哪种代码效率更高:
常规A
local int a[5];
bool condition;
...
a[0] = 0;
if (condition) {
a[0] = 1;
}
或Routine B
local int a[5];
bool condition;
....
a[0] = 0;
a[0] = select(a[0], 1, condition);
第二个列表删除了分支,但如果condition为false,则select语句可以访问本地内存两次。希望如果条件为假,编译器会输入no-op。
答案 0 :(得分:1)
在低级代码和目标机器之间有一个编译器,编译器正在编译的目标机器将最终确定要生成的汇编代码。
例如,你不能说'删除if语句去掉分支'之类的东西,如果编译器决定使用compare和set指令而不是compare分支然后移动怎么办?
如果条件总是为假,则代码将被视为死代码,编译器可能决定不进行任何操作而不是无操作。
如果您设法生成与例程A和例程B相对应的汇编代码并获得目标机器的指令成本表,那么您将能够谈论机器代码效率。编译器通常会在其中嵌入这样的表,以尝试选择最合适的指令组合。
选择它看起来像是为矢量设计而不是单个值。最有可能的是,它可以使用对阵列进行操作的SIMP指令,而不仅仅是像我们手头的单个值。见OpenCL built-in function 'select'