2013-05-21 45 views
2

我正在嘗試在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_eRCP_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,但我不知道哪個變量是哪個。

有人能解釋一下嗎?前兩個我找不到任何文檔,我不明白最後的文檔。不幸的是,我從未做過任何集會。

回答

1

我找到了這個document和這個document描述了彙編語言,它解釋了你在程序集中找到的一些助記符。

在這個級別上,程序集非常專用於硬件;既然你已經使用了AMD工具,我想要尋找AMD設備文檔。如果NVIDIA使用不同的指令集,我不會感到驚訝。

由於您用glsl標記了問題,可能您的方式不正確。OpenGL着色語言的使用是因爲可移植性,因爲它是一個開放的行業標準;相反,使用匯編程序將程序與特定的圖形卡系列結合在一起。例如,我的程序運行在Linux和Windows上,以及NVIDIA,AMD和Intel的各種GPU上(這並不容易,但令人滿意)。

如果仍想便攜性,你是如此的勇敢寫GPU組件,可以實現使用ARB組件(vertexfragment)計劃,但我從來沒有嘗試過(你給我找一個很好的啓示,開始另一個旅程)。

+0

謝謝!看起來我現在有一些閱讀要做,但從快速瀏覽中,它解決了我所困惑的問題。 :)我正在將它寫入GLSL,但是看着程序集看看瓶頸在哪裏(或者如果不可能加速更多)。 –