为什么在与高速缓存行的前4个字节对齐时,x86上的内存访问速度会变慢?

时间:2013-01-17 12:06:59

标签: java performance memory x86

unaligned/aligned direct memory access写一篇博文时我发现了一个很难解释的结果:如果我的内存访问与前4个字节对齐,那么当数据结构适合时,我会发现性能上存在可衡量的差异进入L1缓存。在某些情况下,其他地方的速度提高了20%。

本文将详细介绍实验和方法,但总结如下:

  1. 分配一个适合L1的内存块(我的笔记本电脑上的32k,使用hwloc /检查你的cpu的规格来查找)。将块与高速缓存行大小对齐(通常为64b,检查硬件)。分配是预先完成的,而不是衡量的。
  2. 迭代内存块并在给定偏移量的每个高速缓存行中写入一个长(某个值)(如果偏移量不是8的倍数,则会有效地导致未对齐写入)。
  3. 迭代内存块并从相同的偏移量读取并验证该值是否符合预期。
  4. 当偏移量为0-3时,为什么性能会有任何差异?

    测量代码的本质(根据评论中的要求):

    for (address = startingAddress; address < limit; address += CACHE_LINE_SIZE) {
        Unsafe.putLong(address, value);
    }
    for (address = startingAddress; address < limit; address += CACHE_LINE_SIZE) {
       if (Unsafe.getLong(address) != value)
           throw new RuntimeException();
    }
    

    其中起始地址是缓存对齐+偏移量。 完整的实验可用here

0 个答案:

没有答案