“拆分”缓存的含义是什么。它有什么用(如果有用)?

时间:2019-04-18 19:36:25

标签: cpu-architecture cpu-cache

我当时在问一个关于计算机体系结构的问题,其中提到缓存是一个拆分缓存,并且没有危险,这到底意味着什么?

1 个答案:

答案 0 :(得分:5)

拆分缓存是由两个在物理上分开的部分组成的缓存,其中一部分称为指令缓存,专用于保存指令,另一部分称为数据缓存,专用于保存指令。保存数据(即指令存储器操作数)。从逻辑上讲,指令高速缓存和数据高速缓存都被视为单个高速缓存,称为拆分高速缓存,因为这两者都是相同物理地址空间和相同内存级别的硬件管理高速缓存层次结构。指令获取请求仅由指令高速缓存处理,而内存操作数读取和写入请求仅由数据高速缓存处理。未拆分的缓存称为统一缓存。

哈佛与冯·诺依曼的体系结构区别最初适用于主存储器。但是,大多数现代计算机系统都实现了修改后的Harvard体系结构,其中L1缓存实现了Harvard体系结构,其余的内存层次结构实现了von Neumann体系结构。因此,在现代系统中,the Harvard vs. von Neumann distinction mostly applies to the L1 cache design。这就是为什么拆分缓存设计也称为哈佛缓存设计,统一缓存设计也称为von Neumann的原因。 Wikipedia上有关修改后的哈佛体系结构的文章讨论了three variants的体系结构,其中之一是拆分缓存设计。

据我所知,James Bell,David Casasent和C.Cordon Bell在其题为An Investigation of Alternative Cache Organizations的论文中首次提出并评估了分离缓存设计的想法,该论文于1974年在IEEE上发表。 TC日志(IEEE version更清晰)。作者发现使用模拟器,对于研究中考虑的几乎所有缓存容量,均等的分割可实现最佳性能(请参见图5)。从论文中:

  

通常,只有一半的高速缓存专用于最佳性能   指令,一半用于数据。

他们还对相同容量的统一缓存设计进行了比较,最初的结论是拆分设计比统一设计没有优势。

  

如图6所示,最佳专用缓存CUXD的性能   (一半分配给指令,另一半分配给数据)   与同类缓存(CUX)类似;的额外复杂性   因此,专用高速缓存控件是不合理的。

请注意,本文并未讨论为何拆分设计的性能可能比统一设计更好或更差。还要注意作者如何使用术语“专用缓存”和“同质缓存”。 “分裂”和“统一”这两个术语出现在后来的作品中,我认为是1978年艾伦·杰伊·史密斯在Directions for memory hierarchies and their components: research and development中首次使用的。但是我不确定,因为艾伦使用这些术语的方式给人的印象是他们已经众所周知。从Alan的论文看来,使用拆分缓存设计的第一个处理器是1975年左右的IBM 801,第二个处理器可能是S-1(1976年左右)。这些处理器的工程师有可能独立提出了拆分设计构想。

然后在接下来的二十年里,对拆分缓存的设计进行了广泛的研究。例如,请参见this有影响力的论文的第2.8节。但是很快就认识到,拆分设计对于流水线处理器很有用,在这种流水线处理器中,指令提取单元和存储器访问单元实际上位于芯片的不同部分。利用统一设计,不可能将高速缓存同时放置在指令提取单元和存储器单元附近,从而导致一个或两个单元的高速缓存访​​问延迟较高。拆分设计使我们可以将指令高速缓存放置在靠近指令提取单元的位置,将数据高速缓存放置在靠近存储单元的位置,从而同时减少两者的延迟。 (请参阅this文档的图3中的S-1处理器。)这是拆分设计相对于统一设计的主要优势。这也是至关重要的支持缓存分区的拆分设计与统一设计之间的区别。

拆分设计的另一个优点是,它允许指令和数据访问并行发生而没有争用。本质上,拆分缓存可以具有统一缓存的两倍带宽。这可以提高流水线处理器的性能,因为指令和数据访问可以在流水线不同阶段的同一周期内发生。或者,可以使用多个访问端口或多个存储库将统一缓存的带宽加倍或提高。实际上,使用两个端口为整个高速缓存提供两倍的带宽(相比之下,在拆分设计中,bandwdith在指令高速缓存和数据高速缓存之间被拆分为一半)。就面积和功率而言,端口更昂贵,并且可能会影响延迟。改善带宽的第三种替代方法是在同一端口上添加更多的导线,以便可以在同一周期中访问更多的位,但这很可能仅限于同一高速缓存行(与其他两种方法相比)。如果缓存位于芯片外,则将其连接到管线的导线将变为引脚,导线数量对面积,功耗和延迟的影响将变得更加明显。

