If statement 无if语句的分支
是否可以不使用If statement 无if语句的分支,if-statement,language-agnostic,If Statement,Language Agnostic,是否可以不使用if语句来分支代码?是的,您可以,GPU风格 假设您有一个分支的函数,并在末尾返回一个值 float function( float input ) { if( input > 0 ) { // do stuff finalValue = 2+4+8*input; return finalValue ; } else { // do other stuff
if
语句来分支代码?是的,您可以,GPU风格
假设您有一个分支的函数,并在末尾返回一个值
float function( float input )
{
if( input > 0 )
{
// do stuff
finalValue = 2+4+8*input;
return finalValue ;
}
else
{
// do other stuff
finalValue = 1+input;
return finalValue ;
}
}
要在没有分支的情况下实现这一点,您可以编写GPU风格的代码:即,计算两个分支,然后在最后扔掉您不想要的分支
float function( float input )
{
if( input > 0 )
{
// do stuff
finalValue = 2+4+8*input;
return finalValue ;
}
else
{
// do other stuff
finalValue = 1+input;
return finalValue ;
}
}
好了。没有分支的分支,没有if语句的if语句。取决于“分支”和“if”的含义。以下任何分支,不带“如果” 或三元运算符,如果不计算:
x == 0 ? doFunc1() : doFunc2()
如果您的语言支持函数指针:
funcArray[selectedOption]()
你可以愚蠢地做:
boolean once = true;
while (condition && once) {
doAWhichNeverReturns();
once = false;
}
doB();
但是我不认为这真的回答了你的问题,因为我不知道你想做什么。但是实际的
如果input>0
表达式中仍然存在,只有语法发生了变化。从性能的角度来看,它可能比原来的更差,因为它有两个evaluation@icepack:我想你错了,这里没有if
。最重要的是,此代码从不分支或跳转,因此不会停止指令pipelines@mvp在语法上没有if
,但在语义上它出现在input>0
表达式中,这将产生类似于if
的汇编代码。见下面的@James答案。我同意管道系统。@icepack:不太同意<例如,x86上的code>input>0
只是一条cmp
指令,它纯粹是算术指令-CMPA,b
设置测试标志,就好像您已经计算了a-b
。“分支”仅在使用条件跳转指令(例如,ja
或jg
)时发生,该指令不会由该代码生成。我正在简化处理浮点数的细节,虽然有点不同,但原则是成立的。@JonPurdy是的,它设置了标志。接下来对结果做了什么?我试图弄清楚GPU是如何分支的,因为我读了很多地方。就是在那里我意识到这就是你能做到的。
boolean once = true;
while (condition && once) {
doAWhichNeverReturns();
once = false;
}
doB();