nishio-dens's diary

Railsとかプログラミング関連の備忘録

CUDAで指定可能な最大スレッド数と最大ブロック数

CUDAにて,1ブロックあたりに指定できる最大スレッド数は512個である.前回のプログラムのmain部分で

dim3 threadNum(3);
dim3 blockNum(5);

と,スレッド数3個,ブロック数5個と指定していたが,このスレッド数の部分を512個以上(例えば600)指定してみる.

dim3 threadNum(600);
dim3 blockNum(5);

実行結果は以下の通り.

省略 ...

I'm thread 506. My Block ID is 4
I'm thread 507. My Block ID is 4
I'm thread 508. My Block ID is 4
I'm thread 509. My Block ID is 4
I'm thread 510. My Block ID is 4
I'm thread 511. My Block ID is 4

...
この領域は初期化していないので,でたらめなデータが出力される

上記の様に,スレッド数を600と指定しても,最大スレッド数が512であるため,うまく動作していないのが分かる.

また,グリッドの各次元に指定できる最大ブロック数は65535までである.それ以上値を増やすと挙動がおかしくなるので注意.例えば次のようにスレッド数,ブロック数を指定してみる.

threadNum(2);
blockNum(65550);

実行結果は以下の通り.

I'm thread 1. My Block ID is 65530
I'm thread 0. My Block ID is 65531
I'm thread 1. My Block ID is 65531
I'm thread 0. My Block ID is 65532
I'm thread 1. My Block ID is 65532
I'm thread 0. My Block ID is 65533
I'm thread 1. My Block ID is 65533
I'm thread 0. My Block ID is 65534
I'm thread 1. My Block ID is 65534
I'm thread 0. My Block ID is 13107
I'm thread 1. My Block ID is 13107
I'm thread 2. My Block ID is 13107
I'm thread 3. My Block ID is 13107
I'm thread 4. My Block ID is 13107
I'm thread 5. My Block ID is 13107
I'm thread 6. My Block ID is 13107

明らかに挙動がおかしくなる.各次元に指定できる数が65535であり,ブロック数はx次元とy次元にて指定可能なので,

blockNum(65535,65535)

と,最大65535x65535個まで生成可能である.