我正在尝试在CUDA中实现以下功能:
int compare(unsigned a, unsigned b) {
if (a == b) {
return 0;
} else {
if (a < b) return -1;
else return 1;
}
}
我目前正在使用一个非常幼稚的宏
#define CMP(X, Y) (((X) == (Y)) ? 0 : (((X) < (Y)) ? -1 : 1))
但我想知道是否由于分支而引起分歧。有没有更好的方法在CUDA中实现此功能?
您可以使用无分支等效项,即:
(a > b) - (a < b)
这解决了潜在的翘曲发散。
在您的代码中,nvcc
编译器可以通过使用分支谓词来消除歧义。但是,即使采用了这种技术,有些变形也可能不起作用。您可能会在NSight Visual Studio探查器的“线程执行效率”列中看到此代码中特定语句的情况。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句