Introduction
備忘録。
GPU 側のコードの動きを調べるために printf
を追加したけど何も表示されない事象に遭遇。
加えて、結果が常に 0 になるという不可思議な事象。
How to resove?
ブロック当たりのスレッド数が大きすぎる
まずは Stackoverflow で解決策が見つかった。
printf() in my CUDA kernel doesn’t result produce any output
下記のコードで
1 |
|
#define THREAD_PER_BLOCK 1024
を #define THREAD_PER_BLOCK 2048
に変えると、 hello_cuda
の printf
が何も表示してくれなくなる。
ややこしいのが、ホスト側の printf("End!\n");
は表示され、プログラムとしてクラッシュしないことである。
原因は GPU の性能を超えたスレッドを起動したことによるもの。
デバイスの最大ブロック数は cudaDeviceProp.maxThreadsPerBlock
で確認できる。
1 |
|
printf
が何も表示されないどころか、計算すら行われないので結果が常に 0 になっていたわけである。
CUDA_ARCHITECTURES が不一致
これは自宅で検証しているときに気付いた。
GPU の Compute Capability は下記のサイトで見つけられる。
ここで CMakeLists.txt 等で CUDA_ARCHITECTURES
に、自分の GPU の Compute Capability より大きな値を設定すると、printf
が表示されない。
というよりも、計算すら行われないのだろう。
例えば、自分の GPU の Compute Capability が 6.1
の時ならば CUDA_ARCHITECTURES
の上限は 61
になる。
ここで、 75
を指定すると、この事象が起きてしまう。