思享国logo
返回顶部

点赞数

1

回复数

0

被浏览

180

通过一个通俗易懂的故事了解为什么CPU有多个缓存级别?(译)

2018-02-11 17:23更新
  • 热点聚焦

为什么需要多层的 CPU 缓存呢?似乎值得回答的不仅仅是一句话:

我明白需要一个缓存,但我不明白为什么有多个级别的缓存,而不是只有一个较大的级别。换句话说,假设一级缓存是32K,二级缓存是256K,三级缓存是2M,为什么没有一个32K + 256K + 2M一级缓存呢?

简短的版本是,各种缓存级别在设计方式上有很大的差异; 他们受到不同的限制,实现不同的目的。作为一个经验法则,当你爬上高速缓存层次时,高速缓存变得更大,更慢,更高的密度(每单位区域存储更多的比特),消耗每比特更少的功率,并获得额外的任务。

缓存故事时间!

假设你是一个在20世纪60年代无名的官僚体系中的白领办公室工作者,没有计算机可见,而你的工作涉及很多查看和交叉引用案例文件(这里是包含纸张的文件夹)。

你有一张桌子(L1数据缓存)。在你的办公桌上有你正在处理的文件(缓存行),以及你最近抽出的一些其他文件,要么是完成了,要么是期望再次看到。使用文件通常意味着查看它包含的单个页面(对应于缓存行中的字节)。但是,除非他们在桌面上,否则文件只是作为一个单元来对待。您总是一次抓取整个文件,即使您现在只关注其中的一个页面。

在办公室里还有一个档案柜(二级缓存)。该档案柜包含您最近处理的文件,但现在没有使用。当您完成桌面上的工作时,大部分文件都会回到文件柜中。从橱柜里抓东西不是直接的 - 你需要走到那里,通过几张索引卡打开右边的抽屉和拇指找到正确的文件 - 但它仍然很快。

有时候其他人需要看一下你的档案柜里的文件。有一个有车的人,巴斯特(代表一种环形巴士),他们只是在所有的办公室里继续巡视。当一个上班族需要一个档案,他们没有在他们的私人档案柜,他们只是写一个小的请求单,交给巴斯特。为了简单起见,让我们只说巴斯特知道一切是在哪里。所以当他下一次来到你的办公室时,Buster会检查是否有人要求你的档案柜里有任何档案,如果是这样的话,只要悄悄地把这些档案从柜子里拿出来放在他的车上。下一次他来到要求档案的人的办公室时,他会把档案放在柜子里,并把收据留在桌子上。

巴斯特每隔一段时间都会注意到一个请求的文件 不在档案柜中,而是在桌面上。在这种情况下,他不能只是默默地抓住它。他需要在办公桌前询问工作人员是否已经完成了工作,如果没有,那么这个工作人员和提出请求的工作人员就需要同意做什么。有关这种情况下做什么的繁琐的公司协议(会议肯定会被要求!)。

档案柜通常是满的。这意味着Buster不能只是放入一个新文件; 他必须首先腾出空间,然后抓住另一个文件,最好是一段时间没有使用过的文件。这些文件,巴斯特带到地下室的存档(L3缓存)。在地下室,文件组被密集地包装在工业搁架单元上的纸箱中。普通的上班族根本不会下来,这很好,他们不熟悉档案系统的细节。我们把它留给档案员。

每当巴斯特来到这里,他就把所有的旧文件都放在前台的“进”托盘中。他还将所有不在楼上任何文件柜中的文件从请求单中删除,但是他不会等待,直到文件员把文件带回来,因为这需要一段时间。他们只是拿出请求单,拿起有问题的文件,每当他们完成时就把它放在“出”托盘中。所以每当Buster出现时,他都会抓住“出”托盘中的任何东西,将其放在他的车上,并在下一次出现时将其带到收件人处。

现在,问题是,有 很多 的这些档案,甚至是高效的包装,他们甚至都没有接近装修地下室。大部分文件都保存在异地; 这是一个办公大楼,在这个城市很好的地方,这里的租金太高,不能在存储上花费太多的空间。相反,公司租了30分钟的仓库空间,大部分旧文件都保存在这里(这对应于DRAM)。总部档案管理员梅根在地下室的前台工作。梅根保持跟踪哪些文件保存在地下室,哪些是仓库。因此,当巴斯特在“进”托盘中放下请求单时,她会检查哪些文件对应于地下室中的文件(由档案职员处理),哪些不在现场。后者只是被添加到一大堆请求中。也许一天一两次,

