0

わかりましたので、この巨大な配列をJと呼びましょう

J の各要素には、関連付けられた配列 TJ がありますが、TJ の長さは J に関して可変です。

たとえば、シーケンシャル手順は次のようになります

for(J=0;J<length(ARRAY_J))
do
  for(T=0;T<length(ARRAY_TJ))
  do
    ARRAY_RESULT[J]+=ARRAY_J[J]+ARRAY_TJ[T]
  end
end

そこで、スレッドを 2D ブロックに配置すると、スレッドの x インデックスを J に、スレッドの y インデックスを T に使用できると考えました。

Jの長さはわかりましたが、Tの長さはさまざまであるため、Cudaでこれを定義する方法がわかりません。

例えば

ARRAY_RESULT[blockidx.y*blockDim.y+threadidx.y]+=ARRAY_J[blockidx.y*blockDim.y+threadidx.y]+ARRAY_TJ[blockidx.x*blockDim.x+threadidx.x]

では、ARRAY_TJ の長さが可変であることを考慮して、ここでブロックの寸法を定義するにはどうすればよいでしょうか? 最大長の ARRAY_TJ を使用する必要がありますか? しかし、上記のようなコードは機能しますか? ARRAY_J の各値について、長さ (ARRAY_TJ) の値を合計しますか?

4

1 に答える 1

1

Jスレッドの長さで、各スレッドで行う1Dブロックを使用する方が良いと思います

int thread = blockIdx.x * blockDim.x + threadIdx.x;
for(T=0;T<length(ARRAY_TJ))
    ARRAY_RESULT[thread]+=ARRAY_J[thread]+ARRAY_TJ[T]

TJ 配列の 2 次元を使用して 2D で実行しようとすると、複数のスレッドが ARRAY_RESULT の同じ位置に同時に書き込みを行うことになり (問題が発生します)、クリティカル セクションを簡単に管理することはできません。クーダで。

于 2013-05-24T18:32:29.060 に答える