【问题标题】:How do inline functions increase memory cache miss and why is it bad compared to the alternative?内联函数如何增加内存缓存未命中率,为什么它与替代方法相比不好?
【发布时间】:2015-11-14 14:39:19
【问题描述】:

来自https://isocpp.org/wiki/faq/inline-functions#inline-and-perf,

内联可能会导致内部循环跨越多行 内存缓存,这可能会导致内存缓存抖动。

让我们考虑另一种选择,该函数不是内联的。然后在函数将控制权返回给循环之后,也会发生内存缓存未命中。此外,还需要从堆栈中压入和弹出寄存器。

考虑到上述事实,内联版本会比非内联版本更快[排除由于膨胀的可执行文件大小和其他因素导致的页面错误],即使内存缓存未命中。

【问题讨论】:

    标签: c++ function caching inline


    【解决方案1】:

    在许多情况下,您的分析是正确的。但是,我可以提供一个反例:如果您的内部循环多次调用同一个函数并且该函数是内联的,则生成的代码可能会比非内联版本占用更多的缓存行。

    当然,在不同的场景中会有所不同。

    【讨论】:

    • 我想,你说的是指令缓存行。问题是关于内存缓存线。关于指令缓存未命中,循环展开是一种情况,您所说的将成立,您能否提供任何其他可能发生的情况的示例。谢谢!
    • 当然,但是在现代微处理器中,指令和数据缓存之间的区别在 L1 之后就消失了。在 L2 及更高版本中,指令和数据共享相同的容量。
    猜你喜欢
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多