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

弱内存模型如何避免伪共享引发的性能下降?不同CPU架构下真/伪共享性能表现差异原因咨询

弱内存模型如何避免伪共享引发的性能下降?不同CPU架构下真/伪共享性能表现差异原因咨询

首先先梳理下你做的测试背景,方便大家理解问题:

你实现了一个真/伪共享基准测试,核心是对指针循环执行加载+自增+写入操作,代码如下:

static void do_increments(volatile size_t *buffer, size_t iterations)
{
    while (iterations) {
        buffer[0]++;
        --iterations;
    }
}

你让两个绑定到不同物理核心的线程在屏障同步后调用这个函数,根据buffer的指向不同,会触发三种场景:

  • 真共享:两个核心操作同一个内存地址
  • 伪共享:两个核心操作同一条缓存行内的不同地址
  • 无共享:两个核心操作不同缓存行的地址

测试结果显示:x86架构下真/伪共享场景对比无共享有明显性能下降,但Cortex-A73这类ARM核心、部分RISC-V核心却没有出现性能损耗。下面就来拆解不同架构的差异原因:

一、x86强内存模型下的缓存颠簸根源

x86采用TSO(Total Store Order)强内存模型,配合MESI系列缓存一致性协议,导致真/伪共享时性能暴跌的核心原因是:

  • 只要有核心要修改某条缓存行(不管是真共享还是伪共享),必须先将其他核心持有的该缓存行副本置为失效状态;其他核心后续要读/写时,必须重新从内存或上级缓存拉取完整缓存行。
  • x86的存储操作具有全局可见性,不能延迟或重排,这种频繁的“失效-拉取”循环(也就是缓存颠簸)会让核心大量时间浪费在等待缓存同步上,直接拉低性能。

二、弱内存模型架构的优化逻辑

像Cortex-A73、部分RISC-V核心采用弱内存模型,搭配更灵活的缓存一致性协议(比如ARM的MOESI、部分RISC-V的自定义协议),通过以下方式规避伪共享的性能损耗:

  • 存储缓冲与本地转发:弱内存模型允许核心将写操作暂存到本地存储缓冲区,不用立刻同步到全局缓存。如果同一个核心后续读取自己刚写入的数据,直接从缓冲区获取,无需触发缓存行同步。
  • 缓存行私有状态优化:针对伪共享场景,部分核心会将缓存行标记为“私有”状态——只要其他核心没有对该缓存行的写操作,本地写操作无需触发全局失效通知,减少不必要的同步开销。
  • 乱序执行与内存重排:弱内存模型允许存储、加载操作在不违反程序语义的前提下乱序执行,核心可以优先执行不依赖共享缓存行的任务,减少缓存等待带来的空转时间,从整体上掩盖伪共享的性能损耗。

三、真共享场景无性能下降的特殊原因

你提到真共享场景在这些架构上也没慢下来,可能是这两个原因:

  • 写更新协议替代写失效:部分弱内存模型架构采用写更新协议(而非x86的写失效),修改缓存行时直接将更新数据广播给其他核心的缓存副本,而非让它们失效后重新拉取。这种方式在小数据频繁写的场景下,比写失效更高效。
  • 测试场景的局限性:如果你的迭代次数不足,缓存颠簸的开销还未体现;或者核心单线程性能足够强,暂时掩盖了共享带来的损耗。

最后给你个验证建议:可以增加测试迭代次数,或者利用架构自带的性能计数器(比如ARM PMU、x86 perf)统计缓存行失效次数,这样能直观看到不同架构的缓存行为差异。

备注:内容来源于stack exchange,提问作者aolo2

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 12:43:05