L1高速缓存未命中的成本是多少?


72

编辑:出于参考目的(如果有人偶然发现此问题),Igor Ostrovsky写了一篇有关缓存未命中的好文章。它讨论了几个不同的问题并显示了示例编号。 结束编辑

我做了一些测试,<long story goes here>并且想知道性能差异是否是由于内存缓存未命中引起的。以下代码演示了该问题,并将其归结为关键的计时部分。以下代码具有几个循环,这些循环以随机顺序访问内存,然后以地址升序访问。

我在XP机器(与VS2005编译:cl / O2)和Linux机器(gcc –Os)上运行了它。两者产生相似的时间。这些时间以毫秒为单位。我相信所有循环都在运行,并且没有进行优化(否则它将“立即”运行)。

***测试20000个节点
总订购时间:888.822899
总随机时间:2155.846268

这些数字有意义吗?差异主要是由于L1高速缓存未命中还是其他原因造成的?有20,000 ^ 2个内存访问,如果每个访问都是缓存未命中,则每个未命中大约3.2纳秒。我测试过的XP(P4)机器为3.2GHz,我怀疑(但不知道)具有32KB L1高速缓存和512KB L2。假设有20,000个条目(80KB),我认为不会有大量的L2丢失。原来如此(3.2*10^9 cycles/second) * 3.2*10^-9 seconds/miss) = 10.1 cycles/miss。在我看来,这太高了。也许不是,或者我的数学不好。我尝试使用VTune测量高速缓存未命中,但是出现了BSOD。现在,我无法连接到许可证服务器(grrrr)。


13
他的问题是:“这些数字有意义吗?”
蒂姆·西尔维斯特

抱歉-我有点在太多文字中掩盖了这个问题。但是是的,问题是数字是否有意义。L1缓存未命中10个周期大约正确吗?
Mark Wilkins,2009年

2
您应该阅读Ulrich Drepper的“每个程序员应该了解的内存知识” -它深入探讨了内存访问,访问模式与缓存交互的时间。
caf

3
问题中所涉及的伊戈尔·奥斯特洛夫斯基非常出色。+1只是为了指导我。

Answers:


25

虽然我无法提供数字是否有意义的答案(我不太了解缓存延迟,但据记录,大约10个周期的L1缓存错过了正确的声音),但我可以为您提供Cachegrind作为工具,可帮助您实际查看两次测试之间的缓存性能差异。

Cachegrind是Valgrind工具(为始终可爱的memcheck提供支持的框架),用于描述缓存和分支命中/未命中。它将使您了解程序中实际获得了多少次缓存命中/丢失。


非常好。感谢您指向它的指针。我已经知道Valgrind,但之前从未使用过它(我的大部分开发都在Win32上进行)。我现在在Linux机器上运行它,它报告测试“随机”部分的未命中率达到41%。测试的“按顺序”部分的漏失率可以忽略不计。这两部分都没有任何L2遗漏率。
Mark Wilkins,2009年

63

这是尝试通过类似于烘烤巧克力曲奇饼来洞察缓存未命中的相对成本...

你的手就是你的寄存器。将巧克力片放入面团中需要1秒。

厨房柜台是您的L1缓存,比寄存器慢12倍。步行到柜台需要12 x 1 = 12秒,拿起核桃袋,再将一些倒入您的手中。

冰箱是您的L2缓存,比L1慢四倍。需要4 x 12 = 48秒才能走到冰箱,打开冰箱,移开昨晚的剩菜,取出一盒鸡蛋,打开纸箱,在柜台上放3个鸡蛋,然后将纸箱放回冰箱。

橱柜是您的L3缓存,比L2慢三倍。花3 x 48 = 2分24秒,将橱柜分三步走,弯下腰,打开门,四处寻找面包粉,从橱柜中取出,打开,挖去找到发酵粉。 ,将其放在柜台上,扫清洒在地板上的脏乱。

和主记忆?那是街角商店,比L3慢5倍。需要5 x 2:24 = 12分钟才能找到您的钱包,穿上鞋子和夹克,在街上奔跑,抢一升牛奶,奔跑回家,脱下鞋子和夹克,然后回到厨房。

请注意,所有这些访问都是恒定的复杂度-O(1)-但它们之间的差异可能会对性能产生巨大影响。纯粹针对大O复杂度进行优化就像决定是一次向面糊中添加巧克力片还是一次向面糊中添加巧克力片,但忘记将它们放入食品杂货清单一样。

故事的寓意:组织您的内存访问,因此CPU必须尽可能少地处理杂货。

数字来自“ CPU缓存刷新谬论”博客文章,该文章表明对于特定的2012年代英特尔处理器,以下内容是正确的:

  • 寄存器访问=每个周期4条指令
  • L1延迟= 3个周期(12 x寄存器)
  • L2延迟= 12个周期(4 x L1,48 x寄存器)
  • L3等待时间= 38个周期(3 x L2、12 x L1、144 x寄存器)
  • 在3 GHz CPU上DRAM延迟= 65 ns = 195个周期(5 x L3、15 x L2、60 x L1、720 x寄存器)

