我记得假设L1缓存命中1个周期(即等同于注册访问时间)在我的建筑类,但实际上现代x86处理器真的吗?
多少个时钟周期的L1缓存命中走? 它是如何比较寄存器访问?
我记得假设L1缓存命中1个周期(即等同于注册访问时间)在我的建筑类,但实际上现代x86处理器真的吗?
多少个时钟周期的L1缓存命中走? 它是如何比较寄存器访问?
下面是关于这个问题的一个伟大的文章:
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
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
没有。
单周期缓存延迟以前是在简单的有序管道的事情在较低的时钟速度(所以每个周期更纳秒),尤其是简单的缓存(更小,还不如联想,并以较小的TLB为间没有缓存”牛逼纯粹的虚拟寻址。)例如经典的5级RISC流水线像MIPS我承担的缓存命中存储器存取1个周期,在EX地址计算和MEM内存访问,WB阶段之前。
现代高性能CPU划分管道分成多个阶段,使每个周期更短。 这让喜欢简单的指令add
/ or
/ and
运行非常快,还是1个周期延迟,但在高时钟速度。
有关循环计数和乱序执行的详细信息,请参阅昂纳雾的microarch PDF格式 ,并在其他环节的x86标签维基 。
英特尔的Haswell的L1负载使用的等待时间是4个周期用于指针跟踪,这是典型的现代的x86 CPU的。 即如何快速mov eax, [eax]
可以在一个循环中运行,与指向自身的指针。 (或者一个链接列表,在缓存命中,易与闭环microbench)。 又见有当基地+偏移一个点球是在比基不同的页面? 这4个周期的延迟特例仅当指针从另一负载来直接应用,否则它的5个周期。
负载使用的等待时间对于在英特尔CPU SSE / AVX矢量更高1个循环。
店重装延时为5个周期,并且是无关的缓存命中或错过 (它的储存转发,从存储缓冲区用于存储数据还没有承诺L1D缓存中读取)。
如哈罗德评论的,寄存器访问是0周期。 因此,举例来说:
inc eax
有1层周期的延迟(只是ALU操作) add dword [mem], 1
有6个周期的延迟,直到从负载dword [mem]
将准备。 (ALU +商店转发)。 例如保持在存储器中的循环计数器限制环至每6个周期一次迭代。 mov rax, [rsi]
具有4周期延迟rsi
正准备rax
准备好上的L1命中(L1负载使用的等待时间。) http://www.7-cpu.com/cpu/Haswell.html有每个缓存延迟(我会在这里复制)的表,和一些其他的实验号码,包括L2-TLB命中延迟(上L1DTLB小姐)。
英特尔i7-4770(Haswell的),3.4千兆赫(涡轮增压升压关闭),22纳米。 RAM:32 GB(PC3-12800 CL11 CR 2)。
- 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至强,包括一些远程(其他插槽)存储器/ L3号码的表。
如果我没记错的话这是约1-2个时钟周期,但这是一个估计值,更新缓存可能会更快。 这是出了计算机体系结构的书我有,这是AMD的信息,以便英特尔可能会略有不同,但我想这似乎是一个很好的估计给我5个15个时钟周期之间的约束它。
编辑:糟糕L2是10个循环,TAG访问,L1为1〜2个周期,我的错误:\
实际上,L1缓存命中的成本几乎是一样的寄存器访问成本。 这是令人惊讶的,对我来说这是真的,至少我处理器(速龙64)。 前一段时间我写了一个简单的测试应用程序来访问共享数据在多处理器系统的标杆效率。 涂布体是在预定义的时间周期的简单存储器变量递增。 为了使comapison,我基准非共享变量在第一。 而且活动期间我拍摄的结果,但随后在应用程序拆卸我发现,编译器欺骗了我的期望和应用不需要优化我的代码。 它只是把变量在CPU寄存器和寄存器iterativetly增加它没有内存访问。 但我强迫compliler使用内存变量而不是寄存器变量后,真正的惊喜是achived。 在更新的应用程序,我几乎achived相同基准测试结果。 性能的劣化真的negligeble(约1-2%),看起来像相关的一些副作用。
结果:
1)我认为,作为一个非托管的处理器寄存器库,你可以考虑L1缓存。
2)没有任何SENCE通过迫使编译商店经常accesing在处理器寄存器数据应用残酷assambly优化。 如果他们是真正的频繁访问,他们将生活在L1高速缓存,并且由于这将有相同的访问成本处理器寄存器。