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

3
在这张图片中:pic 我并不完全理解这个图。它基本上展示了从不同大小的数组和不同步幅度读写的性能。每种颜色代表不同大小的数组。我知道为什么会增加,但我不知道为什么会下降?例如对于L(数组长度)= 64MB,然后stride = 256k,为什么时间会再次下降?
在此链接中,附有代码:www.cs.berkeley.edu/~yelick/arvindk/t3d-isca95.ps 谢谢。
1个回答

3

您发布的论文尝试进行微基准测试,以找出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])

假设数组大小为4MB,步幅大小为1MB。您将访问A [0],A [1M],A [2M],A [3M],每个地址都会重复多次。这只有4个地址很容易被缓存。

因此,我的理论是,对于更大的步幅,实际读/写/更新的地址数量更少。这导致两种效果:

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

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

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

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

我认为,这些微基准测试应该在固定的数组大小上进行(8、32或64MB),不管步幅大小如何,但要足够大以减少缓存效应。步幅越大,重复读取相同地址的机会就越高。


好的,谢谢(我没有足够的声望来投票!)在前言之后,您说:“对于更大的步幅,实际读取/写入/更新的地址数量较少”,但为什么?如何做到的?而且您还说:“我的观点是这些微基准测试应该在固定的数组大小(8、32或64MB)上进行,无论步幅大小如何。”- 是的,数组大小是固定的,但基准测试会多次进行,每次都会针对多个步幅大小进行(这意味着L = 1MB和S = 1,2,4,8,16,...或L = 2MB和S = 1,2,4,8,16,...就像您在图片中看到的那样)。 - fidelroha
我不理解。例如,对于数组大小为4MB和步长为2MB,我们将访问A [0],A [2MB],A [4MB],A [6MB],因为我们跳过步长。因此,这只有4个地址! - fidelroha
@fidelroha 当你的数组大小只有4MB时,你如何访问A [6MB]?考虑到你的数组大小为8MB,步长大小为256B,你将访问多少个地址? - VAndrei
A[6MB] 表示数组的最后一个元素(考虑数组元素间的步幅)。您需要考虑数组元素的长度。如果数组大小为 8MB,步幅为 256B,则在每个页面中我们有: 8KB(即页面大小)/ 256B = 32 个元素(来自数组),我们应该访问 8MB / 8KB = 1000 个页面,因此我们有 1000*32 = 32000 个地址!? - fidelroha
@fidelroha。没错,步幅尺寸越小,数组中的读取就会更加“密集”。因此,如果您必须读取32K个地址,则与读取较大步幅的4个地址相比,肯定会有更多的缓存未命中。 - VAndrei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接