0

ベクトル vecShift に沿ってボリューム テクスチャのコンテンツを移動したいと考えています。私は次のようなカーネルを考えています。

__global__ void
moveVolume(int* vecShift)
{
  // Determine position of current voxel as ptDest

  // Determine position of voxel we copy the content from as ptSrc

  // Read value at ptSrc and store it to voxelColor

  // __threadfence()

  // Write voxelColor to voxel at position ptDest
}

スレッドフェンスは、すべてのボクセルが「パートナー」のコンテンツを読み取ったことを保証し、すべてのボクセルが読み取り操作を行う前に ptDest への書き込みが行われないようにしますね?

これが本当なら、なぜ私は(時々)ぼやけた種類のアーティファクトを得るのですか? または、スレッドフェンスの機能について間違った意見を持っていますか?

4

1 に答える 1

2

talonmies がコメントで説明しているように、__threadfence()ここでの使用は必要でも十分でもありません。__threadfence()はグローバル バリア同期を提供しません。単に、呼び出したスレッドが続行する前に、フェンスの前に__threadfence()そのスレッドによるすべての書き込みが、カーネルの起動で他のすべてのアクティブなスレッドに表示されるようにします。

ここで本当に必要なのは、ボリューム データをダブル バッファリングすることです (つまり、読み取るアレイとは異なるアレイに書き込む)。同じスレッド ブロック内の他のスレッドによってのみ読み取られることを保証できない限り、配列の他の部分を上書きすることはできません。そうしないと、競合状態が発生し、プログラムが正しくありません。

注: シーケンシャル (CPU) 実装であっても、このタイプの計算ではデータをダブル バッファリングする必要があります。

実装しているものは、流体力学シミュレーションで使用される移流カーネルに非常に似ています。ウェブ上で必要なものの例が複数あると確信しています (並列または順次)。

マーク

于 2012-07-11T23:47:32.340 に答える