0

2100 ブロックでブロックあたり 4 スレッドのカーネルを起動しました。

このカーネルでは、すべてのスレッドが関数を実行し、その結果を (グローバル メモリ上の) 配列に "threadIdx.x" の位置に配置する必要があります。

このプロジェクトのフェーズでは、関数が常に 1.012086 を返すことは確かです。今、私はその合計を行うためにこのコードを書きました:

currentErrors[threadIdx.x]=0;
for(i=0;i<gridDim.x;i++)
{
    if(i==blockIdx.x)
    {
        currentErrors[threadIdx.x]+=globalError(mynet,myoutput);
    }
}

しかし、カーネルが終了すると、すべての配列の位置の値は 1.012086 (代わりに 1.012086*2100) になります。

どこが間違っていますか?助けてくれてありがとう!

4

1 に答える 1

2

ブロックの部分的な結果から最終的な合計を計算するには、次の方法をお勧めします。

  • すべてのブロックが部分的な結果を gridDim.x サイズの配列の個別のセルに書き込むようにします。
  • アレイをホストにコピーします。
  • ホストで最終合計を実行します。

各ブロックには独自に計算することがたくさんあると思います。これは、そもそも CUDA の使用を保証するものです。

現在の状態では --- カーネルに何か問題がある可能性があると思います。すべてのブロックがすべてのデータを合計し、部分的な結果であるかのように最終結果を返しているように思えます。

あなたが提示したループは本当に意味がありません。各ブロックには、i何かを行うブロックが 1 つだけあります。コードは単純に次のように書くのと同じです:

currentErrors[threadIdx.x]=0;
currentErrors[threadIdx.x]+=globalError(mynet,myoutput);

予測できないスケジュールの違いを考慮して保存してください。

ブロックは同期して実行されないことに注意してください。各ブロックは、他のブロックの前、最中、または後に実行できます。


また:

于 2012-08-19T10:09:21.440 に答える