CUDA:为什么按位运算符有时比逻辑运算符更快?

Ash*_*ppa 11 cuda bitwise-operators logical-operators

当我到挤压性能的最后一位出一个内核的,我通常会发现更换逻辑运算符(&&||有)位运算符(&|),使内核快一点点.通过查看CUDA Visual Profiler中的内核时间摘要可以观察到这一点.

那么,为什么bitwise运算符比CUDA中的逻辑运算符更快?我必须承认,它们并不总是更快,但很多时候它们都是.我想知道什么魔法可以给这个加速.

免责声明:我知道逻辑运算符短路和按位运算符不会.我很清楚如何滥用这些操作符导致错误的代码.我只是在结果逻辑保持不变的情况下小心使用这个替换,加速并且由此获得的加速对我来说很重要:-)

Pau*_*l R 12

逻辑运算符通常会导致分支,特别是在需要遵守短路评估规则时.对于普通的CPU,这可能意味着分支错误预测,对于CUDA,它可能意味着扭曲分歧.按位运算不需要短路评估,因此代码流是线性的(即无分支).


Rog*_*ahl 7

A && B:

if (!A) {
  return 0;
}
if (!B) {
  return 0;
}
return 1;
Run Code Online (Sandbox Code Playgroud)

A&B:

return A & B;
Run Code Online (Sandbox Code Playgroud)

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

编译器可以通过多种方式优化A && B案例,具体取决于A和B的类型以及上下文.