Assembly 单个x86指令从一级缓存读取或写入的最大数据量是多少?

Assembly 单个x86指令从一级缓存读取或写入的最大数据量是多少?,assembly,x86,sse,avx,avx2,Assembly,X86,Sse,Avx,Avx2,我刚刚读了一遍,它让我想起了这个问题。我不确定你的问题是否完全清楚,但我想你是在问,在执行一条x86指令时,一级缓存可以传输多少数据 如果是这样,这是一个不适定的问题。缓存结构,甚至缓存作为一个概念都不是x86规范的一部分。这意味着,答案完全取决于底层硬件。如果你有一个特定的处理器,你可以在数据表中找到答案。您要查找的是缓存块大小,因为缓存管理器喜欢一次写入和读取整个块。但是,x86扩展(如AVX和SSE)中有一些指令专门处理大内存事务,它们可以根据需要/方便地写入或读取缓存。您从未明确读取或写

我刚刚读了一遍,它让我想起了这个问题。

我不确定你的问题是否完全清楚,但我想你是在问,在执行一条x86指令时,一级缓存可以传输多少数据


如果是这样,这是一个不适定的问题。缓存结构,甚至缓存作为一个概念都不是x86规范的一部分。这意味着,答案完全取决于底层硬件。如果你有一个特定的处理器,你可以在数据表中找到答案。您要查找的是缓存块大小,因为缓存管理器喜欢一次写入和读取整个块。但是,x86扩展(如AVX和SSE)中有一些指令专门处理大内存事务,它们可以根据需要/方便地写入或读取缓存。

您从未明确读取或写入任何缓存级别,但对您的意思有任何合理的解释,在我看来,如果您从L1$读取,则值被读取到寄存器中,如果您向L1$写入,则值被从寄存器中写入,因此对于所有实际用途,基本答案始终是“您使用的寄存器的大小”作为所讨论的体系结构指令的源/目标


实际上,它比这要复杂一点,因为它取决于MOB(内存顺序缓冲区)和L1$之间的路径宽度,这是特定微体系结构的一个特征。最近,Intel CPU(如Core、Nehalem)从MOB到L1$有128位路径,但我不知道最近的(如Haswell)是否将其提升到256位以匹配AVX寄存器大小。这是一种可能性。另一种情况是,256位AVX寄存器的单个体系结构存储可能会在后端解码为两个128位µOp(微操作)。后者似乎更适用于Sandy和Ivy桥,因为“双联”使用两个128位执行单元来实现256位AVX操作。我对Haswell微体系结构了解不够,无法推测它可能会做什么。

没错,这是有道理的,体系结构可能会改变,但x86只是ISA规范。因此,如果我要提出与Haswell相关的问题,我在哪里可以找到答案?我必须澄清这一点:ISA代表指令集体系结构,是体系结构。实现或微体系结构是什么样的变化。就Haswell而言,这可能是您正在寻找的:@OregonTrail,实际上在x86中有与微体系结构元素交互的方法-一条
wbinvd
指令将使整个缓存层次结构无效,导致存储在那里的修改行多次写入,因此它可能写入“最多”的数据。然而,您似乎希望在缓存和执行单元之间传递尽可能大的数据块,在Haswell中应该是256B,并且未来的CPU可能会扩展到512(请参阅)@Leeor,您提出了一个很好的观点。几乎任何内存指令都可以调用缓存一致性事件的连锁反应,这可能涉及到读取和写入许多缓存线。是的,我的问题是关于从执行管道到缓存的数据传输,反之亦然。使用repeat可以获得相当大的传输。
REP
-前缀
st
环指令可以传输任意数量的数据。抛开这些因素不谈,AVX-less 64位处理器具有
CMPXCHG16B
,这可能导致总共32字节的通信量(16字节读取,16字节写入)。在AVX中,未对齐的32字节存储可能导致读取和写入两条缓存线(CLs)。使用AVX2采集,最多可以读取8个CLs。“核心”CPU和更高版本具有
XSAVE
,可节省512+字节的CPU状态。但对我来说,最终的赢家是TSX的
XEND
,它原则上可以提交或回滚KBs的数据,而不会有字符串操作的“欺骗”感觉。与微体系结构问题的答案有链接。(特别是大卫·坎特为桑迪布里奇和哈斯韦尔写的作品)。SnB/IvB有AVX,但到L1D$的路径仍然只有128b。256b装载操作是端口2或3的单个uop,但占用它两个周期。没有专用的存储地址端口(直到Haswell)。即使在256b加载的第二个周期内,存储(通常解码为一个存储数据和存储地址uop)也可以在p2或p3上运行存储地址uop。因此,最大吞吐量(2x 128b负载,1x 128b存储)仅在256b操作时才会出现。SnB的最大吞吐量实际上不会出现,因为在该吞吐量下,缓存组冲突几乎是不可避免的。Haswell向前迈出了一大步:一级缓存的路径为256b,没有缓存组冲突,还有一个单独的存储地址端口(尽管它只能处理单寄存器寻址模式)。尽管如此,大多数代码仍然是L2/L3或DRAM绑定的。无论如何,回答单个uop问题中的数据量是+1,这听起来更像OP的想法,而不是单个x86指令。