2017-03-01 7 views
-3

、私は「int型私= blockIdx.x * blockDim.x + threadIdxの意味を理解することはできません、これに新鮮な男だ階層CUDA Cプログラミングガイド:スレッドとブロックのインデックス計算はどのように機能しますか? CUDA_C_Programming_Guide、第2章では

relationship

__global__ void MatAdd(float A[N][N],float B[N][N],float C[N][N]) 
{ 
    int i=blockId.x*blockDim.x+threadIdx.x; 
    int j=blockId.y*blockDim.y+threadIdx.y; 
    if(i<N&&j<N) 
    C[i][j]=A[i][j]+B[i][j]; 
} 

int main() 
{ 
.... 
    dim3 threadPerBlock(16,16); 
    dim3 numBlock(N/threadPerBlcok.x,N/threadPerBlock.y); 
    MatAdd<<<numBlocks,threadPerBlock>>>(A,B,C); 
.... 
} 

スレッド.x "。なぜこれができますか? 誰かが私にそれを説明できますか? ありがとうございました。 たとえば、 "i"と "j"を使用してブロック(1,1)のスレッド(1,1)を確認する方法はありますか?

+0

コードは投稿自体の中に属します。コードの画像を投稿しないでください。 – StoryTeller

+0

画像ブロックとスレッドの位置関係が表示されました –

+0

画像1が読み込まれませんでした。今度は画像2です。 – StoryTeller

答えて

0

答えは、< <です。CUDAプログラミング:GPUによる並列コンピューティングの開発者ガイドautor:シェーンクック。 第5章では、そのことを明確に説明しています。 2D配列に関しては、2Dレイアウトスレッドを作成するためにdim3が必要です。 "dim3 threadPerBlock(16,16)"は、1つのブロックがx軸に16スレッド、y軸に16スレッドを持つことを意味します。 "dim3 numBlocks(N/threadPerBlock.x,N/threadPerBlock.y)"は、1つのグリッドに、x軸に沿ったN/threadPerBlock.xブロックと、y軸に沿ったN/threadPerBlock.yブロックがあることを意味します。 gridDim.xまたはgridDim.yは、グリッド内のx/y軸に沿ったブロック数を意味します。 blockDim.xまたはblockDim.yは、ブロック内のx/y軸に沿ったスレッドの数を意味します。 threadIdx.xまたはthreadIdx.yは、ブロック内のx/u軸に沿ったスレッドインデックスを意味します。 blockIdx.xまたはblock.idx.yは、グリッド内のx/y軸に沿ったブロックインデックスを意味します。 絶対スレッドインデックスを知りたい場合は、現在のスレッドの背後にあるブロック数と現在のスレッドの背後にあるスレッド数(row *(sizeof(array_element)* width))+(sizeof(array_element)* offset) ))。だから我々はi= blockIdx.x*blockDim.x+threadIdx.xを得る。 画像のグリッド、ブロック、スレッドの寸法が表示されます。 enter image description here

関連する問題