計算シェーダを使用して流体シミュレーションの一部としてSSBOの同じ要素を読み書きできることを期待していますが、同期に問題があります。私は16回実行されるテストシェイダーを持っています。下の3つのオプションは、私がやろうとしていることをうまく示しています。OpenGL Compute Shader - 正しいメモリバリアの使用
layout (std430, binding=8) coherent buffer Debug
{
int debug[ ];
};
shared int sharedInt;
layout (local_size_x = 16, local_size_y = 1, local_size_z = 1) in;
void main()
{
/////// 1. ///////
sharedInt = debug[0];
memoryBarrierShared();
barrier();
debug[0] = sharedInt[0] + 1;
memoryBarrierShared();
barrier();
// Print debug[0]: 1
/////// 2. ///////
atomicAdd(debug[0], 1);
// Print debug[0]: 16
/////// 3. ///////
sharedInt = debug[0];
memoryBarrierShared();
barrier();
atomicExchange(debug[0], debug[0]+1);
memoryBarrierShared();
barrier();
// Print debug[0]: 1
}
*私は一度に1つのオプションしか実行していません。
私が得ようとしているのは、デバッグ[0]が16に等しいということですが、読み書きする必要があるため、シミュレーションで第1または第3のオプションのようなものを使用する必要がありますSSBOは同じスレッド内にあります。
私は共有変数の役割を理解しているとは思えません。私はmemoryBarrierShared()がsharedIntの読み書きをワークグループ内のすべてのスレッドに見せるようにするべきだと理解しています。それが同じ結果である派遣された唯一のワークグループです。
ありがとうございました。
それは本当にはっきりしていませんあなたがやろうとしていること、なぜ共有変数があるのか、あるいはあなたの障壁が達成しようとしていること。あなたは 'debug [0]'を16にしたいと言っていますが、なぜ#2がその問題に対する許容可能な解決策ではないのかは本当に不明です。 –
申し訳ありません。私はデバッグ[0]から読んでから後で1を追加しなければならないので、#2を使用することはできません。 シミュレーションでは、3Dグリッドを表すssboまたは現在どのパーティクルが各セルであるかを格納するセルがあります。各セルには、粒子の数、およびセル内の粒子のインデックスが格納されています。グリッドを塗りつぶすと、各パーティクルごとに計算シェーダが実行され、その中のセルが見つかると、セル内のパーティクルの数に応じて適切なメモリスロットに追加されるため、パーティクルの数を読み取る必要がありますそれを増分する。 – Ewan