我正在嘗試在GLSL中編寫一個光線投射着色器,它的速度令人難以忍受。所以我安裝了AMD的「GPU Shader Analyzer」,所以我可以查看實際生成的內容。我已經從2 FPS到12,但這仍然不是很棒。理解GPU拆卸問題
我覺得我可以改善它,但我堅持三點。
奇怪的下劃線:我得到了什麼呢
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」s:通常我的乘法運算會變成
MUL a, b, c
。但有時我看到MUL_e a, b, c
。這也發生在SQRT_e
,RSQ_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
我的循環有我< 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, 1065353216
x = q? a:b,但我不知道哪個變量是哪個。
有人能解釋一下嗎?前兩個我找不到任何文檔,我不明白最後的文檔。不幸的是,我從未做過任何集會。
謝謝!看起來我現在有一些閱讀要做,但從快速瀏覽中,它解決了我所困惑的問題。 :)我正在將它寫入GLSL,但是看着程序集看看瓶頸在哪裏(或者如果不可能加速更多)。 –