此外,使用统一(L1)高速缓存的处理器通常包含仲裁逻辑,该逻辑优先于数据访问而不是指令访问。这种逻辑可以在拆分设计中消除。另一方面,拆分设计需要两个专用的缓存控制器和单独的访问端口。此外,如果存在另一个实现统一设计的缓存级别,则可能仍需要在拆分缓存和统一缓存之间建立仲裁逻辑。但是,指令缓存是只读的,它的设计可以比数据缓存更简单(硬件更少)。

另一个潜在的优势是,拆分设计使我们可以对指令高速缓存和数据高速缓存采用不同的(更简单的)替换策略,这可能更适合每个高速缓存的访问模式。 (需要参考。)访存到数据高速缓存中的高速缓存行永远不能替换指令高速缓存中的行。同样,填充到指令高速缓存中的行永远不能替换数据高速缓存中的行。但是,在统一设计中可能会出现此问题。

section的最后一个小节,关于经修改的哈佛体系结构与Wikipedia文章中的Harvard和von Neumann之间的差异,提到Mark I机器对指令和数据存储器使用了不同的存储技术。这使我思考这是否可以构成现代计算机系统中拆分设计的优势。以下是一些表明这种情况的论文:

  • LASIC: Loop-Aware Sleepy Instruction Caches Based on STT-RAM Technology:指令高速缓存大部分是只读的,除非有未命中,在这种情况下,必须提取该行并将其填充到高速缓存中。这意味着,与使用STT-RAM进行数据缓存相比,使用STT-RAM(或实际上是任何其他NVRAM技术)时,昂贵的写操作发生的频率降低。该论文表明,通过使用SRAM循环高速缓存(如Intel处理器中的LSD)和STT-RAM指令高速缓存,可以显着降低能耗,尤其是在执行完全适合循环高速缓存的循环时。 STT-RAM的非易失性特性使作者能够完全控制门指令缓存而不会丢失其内容。相反,使用SRAM指令高速缓存时,静态能量消耗要大得多,对其进行功率门控会导致其内容丢失。但是,建议的设计会降低性能(与纯SRAM缓存层次结构相比)。
  • Feasibility exploration of NVM based I-cache through MSHR enhancements:本文还建议将STT-RAM用于指令缓存,而数据缓存和L2缓存仍基于SRAM。这里没有循环缓存。相反,本文针对STT-RAM的高写入延迟问题,这种问题是在高速缓存中填充一行时引起的。这个想法是,当从L2高速缓存接收到请求的行时,L1高速缓存首先在为该请求分配的MSHR中缓存该行。 MSHR仍基于SRAM。然后,指令高速缓存行可以直接从MSHR馈送到流水线中,而不必潜在地停止直到被写入STT-RAM高速缓存。与以前的工作类似,该提议的体系结构以降低性能为代价来提高能耗。
  • System level exploration of a STT-MRAM based level 1 data-cache:建议将STT-RAM用于L1数据高速缓存,同时将所有其他高速缓存保持基于SRAM。
  • Loop optimization in presence of STT-MRAM caches: A study of performance-energy tradeoffs:比较纯(仅SRAM或仅STT-RAM)和混合(L2和指令缓存是基于STT-RAM的)层次结构的能耗和性能。

因此,我认为可以说,分离设计的最终优势是我们可以对指令和数据缓存使用不同的存储技术。

不过,拆分设计存在问题。首先,自修改代码会导致一致性问题,需要在微体系结构级别和/或软件级别进行考虑。 (两个缓存之间可能有少量的不一致,但是如果ISA不允许这种不一致的现象出现,则必须在被修改的指令永久更改体系结构状态之前对其进行检测。)指令和数据高速缓存的组合空间可能无法有效利用。包含指令和数据的高速缓存行可能同时存在于两个高速缓存中。相反,在统一缓存中,缓存中仅存在该行的单个副本。另外,指令缓存和/或数据缓存的大小对于所有应用程序或同一应用程序的不同阶段可能不是最佳的。

我不知道过去15年中设计的任何具有统一(L1)缓存的处理器。在现代处理器中,统一设计主要用于数量更大的缓存级别,这是有道理的,因为它们没有直接连接到管道。

  

有人提到缓存是拆分缓存,没有危害什么   这到底意味着什么?

这本书到底在说什么?您应该提供更多的上下文。这本书叫什么名字?哪个版本?哪一章?哪一节?无论如何,这可能与保罗的评论中提到的结构性危险有关。