处理器高速缓存影响的画廊也使得有关这个主题的良好的阅读。

嗯,饼干...


1
O(1)中的1始终是阻力。不错的答案,应该已经被接受了!
g24l 2015年

2
好答案!另外,它可以扩展到共享同一橱柜(L3缓存)的多个小厨房(核心);如果一位厨师去商店里买更多的面粉,其他所有厨师都可以从那里拿走面粉。
rosuav '16

5
我还要补充一点:对于虚拟内存,访问交换页面(即需要从磁盘读取数据的页面)就像发现该肉桂粉的商店缺货,需要订购来自中国的新批次-交货期为6周。
Smeeheey

18

L1高速缓存未命中3.2ns完全合理。为了进行比较,在一个特定的现代多核PowerPC CPU上,一次L1丢失大约为40个周期-有些内核要比其他内核更长一些,这取决于它们离L2缓存有多远(是的)。L2丢失至少为 600个周期。

缓存是性能的一切。现在,CPU的速度比内存快得多,您实际上几乎在优化内存总线而不是内核。


6

是的,看起来确实主要是L1高速缓存未命中。

L1高速缓存未命中的10个周期听起来确实是合理的,但在低端可能要少一些。

从RAM读取的周期大约为100s甚至可能是1000s(太累了,无法立即进行数学运算;),因此它仍然是一个巨大的胜利。


5
“有点偏低” –拥有80K的数据和32K的L1,如果每个获取都错过了缓存,您会感到失望,所以有点低对我来说很有意义。
史蒂夫·杰索普

好点..而且顺序已经随机化,这意味着命中必须有大约50/50个缓存未命中。当然,拿出一个读取模式将很容易,这将意味着每个访问都将丢失:)
Goz

我同意-好点。如果缓存为32K,并且主要用于保存阵列,则可能会命中40%的引用。因此60%的未命中率会使每次未命中的成本增加约17个周期(再次假设我的数学是正确的)。
Mark Wilkins,2009年

sandpile.org/impl/p4.htm建议从90nm至65nm P4读取L2缓存的等待时间在18至20个周期之间。因此,马克的上述快速计算方法很不错:)
Goz

实际上,假设每个未命中18个周期并进行插值,这将使我们获得大约56.3%的L1高速缓存未命中值,并且假定20个周期将给我们提供50.6%的L1高速缓存未命中值。
Goz

3

如果您打算使用cachegrind,请注意,它只是一个缓存命中/未命中模拟器。它并不总是准确的。例如:如果您访问某个内存位置,例如在一个循环中说0x1234 1000次,则cachegrind始终会向您显示只有一个缓存未命中(第一次访问),即使您遇到以下情况:

clflush 0x1234在您的循环中。

在x86上,这将导致所有1000次缓存未命中。


您能解释一下为什么在x86上会丢失1000次缓存


0

没有更多的测试就很难确定地说什么,但是根据我的经验,差异的大小肯定可以归因于CPU L1和/或L2缓存,尤其是在具有随机访问的情况下。通过确保每次访问距离最后一次访问至少至少一些最小距离,可能使情况变得更糟。


-3

最简单的方法是对目标cpu进行缩放照片,然后物理测量内核与1级缓存之间的距离。将该距离乘以电子每秒在铜中传播的距离即可。然后找出您在同一时间可以拥有多少个时钟周期。这是您将在L1缓存未命中时浪费的最少CPU周期数。

您还可以计算出以相同方式浪费的CPU周期数,从RAM中获取数据的最低成本。您可能会感到惊讶。

请注意,您在此处看到的内容肯定与缓存未命中有关(无论是L1还是L1和L2),因为通常,一旦您访问该缓存行中的任何内容,缓存就会在同一缓存行上提取数据更少的RAM行程。

但是,您可能还会看到的事实是RAM(即使它称为随机存取存储器)仍然偏爱线性存储器访问。


6
<悬挂>电子的速度与电流/电压的速度无关。电子移动非常缓慢。</ pedant>
Skizz

是的,这更多地与电容以及振铃稳定下来需要多长时间有关。
Crashworks

@Skizz,您能告诉我如何将这些单位转换为秒,以便我可以将其转换为答案吗?
贾斯珀·贝克斯

3
您至少可以做的是包含铜的电波速度,即IIRC约为0.6c(足够接近此目的)
MSalters

1
如果缓存访问是无时钟的异步电路,这将是有意义的。实际处理器是流水线的,更改仅发生在时钟沿,并且加载/存储流水线具有确定性地运行的流水线寄存器。物理距离仅与设计硅片的工程师有关。当然,延迟的原因之一是物理距离,但是您无法从照片确定延迟。
doug65536 '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.