2016-08-25 4 views
2

同じディスパッチ内の異なるワークグループが連続ループに置かれていて、フラグを設定することによってループを終了するようにallを通知したいという計算シェーダがある場合。これは実際に可能ですか?OpenGL Computeシェーダが異なるワークグループを同期する

私は、コヒーレントと揮発性の両方のマークが付いたSSBOでフラグを使用して、それらの終了をトリガーしようとしました。それは時々AMDの上で動作しません。作業グループの1つがすべて終了するようにするには、アトミックを使用しないでフラグを0から1に直接設定するだけです(それが重要でない限り)ので、あとでmemoryBarrier()を呼び出します。

memoryBarrier()のドキュメントから、同じディスパッチ内の他のワークグループへのセットの最終的な可視性が保証されるようです。

答えて

2

memoryBarrier()のドキュメントから、同じディスパッチ内の他のワークグループへのセットの最終的な可視性が保証されるようです。

可視性、はい。しかし、の実行はどうですか?

このシャットダウンをトリガするワークグループがループグループと一緒に実行されるという保証はありますか?いいえ

すべて異なる作業グループからの呼び出しの間には、順序保証はありません。したがって、GPUがすべての実行時間をループしている作業グループで満たすことは完全に可能です。つまり、彼らはになることを決して待つことを意味します。が来ます。

計算シェーダは、すべてのスレッドが処理されることを保証していません。したがって、そのように思うコードを書くことはできません。計算シェーダの実行を制御する唯一のツールはbarrierであり、内の呼び出しの実行を制御します。ワークグループ内です。

+1

ありがとう、素晴らしい答え!標準のOpenGLドキュメントにこれが含まれていれば幸いです。私はこのために正しい精神モデルを確かめるために、これを正確に述べる必要がありました。 – iam

+1

@iam: "*標準のOpenGLドキュメントにこれが含まれていれば幸いです。 OpenGL標準では、「作業グループは完全に独立して実行され、不特定の順序で実行されています。私がしたことは、それ以上の言葉でそれを語っていた。 –

+0

ok私は明らかに、あなたが私にこのことの理解をより自信を持たせるようにしたように、少しだけ言葉を使用したかったと思います! :)そして、公正ではないかもしれないが、それ以外の事例ではそれがよく確認されていない/理解されていないかもしれない。 – iam

関連する問題