WC vs WB内存? x86_64上的其他类型的内存?

时间:2017-08-10 20:34:17

标签: assembly memory cpu x86-64 cpu-cache

你能描述一下x86_64上WC和WB内存的含义和区别吗?为了完整起见,请在x86_64上描述其他类型的内存,如果有的话。

1 个答案:

答案 0 :(得分:5)

我将首先从 Writeback caching (WB)开始,因为它更容易理解。

写回缓存

顾名思义,这种缓存策略试图尽可能地延迟对系统内存的写入 理想情况是理想情况下只使用缓存。

但是,由于缓存的有限大小小于内存的有限大小及其内部组织,请参阅Wikipedia's Cache article进行介绍引入了一些冲突的别名,有时候缓存行必须是被驱逐回忆 这是一个回写事件 - 回写事件的另一个来源是缓存一致性机制 请参阅MESI

这是WB的基本思想,从技术上讲,缓存策略是由对四个主要事件采取的行动定义的。

Event              | Action
-------------------+----------------------------------------------
Read hit           | Read from the cache line
-------------------+----------------------------------------------
Read miss          | Fill the line then read from the cache line
-------------------+----------------------------------------------
Write hit          | Write to the cache line
-------------------+----------------------------------------------
Write miss         | Fill the line then write to the cache line*

* Since P6, we will assume this is always the case

正如你所看到的,没有写入内存,这是缓存有限的一个副作用,反过来会强制驱逐。
其他缓存属性,如替换策略,一致性,允许的推测行为(以及所有这些如何影响内存访问的可见性和排序)都被排除在这个答案之外,因为它们与缓存策略正交。
英特尔为每个策略隐式设置了一些此属性,但这只是为了节省一些配置位。

为了完整起见,这里是一个与其他缓存策略的比较表 故意遗漏写入组合(WC)。

Legend
   LF = Line Fill;         LR = Read from line;   MR = Read from memory
   LW = Write to line;     MW = Write to memory

Event              | WB      |  UC | WT       | WP     |
-------------------+---------+-----+----------+--------+----------
Read hit           | LR      | RM* | LR       | LR     |
-------------------+---------+-----+----------+--------+----------
Read miss          | LF, LR  | RM  | LF, LR   | LF, LR |
-------------------+---------+-----+----------+--------+----------
Write hit          | LW      | WM  | WL, WM** | WM***  |
-------------------+---------+-----+----------+--------+----------
Write miss         | LF, LW  | WM* | WM       | WM     |

* A hit on a UC region can happen if the cache type has been
  changed without invalidating the cache. In truth for UC talking about
  hits is a bit misleading. Caching is bypassed, so it is actually a
  N.A. case.   

** The line can be invalidated as the result of the eviction operation
   used.

*** This can never happen, WP doesn't use the cache for writes so this
    is actually an N.A. case.  
    Writing directly to memory by bypassing the caches also invalidates
    all the copies of the affected line in other processors.

备注:WP和WT之间的区别在于后者可以被视为"穿孔"这个缓存虽然前者围绕"周围"缓存。

写合并

WC并不是一种真正的缓存策略,但由于它与缓存策略紧密相关,因此会对它们进行讨论 我发现英特尔SDM在这个问题上相当混乱,这是我对此事的解释。 欢迎更正!

英特尔提供了一份旧文件here可用于WC - 其内容已包含在英特尔SDM 3的第11.3.1节中,但在此过程中,英特尔失去了一些可用的内容和结构。原始文件。

WC的想法是在诸如总线事务或缓存一致性事务之类的持久操作之前或期间合并写入。

为了实现处理器具有多个 WC缓冲区 - 不要将它们与缓存行的存储缓冲区混淆。
WC缓冲区是一个单独的实体!
WC缓冲区的数量非常少:在P6中(因此在Pentium M中)有6个WC缓冲区,Pentium 4有8个,而Nehalem有10个WC缓冲区见英特尔优化手册第3.6.10节< / SUP>。
每个WC缓冲区的大小在架构上没有定义,但到目前为止,它始终与缓存行的大小相同(因此P6为32字节,其他为64字节)。

WC缓冲区在缓存之前位于

现在扭曲,WC真的意味着两件事:

  • 在写入未命中的情况下允许CPU写入高速缓存行之前,必须执行RFO以通知其他CPU其高速缓存数据(如果有)无效。
    由于这可能需要很长时间,因此CPU会将存储区停放在WC缓冲区中并继续工作。然后,缓存子系统将自动将WC缓冲区移动到适当的缓存中 如果连续存储到正在执行RFO的同一行,则它们都会陷入WC缓冲区。

  • 如果内存类型不涉及缓存,则WC缓冲区在它们完全转移到总线之前充当商店的停车场。
    启动总线事务需要一些开销,但一旦启动,数据就可以很快地传输到连续的突发(实际上每个8字节)。 写入比内存总线宽度更少的数据是浪费内存带宽 - 就像制作总线(真正的总线,人们的总线)运行半空。 因此WC正在尝试利用整个内存总线宽度。

备注:UC内存类型绕过所有缓存子系统,包括WC缓冲区。 WC内存类型绕过缓存而不是WC缓冲区。

在第一种情况下,WC允许CPU在长时间运行的同时继续工作,在第二种情况下,它允许有效的数据传输。
英特尔对两种情况使用相同的术语WC,导致我认为混乱 英特尔SDM读取WC仅允许在WC内存类型区域使用,但后来声称它用于所有内存类型并在每个缓存策略的描述中报告。
我相信这是因为英特尔指的是上述两个WCs 我相信第二种类型是原始类型,并且当MESI变得流行时,WC缓冲区已被重用。

修改

我忘了提到WC内存类型是不可缓存的(但是投机性的,猜测是故意遗漏的)。
彼得·科德斯在his comment

中完美地总结了这一点
  

WC是USWC的简称:&#34; Uncacheable Speculative Write-Combining&#34;。
  关键点在于它是一个不可缓存的内存类型,这就是movntdqa加载有用的原因(加载[存储缓冲区条目,就像一个完整的缓存行一样宽],而不是单独执行访问DRAM以获取来自同一缓存行的单独加载[驻留在可缓存的地址范围内]

我刚在括号中添加了文字,因为我相信他使用了术语&#34;缓存行&#34;作为测量单位和记忆地址的区别特性。

在给定时刻只能激活四个WC缓冲区 英特尔优化手册还报告只有两个可用于将写入组合到缓存。

当使用WC将商店与存储器组合时,处理器不会强制执行连贯性 WC缓冲区未被窥探,此外,当前活动的WC缓冲区(首先溢出的缓冲区)之间没有强制执行命令。
当必须驱逐WC时,如果WC缓冲区全部为脏,则执行单个总线事务,如果WC缓冲区包含部分数据,则执行多达8(64/8)或4(32/8)个总线事务。
再次在使用部分数据溢出WC缓冲区时,不会在块之间强制执行排序。

一旦软件在缓冲区大小之外写入,P6就会驱逐WC缓冲区,确切的算法是实现定义的 - 通常有一个时间窗口允许软件合并写入。
可以通过访问UC存储器类型区域或特定事件来强制驱逐(参见本节开头链接的文章)。