【问题标题】:decreasing cache misses through good design通过良好的设计减少缓存未命中
【发布时间】:2010-10-02 10:03:24
【问题描述】:

在设计 C++ 程序时如何减少可能的缓存未命中次数?

内联函数每次都有帮助吗?还是只有在程序受 CPU 限制(即程序是面向计算而不是面向 I/O)时才好?

【问题讨论】:

    标签: c++ caching inline


    【解决方案1】:

    让 CPU 高效地预取数据。例如,您可以减少按行而不是按列处理多维数组的缓存未命中数、展开循环等。

    这种优化取决于硬件架构,因此您最好使用某种特定于平台的分析器(例如 Intel VTune)来检测缓存可能存在的问题。

    【讨论】:

      【解决方案2】:

      用于数据绑定操作

      1. 在列表、地图和集合上使用数组和向量

      2. 逐列处理

      【讨论】:

      • 萨特的好话。幻灯片可以在这里找到,因为它的质量有点糟糕,所以可以放在视频旁边。 nwcpp.org/Downloads/2007/Machine_Architecture_-_NWCPP.pdf
      • 视频链接和演示幻灯片已失效。建议编辑 cmets 和答案以包含视频标题,以便人们找到它。
      【解决方案3】:

      避免在不需要时使用动态内存。使用 new、delete、smart pointers 等等,往往会将您的程序数据分散到内存中。这不好。如果您可以将大部分数据保存在一起(例如,通过在堆栈上声明对象),您的缓存肯定会工作得更好。

      【讨论】:

        【解决方案4】:

        内联函数运行可能会损害指令缓存。如果内存不受 fetch 限制,那么它不太可能产生太大(如果有的话)差异。

        与往常一样,任何优化都应该通过分析而不是预感来通知。更不用说您需要了解分析器告诉您的内容,这意味着您熟悉汇编语言以及您正在优化的平台的特定特征。

        现在有点老了,但 Mike Abrash 的“图形编程黑皮书”仍然有很多很好的一般性建议。

        【讨论】:

          【解决方案5】:

          在处理此类代码时,我喜欢考虑以下几点。

          • 考虑您需要“数组结构”还是“结构数组”。您要使用哪个取决于数据的每个部分。
          • 尽量将结构保持为 32 字节的倍数,以便它们均匀地打包缓存行。
          • 将数据划分为冷热元素。如果您有一个 o 类对象数组,并且您经常一起使用 ox、oy、oz,但只是偶尔需要访问 oi、oj、ok,那么请考虑将 ox、oy 和 oz 放在一起并移动 i、j 和k 部分到一个并行的辅助数据结构。
          • 如果您有多维数据数组,那么使用通常的行顺序布局,沿首选维度扫描时访问速度会非常快,而沿其他维度扫描时访问速度会很慢。将其映射到 space-filling curve 将有助于平衡在任何维度中遍历时的访问速度。 (阻塞技术是类似的——它们只是具有更大基数的 Z 顺序。)
          • 如果您必须导致缓存未命中,请尝试尽可能多地使用该数据以分摊成本。
          • 你在做多线程的事情吗?注意缓存一致性协议的减速。填充标志和小计数器,以便它们位于不同的缓存行上。
          • Intel 上的 SSE 提供了一些预取内在函数,如果您提前知道要访问什么。

          【讨论】:

          • +1。希尔伯特曲线的想法很新颖,你是从哪里想到的?在希尔伯特曲线坐标和标准数组坐标之间来回转换所需的时间真的值得缓存效率吗,还是只有在一个方向进行坐标转换而不是另一个方向时才值得?
          【解决方案6】:

          此外,如果您使用 C++ 和多线程,则需要考虑虚假共享、局部性和每个处理器缓存上数据的热度。这可以产生很大的不同。特别是在多线程计算中,LIFO 方式比 FIFO 方式计算更有效,但它在单处理器架构中也有效。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-07-04
            • 2022-01-20
            • 2011-09-01
            • 1970-01-01
            • 2020-06-07
            • 2010-09-13
            相关资源
            最近更新 更多