Glsl 理解GPU反汇编的困难
我正试图在GLSL中编写一个光线投射着色器,但速度慢得令人无法忍受。所以我安装了AMD的“GPU着色器分析器”,所以我可以看看实际生成的是什么。我把它从2帧提高到12帧,但这仍然不是很好 我觉得我可以提高它,但我被困在三点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
- 奇怪的下划线:我得到了添加R1.x,R0.x,-C6.x所做的;从R0.x中减去C6.x,并将其存储在R1.x中。与
;将R1.x和R2.w相乘,加上R4.x,并存储在R4.x中。但有时我会接到类似于类似,添加R4.x、R1.x、R2.w、R4.x
MUL\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
- 尾随的“E”:通常我的乘法被转换成
。但有时我会看到mula、b、c
。这也发生在多个a、b、c
、SQRT_e
和RSQ_e
中RCP_e
- 魔法:我只是不明白这些说明
Begin LOOP。但参数是什么LOOP\u DX10 i0 FAIL\u JUMP\u ADDR(10)VALID\u PIX
不知道ALU_BREAK:ADDR(48)CNT(3)
我的for循环的i<350,但是其他的是什么SETGT_INT R0.y,350,R3.y
是否可以将i设置为0?但是为什么是浮点0呢PREDNE\u INT,R0.y,0.0f
PUSH让我想到了堆栈ALU-PUSH\u-BEFORE:ADDR(51)CNT(34)
没有线索PREDGT\uu,R0.x,R3.x
无条件跳转,但是什么是POP\u CNT跳转POP\u CNT(1)ADDR(8)VALID\u PIX
WhooshALU:ADDR(85)CNT(1)
跳转到9断开地址(9)
是否从堆栈中删除帧?为什么是8POP(1)ADDR(8)
结束从loop\u DX10开始的循环ENDLOOP i0 PASS\u JUMP\u ADDR(2)
x=q?a:b,但我不知道哪个变量是哪个CNDE_INT R0.x,R2.z,0.0f,1065353216
glsl
,可能您走错了方向。使用OpenGL着色语言是因为可移植性,因为它是一个开放的行业标准;相反,使用assembly可以将程序与特定的图形卡系列耦合。例如,我的程序在Linux和Windows上运行,在NVIDIA、AMD和Intel的各种GPU上运行(这并不容易,但令人满意)
如果您仍然想要可移植性,并且非常勇敢地编写GPU汇编,您可以使用ARB汇编(和)实现程序,但我从未尝试过(您现在给了我一个很好的灵感,让我开始另一个旅程)。谢谢!看起来我现在有一些阅读要做,但通过快速浏览,它解决了我所困惑的问题。:)我是用GLSL编写的,但是查看程序集,看看瓶颈在哪里(或者不可能加快速度)。