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

OpenCL:更好地使用宏或函数?,opencl,Opencl,在OpenCL(即C-99)中,我们有两个选项来创建类似以下功能: 宏 功能 [编辑:或者使用模板语言,新选项3:-)] 我在某个地方听说过(在任何地方都找不到任何官方的引用,只是在stackoverflow的某个地方的评论中看到过一次),函数在实践中几乎总是内联的,因此使用函数在性能方面还可以吗 但根据宏的性质,基本上保证宏是内联的。但是容易受到bug的影响,例如,如果不在所有内容周围添加括号,并且不具有类型安全性 在实践中,什么效果好?最标准的是什么?什么可能是最便携的 我想我的要求是以

在OpenCL(即C-99)中,我们有两个选项来创建类似以下功能:

  • 功能
  • [编辑:或者使用模板语言,新选项3:-)]
我在某个地方听说过(在任何地方都找不到任何官方的引用,只是在stackoverflow的某个地方的评论中看到过一次),函数在实践中几乎总是内联的,因此使用函数在性能方面还可以吗

但根据宏的性质,基本上保证宏是内联的。但是容易受到bug的影响,例如,如果不在所有内容周围添加括号,并且不具有类型安全性

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

我想我的要求是以下几点的结合:

  • 尽快
  • 尽可能少的注册压力
  • 当与编译时常量一起使用时,理想情况下应保证优化到另一个常量
  • 易于维护
  • 标准的,不太奇怪,因为我正在考虑将其用于一个开源项目,我希望其他人能对此做出贡献
但根据宏的性质,基本上保证宏是内联的

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

虽然这确实依赖于实现,但我还没有看到一个不积极内联的GPU二进制文件。我对CPU OpenCL没有太多的工作,但我相信优化器策略可能类似,尽管硬件约束不同

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

让我们看看您的要求:

  • 尽快
  • 尽可能少的注册压力
  • 当与编译时常量一起使用时,理想情况下应保证优化到另一个常量
内联函数与宏一样快,不使用更多寄存器,并在可能的情况下进行优化

  • 易于维护
函数更易于维护宏。它们是类型安全的,可以很容易地重构,等等,这个列表将永远持续下去

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

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

函数在GPU上是内联的,但在OpenCL的CPU实现上可能不是这样。保证内联吗?这是否意味着如果我将#define常量传递到一个没有非#define输入的函数中,编译器会在编译时处理这个,并用一个常量替换函数调用?这不是保证,但根据我的经验,GPU实现了内联函数。酷。我更喜欢使用函数,如果我有信心的话,它们将被内联,积极地优化,你所说的是非常令人放心的。是否有任何官方来源/声明支持这一点?是适用于所有平台,还是仅适用于如nvidia?