GPU カーネルで多くの変数を使用する場合、変数はグローバル メモリに存在しますか? ローカル変数の読み書きにはグローバルメモリへのアクセスが必要ですか?
変数がレジスタに存在するように、GPU カーネル内の変数の数の一般的な制限は?
ありがとう、サム
簡単な答え:はい。典型的な限界?約 0.5 の占有率に到達したい場合、アーキテクチャにもよりますが、スレッドあたり約 32 ~ 64 レジスタになります。
もう少し長い答え: レジスタの数は「ローカル変数の数」と正確に同じではないことに注意してください。これは、通常、特定の時点ですべてのローカル変数が必要になるわけではなく、コンパイラがレジスタを再利用しようとするためです。複数の変数が同じレジスタにマップされることになる場合があります。
第 2 に、レジスタ空間が不足した場合でも、コンパイラはそれらの値をめったに使用されないグローバル メモリにスピルしようとします。通常、コードにレジスタ スピルがほとんどない場合、それほど時間はかかりません。さらに、これらのレジスター・スピルは、完全に整列されたグローバル・メモリー・アクセス・パターンにつながります。
各カーネルが使用しているレジスタと (こぼれた) ローカル メモリの量を知りたい場合は--ptxas-options=-v
、コンパイル パラメータに追加します。
CUDAインストールディレクトリにCUDAGPU占有計算機があります。
cuda-5.0/tools/CUA_Occupancy_Calculator.xls
ハードウェアリソース(スレッド/ブロック、レジスタ、共有メモリ)とワープ占有率の関係、およびさまざまなGPUコンピューティング機能の物理的な制限を示すことができます。