L1缓存命中的周期/成本与x86上的Register相比?

Meh*_*dad 27 performance x86 cpu-architecture micro-optimization cpu-cache

我记得假设在我的架构类中L1缓存命中是1个周期(即与寄存器访问时间相同),但在现代x86处理器上实际上是这样吗?

L1缓存命中多少个周期?它与寄存器访问相比如何?

pau*_*sm4 36

这是一篇关于这个主题的精彩文章:

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

要回答您的问题 - 是的,缓存命中与注册访问的成本大致相同.当然,高速缓存缺失是非常昂贵的;)

PS:

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

访问各种缓存和主内存的近似成本?

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 
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • 如何访问L3缓存可能需要100-300个周期,而本地DRAM访问只需要大约120个周期.这是否意味着L3缓存可能比主存中使用的DRAM慢两倍? (3认同)

Pet*_*des 8

没有。

单周期缓存延迟通常是在较低的时钟速度(因此每个周期为更多的纳秒)上在简单的有序管道中发生的事情,尤其是对于较简单的缓存(更小,没有关联性,并且对于没有缓存的缓存,TLB较小)时t纯粹是虚拟寻址。)例如,像MIPS I这样的经典5级RISC管道假设在WB阶段之前对缓存命中执行1个周期的内存访问,其中EX中进行地址计算,而MEM中进行内存访问。

现代高性能CPU将流水线划分为更多的阶段,从而缩短了每个周期。这让简单的指令一样add/ or/ and跑的真快,还是1个周期延迟,但在高时钟速度。


有关周期计数和乱序执行的更多详细信息,请参阅Agner Fog的microarch pdf以及x86标签wiki中的其他链接。


Intel Haswell的L1负载使用延迟是4个周期的指针跟踪,这是现代x86 CPU的典型情况。即mov eax, [eax],可以使用指向自身的指针在循环中运行多快。(或者对于命中缓存的链表,很容易通过闭环进行微平台测试)。另请参见当base + offset与base在不同的页面中时,会有惩罚吗?仅当指针直接来自另一个负载时才适用4周期延迟特殊情况,否则为5周期。

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


存储重新加载延迟为5个周期,与缓存命中或未命中无关(它是存储转发,从存储缓冲区读取尚未提交给L1d缓存的存储数据)。

正如harold所说,寄存器访问为0个周期。因此,例如:

  • inc eax 具有1个周期的延迟(仅ALU操作)
  • add dword [mem], 1具有6个周期的延迟,直到负载dword [mem]准备就绪为止。(ALU +商店转发)。例如,将循环计数器保存在内存中可将循环限制为每6个循环进行一次迭代。
  • mov rax, [rsi]rsi准备就绪到rax准备好应对L1命中有4个周期的延迟(L1负载使用延迟)。

http://www.7-cpu.com/cpu/Haswell.html包含每个缓存的延迟表(我将在此处复制),以及一些其他实验数据,包括L2-TLB命中延迟(L1DTLB未命中) )。

英特尔i7-4770(Haswell),3.4 GHz(Turbo Boost关闭),22 nm。内存:32 GB(PC3-12800 cl11 cr2)。

  • L1数据缓存= 32 KB,64 B /行,8路。
  • L1指令缓存= 32 KB,64 B /行,8路。
  • L2缓存= 256 KB,64 B /行,8路
  • 三级缓存= 8 MB,64 B /行

  • L1数据缓存延迟= 4个周期,用于通过指针(mov rax, [rax])进行简单访问

  • L1数据缓存延迟= 5个周期,用于使用复杂地址计算(mov rax, [rsi + rax*8])进行访问。
  • L2缓存延迟= 12个周期
  • L3缓存延迟= 36个周期
  • RAM延迟= 36个周期+ 57 ns

顶级基准测试页面是http://www.7-cpu.com/utils.html,但仍然没有真正解释不同测试大小的含义,但是可以使用代码。测试结果包括Skylake,它与该测试中的Haswell几乎相同。

@ paulsm4的答案有一张用于多路Nehalem Xeon的表,其中包括一些远程(其他插槽)内存/ L3数字。


归档时间:

查看次数:

17740 次

最近记录:

6 年,6 月 前