2

我正在尝试在 GLSL 中编写一个光线投射着色器,而且速度慢得令人难以忍受。于是我安装了AMD的“GPU Shader Analyzer”,这样我就可以看看实际生成了什么。我已经将它从 2 FPS 提高到 12 FPS,但这仍然不是很棒。

我觉得我可以改进它,但我被困在三个点上。

  • 奇怪的下划线:我明白了什么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_e,RSQ_eRCP_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也许将 i 设置为 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,但我不知道哪个变量是哪个。

有人可以解释这些吗?我找不到前两个的任何文档,我不理解最后一个文档。不幸的是,我以前从未做过任何组装。

4

1 回答 1

1

我找到了这个文档和描述汇编语言的文档,它解释了您在程序集中找到的一些助记符

在这个级别上,装配是非常特定于硬件的;由于您使用过 AMD 工具,我想查找 AMD 设备文档。如果 NVIDIA 使用不同的指令集,我不会感到惊讶。

由于您已用 标记问题glsl,因此您可能走错路了。使用 OpenGL 着色语言是因为它具有可移植性,因为它是一个开放的行业标准;相反,使用汇编可以将程序与特定的显卡系列结合起来。例如,我的程序可以在 Linux 和 Windows 上运行,并且可以在 NVIDIA、AMD 和 Intel 的各种 GPU 上运行(这并不容易,但令人满意)。

如果你仍然想要可移植性,并且你非常勇敢地编写 GPU 程序集,你可以使用 ARB 程序集(顶点片段)来实现程序,但我从未尝试过(你现在给了我一个很好的灵感来开始另一个旅程)。

于 2013-05-21T20:13:35.503 回答