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

另一方面,我们还(很少)听到将大块内存(数组/缓冲区)与一个不错的,2的整数次幂地址对齐可能是不好的,因为将内存地址分配给缓存地址的哈希函数是不再统一(这称为页面对齐)。

因此,我的问题是,关于何时应故意错位数据以避免页面对齐的问题是否存在某种规则或阈值点; 何时不使用,以获得标准内存对齐的好处?

#1楼 票数:2

我认为您无法为此获得一般规则。 这取决于您使用的处理器,即基础系统的MMU和缓存实现。 这将因系统而异。 因此,如果要获得最佳性能,则需要了解当前系统的所有底层细节。 通常,我希望将大内存块对齐到2的幂的边界的好处是有限的。

#2楼 票数:1 已采纳

如果性能对于您的应用程序来说至关重要,并且您的应用程序通常在已知数据集(类型和大小)上进行迭代,那么了解和理解MMU,L缓存和缓存行的影响就很重要。 这不是因为您确实可以提前避免这些问题,而是因为您可能需要事后找出它们,同时盯着分析结果,并想弄清楚为什么事情花的时间比以前更长,或者“通常应该”。 而且-如果您很幸运,并且数据集在您的控制范围内,则可以进行调整以解决某种CPU缓存性能问题。

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

最后,即使有关“将变量对齐到N字节边界”的“经验法则”也受底层硬件的约束。 大多数较新的台式机级x86架构(大多数在2011年左右之后制造)更喜欢打包数据而不是对齐数据,因为加载跨缓存行边界打包的单词的成本比必须加载更多总缓存行来表示同一数据集要便宜。 但是在运行ARM的移动设备上? 对齐仍然很关键。

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

  ask by Xenoprimate translate from so

未解决问题?本站智能推荐:

1回复

缓存未命中是否与我们是否使用堆内存相关?

为了获得最佳性能,请尝试最小化缓存未命中。 我想我们都可以同意。 我建议并想问的是以下内容。 我这样说: 比以下情况更容易发生缓存未命中: 我经常提出这样的论点: 最小化堆分配以最小化缓存未命中 。 我对此有错吗? 基本原理:从我的工作仿真器(我编写了包括MMU
2回复

在处理内存中的一些长向量时如何不搞乱缓存?

前提 我想做一些涉及k长数据向量(每个长度为n )的计算,我在主内存中接收,并将某种结果写回主存。 为简单起见,假设计算仅仅是 也许 (这不是代码,它是伪代码。) foo()和bar_i()函数没有副作用。 k是常量(在编译时已知), n仅在此计算发生之前就已知(并且它
3回复

如何从mingmap的operator new或malloc获取页面对齐的内存

有没有办法分配一块内存,使其起始地址与给定的页面大小对齐? 请注意,我不想在分配块之后计算对齐的地址。 原因是在某些时候我将不得不在块上调用mremap():mremap要求旧的地址参数是页面对齐的。
3回复

分配页面对齐的内存块有什么好处?

我意识到大多数CPU更擅长在对齐的内存地址读取数据,即内存地址是CPU字的倍数。 但是,在很多地方我都读过有关分配页面对齐内存的内容。 为什么有人想要获得页面对齐的内存地址? 它只是为了更大的表现吗?
1回复

Linux C ++中页面对齐的内存分配

假设我需要在Linux64 C ++应用程序中分配一个大型Vector。 我执行以下操作: 这将在我的笔记本电脑上打印0x7ffc2a177450,这是字对齐的。 但是,Vector大小为2000 * 4B = 8kB,恰好是我的4kB页面Ubuntu系统上的2页。 问:如何将
1回复

堆上的页面对齐内存分配是否有任何优化或不同的 API?

我将要编写一个表示双端队列的类,就像std::dequeue ,但能够存储任何简单的可破坏类型,并且没有索引支持。 迭代或弹出操作只有知道之前存储的类型才能工作。 大多数情况下,它将被用作队列/堆栈之类的存储,由其他类型引用,因为引用保证保持有效,即使它被推送/弹出到两者之间的任一端。 内存的分配和
5回复

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

我只知道对齐内存分配的基本思路。 但我并不关心对齐问题,因为我不是汇编程序员,也没有MMX / SIMD的经验。 而且我认为这是过早优化之一。 这些天人们越来越多地谈论缓存命中,缓存一致性,大小优化等。一些源代码甚至分配在CPU缓存行上显式对齐的内存。 坦率地说,我不知道我的i7
5回复

获得对齐内存的最佳跨平台方法

这是我通常用于通过Visual Studio和GCC获得对齐内存的代码 这个代码一般是好的吗? 我也看到人们使用_mm_malloc , _mm_free 。 在大多数情况下,我想要对齐内存,使用SSE / AVX。 我可以一般使用这些功能吗? 它会使我的代码更简单。 最后