巴斯特不知道或不关心整个仓储操作的细节; 这是梅根的工作。他所知道的是,通常情况下,他手中存档的请求很快处理完毕,但有时需要数小时。

回到原来的问题

那么,这个完整的练习有什么意义呢?简而言之,要建立一个比不透明的“魔法缓存”更具体的模型,使我们能够更清楚地思考所涉及的后勤问题。物流在设计芯片时与在高效率的办公室中一样重要。

原来的问题是“为什么我们不建立一个大的缓存,而不是几个小的缓存”。所以,如果你有说4核的四核机器,每个核心都有32KB的L1数据缓存,256KB的二级缓存,再加上2MB的共享三级缓存,为什么我们没有一个大约3MB的共享缓存呢?

在我们的比喻中:出于几乎相同的原因,我们有单独的办公桌,可能是1.50米宽,而不是在一个150米宽的单一巨大办公桌上坐四个不同的人。

在桌子上放一些东西的地方在于它容易到达。如果我们把桌子放得太大,我们就是为了达到这个目的:如果我们需要走50米才能拿到我们想要的档案,事实上这在技术上“就在我们桌子上”并不是真的有帮助。L1缓存也一样 让他们更大使他们(身体)更大。除此之外,这使得访问速度变慢,消耗更多的能量(出于各种原因)。L1高速缓存的大小足够大,可以使用,但是足够小,所以仍然可以快速访问。

第二点是L1高速缓存处理不同类型的访问,而不是缓存层次结构中的其他级别。首先,其中有几个:有一个L1数据缓存,但也有一个L1指令缓存,例如英特尔酷睿CPU也有另一个指令缓存,uOp缓存,这是(根据您的观点)一个并行L1指令缓存或“L0指令缓存”。

要求L1数据缓存读取和写入最常见的1到8字节大小的单个项目,稍微大些(对于SIMD指令)。层次结构中较高的缓存级别通常不会受到单个字节的影响。在我们的办公室比喻中,所有不在办公桌上的东西都是以单个文件(或更大)的粒度处理的,与缓存行相对应。内存子系统也是如此。当核心执行内存访问时,您处理单个字节; 高级缓存一般处理数据批发,一次处理一个缓存行。

L1指令缓存与数据缓存具有完全不同的访问模式,与L1数据缓存不同,它们只读核心。(写入指令高速缓存一般是间接发生的,将数据放入其中一个高级统一高速缓存中,然后让指令高速缓存从其中重新加载它们的数据)。由于这些(和其他)原因,指令缓存通常与数据缓存完全不同,使用单个统一的L1缓存意味着最终的设计需要满足几个相互矛盾的设计标准,强制实现任何一种目的都会使其变得更糟的折衷。统一的L1高速缓存也需要处理指令和数据流量,这非常重要!

顺便说一句:作为程序员,很容易忽略获取指令需要多少缓存带宽,但这非常重要。例如,当不从uOp高速缓存运行代码时,所有的英特尔酷睿i7 CPU内核都可以从L1指令高速缓存中获取16个字节的指令缓存,每个周期实际上会一直保持这样做,只要指令执行跟上解码。在3GHz,我们正在谈论每个内核 50GB / s的数量级 在这里,只是为了获取指令 - 尽管如此,只有当指令获取单元一直忙时,而不是由于某种原因而被阻塞的时候。在实践中,L2缓存通常只能看到其中的一小部分,因为L1指令缓存工作得很好。但是如果你正在设计一个统一的L1高速缓存,那么你至少需要预测高指令和高数据流量的突发(像L1数据高速缓存中源数据和目标数据的快速内存数千字节) 。

顺便说一句,这是一个普遍的观点。 只要CPU内核全部达到L1高速缓存内,CPU内核就可以处理 每个周期的许多内存访问。对于频率为3GHz的“Haswell”或更高版本的Core i7, 如果您只有正确的指令组合,我们正在讨论聚合代码+数据L1带宽,每个内核的速度超过300GB / s ; 在实践中不太可能,但有时你仍然会爆发非常热门的活动。

L1缓存旨在尽可能快地处理这些突发事件。只有错过的L1需要传递到更高的缓存级别,这不需要几乎一样快,也没有太多的带宽。他们可以更多地关心功率效率和密度。

