百科问答小站 logo
百科问答小站 font logo



为什么目前x86的CPU的L1 Cache这么小? 第1页

  

user avatar   bei-ji-85 网友的相关建议: 
      

各种原因都有,可以说是技术问题,也可以说是市场定位的影响。

L1 cache的大小确实会影响到访问性能,准确的说,对x86或者x86-64这种内存模型的架构来说会有比较大的影响

一个实际的例子就是:从Intel Sunny Cove(Core第10代)开始,L1 cache从32K(指令)+32K(数据)的组合变成了32K(指令)+48K(数据)的组合。

数据来源:

这样的后果就是L1 cache的访问性能下降,从4个cycle变成5个cycle:

数据来源:

虽然只多了一个cycle,但相当于增加了25%的开销,实际上影响是不小的。

Intel是知道这种延迟的代价的,Intel的希望是通过扩大L1 cache能获得的性能的提升抵消这种延迟。但这种一升一降的抵消是有上限的,增大L1 cache必然伴随着设计成本的增大,所以这里也有性价比的问题,也就是客户接受程度的问题,所以也是一个市场问题。


为什么ARM架构的L1 cache没有这种问题?我个人理解是,原因出在前面说的内存模型上,x86(包括x86-64,下同)属于编程友好型的内存模型,绝大多数操作不存在内存重排(memory reorder),从汇编语言的角度上说,就是汇编指令运行基本上就是指令编写的那种样子(AMD64就是x86-64):

图片来源:


说的更简单点:在x86或者x86-64上写驱动或者操作系统,比在ARM上(以及其它CPU上)要容易的多,因为x86上是strict memory model,ARM上是weak memory consistency。(参考链接:Memory consistency and memory order)。在做DMA操作的时候,在x86上不需要考虑DMA内存的问题,硬件(内存控制器)会主动帮软件解决DMA可能遇到的问题,但ARM上则需要手动flush DMA。

为了保证内存的一致性,x86架构下,对L1 cache需要更多的一致性的维护工作,所以L1 cache的增加对于x86来说是一种负担,无脑增大L1 cache对于x86架构来说获得的性能提升不好,性价比不高。

对于指令cache来说,Intel CPU的压力更多的是在后端:

图片来源:en.wikichip.org/wiki/in

从这个架构图上看微指令的队列是很大的,考虑到x86的指令是变长的,那么16B对接5个指令解码器(decode)以及128个uOP已经是一个很巨大的数量了,而指令的执行后端,只有port0到port7,不少指令还需要多个port,这种情况下后端的执行压力更大,与其增大L1 指令cache,不如优化流水线或者增加执行后端效果更好。

对于RISC来说,增大L1 指令cache的好处也不明显,因为世界上绝大多数CPU都是前端在等待后端,后端压力更大一些。


cache line size常年保持64B,这个是一个兼容性的问题(最早见于pentium 4),如果要改变这个值,那么操作系统和很多驱动都要重写(驱动中很多数据要对齐到cache line),改变cache line size产生的破坏性非常巨大,不亚于改变指令集兼容性。对于x86这种强调兼容性的厂商来说,这是绝对不可以的。

抛开兼容性不谈,目前Intel CPU内部的高速环形总线是32B的,cache line太小不行,太大的话总线占用周期过长,也不合理,所以目前看64B是一个比较合适的中间值。


所以,总结起来就是:增大L1 cache对于x86来说好处不太明显,成本反而更高,性价比不划算,客户不一定买单,既是技术问题,也是市场选择。


user avatar   chen-hui-12-40 网友的相关建议: 
      

实际上现在的Golden Cove已经涨到48KB L1d+32KB L1i了,即使是X86的主流容量也有32KB L1d+32KB L1i。

CPU在一个时钟域内应当有能力访问缓存的所有单元,而增加L1缓存会增大访问L1缓存的延迟,这使得CPU浪费了更多的时钟周期访问缓存。另外,苹果比较有钱舍得花芯片面积堆缓存量,实际上ARM Cortex-X1大核心也就配了64KB L1。

还有一个是Decoded ICache的存在,这个问题下别的回答有提到,具体可以参考intel官方的介绍。

The Decoded ICache caches decoded instructions, called micro-ops (μops), coming out of the legacy decode pipeline. The next time the processor accesses the same code, the Decoded ICache provides the μops directly, speeding up program execution.
Decoded ICache存储了已经被解码的叫作μops的出自过去的解码流水线的指令。处理器下次访问相同代码的时候,Decoded ICache直接提供μops,加速程序执行。


以下回应评论区的看法:

1.增大缓存可以提高命中率,降低Cache Miss带来的惩罚。我阅读了一些资料,发现IPC存在两种不同的定义:如果是执行的指令与Unhalted Cycle非空循环之比,那么文中该名词系误用;如果是the average number of instructions executed for each clock cycle每时钟周期平均执行指令数,那么减少Cache Miss的确影响IPC。

2.L1 Cache本身有延迟,这个延迟大概会占据CPU的几个Cycle,L2的延迟大概是十几个Cycle。我原先的理解和表述应当是有误的,我已经进行了修改。


user avatar   qin-mian-05-02 网友的相关建议: 
      

前面答主提到了L1大小将直接影响访问时间,而访问L1的时间又会直接影响到平均内存访问时间(average memory access time - AMAT),对整个CPU的性能产生巨大影响。那么具体L1大小是如何限制L1访问时间的呢?这里涉及到一个重要的CPU模块translation lookahead buffer - TLB,下面简单介绍一下这两点。

1,平均内存访问时间 AMAT

