【问题标题】:Updating caches in a sequential, unthreaded C/C++/Fortran program在顺序的、无线程的 C/C++/Fortran 程序中更新缓存
【发布时间】:2014-01-17 17:03:17
【问题描述】:

所以我们都知道,现代微处理器除了 DRAM 内存之外,都具有层次结构的缓存,以使访问常用数据的速度更快。

我想知道高速缓存如何与 DRAM 内存保持同步。

更准确地说,假设我有一个变量 double a 正在更新 通过单个非线程进程,比如a+=1.0

假设我有两个数据缓存 L1 和 L2。

  1. 处理器是否先更新L1中a的副本,然后更新L2中的副本,最后更新 DRAM内存中的副本?

  2. 或者处理器是否首先更新 DRAM 内存中 a 的值,然后将适当大小的高速缓存行 包含 a 引入L2 然后 L1?

当然这个过程对程序员来说是不可见的,并且是由操作系统和/或处理器执行的,但我很想知道它是如何工作的细节。

我提到了 C/C++/Fortran 语言,因为这些是我最熟悉的“最低级”语言,我很想知道我是否可以控制这些语言的缓存行为。

【问题讨论】:

标签: performance caching architecture


【解决方案1】:

不同的处理器采用不同的方法。您的问题没有单一、独特的直接答案。

更新(见下方评论)

首先,考虑包含和独占缓存的区别。

在包含缓存的情况下,如果a 在 L1 缓存中,那么它也在 L2 和 L3 中,因为这是一个内存层次结构。 a不可能在N级缓存中而不在N+1级缓存中。但是,请注意,相反的情况可能会发生,而且经常会发生(例如,在 L3 但不在 L2)。

在真正的独占缓存中,L1 中的内容永远不会出现在 L2 或 L3 中。

您的示例会发生什么取决于使用的写入策略。这里有两个不同的选项,称为 write-through 或 write-back。除此之外,还必须考虑写分配策略,该策略决定了对未缓存对象的写指令是否必须首先将该对象提取到缓存中。写分配策略可以是write-allocate,意味着丢失的对象在被写入之前被带入缓存,也可以是no-write-allocate,这意味着对象不会被带入缓存,而是直接写入后备存储中。

关于写策略:

直写意味着只要对象被写入,它在内存中的值(以及跨每个缓存级别)都会立即更新。

回写表示对象的值只在缓存中更新;仅当需要将其从缓存中取出时才会在内存中更新。

请注意,write-through 可以与任何写入分配策略一起使用;另一方面,用 no-write-allocate 策略谈论 write-back 没有多大意义。

至于你的具体问题:

处理器是否先更新L1中a的副本,然后更新L1中的副本 L2,最后是DRAM内存中的副本?

如果它同时使用写入分配策略和直写,是的,这正是发生的情况。如果是使用write-allocate with write-back,那么a += 1.0会第一时间将对象带到L3、L2和L1缓存中,后续指令只会更新L1中的副本,假设不需要替换。如果它使用no-write-allocate,则写入内存时不会将块放入缓存。

但是,请注意a += 1.0 下降到“读取 a;添加 1;更新 a”,“读取 A”步骤很可能会将 a 带入缓存,这意味着这不是真正的写入操作,而是一个先读后写的操作。因此,即使使用 no-write-allocate ,我会说 a 总是被带到缓存中,所以真正发生的事情只取决于写策略(直写或回写)。只有当我们将直接的 write 指令放入未缓存的对象中时,写入分配才相关,例如 a = 1.0;。

或者处理器是否首先更新 DRAM 内存中的 a 值,然后 然后将包含 a 的适当大小的缓存行引入 L2 然后是L1?

这永远不会发生。如果使用 no-write-allocate ,则直接操作内存。否则,对象总是被带到 L3、L2 和 L1 缓存(这是由缓存控制器“自动”处理的,CPU 本身不必担心将它分别带到每个缓存),然后会发生什么取决于写入策略。

所有这些都假设在程序执行期间不需要替换缓存中的对象,这是不现实的。一种流行的替换策略是 LRU(最近最少使用)。缓存冲突是需要替换的主要来源,它们何时发生取决于缓存的组织:它的大小、它的块大小,以及最重要的是它的关联性。维基百科对此有深入的了解;如果你想对这个问题有更严肃的看法,如果你想了解更多关于缓存的知识,我推荐计算机组织和设计的第 5 章——Patterson & Henessy 的硬件/软件接口。

【讨论】:

  • 包容性是每个缓存级别的,L3 可能是包容性的,而 L2 不会(例如,现代 Intel CPU 有这个)。包容性缓存 (IMHO) 的最大好处是它可以用作窥探过滤器,您实际上不需要多于一层的过滤。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-24
  • 2013-06-12
  • 1970-01-01
  • 2015-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多