小智 30
这应该.我是手动内联的忠实粉丝.当然,过度使用它是一件坏事.但通常在优化代码时,会有一两个功能只需要内联或性能下降.坦率地说,根据我的经验,C编译器在使用inline关键字时通常不会内联这些函数.
我非常愿意让编译器为我编写大部分代码.这只是我真正关心的六个左右绝对重要的案例.人们说"编译器在这方面做得很好".我想看看那个证据.到目前为止,我从未见过C编译器在不使用某种强制内联语法(在gcc __forceinline上的msvc __attribute__((always_inline))上)的情况下内联一个重要的代码片段.
jmk*_*yes 24
是的,它会的.这并不意味着这是一个好主意.
Bas*_*tch 11
根据gcc优化选项文档,您可以使用参数调整内联:
-finline-limit=n
By default, GCC limits the size of functions that can be inlined. This flag
allows coarse control of this limit. n is the size of functions that can be
inlined in number of pseudo instructions.
Inlining is actually controlled by a number of parameters, which may be specified
individually by using --param name=value. The -finline-limit=n option sets some
of these parameters as follows:
max-inline-insns-single is set to n/2.
max-inline-insns-auto is set to n/2.
Run Code Online (Sandbox Code Playgroud)
我建议详细阅读有关内联的所有参数的详细信息,并进行适当的设置.
我想在这里补充一点,我有一个 SIMD 数学库,其中内联对于性能绝对至关重要。最初,我将所有函数设置为内联,但反汇编表明,即使对于最简单的运算符,它也会决定实际调用该函数。MSVC 和 Clang 都显示了这一点,并且所有优化标志都打开。
我按照 SO 中其他帖子中的建议进行操作,并__forceinline为 MSVC 和__attribute__((always_inline))所有其他编译器添加了内容。从基本乘法到正弦运算,各种紧密循环的性能持续提高了 25-35%。
我不明白为什么他们内联如此困难(也许模板化代码更难?),但底线是:手动内联有非常有效的用例,并且可以获得巨大的加速。
如果你好奇的话,这就是我实现它的地方。https://github.com/redorav/hlslpp
| 归档时间: |
|
| 查看次数: |
52018 次 |
| 最近记录: |