设置局部变量时删除分支

时间:2015-02-05 21:30:14

标签: opencl

哪种代码效率更高:

常规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。

1 个答案:

答案 0 :(得分:1)

在低级代码和目标机器之间有一个编译器,编译器正在编译的目标机器将最终确定要生成的汇编代码。

例如,你不能说'删除if语句去掉分支'之类的东西,如果编译器决定使用compare和set指令而不是compare分支然后移动怎么办?

如果条件总是为假,则代码将被视为死代码,编译器可能决定不进行任何操作而不是无操作。

如果您设法生成与例程A和例程B相对应的汇编代码并获得目标机器的指令成本表,那么您将能够谈论机器代码效率。编译器通常会在其中嵌入这样的表,以尝试选择最合适的指令组合。

选择它看起来像是为矢量设计而不是单个值。最有可能的是,它可以使用对阵列进行操作的SIMP指令,而不仅仅是像我们手头的单个值。见OpenCL built-in function 'select'