OpenCL:使用宏还是函数更好?
OpenCL: better to use macros or functions?
在 C-99 的 OpenCL 中,我们有两种创建类似函数的选项:
- 宏
- 函数
- [编辑:嗯,或者使用模板语言,新选项 3 :-)]
我在某处听说(在任何地方都找不到任何官方参考,只是在 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)。由你决定。
在 C-99 的 OpenCL 中,我们有两种创建类似函数的选项:
- 宏
- 函数
- [编辑:嗯,或者使用模板语言,新选项 3 :-)]
我在某处听说(在任何地方都找不到任何官方参考,只是在 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)。由你决定。