5

CUDA カーネルで新しい変数を宣言し、次のように複数のスレッドで使用するとします。

__global__ void kernel(float* delt, float* deltb) {
int i = blockIdx.x * blockDim.x + threadIdx.x;
float a;
a = delt[i] + deltb[i];
a += 1;
}

カーネル呼び出しは以下のようになり、複数のスレッドとブロックが含まれます。

int threads = 200;
uint3 blocks = make_uint3(200,1,1);
kernel<<<blocks,threads>>>(d_delt, d_deltb);
  1. 「a」はスタックに格納されていますか?
  2. 初期化時にスレッドごとに新しい「a」が作成されますか?
  3. それとも、各スレッドが未知の時間に個別に「a」にアクセスし、アルゴリズムを台無しにする可能性がありますか?
4

2 に答える 2

8

上記のどれでもない。CUDA コンパイラは十分にスマートで積極的でa あり、未使用であることを検出できる最適化を備えており、完全なコードを最適化して取り除くことができます。これを確認するには、カーネルを-Xptxas=-vオプションとしてコンパイルし、リソース カウントを調べます。これは基本的にはレジスタもローカル メモリもヒープもありません。

それほど単純ではない例でaは、スレッドごとのレジスタ、またはオフダイ DRAM であるスレッドごとのローカル メモリに格納される可能性があります。

于 2013-07-29T20:42:22.090 に答える