当我想从内核中榨取最后一点性能时,我通常会发现替换 逻辑运算符 ( &&
和 ||
)与 按位运算符 ( &
和 |
)使内核更快一点。这是通过查看 CUDA Visual Profiler 中的内核时间摘要观察到的。
那么,为什么是按位运算符 更快 比 CUDA 中的逻辑运算符?我必须承认,它们并不总是更快,但很多时候它们都是如此。我想知道什么魔法可以使这种加速。
免责声明:我知道逻辑运算符短路和位运算符没有。我很清楚这些运算符如何被滥用,从而导致错误的代码。仅当结果逻辑保持不变时,我才小心使用此替换,有加速并且因此获得的加速对我很重要:-)
最佳答案
逻辑运算符通常会导致分支,尤其是在需要遵守短路评估规则时。对于普通 CPU,这可能意味着分支预测错误,而对于 CUDA,这可能意味着扭曲发散。按位运算不需要短路评估,因此代码流是线性的(即无分支)。
关于CUDA:为什么按位运算符有时比逻辑运算符快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9906774/