了解缓存/ RAM访问延迟的微基准测试

时间:2015-02-21 13:54:06

标签: performance memory-management benchmarking cpu-architecture cpu-cache

在此图片中:pic

我真的不明白这个情节。它基本上以不同的步幅显示了不同大小数组的读写性能。每种颜色显示不同大小的阵列。 T知道它为什么会增加,但我不知道为什么会减少?那么,例如对于L(数组的长度)= 64MB,并且在stride = 256k之后,为什么你认为时间再次下降?

在此链接中,代码为:www.cs.berkeley.edu/~yelick/arvindk/t3d-isca95.ps

谢谢。

1 个答案:

答案 0 :(得分:3)

您发布的论文尝试使用microbenchmark来查找Cray T3D的详细信息。它得出以下结论:

  • 缓存行/块大小为32B
  • 缓存是直接映射的
  • 没有L2缓存(只是L1)
  • 页面大小可能是8KB。

下一个有趣的评论是它们围绕实验的最内部循环,另一个循环重复实验。这个循环实际上启用了缓存。

他们的代码如下:

for (arraySize = 4KB; arraySize < 8MB; arraySize *= 2)
   for (stride = 1; stride <= arraySize / 2; stride *= 2)
      for (i = 0; i < arraySize; i += stride)
         for (k = 0; k < repeats; k++)
            MEMORY_OPERATION_ON(A[i])

我们假设arraySize = 4MB,strideSize = 1MB。您将访问A [0],A [1M],A [2M],A [3M],每个重复次。这只是容易缓存的4个地址。

所以我的理论是对于更大的步幅,读/写/更新的实际地址数量更小。这会产生两种效果:

  • 由于您重复使用存储在较少地址的数据,因此缓存未命中次数较少
  • 由于您访问的页数较少,因此TLB丢失较少

我认为这就是延迟下降对更大步幅的解释。

对于小步幅,延迟较低,因为您在同一缓存块中读取的可能性较高,并且预取也可能更有效。

对于中等步幅,你有足够的读取来使缓存无效,并且由于跨步大小,你经常得到TLB未命中,因为你跳过许多页面。这会导致更长的延迟。

我的观点是,这个微基准测试应该是在固定阵列大小(8,32或64MB)上进行的,无论步幅大小,但大到足以减少缓存效果。步幅越大,一遍又一遍地读取相同地址的可能性越大。