在没有分支的情况下比较CUDA

Fil*_*ffa 2 c comparison cuda

我想在CUDA中实现以下功能:

int compare(unsigned a, unsigned b) {
    if (a == b) {
        return 0;
    } else {
        if (a < b) return -1;
        else return 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

我目前正在使用一个非常天真的宏

#define CMP(X, Y) (((X) == (Y)) ? 0 : (((X) < (Y)) ? -1 : 1))
Run Code Online (Sandbox Code Playgroud)

但我想知道它是否因分支而引起分歧.有没有更好的方法在CUDA中实现这个功能?

Grz*_*ski 5

您可以使用无分支等价物,即:

(a > b) - (a < b)
Run Code Online (Sandbox Code Playgroud)

这解决了潜在的扭曲分歧.

在您的代码中,nvcc编译器可以使用分支预测来消除分歧.但是,即使使用这种技术,经线中的一些荆棘也可能不活跃.您可以 在NSight Visual Studio探测器的" 线程执行效率"列中查看代码中的特定语句.