2016-06-28 64 views
0

相當一段時間以來,我一直在迴避,而不是像這樣剖析圖形着色器

float invert_value_ifless(in float value) 
{ 
float sign_value = sign(value); 
float sign_value_squared = sign_value*sign_value; 
return sign_value_squared/(value + sign_value_squared - 1.0); 
} 

float invert_value(in float value) 
{ 
if(value == 0.0) 
    return 0.0; 
else 
    return 1.0/value; 
} 

寫「聰明」的代碼在我的shader代碼分支,這將返回什麼第一個函數確實沒有分支,因此速度更快。

是這樣嗎?我在這裏與幽靈戰鬥嗎?

如何分析圖形着色器的速度?我最近對最近的移動平臺(Android)感興趣,但任何關於圖形分析的建議都將受到歡迎!

+1

「*我是鬼打架嗎?*」 [是,你是。(http://stackoverflow.com/q/37827216/734069) –

+0

優秀的答案有尼科爾。 – Leszek

+0

這是否與幽靈戰鬥呢?而不是 如果(a> 0時)B =(1-α)/(2-A) 否則B =(1 +α)/(2 +α) 寫入 SIGNA =符號(一); b =(1-signA * a)/(2-signA * a); ? – Leszek

回答

1

它往往仍然是,你可能最初認爲的原因 - 一個GPU經常被實現爲一個非常寬的SIMD處理器,所以執行相同的操作每個像素允許一次,而採摘處理了很多人每個像素的不同操作使得這個微積分更有問題。這就是爲什麼像step這樣的運營在GLSL中生存的原因。一個好的GLSL編譯器通常可以消除編譯時條件,並且可以通過其他方式使分支代碼不分支,但GLSL編譯器通常不如普通離線語言編譯器好,因爲它們有自己的性能預算來擔心。

我是一個專業的iOS人員,所以我可以詳細地談談Xcode框架分析器的奇妙之處,並且會爲完整答案帶來好處,但是我很抱歉無法提供有關Android的更多信息。

在Xcode中有一個幀捕獲按鈕。點擊它,將爲單個幀捕獲完整的OpenGL命令流。從那裏你可以檢查所有狀態和緩衝區,就像每個OpenGL命令之前和之後一樣。每次通話所花費的時間將被報告。比這更好的是,你的GLSL代碼本身將被分析到行級別 - 每行代碼的μs將被報告。而且,真正把它放在邊緣,你可以直接在那裏重寫你的GLSL代碼,並重新運行捕獲的框架,以瞭解你的成本會發生什麼。或者僅僅作爲一個快速反饋的GLSL作者環境,儘管這不是真正的工具。

0

所有主要的GPU製造商在Android上有自己的GPU性能分析工具,做大致相同Xcode的幀捕獲。 ARMQualcommPowerVR

這樣的事情必須進行測量,不幸的是,由於Android用戶因各種原因而未更新的問題,野外駕駛員的質量是可變的。

+0

是的,我試圖使用Adreno Profiler ATM,但由於某種原因,當我將它連接到手機時,'找不到adreno profiler enabled app'.... 我會嘗試一些:) – Leszek

+0

是的,我的GPU分析工具的經驗一般是挫敗感。如果您正在尋找快捷方式,我知道PowerVR的着色器編輯器可以對各種GPU架構進行循環計數估計,而無需在設備上運行着色器(我希望其他供應商具有類似的功能,但我不知道當然)。得出想法可能就足夠了。 – Columbo