【问题标题】:Data alignment vs. cache locality数据对齐与缓存局部性
【发布时间】:2012-12-27 14:41:39
【问题描述】:

从内存中,数据只能以体系结构的自然字长读取。例如,在 32 位系统上,数据以 4 字节块的形式从内存中读取。如果将 2 字节或 1 字节的值添加到内存中,它们的读取仍需要访问 4 字节的字。 (如果是 2 字节值,如果值存储在字边界上,则可能需要两次 4 字节访问。)

因此,当需要访问单个单词时,访问单个值是最快的,并且只需要最少的额外工作(例如屏蔽)。如果我是正确的,这就是虚拟机(例如 JVMAndroid 的 Dalvik)在 Object 实例中以 4 字节边界布置成员变量的原因。

另一个概念是缓存友好性,即局部性(例如 L1、L2)。如果许多值必须在彼此之后直接遍历/处理,则它们彼此靠近存储是有益的(理想情况下,在一个连续的块中)。这是空间局部性。如果这是不可能的,至少应该在相同的时间段内完成对相同值的操作(时间局部性 - 即在对其执行操作时,该值很有可能保留在缓存中)。

据我所知,以上两个概念在某些情况下可能是“矛盾的”,它们之间的选择取决于它们的使用场景。例如,少量的连续数据比大量(微不足道的)数据更易于缓存,但如果某些数据通常需要随机访问,则字对齐(但更大)的结构可能是有益的 -- 除非整个结构适合缓存。因此,我认为,是否应该优先考虑局部性(~arrays)或对齐优势取决于如何操纵这些值

有一个场景对我来说很有趣:让我们假设一个寻路算法将输入图(其他辅助结构)作为数组接收。 (它的大部分输入数组都存储

寻路算法对数组执行非常多的随机访问(在几个循环中)。从这个意义上说,输入数据可能需要int[](在 Android/ARM 上),因为访问时这些值将位于字边界上。 (另一方面,如果需要顺序遍历,则建议使用较小的数据类型——尤其是对于大型数组——因为缓存友好的可能性更高。)

但是,如果(随机访问的)输入数据在指定为 short[] 时适合 L1/L2,但如果指定为 int[] 则不适合怎么办?在这种情况下,int[] 的 4 字节对齐随机访问的优势是否会被 short[] 的缓存友好性所抵消?

当然,在具体应用中,我会进行测量以进行比较。但是,这不一定能回答上述问题。

【问题讨论】:

    标签: java android caching memory-access


    【解决方案1】:

    如果您可以确保移动到短会导致显着更好的局部性(也就是所有内容都在缓存中),那么这会超过对齐惩罚。

    对缓存的访问在低纳秒

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-12
      • 2011-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-27
      相关资源
      最近更新 更多