GPU优化:我应该避免逻辑OR吗?

时间:2016-02-03 14:53:16

标签: optimization shader gpu cg

我开始在Cg中编写一些着色器代码。我已经读过GPU不能很好地处理分支条件,但我不确定这对我作为程序员意味着什么。 更确切地说,我试图了解哪些结构具有性能成本。

例如,我有一些看起来像这样的代码:

bool v = step( _Margin, c.y) 
         || step( _Margin, c.x) 
         || !step( 1-_Margin, c.x) 
         || !step( 1-_Margin, c.y);

在我看来,该语句中的逻辑OR执行一些条件逻辑,在变量true 中放置v值如果满足某些条件。这是分支:是否可以,或者如果没有,我应该采取另一种方式吗?

我不想在过早的优化路径上走得太远,但我也想知道这里发生了什么。

1 个答案:

答案 0 :(得分:-1)

最后我做了一些调查(即使确定答案也是必要的!)

根据Cg语​​言规范:

  

&&&和||总是被评估;没有像C中那样的短路。

甚至对于条件运算符(?:)

  

与C不同,无论条件如何,总是会执行第二个和第三个操作数中表达式的副作用。

http://http.developer.nvidia.com/Cg/Cg_language.html

有趣的是,GLSL在这里有所不同:

  

而且(&&)只评估右手操作数   如果左手操作数评估为真。或者(| |)仅评估左侧的右侧操作数   手操作数评估为假

用于条件运算符

  

只有   评估第二个和第三个表达式之一。

https://www.opengl.org/registry/doc/GLSLangSpec.4.40.pdf