TigerLake核心间共享数据时CLWB指令的性能特性解析
TigerLake平台下双核心共享数据时CLWB指令的性能特性分析
测试背景
目标为实现双核心(C1、C2)间32KiB缓冲区的高速传输,同时在双核心上并行执行加载与存储操作。采用乒乓模式设计基准测试,让双核心交替操作缓冲区,得到以下实验结果:
- 实验1(无指令优化):C1平均耗时9615周期,C2平均9624周期
- 实验2(C1执行
CLWB、C2执行PREFETCHW):C1耗时10893周期,C2仅3312周期 - 实验3(双核心均执行
CLWB与PREFETCHW):双核心耗时均约10200周期 - 实验4(按缓存行奇偶分配
CLWB执行核心、双核心均预取):双核心耗时均约6100周期
实验2与实验3的性能差异解析
基于TigerLake(Willow Cove架构)的缓存子系统特性,可从CLWB指令行为、缓存一致性协议两方面解释差异:
1. CLWB指令的核心特性
CLWB的作用是将缓存行的脏数据写回内存,但不会使缓存行失效(与CLFLUSH的核心区别)。执行CLWB后,缓存行仍保留在核心私有缓存(L1/L2)或共享L3中,状态变为干净的独占(E)或共享(S)。
2. 实验2的性能逻辑
- C1执行
CLWB:仅完成脏数据写回,缓存行仍留在C1的私有缓存中,状态转为干净E。 - C2执行
PREFETCHW:提前向缓存子系统请求目标缓存行的独占(E)状态,直接将缓存行加载到C2的L1d缓存。当C2执行存储操作时,无需再发送RFO(Read For Ownership)请求等待总线响应,大幅降低了存储延迟,因此C2耗时骤降。 - C1耗时略高于实验1,仅来自
CLWB本身的写回开销,无额外一致性事务。
3. 实验3的性能逻辑
双核心均执行CLWB会引入两层额外开销:
- 重复写回开销:每次核心操作完缓存行后,都强制触发写回内存的操作——即使数据很快会被另一个核心修改,完全浪费了缓存的临时存储价值,占用了内存总线带宽。
- 缓存一致性事务叠加:C1执行
CLWB后,缓存行处于干净E状态;C2要执行CLWB前,必须先通过一致性协议将C1的缓存行置为S状态,自身获取E状态,执行CLWB后再次写回。这种来回切换缓存状态的事务,加上两次CLWB的写回开销,直接抵消了PREFETCHW的优化效果,最终耗时接近甚至略高于无优化的实验1。
4. 本质差异总结
实验2仅由完成写操作的核心执行CLWB,另一个核心用PREFETCHW提前获取所有权,避免了重复写回和不必要的缓存状态切换;而实验3中双核心重复执行CLWB,引入了冗余的内存总线事务和缓存一致性开销,导致性能大幅下降。
内容的提问来源于stack exchange,提问作者doliphin
相关产品推荐
相关产品推荐

