缓存行对齐的内存分配会得到回报吗?

时间:2011-01-05 14:16:50

标签: c++ c caching memory-management

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

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

坦率地说,我不知道i7 CPU的缓存行大小是多少。我知道大尺寸对齐没有坏处。但是没有SIMD会真的得到回报吗?

让我们说一个程序中有100000项100字节数据。访问这些数据是该计划最密集的工作。

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

5 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:5)

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

  • 你符合你的表现要求吗?如果是,为什么要花时间进行优化。为优化薪酬而优化很少。

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

在最高级别,缓存优化的目标是用有趣的数据填充缓存,同时保留非有趣的数据。如果您正在进行多线程编程,则防止线程之间的干扰也很重要。然后你还要防止一些特定于某些缓存实现的东西,例如共振效应,这有时会减少非完全关联缓存的影响缓存大小。

答案 2 :(得分:4)

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

答案 3 :(得分:4)

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

因此,除非您尝试编写可扩展到大量处理器内核的代码,否则缓存行对齐可能对您来说无关紧要。但再次,测试并看到。

答案 4 :(得分:3)

对齐数据会产生多大差异,这取决于应用程序。这里有一个很好的讨论:

Memory Alignment On Modern Processors