c++ - 我应该用 'if' 语句统一两个相似的内核,冒着性能损失的风险吗?

标签 c++ c optimization cuda gpgpu

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

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

if 语句会在多大程度上影响我的算法性能?
我知道没有分支,因为所有 block 中的所有线程都会进入 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>();

关于c++ - 我应该用 'if' 语句统一两个相似的内核,冒着性能损失的风险吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6179295/

相关文章:

c++ - boost 条件变量 - 是否调用 "notify_one"堆栈?

c - 通过 union 别名

c++ - 为什么 clang 和 gcc 重复代码和分支 vs 无条件跳转到循环内?

java - 对该应用程序进行编程的更好方法是什么?

c++ - 在 Windows 上使用 openssl 库生成随 secret 钥/数据

c++ - 如何使用 WaitForSingleObject

c++ - 使用 OpenCV 改进文本二值化/OCR 预处理

c++ - 在数字常量之前应为 ',' 或 '...'

c - 编译器或处理器在运行时如何区分静态局部变量?

c - 是否有 C 函数的时间(成本)表?