2

GLSL でレイキャスティング シェーダーを書こうとしていますが、耐えられないほど遅いです。ということで、AMDの「GPU Shader Analyzer」をインストールしたので、実際に何が生成されているのか見てみます。私は 2 FPS から 12 まで持っていますが、それでも素晴らしいとは言えません。

改善できる気がしますが、3 つの点で行き詰っています。

  • 奇妙なアンダースコア: 意味はわかりますADD R1.x, R0.x, -C6.x。R0.x から C6.x を減算し、R1.x に格納します。同様にADD R4.x, R1.x, R2.w, R4.x; R1.x と R2.w を乗算し、R4.x を加算して R4.x に格納します。しかし、時々 のような電話がかかってきて、アンダースコアの意味がわかりません。MUL __, PV16.x, C1.x

  • 末尾の「E」:通常、私の掛け算は に変わりますMUL a, b, c。でもたまに見かけMUL_e a, b, cます。これはSQRT_eRSQ_eおよびでも発生しRCP_eます。

  • マジック:私は単にこれらの指示を理解していません.

  • LOOP_DX10 i0 FAIL_JUMP_ADDR(10) VALID_PIXループを開始します。しかし、パラメータは何ですか?
  • ALU_BREAK: ADDR(48) CNT(3)わかりません。
  • SETGT_INT R0.y, 350, R3.y私の for ループには i < 350 がありますが、他は何ですか?
  • PREDNE_INT __, R0.y, 0.0f多分私を0に設定しますか?しかし、なぜ浮動小数点 0 なのですか?
  • ALU_PUSH_BEFORE: ADDR(51) CNT(34)プッシュはスタックを考えさせますか?
  • PREDGT __, R0.x, R3.x全く分からない。
  • JUMP POP_CNT(1) ADDR(8) VALID_PIX無条件ジャンプだけどPOP_CNTって何?
  • ALU: ADDR(85) CNT(1)うわー。
  • BREAK ADDR(9)9 にジャンプしますか?
  • POP (1) ADDR(8)スタックからフレームを削除しますか? なぜ8?
  • ENDLOOP i0 PASS_JUMP_ADDR(2)LOOP_DX10 から始まるループを終了します。
  • CNDE_INT R0.x, R2.z, 0.0f, 1065353216x = q? a : b ですが、どの変数がどれかわかりません。

誰かがこれらを説明してもらえますか? 最初の 2 つのドキュメントが見つかりません。最後のドキュメントも理解できません。残念ながら、私はこれまでアセンブリを行ったことがありません。

4

1 に答える 1

1

このドキュメントと、アセンブリ言語について説明しているこのドキュメントを見つけました。このドキュメントでは、アセンブリで見つかったニーモニックのいくつかを説明しています。

このレベルでは、アセンブリはハードウェアに非常に固有です。あなたは AMD のツールを使ったことがあるので、AMD デバイスのドキュメントを探すことにしました。NVIDIA が別の命令セットを使用していても驚かないでしょう。

質問に のマークを付けたのでglsl、間違った方向に進んでいる可能性があります。OpenGL シェーディング言語は、オープンな業界標準であるため、移植性のために使用されます。代わりに、アセンブリを使用して、プログラムを特定のグラフィックス カード ファミリと結合します。たとえば、私のプログラムは Linux と Windows、そして NVIDIA、AMD、Intel のさまざまな GPU で実行されます (簡単ではありませんでしたが、満足のいくものでした)。

それでも移植性が必要で、GPU アセンブリを作成する勇気がある場合は、ARB アセンブリ (頂点フラグメント) を使用してプログラムを実装できますが、私は試したことはありません (そして、あなたは私に別の旅を始める良いインスピレーションを与えてくれました)。

于 2013-05-21T20:13:35.503 に答える