2012-04-23 39 views
22

我记得假设在我的架构类中L1缓存命中是1个周期(即与寄存器访问时间相同),但是在现代x86处理器上实际上是否如此?L1高速缓存命中与x86上寄存器的周期/成本?

L1缓存命中需要多少个周期?它与注册访问相比如何?

+0

它因处理器而异,但我不知道它的位置*与寄存器一样快*大约比较慢1到5个时钟周期。 – 2012-04-23 03:15:18

+2

我不知道L1有单周期延迟的架构。此外,我不知道任何x86体系结构,其中寄存器访问本身具有可测量的延迟(由于其他因素可能会感知到一些延迟)。 – harold 2012-04-24 12:07:42

+0

请参阅http://www.7-cpu.com/cpu/Haswell.html:某些每高速缓存和每个TLB延迟数字以及一些实验性数字。另请参阅[Agner Fog's microarch pdf](http://agner.org/optimize/)以及[x86 tag wiki](http://stackoverflow.com/tags/x86/info)中的其他链接。 Haswell的L1负载使用延迟为4个周期,这是现代x86 CPU的典型特征。存储 - 重新加载延迟是5个周期,并且与缓存命中或未命中(它是存储转发,而不是缓存)无关。正如哈罗德所说,寄存器访问是0个周期(例如,'inc eax'有1个周期延迟,'inc [mem]'有6个周期延迟(ALU +存储转发) – 2016-08-24 21:52:47

回答

32

下面是关于这个问题的一个伟大的文章:

http://arstechnica.com/gadgets/reviews/2002/07/caching.ars/1

要回答你的问题 - 是的,缓存命中的成本与寄存器访问大致相同。当然,高速缓存未命中是相当昂贵的;)

PS:

的细节会有所不同,但此链接有一些很好的大概数字:

Approximate cost to access various caches and main memory?

Core i7 Xeon 5500 Series Data Source Latency (approximate) 
L1 CACHE hit, ~4 cycles 
L2 CACHE hit, ~10 cycles 
L3 CACHE hit, line unshared ~40 cycles 
L3 CACHE hit, shared line in another core ~65 cycles 
L3 CACHE hit, modified in another core ~75 cycles remote 
L3 CACHE ~100-300 cycles 
Local DRAM ~30 ns (~120 cycles) 
Remote DRAM ~100 ns 

PPS:

这些数字代表太多较旧的较慢的CPU,但比率基本保持不变:

http://arstechnica.com/gadgets/reviews/2002/07/caching.ars/2

Level     Access Time Typical Size Technology Managed By 
-----     ----------- ------------ ---------  ----------- 
Registers    1-3 ns  ?1 KB   Custom CMOS Compiler 
Level 1 Cache (on-chip) 2-8 ns  8 KB-128 KB SRAM   Hardware 
Level 2 Cache (off-chip) 5-12 ns  0.5 MB - 8 MB SRAM   Hardware 
Main Memory    10-60 ns  64 MB - 1 GB DRAM   Operating System 
Hard Disk    3M - 10M ns 20 - 100 GB Magnetic  Operating System/User 
+2

如何访问L3缓存可能需要100-300个周期,而本地DRAM访问只需要约120个周期。这是否意味着L3缓存比主内存中使用的DRAM慢两倍以上? – user2316602 2016-08-10 17:52:00

+0

@ user2316602:对我来说似乎也是虚假的,除非该表行应该用于不同套接字中CPU的L3高速缓存。 (这是Nehalem Xeon系统,所以主内存和L3都是NUMA。) – 2016-08-24 21:32:21

1

如果我没有记错的话,大概需要1-2个时钟周期,但这是一个估计值,较新的缓存可能会更快。这是我没有的计算机体系结构书,这是AMD的信息,所以英特尔可能会略有不同,但我会约束它5至15个时钟周期,这似乎是一个很好的估计给我。

编辑:哎呦L2是10个周期标签访问,L1采用1到两个周期,我的错误:\

+0

只是检查,你说的是* hit *而不是* miss *,对吗? – Mehrdad 2012-04-23 03:16:57

+0

是的,TAG访问需要2个周期,我相信,剩下的时间是从缓存访问和加载。 – 2012-04-23 03:17:51

+0

