当前位置: 首页 > 知识库问答 >
问题:

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

乐正辰阳
2023-03-14

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

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

共有3个答案

魏彦
2023-03-14

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

编辑:Whoops L2是10个周期与TAG访问,L1需要1到两个周期,我的错误:\

马绪
2023-03-14

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

单周期缓存延迟曾经是简单的有序流水线上以较低的时钟速度(因此每个周期更多纳秒)的事情,尤其是对于更简单的缓存(更小,不那么关联,并且对于不是纯粹虚拟寻址的缓存使用更小的TLB。)例如,经典的5级RISC流水线(如MIPS I)假设缓存命中的内存访问为1个周期,在EX中进行地址计算,在WB之前在单个MEM流水线阶段进行内存访问。

现代高性能CPU将流水线分成多个阶段,使每个周期更短。这使得像<code>add/<code>或<code>/>code>和<code>这样的简单指令运行得非常快,仍然有1个周期的延迟,但时钟速度很快。

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

Intel Haswell的L1加载使用延迟是4个周期用于追逐指针,这是现代x86 CPU的典型特征。即mov eax,[eax]可以在循环中运行多快,指针指向自身。(或对于在缓存中命中的链表,容易使用闭环进行微测试)。另请参阅当基本偏移量与基本偏移量在不同的页面中时是否会受到惩罚?4周期延迟特例仅适用于指针直接来自另一个负载的情况,否则为5周期。

对于英特尔CPU中的SSE/AVX向量,负载使用延迟比此高1个周期。

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

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

  • inc eax 有 1 个周期延迟(只有 ALU 操作)
  • 添加 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(哈斯韦尔),3.4 GHz(睿频加速关闭),22 纳米。内存: 32 GB (PC3-12800 cl11 cr2).

> < li>

L1数据缓存= 32 KB,64 B/行,8路。

L1指令缓存=32 KB,64 B/行,8路。

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

L3缓存=8 MB,64 B/行

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

L1数据缓存延迟= 5个周期,用于复杂地址计算的访问(< code>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号码。

澹台逸明
2023-03-14

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

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
 类似资料:
  • 2. x86的寄存器 x86的通用寄存器有eax、ebx、ecx、edx、edi、esi。这些寄存器在大多数指令中是可以任意选用的,比如movl指令可以把一个立即数传送到eax中,也可传送到ebx中。但也有一些指令规定只能用其中某个寄存器做某种用途,例如除法指令idivl要求被除数在eax寄存器中,edx寄存器必须是0,而除数可以在任意寄存器中,计算结果的商数保存在eax寄存器中(覆盖原来的被除数

  • 从本论坛上的前一个问题中,我了解到,在大多数内存系统中,一级缓存是二级缓存的子集,这意味着从二级缓存中删除的任何条目也将从一级缓存中删除。 所以现在我的问题是如何为L2缓存中的条目确定L1缓存中的相应条目。存储在L2条目中的唯一信息是标签信息。基于此标记信息,如果我重新创建addr,如果L1和L2缓存的行大小不相同,它可能会跨L1缓存中的多行。 体系结构是否真的为刷新这两条缓存线而烦恼,还是只维护

  • 本文向大家介绍本地存储的生命周期是什么?相关面试题,主要包含被问及本地存储的生命周期是什么?时的应答技巧和注意事项,需要的朋友参考一下 : 和 都能控制数据的存储时间。 是一个绝对的过期时间, 是文档被访问之后的存活时间(是相对时间)。默认是 。 : 当会话被关闭后(浏览器、标签页被关闭),就会被清除。与 用法一样。 : 除非被主动清除,不然永久储存在浏览器中。 : 没有过期时间,除非主动清除。

  • 本文向大家介绍Intel x86 Assembly& Microarchitecture 调零寄存器,包括了Intel x86 Assembly& Microarchitecture 调零寄存器的使用技巧和注意事项,需要的朋友参考一下 示例 将寄存器归零的明显方法是MOV在0—例如: 请注意,这是一个5字节指令。 如果您愿意破坏标志(MOV从不影响标志),则可以使用XOR指令将寄存器与其自身按位异

  • 本文向大家介绍Intel x86 Assembly& Microarchitecture 标志寄存器,包括了Intel x86 Assembly& Microarchitecture 标志寄存器的使用技巧和注意事项,需要的朋友参考一下 示例 当x86算术逻辑单元(ALU)执行像NOT和一样的操作时ADD,它将在特殊的16位FLAGS寄存器中标记这些操作的结果(“变为零”,“溢出”,“变为负”)。3

  • 本文向大家介绍Intel x86 Assembly& Microarchitecture 8位寄存器,包括了Intel x86 Assembly& Microarchitecture 8位寄存器的使用技巧和注意事项,需要的朋友参考一下 示例 前四个16位寄存器可以将其高低字节和低半字节直接作为自己的寄存器进行访问: AH和AL是AX寄存器的上半部分和下半部分。 BH和BL是BX寄存器的上半部分和下