在没有分支的情况下在 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 分析器的 线程执行效率 列中观察到这一点。