OpenCL:更好地使用宏或函数?

时间:2015-02-19 06:41:55

标签: opencl

在OpenCL中,这是C-99,我们有两个选项来创建类似函数的东西:

  • 功能
  • [编辑:好,或使用模板语言,新选项3 :-)]

我听到了某个地方(无法在任何地方找到任何官方引用,只是在stackoverflow上的某个地方看到它,一次),这些函数几乎总是在实践中内联,因此使用函数是好的性能-wise?

但宏基本上保证内联宏。但容易受到错误的影响,例如,如果不在所有内容周围添加括号,而不是类型安全。

在实践中,哪有效?什么是最标准的?什么可能最便携?

我认为我的要求是以下的组合:

  • 尽快
  • 注册压力尽可能小
  • 与编译时常量一起使用时,理想情况下应保证优化 - 远离另一个常量
  • 易于维护......
  • 标准,不太奇怪,因为我正在考虑将此用于开源项目,我希望其他人能为此做出贡献

1 个答案:

答案 0 :(得分:5)

  

但宏基本上保证内联宏。

至少在GPU上,除了递归函数(OpenCL 2.0)之外,OpenCL编译器积极地内联几乎所有东西。这是出于硬件限制和性能原因。

虽然这确实依赖于实现,但我还没有看到没有积极内联的GPU二进制文件。我对CPU OpenCL的工作量不大,但我认为优化器策略可能类似,尽管硬件限制不一样。

但就标准而言,没有任何保证。

让我们完成您的要求:

  
      
  • 尽快
  •   
  • 注册压力尽可能小
  •   
  • 与编译时常量一起使用时,理想情况下应保证优化 - 远离另一个常量
  •   

内联函数与宏一样快,不使用更多寄存器,并在可能的情况下进行优化。

  
      
  • 易于维护......
  •   

的功能更容易维护这些宏。它们是类型安全的,它们可以很容易地重构,等等,这个列表会永远存在。

  
      
  • 标准,不太奇怪,因为我正在考虑将其用于开源项目,我希望其他人能为此做出贡献
  •   

我认为这是非常主观的。我个人非常讨厌宏,并像瘟疫一样避开它们。但我知道一些非常成功的项目,它们广泛使用它们(例如Boost.Compute)。这取决于你。