【发布时间】:2017-10-16 07:25:51
【问题描述】:
在 x64 上,如果您在短时间内首先将 full 缓存行的内容写入先前未缓存的地址,然后在再次从该地址读取后不久,CPU 就可以避免必须从内存中读取该地址的旧内容?
实际上,内存的内容以前是什么并不重要,因为整个高速缓存行的数据都被完全覆盖了?我可以理解,如果它是对未缓存地址的部分缓存行写入,然后是读取,那么它将产生必须与主内存同步等的开销。
查看有关写入分配、写入组合和窥探的文档让我对这件事有些困惑。目前我认为 x64 CPU 无法做到这一点?
【问题讨论】:
-
据我了解,即使使用 AVX512,也无法在单个内存访问中执行 64 字节(典型缓存行大小)的传输。因此,尽管可能,但我相信没有处理器会在写入之前跳过行填充操作。如果缓存类型需要它。此外,MESI 协议在执行某些写入时需要请求所有权(显示为读取)操作
-
我不确定是否会有特定的优化与写入组合给定的连续写入相关的多个指令填充一行(正如你所说,你不能在一个操作中填充整个缓存行)。我想即使 MESI 目前没有,多核之间的协议也可以解决这个问题。我读得越多,我就越确定这个问题的答案是否定的。
-
FWIW,写入组合不使用缓存。我也会说“不”作为答案。不过请等待专家;)
-
哦,我的意思是一个“相似”的功能来写组合,但不一定写组合本身:-) 但是我想这样的功能需要与存储缓冲区交互(我不是硬件人员所以我真的不知道)。如果答案不是“否”,那么软件优化会很有趣......
-
@MargaretBloom - 我很好奇你为什么提到 AVX512 不提供这种能力? ISTM 认为对齐的 64 字节
mov将完全覆盖缓存行(但实现 CPU 是否对其进行优化以避免 RFO 是另一回事)。也许问题是当前的硬件仍然将其分成两个 32 字节的访问?