我开始用Cg编写一些着色器代码。我读过 GPU 不能很好地处理分支条件,但我不确定这对我作为程序员意味着什么。更准确地说,我试图了解哪些结构具有性能成本。
例如,我有一些代码看起来像这样:
bool v = step( _Margin, c.y)
|| step( _Margin, c.x)
|| !step( 1-_Margin, c.x)
|| !step( 1-_Margin, c.y);
在我看来,该语句中的逻辑 OR 执行一些条件逻辑,如果满足一组特定条件,则在变量v
中放置一个true
值。这是分支吗:可以吗,或者如果不能,我应该以另一种方式进行吗?
我不想在过早的优化道路上走得太远,但我也想了解这里发生了什么。
做了一些调查(即使确定答案也是必要的!
根据Cg语言规范:
&&和||的两边总是被评估;没有像C那样的短路。
甚至对于条件运算符 (?:)
与 C 不同,无论条件如何,都会执行第二个和第三个操作数中表达式中的副作用。
http://http.developer.nvidia.com/Cg/Cg_language.html
有趣的是,GLSL 在这里有所不同:
并且 (&&( 将仅计算右手操作数 如果左操作数的计算结果为 true。或者 ( | | ( 将仅计算右操作数,如果左操作数 手操作数计算为 false
对于条件运算符
只 计算第二个和第三个表达式之一。
https://www.opengl.org/registry/doc/GLSLangSpec.4.40.pdf