嗯,好的谢谢!+1 – Mehrdad 2012-04-23 03:18:18

0

其实L1高速缓存命中的成本几乎是一样的寄存器访问成本。这对我来说是令人惊讶的,但至少在我的处理器(Athlon 64)中是如此。前一段时间,我编写了一个简单的测试应用程序,以测试多处理器系统中访问共享数据的效率。应用程序主体是一个简单的内存变量,在预定义的时间段内递增。为了进行合作,我首先对非共享变量进行了基准测试。在那次活动中,我捕获了结果,但是在应用程序拆卸期间,我发现编译器被我的期望欺骗了,并对我的代码应用了不需要的优化。它只是把变量放在CPU寄存器中,并在寄存器中迭代地递增,而不需要存储器访问。但是,我强制compliler使用内存中的变量而不是寄存器变量后,真正的惊喜得以实现。在更新的应用程序上,我获得了几乎相同的基准测试结果。性能降低真的可以忽略(〜1-2%),并且看起来像一些副作用。

至于结果:

1)我觉得你可以考虑L1缓存作为一个非托管的处理器寄存器池。

2)通过强制编译器存储频繁地访问处理器寄存器中的数据,没有任何意义可以应用残酷的assambly优化。如果它们真的被频繁访问,它们将会存在于L1缓存中,并且由于这将具有与处理器寄存器相同的访问成本。

+0

您的基准测试是错误的,或者是其他问题的瓶颈。 'inc [mem]'在Intel Haswell上有6c的延迟,而在AMD上则有类似的延迟。 'inc eax'在所有现代x86 CPU上都有1个周期的延迟。这是存储转发延迟,而不是L1延迟。 L1负载使用延迟更像是4个周期。请参阅Agner Fog的microarch pdf以及[x86 tag wiki]上的其他链接(http://stackoverflow.com/tags/x86/info)。 – 2016-08-24 21:38:42

3

有关循环计数和无序执行的更多详细信息,请参阅Agner Fog's microarch pdfx86 tag wiki中的其他链接。


英特尔Haswell的L1负载使用延迟是4个周期,这是现代x86 CPU的典型情况。即可以多快地运行一个循环,并且指向自己的指针。 (或者到一个小的闭环链表)。

对于Intel CPU中的SSE/AVX向量,负载使用延迟高出1个周期。


店重装延时为5个周期,并且是无关的缓存命中或错过(它的储存转发,不L1高速缓存)。

正如哈罗德评论的那样,寄存器访问是0个周期。因此,例如:

  • inc eax具有1周周期的等待时间(只是ALU操作)
  • inc dword [mem]具有6个周期的延迟,直到从dword [mem]负载将准备。 (ALU +商店转发)。例如在内存中保留一个循环计数器将循环限制为每6个循环一次循环。
  • mov rax, [rsi]有4个周期的等待时间从rsi正准备rax准备好上的L1命中(L1负载使用的等待时间。)

http://www.7-cpu.com/cpu/Haswell.html具有每缓存延迟的表(我将这里复制)和其他一些实验数据,包括L2-TLB命中延迟(在L1DTLB未命中)。

Intel i7-4770(Haswell),3.4 GHz(Turbo Boost off),22 nm。内存:32 GB(PC3-12800 cl11 cr2)。

  • L1数据缓存= 32 KB,64 B /行,8-WAY。
  • L1指令缓存= 32 KB,64 B /行,8-WAY。
  • L2高速缓存= 256 KB,64 B /线,8-WAY
  • L3高速缓存= 8 MB,64 B /线

  • L1数据高速缓存延迟= 4个周期用于经由指针简单的访问(mov rax, [rax]

  • L1数据高速缓存延迟=用于复杂地址计算访问的5个周期(mov rax, [rsi + rax*8])。
  • L2缓存延迟= 12个周期
  • L3缓存延迟= 36个循环
  • RAM延迟= 36个周期+ 57纳秒

顶层基准页是http://www.7-cpu.com/utils.html,但仍然没有按”不能真正解释不同的测试大小意味着什么,但代码是可用的。测试结果包括Skylake,这与Haswell在这个测试中几乎相同。

@ paulsm4的答案有一个多插座Nehalem Xeon表,包括一些远程(其他插座)内存/ L3号。