OpenCL:使用宏还是函数更好?

OpenCL: better to use macros or functions?

在 C-99 的 OpenCL 中,我们有两种创建类似函数的选项:

我在某处听说(在任何地方都找不到任何官方参考,只是在 Whosebug 某处的评论中看到过一次),函数在实践中几乎总是内联的,因此使用函数是好的性能-明智的?

但是根据宏的本质,基本上可以保证宏是内联的。但容易出现错误,例如,如果不在所有内容周围添加括号,并且类型不安全。

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

我想我的要求是以下的某种组合:

But macros are basically guaranteed to be inlined, by the nature of macros.

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

虽然这确实取决于实现,但我还没有看到没有积极内联的 GPU 二进制文件。我不经常使用 CPU OpenCL,但我相信优化器策略可能相似,尽管硬件限制不一样。

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

让我们看看您的要求:

  • as fast as possible
  • as little register pressure as possible
  • when used with compile-time constants, should ideally be guaranteed to be optimized-away to another constant

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

  • easy to maintain...

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

  • standard, not too weird, since I'm looking at using this for an opensource project, that I hope other people will contribute to

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