[[CUDA]]

**too many resources requested for launch [#vac860b6]
CUDA実行時に too many resources requested for launch とエラーが出たら,
これはカーネルが用いているレジスタ数などが多すぎるということである.

GPUでは多数のスレッドを並列実行できるが,このスレッドを取り扱うために
グリッド -> ブロック -> スレッド
という階層構造を持っており,1ブロックが多数のスレッドを持っている.
1ブロックが持てる最大スレッド数は環境に依存する.
同様に1ブロックが持つレジスタ数も環境によって異なる.
上記のエラーを直すために,現在のカーネルが使っているレジスタ数に加えて,
現在の環境で使えるレジスタ数/ブロックも知る必要がある.

**カーネルが使っているレジスタ数を調べる [#hed1d94f]
CUDAコンパイラであるnvccでコンパイルするときに --ptxas-options=-v オプションを付けてやると,カーネルごととに
 ptxas : info : Used 45 registers, 384 bytes cmem[0], 8 bytes cmem[2]
といった情報がコンパイルの結果として表示される.
Visual StudioでCUDAを用いている場合は,
調べたいcuファイルのプロパティで
 CUDA C/C++ -> Device -> Verbose PTXAS Output
を"はい"にすると,コンパイル時に出力ウィンドウに上記のような情報が表示されるようになる.

この例だとこのカーネルはレジスタを45用いている.
例えば,1024スレッド/ブロックとしていたならば,45*1024 = 46,080レジスタ/ブロックとなる.

**環境が対応しているレジスタ数を調べる [#ka6dba5f]
[[デバイス情報の取得]]で説明した方法を使うと1ブロックあたりのレジスタ数を調べることができる.[[デバイス情報の取得]]にあるコードの
 printf(" register / block : %d\n", dev.regsPerBlock);
が該当する部分である.

また,フリーソフトの[[CUDA-Z:http://cuda-z.sourceforge.net/]]を使っても調べることができる.ダウンロードしてプログラムを起動するとGPUのCUDAに関する情報が表示される.
1ブロックあたりのレジスタ数は,Coreタブの Regs Per Block 項目となる.

ちなみにGeForceGTX680の環境では65,536となる.
この値ならば上記のカーネルを1024スレッド/ブロックで実行しても問題ないということになる.もしも使えるレジスタ数が少ないならば,1ブロックあたりのスレッド数を減らすか,カーネル内で用いられているローカル変数の数を減らすなどする必要がある.

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS