Glsl 理解GPU反汇编的困难

Glsl 理解GPU反汇编的困难,glsl,instruction-set,Glsl,Instruction Set,我正试图在GLSL中编写一个光线投射着色器,但速度慢得令人无法忍受。所以我安装了AMD的“GPU着色器分析器”,所以我可以看看实际生成的是什么。我把它从2帧提高到12帧,但这仍然不是很好 我觉得我可以提高它,但我被困在三点 奇怪的下划线:我得到了添加R1.x,R0.x,-C6.x所做的;从R0.x中减去C6.x,并将其存储在R1.x中。与类似,添加R4.x、R1.x、R2.w、R4.x;将R1.x和R2.w相乘,加上R4.x,并存储在R4.x中。但有时我会接到类似于MUL\uuuuuuuuuu

我正试图在GLSL中编写一个光线投射着色器,但速度慢得令人无法忍受。所以我安装了AMD的“GPU着色器分析器”,所以我可以看看实际生成的是什么。我把它从2帧提高到12帧,但这仍然不是很好

我觉得我可以提高它,但我被困在三点

  • 奇怪的下划线:我得到了添加R1.x,R0.x,-C6.x所做的;从R0.x中减去C6.x,并将其存储在R1.x中。与
    类似,添加R4.x、R1.x、R2.w、R4.x
    ;将R1.x和R2.w相乘,加上R4.x,并存储在R4.x中。但有时我会接到类似于
    MUL\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

  • 尾随的“E”:通常我的乘法被转换成
    mula、b、c
    。但有时我会看到
    多个a、b、c
    。这也发生在
    SQRT_e
    RSQ_e
    RCP_e

  • 魔法:我只是不明白这些说明

  • LOOP\u DX10 i0 FAIL\u JUMP\u ADDR(10)VALID\u PIX
    Begin LOOP。但参数是什么
  • ALU_BREAK:ADDR(48)CNT(3)
    不知道
  • SETGT_INT R0.y,350,R3.y
    我的for循环的i<350,但是其他的是什么
  • PREDNE\u INT,R0.y,0.0f
    是否可以将i设置为0?但是为什么是浮点0呢
  • ALU-PUSH\u-BEFORE:ADDR(51)CNT(34)
    PUSH让我想到了堆栈
  • PREDGT\uu,R0.x,R3.x
    没有线索
  • 跳转POP\u CNT(1)ADDR(8)VALID\u PIX
    无条件跳转,但是什么是POP\u CNT
  • ALU:ADDR(85)CNT(1)
    Whoosh
  • 断开地址(9)
    跳转到9
  • POP(1)ADDR(8)
    是否从堆栈中删除帧?为什么是8
  • ENDLOOP i0 PASS\u JUMP\u ADDR(2)
    结束从loop\u DX10开始的循环
  • CNDE_INT R0.x,R2.z,0.0f,1065353216
    x=q?a:b,但我不知道哪个变量是哪个
有人能解释一下吗?我找不到前两个的任何文档,最后一个的文档我也不理解。不幸的是,我以前从未做过任何汇编。

我发现了这个和这个描述汇编语言的东西,这解释了你在汇编中发现的一些助记符

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

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


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

谢谢!看起来我现在有一些阅读要做,但通过快速浏览,它解决了我所困惑的问题。:)我是用GLSL编写的,但是查看程序集,看看瓶颈在哪里(或者不可能加快速度)。