在没有分支的情况下在 CUDA 中进行比较
Compare in CUDA without branching
我正在尝试在 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 分析器的 线程执行效率 列中观察到这一点。
我正在尝试在 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 分析器的 线程执行效率 列中观察到这一点。