我应该用“if”语句来统一两个类似的内核,冒着性能损失的风险吗?

我有两个非常相似的内核函数,代码几乎相同,但略有不同。 目前我有2个选项:

  • 写2种不同的方法(但非常相似)
  • 编写一个单独的内核,并将不同的代码块放在if / else语句中

if语句会影响我的algorithm性能多less?
我知道没有分支,因为所有块中的所有线程都将进入if或else。
那么如果内核函数被调用了很多次,那么单个if语句是否会降低我的性能呢?

您有第三种select,即使用C ++模板,并将if / switch语句中使用的variables设置为模板参数。 实例化你需要的每一个版本的内核,然后你有多个内核做不同的事情,没有分支分歧或条件评估担心,因为编译器会优化掉死代码和分支。

也许是这样的:

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>(); 

它会稍微降低你的performance,尤其是在内部循环中,因为你每隔一段时间浪费一个指令问题槽,但它不如经线发散。

如果这是一个大问题,那么可以将这个条件移到循环之外。 如果变形是真的分歧,但是,想想如何去除分支:例如,而不是

 if (i>0) { x = 3; } else { x = y; } 

尝试

 x = ((i>0)*3) | ((i<3)*y);