对于典型的x86多核处理器,我们说,我们有一个具有2个内核的处理器,并且两个内核在读取指令时都会遇到L1指令缓存未命中。让我们假设两个内核都访问位于不同高速缓存行中的地址中的数据。这两个内核是否会同时从L2获取数据到L1指令缓存,还是会被序列化?换句话说,我们是否有多个端口用于不同内核的L2缓存访问?
答案 0 :(得分:1)
对于典型的x86多核处理器,我们说,我们有一个2核的处理器
好的,让我们使用一些早期版本的Intel Core 2 Duo和两个核心(Conroe)。它们有2个CPU内核,2个L1i缓存和共享的L2缓存。
并且两个内核在读取指令时都会遇到L1指令高速缓存未命中。
好的,在L1i中将错过读取下一条指令(L1d中的错误,当您访问数据时,以类似的方式工作,但只有来自L1i的读取以及来自L1d的读取和写入)。每个带有未命中的L1i都会向下一层存储器层次结构生成对L2缓存的请求。
让我们假设两个内核都在访问位于不同缓存行中的地址中的数据。
现在我们必须知道如何组织缓存(这是经典的中间细节缓存方案,逻辑上类似于真实硬件)。高速缓存是具有特殊访问电路的存储器阵列,它看起来像2D阵列。我们有很多集(图中为64),每组都有几个方式。当我们要求缓存从某个地址获取数据时,地址分为3部分:标记,设置索引和缓存行内的偏移。设置索引用于选择集合(我们的2D高速缓存存储器阵列中的行),然后将所有方式的标签与请求地址的标记部分进行比较(以查找2D数组中的右列),这由8个标记并行完成比较。如果缓存中的标记等于请求地址标记部分,则缓存已“命中”,并且所选单元格中的缓存行将返回给请求者。
方式和方式;二维缓存数组(来自http://www.cnblogs.com/blockcipher/archive/2013/03/27/2985115.html或http://duartes.org/gustavo/blog/post/intel-cpu-caches/的图像)
选择设置索引2的示例,并行标记比较器为方法1提供“命中”(标记相等):
某些内存或缓存的“端口”是什么?这是外部硬件模块和存储器之间的硬件接口,它具有请求地址行(由外部模块设置,L1由CPU设置,L2由L1设置),访问类型(加载或存储;可以固定为端口),数据输入(用于存储)和带有就绪位的数据输出(由存储器设置;高速缓存逻辑也处理未命中,因此它在命中和未命中时返回数据,但它将返回数据以便稍后丢失)。
如果我们想增加真正的端口数,我们应该增加硬件:对于原始SRAM存储器阵列,我们应该为每个位添加两个晶体管以将端口数增加1;对于缓存,我们应该复制所有标记比较器逻辑但这成本太高,因此CPU中没有多少内存,如果它有多个端口,真实端口的总数很少。
但我们可以效仿几个端口。 http://web.eecs.umich.edu/~twenisch/470_F07/lectures/15.pdf EECS 470 2007幻灯片11:
并行缓存访问比并行FU更难
使用了几种方法
现代芯片使用多银行(有时称为切片)(“英特尔酷睿i7在L1中有四个银行,在L2中有八个银行”;从ISBN 1598297546(2011年第9页)的图1.6 ) - https://books.google.com/books?id=Uc9cAQAAQBAJ&pg=PA9&lpg=PA9)。这意味着,有几个较小尺寸的硬件缓存,以及一些请求地址(设置索引的一部分 - 认为集合 - 行分为8个部分或已着色为交错行)用于选择存储区。每个库的端口数量都很少(1),其功能与经典高速缓存一样(每个库中都有完整的标签比较器;但是库的高度 - 其中的集合数量较小,并且数组中的每个标签都被路由只有单标记比较器 - 在单端口缓存中便宜。
这两个内核是否会同时从L2获取数据到L1指令缓存,还是会被序列化?换句话说,我们是否有多个端口用于不同内核的L2缓存访问?
如果两个访问路由到不同的L2 bank(片),则缓存的行为类似于多端口,并且可以同时处理两个请求。但如果两者都通过单个端口路由到单个存储区,则它们将被序列化为缓存。高速缓存序列化可能需要花费几个时间,并且请求将在端口附近停止; CPU会将此视为稍微多一点的访问延迟。