首先,我们用一个简单的例子来说明一下L1访问时间对AMAT的影响。Intel从Sunny Cove开始将L1-D从原来的32KB提高到了48KB(纠正题目中的一个错误,intel和AMD长期使用的是32KB L1-D和32KB L1-I而非16KB)。对应的L1访问时间从4 cycle来到了5 cycle(intel声称48KB L1-D的延时虽然提升了,但是带宽比之前提升了一倍)。对应的苹果的M1 L1-D访问时间为3 cycle。

假设我们有三层的memory hierarchy(L1, L2, off-chip RAM),其中L2访问时间为10 cycle,off-chip RAM访问时间为200 cycle。假设32KB L1-D的情况下L1,L2的hit rate大致为90%,9%,增加至48KB L1-D的Sunny Cove L1,L2 hit rate提升为95%,4%,那么对应的。

Sunny Cove平均访问时间约为7.15 cycle

Sunny Cove之前的microarchitecture的平均访问时间约为6.5 cycle(之前写反了:p)

简单的模型估算可以看出,即便增大L1 size可以提升L1 hit rate,然而L1访问延时的增加,还是会使得平均内存访问延时增加了~10%。这也是为什么L1 cache size(以及对应的访问时间)长时间来没有太大改动的原因。那么究竟是什么限制了L1的访问延时呢?这里就要引入TLB和L1的结构。

2,TLB,virtual index physical tag L1缓存结构

在系统启动过程中,仅在很早期启动阶段CPU处于实模式,开启paging之后,CPU接受的load/store指令对应的地址均为虚拟地址(更准确的说是线性地址,x64之后segment基本不怎么用了),在访问L1 cache的时候还需要经过虚拟地址VA到物理地址PA的转换。现代CPU通常采用virtual index physical tag的L1结构(L1-D和L1-I类似,TLB也区分iTLB和dTLB)。这种L1的结构一大好处就是可以在index cache set的时候同时访问TLB(相当于隐藏了部分L1访问延时),一个x64下的L1访问示意图如下所示。(这里不在详细介绍set-associative cache的具体结构)

对于4KB大小的page,共有12bit page offset,其中低6bit为cacheline offset(64B cacheline size),剩余6bit作为L1 index bits,这也就意味着L1只能限制于64个cache set。对于32KB L1-D,也就意味着其每个set对应8 way(32KB/64/64 = 8)。Sunny Cove的48KB L1-D对应每个set 12 way。由上图可以看出,L1访问延时的关键路径为TLB访问以及TLB hit之后对相应L1 cache set的TAG matching,由于cache set是简单的lookup,我们可以认为在TLB查询结束得到PPN的时候立即可以进行TAG matching。(TLB也是一个小的set-associatative cache,也需要进行TAG matching因此访问时间要长于L1 set lookup)。因此,TLB的查询时间和L1的associativity(即图中的TAG matching)决定了L1的访问延时。

为了保证L1访问延时可以做的足够低(原因如上所示),通常需要设计L1的associativity尽量小。因此在Sunny Cove之前通常为8 way。这里Sunny Cove增加了一个cycle的L1访问延时,不确定是由TLB的改动引起的还是L1 associativity由8 way增加到12 way因此的。但是总的来说,我们可以看出L1为什么不能设计的很大,主要是由于virtual index physical tag的结构引起的。

那么为什么苹果的M1可以做到192KB的L1-I(128KB L1-D),同时保证3 cycle的访问延时呢?

首先一点苹果的最高主频相对Intel/AMD的desktop/server line的CPU要低一些,因此在时序上约束相对放松一些(主要是tag matching的comparator路径的关键路径)。其次一点,也是最关键的M1对应的MacOS采用的是16KB page而非x86的4KB page。

由上图可知如果扩大page size(16KB对应14bit),相当于增加了2bit的index bits,这样的话L1 cache set数目可以增加4倍(在保持associativity的前提下),因此M1的L1-I正好是Sunny Cove的4倍(192KB/48KB = 4)。M1的L1-D大小是128KB(4倍于32KB)。

苹果的M1其实没有什么太多的黑科技(相对于x86来讲,RISC带来的译码的简化确实可以带来巨大的instruction window size的提升),但是对于问题中的L1 cache来讲,其实更多的是系统层面的取舍(page size增加也会导致内存浪费,内存碎片等问题,但是同时也会减轻页表的压力,增加TLB coverage)。不过也仅限于苹果,其M1的产品只是MacBook一个设备,可以做更多的定制,对于x86来讲,历史包袱和众多设备兼容性的问题,使其很难做到像苹果这种更加灵活的架构设计。


user avatar   luv_letter 网友的相关建议: 
      不是很关注国家政治,也不希望披上政治色彩。只是单纯的想从历史的角度了解这段历史,得到客观有价值的回答 THS


  

相关话题

  8086CPU的16位数据线如何传送大于16位的数据? 
  迄今为止押宝多核的策略几乎都失败了,为什么开发者如此抵触多核? 
  迄今为止押宝多核的策略几乎都失败了,为什么开发者如此抵触多核? 
  Intel 12 代酷睿封杀 AVX-512 指令集,不再允许关闭小核,背后都有哪些原因? 
  amd 5800x cpu 针脚弯了2根 拨正之后。影响cpu性能吗? 
  假如将 CPU 等比例(物理)放大 100 甚至 1000 倍,会发生什么? 
  英伟达宣布将以 400 亿美元收购 ARM ,如何评价这一收购?这意味着什么? 
  手机的整体功耗大概是多少? 
  CPU的功耗和什么相关?为什么一个while(1);就可占满CPU的功耗? 
  为什么手机的soc不使用超线程技术? 

前一个讨论
当页表中的页表项大部分都有效的时候,多级页表还能节省空间吗?
下一个讨论
运行超过24小时的火车,每天都发。那车次名字一样吗?





© 2024-11-24 - tinynew.org. All Rights Reserved.
© 2024-11-24 - tinynew.org. 保留所有权利