You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

x86-64架构下无缓存数据写入时的缓存行加载延迟问题

x86-64下纯原子写入的缓存行为分析

场景代码

#include <stdatomic.h>

_Atomic int x;

void g(int a)
{
    atomic_store_explicit(&x, a, memory_order_relaxed);
}

针对上述场景(仅对不在缓存中的原子变量x执行memory_order_relaxed语义的纯写入,无任何读取操作),x86-64架构下的缓存行为可以明确如下:

  • 必须加载目标缓存行,且需等待加载完成:x86遵循MESI缓存一致性协议,CPU要写入某缓存行时,必须先获取该行的独占(Exclusive)或修改(Modified)状态。而获取这两种状态的前提,是先将对应缓存行从内存或其他CPU的缓存加载到本地缓存中——这个加载流程无法跳过。
  • 不存在“即发即弃”式写入:x86架构不支持绕开缓存层次的直接内存写入,所有存储操作都必须经过缓存。哪怕是纯写入操作,硬件层面也必须完成缓存行的加载、状态获取后,才能执行写入动作。
  • 延迟的实际感知:虽然缓存行加载的流程不可避免,但x86的存储缓冲区(Store Buffer)可以部分隐藏延迟:CPU会先将写入指令放入存储缓冲区,然后异步执行缓存行的加载和状态获取,后续无关指令可以继续推进。不过这只是硬件层面的异步优化,并不意味着不需要等待缓存行加载完成——当存储缓冲区中的写入操作要提交到缓存时,依然要等待缓存行准备就绪。
  • 内存序的影响:memory_order_relaxed仅约束内存可见性的同步规则,不会改变x86底层的缓存行为逻辑——无论使用哪种内存序,存储操作的缓存行加载要求都是一致的。

内容的提问来源于stack exchange,提问作者Kevin Meier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 04:12:09