2012-03-28 253 views
10

当我到挤压性能的最后一位出一个内核的,我通常会发现与位运算符&|)更换逻辑运算符&&||),使内核快一点点。通过查看CUDA Visual Profiler中的内核时间汇总可以看到这一点。CUDA:为什么按位运算符有时比逻辑运算符更快?

那么,为什么按位运算符比CUDA中的逻辑运算符要快?我必须承认,他们是并不总是更快,但他们很多次。我不知道什么魔法可以让这个加速。

声明:我知道逻辑运算符短路和按位运算符没有。我很清楚这些操作员如何被滥用导致错误的代码。我用这个替代小心只有当产生的逻辑是一样的,有一个加速,并由此获得了加速的问题给我:-)

+0

谢谢你提供了一个很棒的优化技巧! – 2012-03-28 16:49:58

+0

Roger:很高兴帮助!当我发现这一点时,我感到很惊讶:-) – 2012-03-29 00:04:11

回答

11

逻辑运算符经常会导致枝条,特别是当需要被观察到短路评价的规则。对于正常的CPU,这可能意味着分支预测失误,CUDA可能意味着分歧。按位操作不需要短路评估,因此代码流是线性的(即无分支)。

+1

此外,对于逻辑运算符,必​​须将非零结果设置为1. – 2012-03-28 16:54:35

+1

@Roger:true,但通常可以优化它,例如,如果表达式只是作为条件的一部分使用 - 只有在将结果分配给变量时,结果才真正需要设置为1。 – 2012-03-28 17:05:04

1

位运算可以在寄存器在硬件层次上进行。寄存器操作是最快的,当数据可以放入寄存器时尤其如此。逻辑操作涉及表达式评估,它可能不是寄存器绑定的。通常,&,|,^,>> ...是一些最快的操作,并在高性能逻辑中广泛使用。

6

甲& & B:

if (!A) { 
    return 0; 
} 
if (!B) { 
    return 0; 
} 
return 1; 

甲& B:

return A & B; 

这些是考虑到评估A和B可以有副作用的语义(它们可以是改变的状态的功能系统评估时)。

有许多方法,该编译器可以优化A && B情况下,取决于该类型A和B的和上下文。