Optimization GPU优化:我应该避免逻辑还是逻辑?

Optimization GPU优化:我应该避免逻辑还是逻辑?,optimization,shader,gpu,cg,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做了一些条件逻辑

我开始在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不同,第二个和第三个操作数中的表达式中的副作用总是被执行,而与条件无关

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

And(&&)将仅计算右侧操作数 如果左侧操作数的计算结果为true。或(| |)仅在左操作数 手动操作数计算为false

对于条件运算符

只有 计算第二个和第三个表达式之一


你确定吗?此运算符具有短路语义,并且不应在部分结果之一不为零时立即计算进一步的步骤。您是对的,我没有想到短路。将更改我的答案。这是不正确的。像这样的GPU语言通常不同于的短路语义,即使发现一个表达式为真,也会对所有表达式求值。这正是因为短路语义有时需要分支。对于cg来说,这是正确的。没有短路语义。对于glsl 4.4有。您使用的是短路布尔or(
|
)。除非可以有条件地执行
步骤
本身,否则在没有分支的情况下无法执行此操作。您是否打算使用按位or(
|
)呢?它对布尔函数也同样有效,但可以避免可能不必要的短路开销。瞧,您首先需要回答的问题是:
step
的成本是否足以保证围绕它进行分支?