2016-08-04 60 views
2

作爲GLSL着色器的新手,我注意到在我的舊上網本中,爲完美運行的着色器添加一行代碼可能會突然使執行時間增加數千倍。什麼導致GLSL着色器的性能突破點?

例如該片段着色器立即運行而limit的值是32或更低,需要10秒運行一次limit的值是33:

int main() 
{ 
    float limit=33.;//runs instantly if =32. 
    float useless=0.5; 
    for(float i=0.;i<limit;i++) useless=useless*useless; 
    gl_FragColor=useless*vec4(1.,1.,1.,1.); 
} 

什麼混淆我以及是加一個或多個useless自乘法的32圈循環不會導致急劇的時間增加。

這是一個沒有for循環的例子。它運行在我的電腦上一毫秒內有6次sin計算,並添加第七一人突然使得程序花費約500ms的運行:

int main() 
{ 
    float useless=gl_FragCoord.x; 
    useless=sin(useless); 
    useless=sin(useless); 
    useless=sin(useless); 
    useless=sin(useless); 
    useless=sin(useless); 
    useless=sin(useless); 
    useless=sin(useless);//the straw that breaks the shader's back 
    gl_FragColor=useless*vec4(1.,1.,1.,1.); 
} 

在我自己不太過時的計算機,編譯時間變得之前太大我可以找到這樣一個突破點。

在我的上網本上,我預計隨着操作的增加,運行時間會不斷增加。

我想知道是什麼原因導致這些突然的飛躍,因此如果這是一個問題,我應該地址,計劃瞄準相當廣泛的蒸汽觀衆。如果有用,這裏是上網本我正在做我的測試http://support.hp.com/ch-fr/document/c01949780和它的芯片組http://ark.intel.com/products/36549/Intel-82945GSE-Graphics-and-Memory-Controller

另外我不知道它是否重要,但我使用SFML運行着色器。

回答

4

根據intel,GMA 950支持硬件着色器模型2和軟件着色器模型3。根據microsoft,着色器模型2對指令計數(64個ALU和32個tex指令)的限制相當苛刻。

我的猜測是,當超過此指令數時,intel驅動程序決定在軟件中進行陰影處理,這會與您所看到的糟糕表現相匹配。

sin函數可能展開爲多條指令。循環可能會被展開,導致更高的指令數和更高的限制。爲什麼在循環外添加第33次乘法不會觸發這個我不知道的事情。

來決定你是否應該解決這個問題,我可以推薦unity hardware statssteam hardware survey。總之我會說着色器模型2是你需要支持的東西:)