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

标签 cuda bitwise-operators logical-operators

当我想从内核中榨取最后一点性能时,我通常会发现替换 逻辑运算符 ( &&|| )与 按位运算符 ( &| )使内核更快一点。这是通过查看 CUDA Visual Profiler 中的内核时间摘要观察到的。

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

免责声明:我知道逻辑运算符短路和位运算符没有。我很清楚这些运算符如何被滥用,从而导致错误的代码。仅当结果逻辑保持不变时,我才小心使用此替换,有加速并且因此获得的加速对我很重要:-)

最佳答案

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

关于CUDA:为什么按位运算符有时比逻辑运算符快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9906774/

相关文章:

C - if-else 语句的不合理结果

c++ - 无法将偏移索引计算到 3D 数组中

c++ - 在 cuda-gdb 中数组值更改时设置断点

c - cuda共享内存静态分配错误

c - 在公投中使用 C 位运算符 - 作业

c - 如何仅使用按位运算符来防止 C 中的位溢出

c# - 在 C# 中,BitArray 获取位值的速度是否比简单的位移运算更快?

常量 for 循环产生错误的结果

swift - 为什么负数的计算中会包含 "sign bit"?

logical-operators - IF 语句中逻辑条件的组合