在没有分支的CUDA中进行比较

在没有分支的CUDA中进行比较,c,cuda,comparison,C,Cuda,Comparison,我试图在CUDA中实现以下功能: int compare(unsigned a, unsigned b) { if (a == b) { return 0; } else { if (a < b) return -1; else return 1; } } int比较(无符号a、无符号b){ 如果(a==b){ 返回0; }否则{ 如果(a

我试图在CUDA中实现以下功能:

int compare(unsigned a, unsigned b) {
    if (a == b) {
        return 0;
    } else {
        if (a < b) return -1;
        else return 1;
    }
}
int比较(无符号a、无符号b){
如果(a==b){
返回0;
}否则{
如果(a
我目前使用的是一个相当幼稚的宏

#define CMP(X, Y) (((X) == (Y)) ? 0 : (((X) < (Y)) ? -1 : 1))
定义CMP(X,Y)((X)=(Y))?0:((X<(Y))?-1:1))

但我想知道它是否因为分支而导致了发散。有没有更好的方法在CUDA中实现此功能?

您可以使用无分支的等效方法,即:

(a > b) - (a < b)
(a>b)-(a
这解决了潜在的扭曲发散


在您的代码中,
nvcc
编译器可以使用分支谓词消除分歧。但是,即使使用这种技术,翘曲中的一些THRED也可能是不活动的。对于代码中的特定语句,您可能会在NSight Visual Studio profiler的“线程执行效率”列中看到这一点

这是一种错误的优化方法。这样的问题很多。如果你研究其中的任何一种,你会发现编译器会积极使用诸如谓词之类的东西来消除在这样简单的代码中进行分支的需要。我不知道诸如分支谓词之类的技术。很高兴知道