7

タイトルとして、3Dブロックがある場合の正しい実行順序を知りたい

すでに何か読んだことを覚えていると思いますが、少し前のことですが、どこにあるのかは覚えていませんが、信頼性の低い人から来たものです。

とにかく、私はそれについていくつかの確認をしたいと思います。

次のようになりますか(縦糸に分割)?

[0、0、0] ... [blockDim.x、0、0]-[0、1、0] ... [blockDim.x、1、0]-(...)-[0、blockDim .y、0] ... [blockDim.x、blockDim.y、0]-[0、0、1] ... [blockDim.x、0、1]-(...)-[0、blockDim .y、1] ... [blockDim.x、blockDim.y、1]-(...)-[blockDim.x、blockDim.y、blockDim.z]

4

1 に答える 1

7

はい、それは正しい順序です。スレッドは、ブロック内でx次元が最初に変化し、次にy、次にz(列の主要な順序に相当)で順序付けられます。計算は次のように表すことができます

int threadID = threadIdx.x + 
               blockDim.x * threadIdx.y + 
               (blockDim.x * blockDim.y) * threadIdx.z;

int warpID = threadID / warpSize;
int laneID = threadID % warpsize;

これthreadIDがブロック内のスレッド番号、はブロックwarpID内のワープ、はワープ内laneIDのスレッド番号です。

スレッドは、ブロック内のこの順序に関連する予測可能な順序で実行されるとは限らないことに注意してください。実行モデルは、同じワープ内のスレッドが「ロックステップ」で実行されることを保証しますが、ブロック内のスレッド番号からそれ以上を推測することはできません。

于 2012-07-16T13:35:27.510 に答える