问题描述
|
我有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);