問題タブ [directcompute]
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.
directx - DirectCompute の最適な numthreads のセットアップ
私は最近、計算シェーダーで遊んでいて、[numthreads(x,y,z)] をセットアップして呼び出しをディスパッチするための最適な方法を決定しようとしています。私のデモ ウィンドウは 800x600 で、ピクセルごとに 1 つのスレッドを起動しています。2D テクスチャの修正を行っています - 重すぎることはありません。
私の最初の試みは指定することでした
私の Dispatch() 呼び出しは常に
したがって、最初のインスタンスは
これは 25 ~ 26 fps で実行されました。次に、16 fps で実行される [numthreads(4,4,1)] に減らしました。それを [numthreads(16,16,1)] に増やすと、約 30 fps の優れた結果が得られ始めました。Y スレッド グループ番号 [numthreads(16,8,1)] をいじって、なんとか 32 fps に押し上げました。
私の質問は、GPU を最も効果的に利用できるようにスレッド数を決定する最適な方法はありますか、それとも古き良き試行錯誤ですか?
hlsl - 頂点バッファーを使用せずに計算シェーダーの結果を頂点シェーダーにフィードするにはどうすればよいですか?
詳細に入る前に、問題の概要を説明します。
RWStructuredBuffers を使用して、計算シェーダー (CS) の出力を格納します。頂点シェーダーとピクセル シェーダーは RWStructuredBuffers から読み取ることができないため、StructuredBuffer を同じスロット (u0/t0) と (u4/t4) にマップします。
ShaderRecourceView を使用して、ピクセルおよび/または頂点シェーダーにバッファーへのアクセスを許可します。この概念は私のピクセル シェーダーではうまく機能しますが、頂点シェーダーは 0 値しか読み取らないようです (バッファーへのインデックスとして SV_VertexID を使用します)。
hlsl コンパイラからのエラー メッセージや警告はなく、renderloop は (vsync を使用して) 60 fps で実行されますが、画面は黒いままです。Draw(..) が呼び出される前に Color.White で画面を空白にしているため、レンダリング パイプラインがアクティブになっているようです。
GPU から UAView を介して三角形のデータ コンテンツを「vertArray」に読み込み、それを頂点バッファーにフィードバックすると、すべてが機能します。
プログラム:
HLSL:
ここで 2D の定義 - 頂点 / ピクセルシェーダー。PS_2D はスロット t0 のバッファー「output2」にアクセスすることに注意してください。これはまさに、3D 頂点シェーダー「VS_3DA」で複製したい「トリック」です。
3日間、私は検索して実験しましたが、役に立ちませんでした. 私が収集したすべての情報は、SV_VertexID を使用した私のアプローチが機能することを確認しているようです。
誰でもアドバイスできますか?私の投稿を読んでくれてありがとう!
================================================== ===================
詳細:
私は DirectX 11 コンピューティング シェーダーのコンセプトがとても好きで、代数計算に採用したいと考えています。テスト ケースとして、フラクタル (マンデルブロ集合) を 3D でレンダリングします。壁の最後のレンガが 1 つ欠けていることを除いて、すべてが期待どおりに機能します。
計算には次の手順が必要です。
CS を使用して 2D テクスチャを計算する (出力は「counterTable」と「colorOutbutTable」です (動作)
必要に応じて、このテクスチャを画面にレンダリングします (動作)
別の CS を使用してメッシュ (三角形のリスト) を生成します。この CS は、ステップ 1 から x、y、および色の値を取得し、z 座標を計算して、最後に各ピクセルのクワッドを作成します。結果は「頂点テーブル」に格納されます。(作品)
三角形のリストを頂点シェーダーにフィードする (問題!!!)
画面にレンダリングします (動作 - 頂点バッファーを使用)。
プログラミングには、F# 3.0 と SharpDX を .NET ラッパーとして使用します。両方のシェーダー (ピクセルと頂点) の ShaderRessourceView は、同じパラメーター (サイズ パラメーターを除く) で設定されます。
ここでは特別なことは何もありません。2D バッファの作成 (スロット t0 のバッファ「output2」にバインド):
3D バッファの作成 (スロット t4 の「vertexTable2」にバインド):
2D のリソースの設定:
2D をレンダリング:
3D のリソースの設定:
3D をレンダリングします (機能しません – 出力結果として黒い画面が表示されます)
最後にスロット番号:
directx-11 - GPU にあるバッファー リソースを入力アセンブラー (IA) にバインドするにはどうすればよいですか?
計算シェーダーを使用して三角形リストを計算し、RWStructuredBuffer
. テストのために、このバッファを読み取り、 経由で IA に渡しcontext.InputAssembler.SetVertexBuffers (…)
ます。このアプローチは機能しますが、データの正確性をテストする場合にのみ有効です。
次に、リソース ビューを使用して (既に存在する) バッファーを IA ステージにバインドします (つまり、頂点バッファーへのポインターを渡さずに)。
私はいくつかの良い本 (Frank D. Luna、Jason Zink) を読んでいますが、このケースについて言及していません。
=============== 編集:
ここで使用している構文は、SharpDX ラッパーによって課されます。
ResourceViewをバインドして、バッファを頂点シェーダにバインドでき
context.VertexShader.SetShaderResource(...)
ます。VS ではSV_VertexID
、バッファへのアクセスに使用します。そのため、現時点では有効なソリューションがありますが、将来、バッファを入力アセンブラにバインドする必要がある場合があるかもしれません。
unity3d - Unity コンピューティング シェーダー、SV_DispatchThreadID による配列インデックス
Compute Shader の GPU での配列のインデックス付けに問題があり、何週間もその問題に悩まされています。
SV_DispatchThreadID の x 値をパーティクル配列のインデックスとして使用しようとしています (Web 上の例に示されているように)。
それは機能しています...しかし、threadID変数(メイン関数内)は常に0,3,6,9,12,15を返しています... 0,1,2,3,4ではありません...
CPU 側でのディスパッチ呼び出しは次のとおりです。 Dispatch(64, 1, 1);
私はディスパッチ (32,16,1), (128,1,1),... の多くの構成を試しました。 ,16,1)...しかし常に同じ結果...
順序付きインデックスを取得するにはどうすればよいですか? :(...常に0、3、6、9などのインデックスを取得します...
なにか提案を?
どうもありがとう。
これが私の CS カーネルと私の C# ソースです。
ComputeBuffer などを作成する C# コード:
ここでは、頂点、ジオメトリ、およびピクセル シェーダー:
c++ - dx11 のコンピュート シェーダーの基本
コードベースに計算シェーダーのサポートを追加しようとしていますが、いくつかの非常に基本的な質問への回答を見つけるのに問題があります。
そこにあるすべてのドキュメントは、Compute Shader パイプラインが GPU から独立して実行されると述べていますが、すべての dx11 サンプル コードはデバイス コンテキスト インターフェイスを使用して、シェーダー自体、リソース ビュー、および dispatch() メソッドの呼び出しを設定するため、これらはコマンドでキューに入れられますか?残りのレンダリング コマンドをバッファリングしますか、それとも個別に実行しますか?
質問 1 の補足として、複数のスレッドからコンピュート シェーダーを呼び出すことはできますか?それとも、すべてのコンピュート シェーダー コマンドをバッファーに入れ、即時デバイス コンテキストが作成されたスレッドでそれらを発行する必要がありますか?
同期。ほとんどの記事では、計算シェーダーの完了を自動的に同期し、CPU に結果へのアクセスを許可する CopyResource コマンドを使用していますが、GPU もブロックするようです。より効率的な同期方法はありますか?
実験することでこれに対する答えを見つけることができることはわかっていますが、時間を節約するための助けがあれば幸いです。
gpgpu - GPU と決定論
いくつかの数学演算を GPU にオフロードすることを考えていました。私はすでに D3D11 を使用しているので、計算シェーダーを使用して作業を行います。しかし、問題は、ユーザーがどの GPU を使用していても、同じ入力に対して結果が同じである必要があるということです。(計算シェーダー 4.0 をサポートするという要件のみ)。
では、浮動小数点演算は GPU で決定論的ですか?
そうでない場合、GPU は整数演算をサポートしていますか?
hlsl - ComputeShaders の「サンプラー配列インデックスはリテラル式でなければなりません」というエラーを理解する
次のように、グループの Id を使用して Texture2DArray からデータを取得する計算シェーダーがあるとします。
そして、このように起動するとしましょうdeviceContext->Dispatch(2, 0, 0);
つまり、Texture2DArray からピクセル値を読み取る 2 つのグループ、それぞれ 32 のスレッドです。GroupID.x = 0 のすべてのスレッドは gTextureArray[0] から値を読み取り、GroupID.y = 0 のすべてのスレッドは gTextureArray[1] から値を読み取ります。その単純なコードをコンパイルできないことがわかりました。代わりに、このコンパイルエラーが発生しますerror X3512: sampler array index must be a literal expression
今、私は代わりにこれを行うことができることを知っています:
または、グループがたくさんある場合はスイッチを使用して、それほどひどく見えないようにします(それでもそうです)
各グループのすべてのスレッドがいずれかのブランチに移動するため、ワープの発散がないことに注意してください。私の質問は、ここで何か不足していますか? 少なくともこの場合、発散やその他の問題が見られないのに、HLSL がそのようなインデックス作成をサポートしていないのはなぜですか?