0
dim3 DimGrid((n-1)/256 + 1, 1, 1);
dim3 DimBlock(256, 1, 1);
vecAddKernel<<<DimGrid,DimBlock>>>(d_A, d_B, d_C, n);
__global__
void vecAddkernel(float* A, float* B, float* C, int n)
{
int i = threadIdx.x + blockDim.x * blockIdx.x;
if(i<n) C[i] = A[i] + B[i];
}

上記の関数では、長さ n=257 のベクトルがあると仮定すると、割り当てられるブロックは 2 つだけになります。vecAddkernel 関数が呼び出されたときに 2 番目のブロックで何が起こるかを知りたかっただけです。2 番目のブロックで実行されるスレッドは 1 つだけですか、それとも 256 のスレッドすべてが実行されますが、そのうちの 255 には出力がありません。したがって、基本的な質問は、各 vecAddKernel 呼び出しに対してパラメーター 'n' がどのように固定されるかということです。ブロックごとに 256 ですか、それとも最初のブロックが 256 で 2 番目のブロックが 1 ですか?

4

1 に答える 1

5

ブロック内で実行されるスレッドの数は、ブロックの次元によってのみ決定されるため、256スレッドが実行されますが、そのうちの255スレッドには「出力」がありません。また、「n」はグリッドの寸法のみを定義し、グリッドの各ブロックには同じ数のスレッドがあります。

于 2012-12-11T18:47:36.710 に答える