理解CUDAグリッド寸法、ブロック寸法及びスレッド機構(簡単な説明)[閉鎖]
質問
整理スレッドはGPUで実行される方法?
解決
ハードウェア
GPUデバイスがある場合は、例えば、4つのマルチプロセッシング・ユニットは、彼らは768件のスレッドごとに実行することができます:あなたはより多くのスレッドを計画している場合これ以上の768 * 4以上のスレッドが実際に(並行して実行される所定の瞬間に、彼ら)自分の順番を待っているされます。
ソフトウェア
のスレッドはブロックに編成されています。ブロックは、マルチプロセッシングユニットによって実行されます。 ブロックのスレッドがINDENTIFIEDすることができる(インデックス付け)1Dimension(X)を用いて、2Dimensions(X、Y)または3Dimインデックス(X、Y、Z)が、いずれの場合にX Y Z <= 768当社例えば(他の制限は、X、Y、Zに適用され、ガイドとあなたのデバイス機能を参照してください)。
あなたがより多くのものより4つの* 768のスレッドが必要な場合は、もちろん、あなたが4つ以上のブロックを必要としています。 ブロックは、1D、2D又は3Dを索引付けすることができます。入るのを待っているブロックのキューがあります GPUは(なぜなら、私たちの例では、GPUは4つのマルチプロセッサを持っており、唯一の4つのブロックがあります )が同時に実行されます。
次に簡単な場合:処理512×512画像
私たちは一つのスレッドが一つの画素(i、j)を処理したいとします。
私たちは、64個のスレッドそれぞれのブロックを使用することができます。その後、我々は512 * 64分の512 = 4096個のブロックを必要とします (SO = 4096 * 64 512×512のスレッドを持っている)
これは、2次元ブロック内のスレッドがblockDim = X 8 8(ブロックあたり64スレッド)を有する(容易画像を索引付けするために)編成するのが一般的です。私はそれをthreadsPerBlock呼び出すことを好むます。
dim3 threadsPerBlock(8, 8); // 64 threads
と2D gridDim = 64×64ブロック(4096個のブロックが必要)。私はnumBlocksそれを呼び出すことを好むます。
dim3 numBlocks(imageWidth/threadsPerBlock.x, /* for instance 512/8 = 64*/
imageHeight/threadsPerBlock.y);
カーネルは次のように起動されます:
myKernel <<<numBlocks,threadsPerBlock>>>( /* params for the kernel function */ );
最後に:。ブロックは、その64件のスレッドが実行を取得するためにGPUのマルチプロセッサのいずれかを割り当てられるのを待っている「4096個のブロックのキュー」、のようなものがあるでしょう。
カーネルスレッドによって処理される画素(i、j)は、このように算出されます
uint i = (blockIdx.x * blockDim.x) + threadIdx.x;
uint j = (blockIdx.y * blockDim.y) + threadIdx.y;
他のヒント
9800GT GPUをするとします。 14のマルチプロセッサは、各々が8 threadprocessorsを有しwarpsize 32スレッドまでの各threadprocessorハンドルを意味し32です。 14 * 8 * 32 = 3584がactuall cuncurrentスレッドの最大数である。
あなたは以上の3584個のスレッドでこのカーネルを実行した場合(4000個のスレッドを言うと、あなたはブロックとグリッドを定義する方法、それは重要ではないのGPUが同じようにそれらを扱います。):
func1();
__syncthreads();
func2();
__syncthreads();
次のように次に、これら2つの関数の実行順序は次のとおり
1.func1第3584スレッドに対して実行される
2.func2第3584スレッドに対して実行される
3.func1は、残りのスレッドのために実行される
4.func2は、残りのスレッドのために実行される