我是否应该使用'if'语句统一两个类似的内核,从而有降低性能的风险?

lin*_*ina 34 c c++ optimization cuda gpgpu

我有2个非常相似的内核函数,在某种意义上代码几乎相同,但略有不同.目前我有2个选择:

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

if语句对我的算法性能有多大影响?
我知道没有分支,因为所有块中的所有线程都将输入if或else.
如果内核函数被多次调用,那么单个if语句会降低我的性能吗?

tal*_*ies 94

您有第三种方法,即使用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>();
Run Code Online (Sandbox Code Playgroud)

  • @talonmies ...这个答案是我见过的最有帮助的答案.我的代码中CUDA内核的数量减少了大约4倍.:) (5认同)
  • 非常聪明.我喜欢. (3认同)
  • 这使得我见过的每一个代码看起来都很难看! (3认同)
  • @talonmies很棒! (2认同)
  • 模板对于传递线程块大小非常有用。它使块的大小保持静态,同时适应特定的 GPU 计算能力。(无法以相同的方式使用 C 中的 #define 指令。)参见 matrixmul.cu 示例。 (2认同)