__global__ void add( int *c, const int* a, const int* b )
{
int x = blockIdx.x;
int y = blockIdx.y;
int offset = x + y * gridDim.x;
c[offset] = a[offset] + b[offset];
}
上記の例では、、、はレジスタに保存されていると思いますがx
、y
offset
nvcc-Xptxas-vは
4 registers, 24+16 bytes smem
プロファイラーは4つのレジスターを表示します
およびptxファイルのヘッド:
.reg .u16 %rh<4>; .reg .u32 %r<9>; .reg .u64 %rd<10>; .loc 15 21 0 $LDWbegin__Z3addPiPKiS1_: .loc 15 26 0
レジスターの使い方を明確にできる人はいますか?Fermiでは、レジスタの最大数はスレッドごとに63です。私のプログラムでは、カーネルがあまりにも多くのレジスタを消費する場合をテストしたいと思います(したがって、変数をローカルメモリに自動的に格納する必要があり、パフォーマンスが低下する可能性があります)。次に、この時点で、各スレッドに十分なレジスタがあるように、1つのカーネルを2つに分割できます。SMリソースが並行カーネルに十分であると想定します。
私が正しいかどうかはわかりません。