【问题标题】:Will the cache line aligned memory allocation pay off?缓存行对齐的内存分配会得到回报吗?
【发布时间】:2011-06-04 01:14:21
【问题描述】:

我只知道对齐内存分配的基本概念。但我不太关心对齐问题,因为我不是汇编程序员,也没有 MMX/SIMD 的经验。我认为这是过早的优化之一。

现在人们越来越多地谈论缓存命中、缓存一致性、大小优化等。一些源代码甚至分配内存明确对齐在 CPU 缓存行上。

坦率地说,我不知道我的 i7 CPU 的缓存线大小是多少。我知道大尺寸对齐不会有任何伤害。但是,如果没有 SIMD,它真的会得到回报吗?

假设一个程序中有 100000 个 100 字节的数据。而访问这些数据是该程序最密集的工作。

如果我们改变数据结构并将所有 100 字节大小的数据按 16 字节对齐,是否可以获得明显的性能提升? 10%? 5%?

【问题讨论】:

  • 说到过早优化,你知道好的算法通常可以为更大的数据集提供数百或数千%的速度提升(甚至更大的数据集)? ;) 诸如程序与缓存的性能如何等细节都在高性能计算的列表中,但对于大多数应用程序来说,这无关紧要。
  • 我相信 64 字节是常见的缓存行大小,而不是 16 字节。
  • 我曾经通过缓存对齐和预取其内存访问将算法提高了十倍。

标签: c++ c caching memory-management


【解决方案1】:

这是我最近最喜欢的关于缓存效果的博客之一。 http://igoro.com/archive/gallery-of-processor-cache-effects/

【讨论】:

  • 我读过的关于处理器缓存的最佳解释。它确实是缓存的戏剧性效果。如果我太天真,我很害怕..
【解决方案2】:

缓存优化甚至为单线程应用程序付费。但是缓存优化不一定要在缓存开始时对齐数据,因为有几个因素需要考虑。所以要走的路是:

  • 您是否满足您的性能要求?如果是,为什么要花时间进行优化。很少为了优化薪酬而优化。

  • 测量瓶颈在哪里。如果您怀疑缓存有问题,请使用报告缓存未命中的工具,以便了解您可以赢得多少。

在最高级别上,缓存优化的目标是用有趣的数据填充缓存,同时将不感兴趣的数据排除在外。如果你在做多线程编程,防止线程之间的干扰也很重要。然后您还必须防止某些特定于某些缓存实现的事情,例如共振效应,有时会减少非完全关联缓存的有效缓存大小。

【讨论】:

  • 显然对于读取,可能对于写入,在缓存行上对齐的内存分配不是一个重要问题,不是吗?
  • 如果你的数据是只读的,重要的是一起访问的数据尽量留在缓存中。 i7 的行大小为 64 字节(请参阅agner.org/optimize/microarchitecture.pdf),因此正确对齐的数据之一将跨越 2 个缓存行,而如果不是,则需要 3 个缓存行。所以它可能会有所帮助(我是否写道,当你想要优化时,测量是要走的路?)
【解决方案3】:

关于高速缓存行对齐的大多数讨论都涉及使用多线程的高性能计算,并尽可能保持可扩展性接近线性。在这些讨论中,缓存行对齐的原因是为了防止写入一个数据变量使缓存行无效,该缓存行还包含另一个由不同线程使用的变量。

因此,除非您尝试编写可扩展到大量处理器内核的代码,否则高速缓存行对齐对您来说可能并不重要。但同样,测试一下看看。

【讨论】:

  • 我认为所有答案都有自己的教训,但这个答案可能是经验法则(但最低投票),所以我接受了这个。谢谢。
  • 两个线程足以显示其巨大的头部的虚假共享。 (但数据大小为 100 字节,我怀疑错误共享对他们来说是个问题 OP)。
  • @Aprogrammer 关于写作的好点。我只关心阅读。
  • 是的,虚假分享会破坏程序。对齐也可以用来优化共享。那些总是脏的和许多线程需要的变量都可以打包到一个缓存行中。这意味着只需要更新一个缓存行。
  • 我不同意,即使对于具有大量内存访问对齐的单线程应用程序,也会对性能产生显着影响。
【解决方案4】:

这取决于您的系统。尝试一下,运行一些基准测试,然后找出答案。

【讨论】:

  • 那么,确实是过早的优化。如果没有可靠的 CPU 检测功能和 CPU 缓存信息列表,如何做到这一点?嗯..我是不是太担心了?
  • 所有优化都为时过早,直到您实际测试了慢的地方。
  • @9dan - 你不需要那些东西,只需要一个时钟。
  • @OrangeDog 我的意思是,因为基准测试结果会因 CPU 而异,所以我无法在没有 CPU 检测功能的情况下应用缓存感知优化。
  • @9dan 如果您需要多个内核来处理处理,那么提前担心虚假共享并不为时过早。如果您无意共享,您的性能将比仅使用单个处理器更差。到目前为止,任何需要多个内核处理相同数据的系统我都会说正确的数据设计不是优化,而是要求。
猜你喜欢
  • 2011-12-30
  • 2017-04-15
  • 1970-01-01
  • 2013-09-27
  • 2021-12-02
  • 2011-11-28
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
相关资源
最近更新 更多