問題タブ [compute-shader]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - DirectX 11 - コンピューティング シェーダー: 出力リソースへの書き込み
DirectX 11 で Compute シェーダー ステージを使い始めたばかりですが、Compute シェーダーで出力リソースに書き込むときに望ましくない動作に遭遇しました。私の理解では、アウト オブ バウンドの読み取りが Compute シェーダーで実行されたことを意味します。(範囲外の書き込みは no-ops になります)
Compute シェーダー コンポーネントの作成
入力リソース
まずID3D11Buffer*
、入力データ用を作成します。これは、Compute シェーダー ステージへの入力に使用される SRV を作成するときに、リソースとして渡されます。入力データが変更されない場合、ID3D11Buffer*
SRV はリソースへのハンドルとして機能するため、SRV の作成後にオブジェクトを解放できます。
ただし、フレームごとに入力データを更新したいので、マッピングのためにバッファを自由に使用できるようにします。
新しく作成されたバッファーをリソースとして使用して SRV を作成する
出力リソース
ここで、Compute シェーダーが書き込むリソースを作成する必要があります。また、読み取るバッファのシステム メモリ バージョンも作成します。ID3D11DeviceContext::CopyResource メソッドを使用して、UAV に接続された Compute シェーダー出力バッファーからシステム メモリ バージョンにデータをコピーして、マッピングを実行し、その内容をシステム メモリに保存します。
計算シェーダーが書き込み可能な読み取り/書き込みバッファーを作成する
結果を読み戻すバッファのシステム メモリ バージョンを作成します。
計算シェーダーが結果を書き込むための UAV を作成する
計算シェーダーの実行 (各フレーム)
C++
HLSL
この質問の内容の量について申し訳ありません。概要を把握しやすいように、慎重に構成しました。
シェーダーに渡される要素の数は 32 です。
私の問題に関する提案はありますか?ありがとうございました!
opengl - GL_ARB_SPARSE_TEXTURE と画像のロード/ストア
執筆時点で、Win8.1 の最新の NV ドライバーで OpenGL 4.4 でスパース テクスチャを使用しています。コミットされた領域に定期的にコピーされると、すべてが正常に機能するようです。ただし、まばらなテクスチャ (コミットされた領域とコミットされていない領域が混在している) でシェーダーの imageLoad/imageStore 操作を実行しようとすると、テクスチャがいたるところでめちゃくちゃになります (値が無秩序に見えたり、ランダムなメモリ コンテンツのように見えたりします)。
拡張機能の仕様 ( https://www.opengl.org/registry/specs/ARB/sparse_texture.txt ) には、コミットされていない領域へのすべてのシェーダーおよびクライアント側の読み取りが未定義であり、書き込みが破棄されると記載されています。ただし、imageLoad imageStore の明示的な言及はどこにも見つかりません。ただし、FBO アタッチメントについては言及しています (計算シェーダーを使用しているため、これは避けたいと思います)。
イメージのロード/ストアに関して、スパース テクスチャの適切な動作は何ですか?
visual-studio-2013 - MSVS2013: FXC を使用して HLSL ファイルをコンパイルします。これの SM4 hcs 出力が SM5 hcs よりも優れているのはいつですか?
残念ながら、ここでコードを共有することはできません (専有) が、私の問題は次のとおりです。SM4 と SM5 の両方で FXC を介してコンパイルできる HLSL (Groestl ハッシュ関数の gpu 実装です) ファイルがあります。私の GPU (AMD Radeon 7800 HD シリーズ) では、SM4 hcs で 3.6 MH/s、SM5 hcs で 6.6 MH/s を取得しています。
同じコード、SM4 と SM5 で大幅に優れたパフォーマンス。SM5 をコンパイルするときに fxc が「ばかげている」という既知のケースはありますか?それをだましてばかげないようにする既知の方法はありますか?
...または、間違ったツリーを鳴らしている可能性があります。これは、GPU に固有のものである可能性がありますか? これを確認するにはどうすればよいですか?
c++ - 計算シェーダーのループがビデオ カード ドライバーをクラッシュさせている間
HLSL を使用して計算シェーダーにバイナリ検索を実装しようとしています。検索キーと配列の値がfloat
. 検索キーに一致する配列値がない場合、検索は最後のインデックスを返すことになっています (minIdx
そしてmaxIdx
、この時点で一致します)。これは、最大数の操作が必要なため、従来のバイナリ検索の最悪のケースです。私はこれを認識しています。
だからここに私の問題があります:
私の実装は次のようになります。
これにより、プログラムの実行時にビデオ ドライバーがクラッシュします。コンパイルエラーになりません。
ただし、のif
代わりにを使用するwhile
と、それを実行でき、最初の反復は期待どおりに機能します。
私はすでにいくつかの検索を行いましたが、これは計算シェーダーでの動的ループで何かをしなければならないのではないかと思います。しかし、コンピューティング シェーダーの経験がなく、HLSL の経験もほとんどないため、途方に暮れているように感じます。
これを でコンパイルしていcs_5_0
ます。
誰かが私が間違っていることを説明したり、少なくともいくつかのドキュメント/説明を教えてくれませんか? これを解決して理解するために私を始めることができるものは何でも非常に高く評価されます!
c - SSBOがUBOよりも大きい?
私は現在、UBOを使用してOpenGL 4.3でレンダリングして、すべての定数データをGPUに保存しています。(マテリアルの説明、マトリックスなど...)。それは機能しますが、UBO のサイズが小さい (私の実装では 64kB) ため、バッファを何度も切り替える必要があり、レンダリングが遅くなります。数 MB を保存する同様の方法を探しています。
少し調査した結果、SSBO はそれを正確に許可するだけでなく、不要な「機能」も備えていることがわかりました。それらはシェーダーから書き込むことができ、読み取りが遅くなる可能性があります。
シェーダーに大量のデータを提供するための SSBO よりも優れたソリューションはありますか? もっと多くのデータを処理できるより柔軟なソリューションが存在するのに、UBO を数 kB に制限する必要があるのはなぜですか? シェーダー ストレージ バッファーが探しているものである場合、シェーダーによって変更されないようにする方法はありますか?