我是否应该使用\'if\'语句统一两个类似的内核,否则会导致性能损失?

| 我有2个非常相似的内核函数,就代码而言,它们几乎是相同的,但略有不同。目前,我有2个选择: 编写2种不同的方法(但非常相似) 编写一个内核并将不同的代码块放入if / else语句中 if语句会在多大程度上影响我的算法性能? 我知道没有分支,因为所有块中的所有线程都将输入if或else。 那么如果多次调用内核函数,一条if语句会降低我的性能吗?     
已邀请:
        您还有第三种选择,即使用C ++模板并将if / switch语句中使用的变量设为模板参数。实例化所需的每个内核版本,然后让多个内核执行不同的操作而无需担心分支分歧或条件评估,因为编译器将优化无效代码及其分支。 也许是这样的:
template<int action>
__global__ void kernel()
{
    switch(action) {
       case 1:
       // First code
       break;

       case 2:
       // Second code
       break;
    }
}

template void kernel<1>();
template void kernel<2>();
    
        这会稍微降低您的性能,尤其是在内部循环中,这是因为您经常浪费指令发布槽,但它几乎不像扭曲那样发散。 如果这很重要,则可能值得将条件移到循环外。如果扭曲确实是发散的,请考虑如何删除分支:例如,而不是
if (i>0) {
    x = 3;
} else {
    x = y;
}
尝试
x = ((i>0)*3) | ((i<3)*y);
    

要回复问题请先登录注册