Performance x86上一级缓存命中与寄存器的周期/成本?

Performance x86上一级缓存命中与寄存器的周期/成本?,performance,x86,cpu-architecture,cpu-cache,micro-optimization,Performance,X86,Cpu Architecture,Cpu Cache,Micro Optimization,我记得在我的体系结构类中,假设一级缓存命中率为1个周期(即与寄存器访问时间相同),但在现代x86处理器上是否确实如此 一级缓存命中需要多少个周期?它与寄存器访问相比如何?如果我没记错的话,大约是1-2个时钟周期,但这是一个估计值,新的缓存可能会更快。这是我的一本计算机体系结构书,这是AMD的信息,所以英特尔可能略有不同,但我会将其限制在5到15个时钟周期之间,这对我来说似乎是一个很好的估计 编辑:哎哟,L2是10个周期,带有标记访问,L1需要1到2个周期,我的错误:\这是一篇关于这个主题的好文章

我记得在我的体系结构类中,假设一级缓存命中率为1个周期(即与寄存器访问时间相同),但在现代x86处理器上是否确实如此


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

如果我没记错的话,大约是1-2个时钟周期,但这是一个估计值,新的缓存可能会更快。这是我的一本计算机体系结构书,这是AMD的信息,所以英特尔可能略有不同,但我会将其限制在5到15个时钟周期之间,这对我来说似乎是一个很好的估计


编辑:哎哟,L2是10个周期,带有标记访问,L1需要1到2个周期,我的错误:\

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

回答您的问题-是的,缓存命中与寄存器访问的成本大致相同。当然,缓存未命中的代价相当高;)

附言:

具体情况会有所不同,但此链接提供了一些大致的数据:

缴费灵:

这些数字代表了更老、更慢的CPU,但这些比率基本上保持不变:


实际上,一级缓存命中的成本几乎与寄存器访问的成本相同。这对我来说是令人惊讶的,但这是真的,至少对我的处理器(Athlon 64)来说是如此。不久前,我编写了一个简单的测试应用程序,以测试在多处理器系统中访问共享数据的效率。应用程序主体是一个简单的内存变量,在预定义的时间段内递增。为了进行比较,我首先对非共享变量进行了基准测试。在那个活动中,我捕捉到了结果,但在应用程序反汇编过程中,我发现编译器欺骗了我的期望,并对代码进行了不必要的优化。它只是将变量放入CPU寄存器,并在寄存器中迭代递增,而无需访问内存。但真正令人惊讶的是,我强迫compliler使用内存变量而不是寄存器变量。在更新的应用程序中,我获得了几乎相同的基准测试结果。性能下降实际上是可以忽略不计的(~1-2%),看起来与某些副作用有关

因此:

1)我认为您可以将L1缓存视为非托管处理器寄存器池。


2) 通过强制编译器频繁地访问处理器寄存器中的数据来应用野蛮的assambly优化没有任何意义。如果它们确实经常被访问,它们将驻留在一级缓存中,因此将具有与处理器寄存器相同的访问成本。

吞吐量和延迟是不同的。你。关于吞吐量,请参阅大多数现代微体系结构的-2负载/时钟吞吐量。有关加载/存储执行单元的微体系结构详细信息,请参见,包括显示加载/存储缓冲区,这些缓冲区限制了它们可以跟踪的内存级别并行度。这个答案的其余部分将只关注延迟,这与涉及指针跟踪(如链表和树)的工作负载有关,以及无序执行需要隐藏多少延迟。(三级缓存未命中通常太长,无法完全隐藏。)

单周期缓存延迟过去在时钟速度较低的简单顺序管道上是一个问题(因此每个周期都是纳秒),特别是对于更简单的缓存(更小,没有关联性,对于不完全虚拟寻址的缓存,TLB更小)例如,like MIPS I假设缓存命中时的内存访问为1个周期,在WB之前,在EX中进行地址计算,在单个MEM管道阶段进行内存访问

现代高性能CPU将管道划分为多个阶段,使每个周期更短。这使得像
添加
/
/
这样的简单指令运行速度非常快,仍然有1个周期的延迟,但时钟速度很快


有关循环计数和无序执行的更多详细信息,请参阅和中的其他链接


Intel Haswell的L1加载使用延迟是指针跟踪的4个周期,这是现代x86 CPU的典型情况。i、 e.
mov-eax,[eax]
在循环中运行的速度有多快,指针指向自身。(或者对于缓存中命中的链表,可以很容易地使用闭合循环进行微链接)。另请参见4周期延迟特例,仅当指针直接来自另一个负载时才适用,否则为5个周期

Intel CPU中SSE/AVX向量的加载使用延迟比SSE/AVX向量高1个周期


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

正如harold所评论的,寄存器访问是0个周期。例如:

  • inc eax
    有1个周期延迟(仅ALU操作)
  • add dword[mem],1
    有6个周期延迟,直到从
    dword[mem]
    加载准备就绪。(ALU+存储转发)。e、 在内存中保留一个循环计数器将循环限制为每6个周期一次迭代
  • mov-rax,[rsi]
    rsi
    准备就绪到
    rax
    在L1命中时准备就绪有4个周期延迟(L1加载使用延迟)

有一个每个缓存的延迟表(我将在这里复制),以及一些其他实验数据,包括L2-TLB命中延迟(在L1DTLB未命中时)

英特尔i7-4770(哈斯韦尔),3.4千兆赫(涡轮增压关闭),22纳米。内存:32 GB(PC3-12800 cl11 cr2)

  • 一级数据缓存=32 KB,64 B/行,8路

  • 一级指令缓存=32 KB,64 B/行,8路

  • 二级缓存=256 KB,64 B/行,8路

  • 三级缓存=8 MB,64 B/行

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

  • 一级数据缓存延迟=具有复杂地址计算的访问的5个周期(
    mov-rax,[rsi+rax*8]

  • 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 
    
    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