Twitterに投稿 はてなブックマークに追加 Google Bookmarksに追加

目次 >> CUDA >> FAQ

CUDA - FAQ

nvccでコンパイルしているかどうかを判別するには?

コンパイル環境によって、CUDA(GPUで計算)もしくはCPUで計算を切り替えたい場合、 __CUDACC__がdefineされているかどうかで判定すればよい。
つまり、

#ifdef __CUDACC__
//CUDAのコード
#else
//CPU用コード
#endif

コードの中でC++を使うには?(古い情報)

(このオプションを使わなくてもC++をコンパイルできるようになった)

CUDAのコンパイラnvccはデフォルトでは使用言語はCを仮定している。そのためコードの中でC++を使おうとするとエラーが出てコンパイルできない。
C++を使うには--host-compilationオプションを使う。具体的には

nvcc test.cu -lcutil32 -lkernel32 --host-compilation c++

のように--host-compilationの後にC++(もしくは小文字でc++)を指定すればよい。

精度は低いが高速な数値計算を行うには?

CUDAには精度は低いが高速な数値計算__sinの様な関数が多数用意されている。
これは、ソースコードを書き換えなくても、-use-fast-mathというオプションをコンパイル時につけるだけで、自動的にすべて変換してくれる。

デバイスのプロパティを取得するには?

cudaGetDevicePropertiesを使う。

//cudatest.cu
#include <iostream>
#include <cutil.h>
int main( int argc, char** argv) 
{
    //デバイスの初期化
    CUT_DEVICE_INIT(argc, argv);
    //デバイス(通常はビデオカードの数)を取得
    int numofdev;
    CUDA_SAFE_CALL(cudaGetDeviceCount(&numofdev));

    //デバイスの数だけループを回してプロパティを取得
    for (int n = 0; n < numofdev; n++)
    {
        //プロパティを格納する構造体
        cudaDeviceProp devprop;
        //n番目のデバイスのプロパティを取得
        CUDA_SAFE_CALL(cudaGetDeviceProperties(&devprop, n));
        //n番目のデバイスの表示
        cout<<n+1<<"番目のデバイスのプロパティ"<<endl;
        cout<<"デバイス名:"<<devprop.name<<endl;
        cout<<"グローバルメモリの合計値:"<<devprop.totalGlobalMem/1024/1024<<" MB"<<endl;
        cout<<"各ブロックに割り当てられる最大シェアードメモリ:"<<devprop.sharedMemPerBlock/1024<<" KB"<<endl;
        cout<<"各ブロックのレジスタ数:"<<devprop.regsPerBlock<<endl;
        cout<<"ワープサイズ:"<<devprop.warpSize<<endl;
        cout<<"メモリピッチ:"<<devprop.memPitch<<endl;
        cout<<"1ブロックあたりの最大スレッド数:"<<devprop.maxThreadsPerBlock<<endl;
        cout<<"ブロックの最大次元:("<<devprop.maxThreadsDim[0]<<","<<devprop.maxThreadsDim[1]<<","<<devprop.maxThreadsDim[2]<<")"<<endl;
        cout<<"グリッドの最大次元:("<<devprop.maxGridSize[0]<<","<<devprop.maxGridSize[1]<<","<<devprop.maxGridSize[2]<<")"<<endl;
        cout<<"最大コンスタントメモリ:"<<devprop.totalConstMem/1024<<" KB"<<endl;
        cout<<"バージョン:"<<devprop.major<<"."<<devprop.minor<<endl;
        cout<<"クロック周波数:"<<devprop.clockRate/1000<<"MHz"<<endl;
        cout<<"デバイス名:"<<devprop.textureAlignment<<endl;
    }
    //終了処理
    CUT_EXIT(argc, argv);
}

コンパイルと実行は下記のようになる。

>nvcc cudatest.cu -lcutil32 -lkernel32 --host-compilation c++ -o cudatest.exe
cudatest.cu
tmpxft_000002bc_00000000-3.gpu
tmpxft_000002bc_00000000-7.gpu
tmpxft_000002bc_00000000-3.cpp
tmpxft_000002bc_00000000-12.ii

>cudatest.exe
1番目のデバイスのプロパティ
デバイス名:GeForce 8400 GS
グローバルメモリの合計値:255 MB
各ブロックに割り当てられる最大シェアードメモリ:16 KB
各ブロックのレジスタ数:8192
ワープサイズ:32
メモリピッチ:262144
1ブロックあたりの最大スレッド数:512
ブロックの最大次元:(512,512,64)
グリッドの最大次元:(65535,65535,1)
最大コンスタントメモリ:64 KB
バージョン:1.1
クロック周波数:918MHz
デバイス名:256

Press ENTER to exit...


最終更新日


本文中のFC4はFedora ProjectのFedora Core 4を、FC5はFedora Core 5を、FC6はFedora Core 6をopenSUSEはNovellのSUSE Linux OSSを表します。Fedora7以降は、単にFedora7、Fedora8、Fedora9、Fedora10、Fedora11、Fedora12、Fedora13、Fedora14、Fedora15と表示しています。Ubuntuは、必要に応じて20.04、21.04のようにバージョン番号をつけて区別しています。

ここに登場するドメイン名やIPアドレスなどはフィクションです。実在の人物・団体等とは一切関係がありません。
実際に使用する際は、各自の環境に合わせて書き換えてください。
もし何か間違いなどありましたらこちらからご連絡ください
リンクに許可は不要です。
Copyright (C) 2021 Chikuma Engineering Co., Ltd. All Rights Reserved.