这个问题专门针对现代 x86-64 缓存一致性架构 - 我很欣赏其他 CPU 上的答案可能会有所不同。
如果我写入内存,MESI 协议要求先将缓存行读入缓存,然后在缓存中修改(将值写入缓存行,然后将其标记为脏)。在较旧的 write-though 微架构中,这将触发缓存行被刷新,在回写下,被刷新的缓存行可能会延迟一段时间,并且在两种机制下都可能发生一些写组合(更可能是写回) . 而且我知道这如何与访问同一数据缓存行的其他内核交互 - 缓存侦听等。
我的问题是,如果存储与缓存中已经存在的值精确匹配,如果没有一个位被翻转,是否有任何英特尔微架构注意到这一点并且不会将该行标记为脏,从而可能避免该行被标记为排他性的,以及在某些时候会出现的写回内存开销?
当我对更多循环进行矢量化时,我的矢量化操作组合原语不会显式检查值的变化,并且在 CPU/ALU 中这样做似乎很浪费,但我想知道底层缓存电路是否可以在没有显式编码的情况下做到这一点(例如存储微操作或缓存逻辑本身)。随着跨多个内核的共享内存带宽越来越成为资源瓶颈,这似乎是一个越来越有用的优化(例如,重复对同一内存缓冲区进行归零——如果它们已经从 RAM 中重新读取值,我们就不会重新读取它们)在缓存中,但强制写回相同的值似乎很浪费)。写回缓存本身就是对此类问题的一种认可。
我可以礼貌地要求保留“理论上”或“这真的没关系”的答案吗?我知道内存模型是如何工作的,我正在寻找的是关于如何编写相同值的确凿事实(而不是避免存储)将影响内存总线的争用,您可以放心地假设这是一台运行多个工作负载的机器,这些工作负载几乎总是受内存带宽的限制。另一方面,对芯片不这样做的确切原因的解释(我悲观地假设他们不这样做)将是有启发性的......
更新: 这里有一些符合预期的答案https://softwareengineering.stackexchange.com/questions/302705/are-there-cpus-that-perform-this-possible-l1-cache-write-optimization但仍然有很多猜测“它一定很难,因为它没有完成”,并说在主 CPU 内核中这样做会很昂贵(但我仍然想知道为什么它不能成为实际缓存逻辑本身的一部分)。
更新(2020 年): Travis Downs 发现了硬件商店消除的证据,但似乎仅针对零且仅在数据未命中 L1 和 L2 的情况下,即便如此,并非在所有情况下都是如此。强烈推荐他的文章,因为它更详细...... https://travisdowns.github.io/blog/2020/05/13/intel-zero-opt.html
更新(2021 年): Travis Downs 现在发现证据表明这种零存储优化最近已在微码中被禁用......更多细节来自源本人 https://travisdowns.github.io/blog/2021/06/17 /rip-zero-opt.html