为什么MASKMOVDQU没有扩展到256位和512位存储?

时间:2019-02-28 17:32:35

标签: caching x86 intel cpu-architecture

MASKMOVDQU 1 在x86存储指令中是特殊的,因为从原理上讲,它允许您将单个字节存储在高速缓存行中,而无需先完全加载整个高速缓存行到核心,以便可以将写入的字节与未覆盖的现有字节合并。

它似乎可以使用与NT存储区相同的机制来工作:在不先执行RFO的情况下向下推高速缓存行。根据英特尔软件开发手册(重点为我):

  

MASKMOVQ指令可用于改善以下方面的性能:   需要逐字节合并数据的算法。这应该   不引起对所有权的读取;这样做会产生不必要的   带宽,因为数据将直接使用字节掩码写入   无需在存储之前分配旧数据

但是,与其他NT存储区不同,您可以使用掩码来指定实际写入的字节。

如果您想在不可能适合高速缓存的任何级别的大区域上进行稀疏的字节粒度写入,则此指令似乎是个主意。

与几乎所有其他有用的指令不同,英特尔没有在AVX / AVX2或AVX-512中将指令扩展到256或512位。这是否表明不再建议使用此指令,或者可能无法在当前或将来的体系结构上有效地实现?


1 ...及其在MMX MASKMOVQ中的64位前身。

2 个答案:

答案 0 :(得分:2)

我怀疑屏蔽的NT向量存储在多核CPU上不再能正常工作,因此,如果完整的64字节行中有任何未修改的字节,那么即使是128位版本也只能在现代x86上进行屏蔽写入。

(常规的掩码向量存储在AVX512BW字节掩码向量中具有复仇性;对于L1d高速缓存的掩码提交似乎已被有效地支持,并且使用AVX1 vmaskmovps/pd和等效的整数进行dword / qword掩码,并且AVX512F)


SDRAM(包括DDR4)总线协议确实支持字节掩码写入(作为高速缓存行突发传输的一部分,每个字节具有1条掩码线)。 This Intel doc(关于FPGA之类的内容)包括对DM(数据掩码)信号的讨论,确认DDR4仍然具有它们,其功能与Wikipedia上针对SDRAM {{3} }。 (DDR1将其更改为仅写掩码,而不是读掩码。)

因此存在硬件功能,例如,现代x86 CPU可能会将其用于单字节写入不可缓存的内存。


如果我们写完整的行,则没有RFO存储会很棒:我们只是使该行的其他副本无效并存储到内存中。

https://en.wikipedia.org/wiki/Synchronous_dynamic_random-access_memory#SDR_SDRAM,普通NT存储在填充完整的64字节行后刷新的 甚至会使脏的行无效,而不会导致脏数据的写回。 < / strong>

因此,被屏蔽的 NT存储区需要使用不同的机制,因为任何被屏蔽的字节都需要从另一个内核的脏行中获取其值,而则不是在DRAM中。

如果用于部分行NT存储的机制效率不高,则添加创建它的新指令是不明智的。我不知道它的效率是否比对一部分生产线进行常规存储更高或更低,还是取决于情况和状况。


它不一定完全是RFO,但这意味着当这样的存储到达内存控制器时,它必须获取探听过滤器以确保该行是同步的,或者可能与缓存中的旧内容,然后刷新到DRAM。

或者在发送全线记录之前,CPU核心可以执行RFO并合并 内存层次结构。

CPU在回收尚未写入所有64字节的LFB时,已经确实需要某种机制来刷新部分行NT存储区,我们知道效率不高。 (但是我忘记了细节。)但这也许是maskmovdqu在现代CPU上的执行方式,无论是始终执行还是保留未修改的字节。

一个实验可能会发现。


因此TL:DR maskmovqdu可能仅在单核CPU中有效地实现了。它起源于带有MMX John "Dr. Bandwidth" McCalpin says的Katmai Pentium III; SMP系统已经存在,但在设计时可能不是该指令的主要考虑因素。 SMP系统没有共享最后一级的高速缓存,但是它们在每个套接字上仍然具有私有的回写L1d高速缓存。

答案 1 :(得分:1)

该描述具有误导性。 MASKMOVQ的非时间方面是,如果您编写整行,它不会生成RFO。如果使用屏蔽方面,则仍然需要RMW,在这种情况下,您可以只使用AVX-512屏蔽寄存器。