0
我知道x = m*a+d
這個表達式最有效的寫法是x = mad(m,a,d)
,因爲在彙編級別只需要一條指令而不是單獨的乘法和加法。我的問題是最優地寫下這個表達式:x += m*a
。 這應該寫成x = mad(m,a,x)
或x += m*a
?差別太微妙了,但我想知道是否有人可以在裝配層面看到差異。 (我不知道如何查看彙編代碼。)HLSL Shader使用MAD進行優化(m,a,d)
我知道x = m*a+d
這個表達式最有效的寫法是x = mad(m,a,d)
,因爲在彙編級別只需要一條指令而不是單獨的乘法和加法。我的問題是最優地寫下這個表達式:x += m*a
。 這應該寫成x = mad(m,a,x)
或x += m*a
?差別太微妙了,但我想知道是否有人可以在裝配層面看到差異。 (我不知道如何查看彙編代碼。)HLSL Shader使用MAD進行優化(m,a,d)
使用'fxc'編譯着色器並查看它打印出來的已編譯的DXBC。
在這種情況下,編譯器沒有問題確定x + = m * a;與x = mad(m,a,x)相同;所以生成的代碼將是相同的。
對於這兩個表達式得到的字節碼產生:
狂o0.x,v0.x,v0.y,v0.z
即使當爲x = M * A + d書面;編譯器可以自由地(並且確實)在DirectX字節碼中使用瘋狂的指令。以您描述的三種方式中的任何一種書寫方式都不會影響性能。
當我發佈了這個問題後,我花了兩個小時的時間想出如何查看彙編代碼並實現了你所提出的觀點。我沒有意識到編譯器做了很多優化。看來我試圖過度優化。 – 2015-04-02 19:08:46