-2

スレッドの番号付けとスレッド ID については、ほとんど疑いがありません。

  1. 2D-Thread(1,0) は、x インデックスが 1 で y インデックスが 0 であるため、スレッド 1 です。次に、thread(0,1) が来ます。このスレッドのスレッド ID またはスレッド番号は何ですか? 3だと思いますがどうですか?スレッド (0,1) に ThreadId = blockIdx.x*blockDim.x + threadIdx.x の式をどのように適用できますか? この式を使用して、たとえばブロック 3 のスレッド (0,1) のスレッド ID 値を計算するにはどうすればよいですか? または、別の式があります。どのように見つけるのですか?3D の場合はどうすればよいですか?

  2. 総数をどのように決定できますか。一緒に x 方向のスレッドの数? 例: 行列要素にアクセスしている場合。行列のサイズが 3 の場合、スレッド (0,0) が 1 番目の要素にアクセスし、スレッド (1,0) が 2 番目の要素にアクセスし、スレッド (2,0) が 3 番目の要素にアクセスし、次にスレッド (0,1) がアクセスすることがわかりました。 2 行目の 1 番目の要素 (4 番目の要素) にアクセスします。しかし、この図から thread(3,0) が無視されているのはなぜですか? thread(3,0) はどの要素にどのようにアクセスしますか? ブロックサイズとグリッドサイズを指定した実行構成に依存しますか?

4

1 に答える 1

2

threadIdxは、.x、.y、および.zフィールドを持つ構造体です。「thread(x、y)」と書くと混乱する可能性があります。

  1. 2Dスレッドブロックを作成し、それを1Dインデックスにマップしようとしています。もちろんそれは可能ですが、2Dから1Dへのマッピングはアプリケーションのコンテキストによって異なります。実際に1Dインデックスが必要な場合、ほとんどの人は1Dを使用します。

    もちろん、2Dスレッドインデックスを取得して線形配列にアクセスする必要がある場合もありますが、配列のレイアウトはアプリケーションによって異なります。典型的な例はのようなものですoffset = threadIdx.y * arraywidth + threadIdx.x

  2. x方向のスレッドの総数はですgridDim.x * blockDim.x

    特定のスレッドがどの要素にアクセスするかは、オフセットの計算方法によって異なります((1)を参照)。

Talonmiesはまた、ドキュメントのスレッド階層セクションを指摘しました。これは、開始するのに適した場所です。

于 2012-11-19T13:20:02.070 に答える