我开始在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
值如果满足某些条件。这是分支:是否可以,或者如果没有,我应该采取另一种方式吗?
我不想在过早的优化路径上走得太远,但我也想知道这里发生了什么。
答案 0 :(得分:-1)
最后我做了一些调查(即使确定答案也是必要的!)
根据Cg语言规范:
&&&和||总是被评估;没有像C中那样的短路。
甚至对于条件运算符(?:)
与C不同,无论条件如何,总是会执行第二个和第三个操作数中表达式的副作用。
http://http.developer.nvidia.com/Cg/Cg_language.html
有趣的是,GLSL在这里有所不同:
而且(&&)只评估右手操作数 如果左手操作数评估为真。或者(| |)仅评估左侧的右侧操作数 手操作数评估为假
用于条件运算符
只有 评估第二个和第三个表达式之一。