連続したOpenGL Compute Shader呼び出しの同期


12

特定の順序で実行する必要があり、出力が以前の入力に依存するいくつかの計算シェーダーがあります。理想的には、クライアント側のバッファーをコピーしてGPUですべての作業を行う必要はありません。

私はコンパイルとリンクとして2つのコンピュートシェーダ持って考えてみましょうprogram_oneとしますprogram_twoGL_SHADER_STORAGE_BUFFERによって書き込まれprogram_one、読み取られるデータを含むを持っているとしますprogram_two。次のことができますか?

glUseProgram(program_one);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, index, buffer);
glDispatchCompute(16, 16, 1);

glUseProgram(program_two);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, index, buffer);
glDispatchCompute(16, 16, 1);

最初の計算シェーダーのすべての呼び出しが、2番目の呼び出しの前に完了することが保証されていますか(読み取りと書き込みの間のデータの競合を回避するためbuffer)?そうでない場合、どのようにそれらを同期しますか?

回答:


12

いいえ、保証されていません。OpenGL仕様では、2つのCompute Shaderを同時に、または異なる順序で実行することが許可されているためです。

からの書き込みの可視性を確保するためglMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT)に、2番目の前に呼び出す必要があります。glDispatchComputeprogram_one


メモリモデルに関するOpenGL.org wiki記事から

[...]ステージ間の呼び出しは、任意の順序で実行できます。これには、さまざまなレンダリングコマンドによって起動される呼び出しが含まれます。異なるレンダリング操作からの2つの頂点シェーダーが同時に実行される可能性はおそらく低いですが、可能性もあるため、OpenGLは保証ません

シェーダーストレージバッファーに関するOpengl.org wiki記事から

SSBOの読み取りと書き込みは、一貫性のないメモリアクセスを使用するため、Image Load Store操作と同様に、適切なバリアが必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.