了解 Cache/RAM 访问延迟的微基准

Understand a microbenchmark for Cache/RAM access latency

图中:pic

这个剧情我不是很懂。它基本上展示了以不同步幅从不同大小的数组读取和写入的性能。每种颜色显示不同大小的数组。不知道为什么会增加,但不知道为什么会减少?因此,例如,对于 L(数组长度)= 64MB,并且在 stride=256k 之后,您认为为什么时间会再次减少?

这里link,代码:www.cs.berkeley.edu/~yelick/arvindk/t3d-isca95.ps

谢谢。

您发布的论文试图通过微基准测试找出 Cray T3D 的详细信息。得出以下结论:

  • 缓存行/块大小为32B
  • 缓存是直接映射的
  • 没有二级缓存(只有一级缓存)
  • 页面大小大概是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个地址可以轻松缓存。

所以我的理论是步幅越大,实际读取/写入/更新的地址数量就越少。这会导致 2 个影响:

  • 您的缓存未命中率较低,因为您重用了存储在较少地址的数据
  • 您的 TLB 未命中率较低,因为您访问的页面较少

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

对于小步幅,延迟很低,因为您有更高的机会读取同一缓存块,并且还有可能更有效的预取。

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

我的观点是,无论步幅大小如何,都应该在固定数组大小(8、32 或 64MB)上进行此微基准测试,但要足够大以减少缓存效果。步幅越大,一遍又一遍读取相同地址的机会就越大。