在OpenCL中,这是C-99,我们有两个选项来创建类似于函数的东西:
宏
功能
[编辑:好吧,或使用模板语言,新选项3 :-)]
我听说过某处(在任何地方找不到任何官方引用,只是在stackoverflow上的某个地方看到它,一次),这些函数几乎总是在实践中内联,因此使用函数在性能方面是否正常?
但宏基本上保证内联宏.但容易受到错误的影响,例如,如果不在所有内容周围添加括号,而不是类型安全.
在实践中,哪有效?什么是最标准的?什么是最便携的?
我想我的要求是以下几种组合:
尽可能快地
注册压力尽可能小
当与编译时常量一起使用时,理想情况下应保证优化 - 远离另一个常量
易于维护......
标准,不是太奇怪,因为我正在考虑将其用于开源项目,我希望其他人会为此做出贡献
user703016.. 5
但宏基本上保证内联宏.
至少在GPU上,除了递归函数(OpenCL 2.0)之外,OpenCL编译器积极地内联几乎所有东西.这是出于硬件限制和性能原因.
虽然这确实依赖于实现,但我还没有看到没有积极内联的GPU二进制文件.我对CPU OpenCL不起作用,但我相信优化器策略可能类似,尽管硬件限制不一样.
但就标准而言,没有任何保证.
让我们来看看你的要求:
尽可能快地
注册压力尽可能小
当与编译时常量一起使用时,理想情况下应保证优化 - 远离另一个常量
内联函数与宏一样快,不使用更多寄存器,并在可能的情况下进行优化.
易于维护......
功能更容易维护宏.它们是类型安全的,它们可以很容易地重构,等等,这个列表永远存在.
标准,不是太奇怪,因为我正在考虑将其用于开源项目,我希望其他人会为此做出贡献
我认为这是非常主观的.我个人非常讨厌宏,并像瘟疫一样避开它们.但我知道一些非常成功的项目,它们广泛使用它们(例如Boost.Compute).由你决定.
但宏基本上保证内联宏.
至少在GPU上,除了递归函数(OpenCL 2.0)之外,OpenCL编译器积极地内联几乎所有东西.这是出于硬件限制和性能原因.
虽然这确实依赖于实现,但我还没有看到没有积极内联的GPU二进制文件.我对CPU OpenCL不起作用,但我相信优化器策略可能类似,尽管硬件限制不一样.
但就标准而言,没有任何保证.
让我们来看看你的要求:
尽可能快地
注册压力尽可能小
当与编译时常量一起使用时,理想情况下应保证优化 - 远离另一个常量
内联函数与宏一样快,不使用更多寄存器,并在可能的情况下进行优化.
易于维护......
功能更容易维护宏.它们是类型安全的,它们可以很容易地重构,等等,这个列表永远存在.
标准,不是太奇怪,因为我正在考虑将其用于开源项目,我希望其他人会为此做出贡献
我认为这是非常主观的.我个人非常讨厌宏,并像瘟疫一样避开它们.但我知道一些非常成功的项目,它们广泛使用它们(例如Boost.Compute).由你决定.