第三点:分享。在办公室以类比或单核心L1高速缓存来设置单个办公桌的重要一点是,它们是 私人的 。如果在你的私人办公桌上,你不需要问任何人; 你可以抓住它。

这是至关重要的。在办公室的比喻中,如果你与四个人共享一张巨大的办公桌,你不能只抓一个文件。这不仅仅是 你的 办公桌,而且你的其他3位同事之一可能现在需要这个文件(也许他们试图与他们在办公桌另一端拾取的另一个文件交叉引用它)。每次你想拿起什么东西的时候,你都需要喊出“如果我抓住这个,每个人都行”,如果别人想要它,那么你必须等待。或者你可以有一个方案,每个人都需要抢票,排队等候,直到轮到冲突。或者是其他东西; 这里的细节并不重要,但你所做的任何事情都需要与他人协调。

共享缓存的多个核心也适用同样的事情。你不能不经过暗示就开始跺脚数据。您在共享缓存中执行的任何操作都需要与您分享的所有其他人协调。

这就是为什么我们有私人一级缓存。L1缓存是你的“桌子”。当你坐在那里时,你可以继续工作。二级缓存(“文件柜”)处理大多数与其他人的协调。大多数时候,工作人员(CPU核心)坐在桌子上。巴斯特可以过来,拿起一个新的请求列表,并将之前请求的文件放入文件柜中,而不中断工作人员。

只有当员工和巴斯特想要同时访问文件柜,或者当其他人要求放置在工作人员桌上的文件时,他们需要停下来并互相交谈。

简而言之,L1缓存的工作首先是为其CPU核心服务。因为它是私人的,它只需要很少的协调。二级缓存对于CPU核心来说仍然是私有的,但是随着缓存的增加,它还有一个额外的责任:处理大多数总线通信和通信,而不是中断内核(这有更好的办法)。

L3缓存是一个共享资源,访问它需要全局协调。在办公室的比喻中,工作人员只用一种方式来访问它,即通过巴斯特(巴士)。公车是一个扼要点; 希望前面的两个缓存级别已经将存储器访问的数量减少到了不足以成为性能瓶颈。

注意事项

本文介绍了一种与当前桌面(和笔记本电脑)x86 CPU相匹配的特定缓存拓扑:每个核心分离的L1I / L1D缓存,每个核心的统一L2缓存,共享的统一L3缓存,核心通过环形总线连接。

并非每个系统都像这样。 一些(主要是较老的)系统没有拆分指令和数据缓存; 有些具有完整的哈佛架构,将指令和数据存储器完全分开。通常L2在多个核心之间共享(想象一个办公室有一个文件柜和多个办公桌)。在这种类型的配置中,L2缓存有效地作为核心之间总线的一部分。许多系统没有L3高速缓存,有些同时拥有L3和L4高速缓存!我也没有谈到多CPU插座等系统

我坚持使用环形公交车,因为它与这个比喻很吻合。环形公交车相当普遍。有时(特别是当只需要连接两个或三个块时),它是一个完整的网格; 有时候是多个环形巴士与一个横梁相连(这与办公室的类比是合理的:多层办公大楼,每个楼层有一个“巴斯特”轮,连接楼层的电梯)。

作为一名软件开发人员,假设您可以将模块A神奇地连接到模块B,并且数据只是从一端传输到另一端,这是一种自然而然的趋势。内存实际上工作的方式到目前为止是非常复杂的,但是提供给程序员的抽象仅仅是一个大的,扁平的字节数组之一。

硬件不能这样工作。部分不是通过一个不可见的以太神奇连接。模块A和B不是抽象概念; 他们是物理设备,实际上是微型机器,它们占据了硅片上的实际物理区域。芯片有一个“平面图”,这不是一个模糊的点头或在一个笑话; 这是一个真实的2D地图。如果要将A连接到B,则需要在它们之间运行实际的物理连线。电线占用空间,驱动它们需要电力(时间越长)。在A和B之间运行一堆电线意味着它是物理阻塞区域,可以用来连接其他东西(是的,芯片使用多层电线,但它仍然是一个严重的问题) 。在芯片上移动数据是一个实际的后勤问题,

所以,虽然办公室的事情是“口无遮拦”,“谁需要与谁谈话”以及“这个系统的几何形状是怎样的 - 它是否承认一个合理的布局?”对于硬件和整个系统设计都是非常相关的问题这会产生巨大的影响。空间隐喻是概念化潜在现实的有用方式。


您尚未登录, 登入  或  注册  后可查看全部