内存对齐与页面对齐

本文关键字:对齐 面对 内存 | 更新日期: 2023-09-27 18:37:28

我们经常听到将变量与内存中的N字节边界对齐可以提高性能(通过防止CPU必须将两个单独的"字"加载到缓存中来读取我们的变量)。

另一方面,我们也听到(不太常见)将大块内存(数组/缓冲区)对齐到一个漂亮的圆形二次幂地址可能是不好的,因为将内存地址分配给缓存地址的哈希函数不再统一(这称为页面对齐)。

因此,我的问题是,是否有某种规则或阈值点来说明我们何时应该故意错位数据以避免页面对齐的问题;何时不这样做,以获得标准内存对齐的好处?

内存对齐与页面对齐

如果性能对应用程序的特殊性至关重要,并且应用程序通常循环访问已知数据集(类型和大小),则了解和理解 MMU、L 缓存和缓存行的影响非常重要。 不是因为您可以提前真正避免这些问题,而是因为您可能需要在事后识别它们,同时盯着分析结果并试图弄清楚为什么某些事情比以前或"通常应该"花费的时间更长。 而且 - 如果你很幸运并且数据集在你的控制范围内足够 - 你可以调整一些东西来解决某种CPU缓存性能问题。

不幸的是,大多数应用程序无法迭代已知数据集并了解其目标硬件类型。 这是游戏和多媒体应用程序开发以及操作系统工程所独有的。 对于世界上大多数其他应用程序,改进某个特定大小的特定数据集的缓存配置文件意味着减少另一个数据集的缓存配置文件。

最后,即使是关于"将变量与 N 字节边界对齐"的"经验法则"也受制于底层硬件。 大多数较新的桌面级 x86 体系结构(大多数是在大约 2011 年之后制作的)更喜欢打包数据而不是对齐数据,因为加载跨缓存行边界打包的单词的成本已经变得比必须加载更多总缓存行来表示同一数据集的成本要低。 但是在运行 ARM 的移动设备上? 对齐仍然非常关键。

更多关键字供您搜索,用于进一步教育:缓存着色缓存逐出。 但同样,这一切都非常依赖于目标 CPU,不幸的是,很少(或没有)概括。

我认为你不能得到一个一般的规则。这取决于您使用的处理器,即底层系统的 MMU 和缓存实现。这将因系统而异。因此,如果您想要最佳性能,则需要了解当前系统的所有低级细节。一般来说,我希望将大内存块对齐到二次方边界的好处是有限的。