nvccでコンパイルしているかどうかを判別するには?
コンパイル環境によって、CUDA(GPUで計算)もしくはCPUで計算を切り替えたい場合、 __CUDACC__がdefineされているかどうかで判定すればよい。
つまり、
#ifdef __CUDACC__ //CUDAのコード #else //CPU用コード #endif
(このオプションを使わなくても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...
最終更新日