私はCUDAが新しく、スレッドのIDを計算する方法を読んだことがあります。このimageのように、スレッドIDに関する質問があります。CUDAでスレッドIDを計算するためにブロック次元が必要なのはなぜですか?
私が理解していないのは、スレッドとブロックの座標がthreadIDを計算するのに十分ではなく、代わりにブロックの次元を使用する必要があるということです。
私はCUDAが新しく、スレッドのIDを計算する方法を読んだことがあります。このimageのように、スレッドIDに関する質問があります。CUDAでスレッドIDを計算するためにブロック次元が必要なのはなぜですか?
私が理解していないのは、スレッドとブロックの座標がthreadIDを計算するのに十分ではなく、代わりにブロックの次元を使用する必要があるということです。
CUDA documentationに見られるように、複数のスレッドが一緒にブロックを形成し、複数のブロックがグリッドを形成します。
グリッド内の各スレッドを一意に識別する必要がある場合は、ブロックの次元を考慮する必要があります。次の例で
、一緒i
とj
一意グリッド内の各スレッドを識別する。
int i = blockIdx.x * blockDim.x + threadIdx.x;
int j = blockIdx.y * blockDim.y + threadIdx.y;
threadIdx
ブロック内のスレッドの指標であり、そしてblockIdx
は、グリッド内のブロックのインデックスです。グリッド内のスレッドの一意のインデックスi, j
を取得するには、blockDim
が必要です。
しかし、私はまだ同じ質問があります。 'blockDim'はなぜ必要なのですか?申し訳ありませんが、愚かな質問かもしれません。次のように言っても大丈夫です: 'int i = blockIdx.x + threadIdx.x; int j = blockIdx.y + threadIdx.y; '?こうすることで、ブロック内のスレッドとグリッド内のブロックを知ることができます。ブロックに何個のスレッド(ブロックディメンション)が必要なのはなぜですか? – chick3n0x07CC
_grid_全体の各_thread_を一意に識別します。私はあなたが書いた数式を試して、この方法で各スレッドを一意的に索引付けしようと試みることを紙面で試みることをお勧めします。私はこれをさらに説明する方法がわからないのではないかと思います。 – ApoorvaJ
我々は....理解really2しなければならないと想像することができ、私たちの頭の中で物理的な可視化カーネルが起動されたスレッドが作成されたとき、およびblockDim、blockIdx、threadIdxが本当に何を意味するかについて
ブロック寸法(BlockDim)でありますX、Y、またはZ次元の各ブロックの "NUMBER(count)of threads"(.X、.Y、または.Zに依存)
BlockIdx.xは、スレッドがどのブロック内にあるかを示すインデックス番号を表します。ブロックのインデックス番号は、左から右(x)、上(y)、前から後(z)の順にゼロから数えられます。
threadIdx.xは、各ブロック(blockIdx.x)内でインデックスがゼロからローカルに開始します。 しかし、/ lifeを実行しているときは、 "スレッドのグローバルインデックス"を知っておく必要があります。だから、必要があります。
uint globalIdx_x = blockIdx.X * blockDim.X + threadIdx.x;
が読み込まれ、この本から学ぶようにしてください: プロフェッショナルCUDA Cプログラミング - WROXプログラミング。
イメージは実際にそれをうまく示しています。例えば '(threadIdx.x、threadIdx.y)'が '(1,2)'である複数のスレッドがあります。 ApoorvaJによって指摘されているように、**ユニークな**インデックスを得るためには、このスレッドが* block *であることと、1つのブロック内にいくつのスレッドがあるかを考慮する必要もあります。 – Marco13