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)
没有。
单周期缓存延迟通常是在较低的时钟速度(因此每个周期为更多的纳秒)上在简单的有序管道中发生的事情,尤其是对于较简单的缓存(更小,没有关联性,并且对于没有缓存的缓存,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 次 |
| 最近记录: |