Ash*_*ppa 11 cuda bitwise-operators logical-operators
当我到挤压性能的最后一位出一个内核的,我通常会发现更换逻辑运算符(&&和||有)位运算符(&和|),使内核快一点点.通过查看CUDA Visual Profiler中的内核时间摘要可以观察到这一点.
那么,为什么bitwise运算符比CUDA中的逻辑运算符更快?我必须承认,它们并不总是更快,但很多时候它们都是.我想知道什么魔法可以给这个加速.
免责声明:我知道逻辑运算符短路和按位运算符不会.我很清楚如何滥用这些操作符导致错误的代码.我只是在结果逻辑保持不变的情况下小心使用这个替换,加速并且由此获得的加速对我来说很重要:-)
Pau*_*l R 12
逻辑运算符通常会导致分支,特别是在需要遵守短路评估规则时.对于普通的CPU,这可能意味着分支错误预测,对于CUDA,它可能意味着扭曲分歧.按位运算不需要短路评估,因此代码流是线性的(即无分支).
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的类型以及上下文.
| 归档时间: |
|
| 查看次数: |
5215 次 |
| 最近记录: |