Intel CPU跨NUMA节点L3缓存一致性实际表现及规范依据问询
我做了一个双线程测试:一个线程循环访问本地NUMA节点上的32MB数组,另一个线程从远程NUMA节点访问该数组。从测试结果来看,远程NUMA节点的数据似乎不会被缓存到本地L3缓存,只能通过REMOTE_DRAM和REMOTE_CACHE_FWD提供服务。
我猜测跨NUMA节点的L1/L2缓存实现了总线监听,但L3缓存未实现。Intel SDM中有“cross package snoop”和“remote cache”相关表述,但没有详细定义。想咨询:哪里能找到验证该测试结论的详细规范或依据?
测试环境
- Intel(R) Xeon(R) Gold 6238R CPU @ 2.20GHz
- 2个NUMA节点
- L3缓存大小:38 MiB
Intel SDM中REMOTE_DRAM和REMOTE_CACHE_FWD的说明

perf stat测试结果
1. 本地访问
Performance counter stats for process id '2482844': 112 mem_load_l3_miss_retired.remote_dram (48.94%) 97 mem_load_l3_miss_retired.remote_fwd (65.96%) 2166976 LLC-load-misses # 41.82% of all LL-cache hits (65.96%) 5181401 LLC-loads (67.76%) 678 node-load-misses (34.04%) 2036055 node-loads (32.24%) 1.308500500 seconds time elapsed
2. 远程访问
Performance counter stats for process id '2482844': 1143866 mem_load_l3_miss_retired.remote_dram (49.40%) 2920330 mem_load_l3_miss_retired.remote_fwd (66.31%) 18063660 LLC-load-misses # 45.68% of all LL-cache hits (66.68%) 39543836 LLC-loads (67.08%) 4500262 node-load-misses (33.32%) 13366604 node-loads (32.92%) 2.331103404 seconds time elapsed
3. 停止本地循环访问线程后的远程访问
Performance counter stats for process id '2482844': 6171182 mem_load_l3_miss_retired.remote_dram (48.65%) 124 mem_load_l3_miss_retired.remote_fwd (65.77%) 6350280 LLC-load-misses # 76.26% of all LL-cache hits (66.19%) 8326881 LLC-loads (67.51%) 6076443 node-load-misses (33.81%) 1480 node-loads (32.49%) 1.399664053 seconds time elapsed
验证结论的规范与依据来源
Cascade Lake-SP架构优化指南
你使用的Xeon Gold 6238R属于Cascade Lake-SP架构,Intel官方发布的《Cascade Lake-SP Optimization Guide》中,详细说明了该架构下NUMA节点的缓存一致性机制、跨包窥探规则,以及L3缓存的远程访问行为,会明确L3是否参与跨NUMA节点的缓存共享。Intel SDM 核心章节补充解读
Intel SDM(软件开发者手册)的第3卷第11章(缓存控制与一致性)、第8章(多处理器管理)中,虽未直接定义remote cache,但结合NUMA窥探机制的描述,可以梳理出跨节点缓存的行为逻辑。另外第19章(性能监控事件定义)会明确mem_load_l3_miss_retired.remote_dram和mem_load_l3_miss_retired.remote_fwd的触发场景,间接验证你的测试结论。Intel架构优化参考手册
编号为248966的《Intel Architecture Optimization Reference Manual》中,有专门章节讲解NUMA优化、缓存一致性域划分,会明确L1/L2/L3在跨NUMA节点访问时的行为边界——比如L3属于本地节点私有共享缓存,跨节点访问时不会被缓存,只能通过远程DRAM或缓存转发获取数据。
测试数据佐证
从你的perf结果可以看出:
- 远程访问时
mem_load_l3_miss_retired.remote_fwd数值极高,说明大部分请求依赖远程节点缓存转发,而非将数据缓存到本地L3; - 停止本地线程后,
remote_fwd骤降、remote_dram大幅上升,说明本地线程的循环访问维持了数据在远程缓存中的有效性,但远程节点不会将数据同步到本地L3; - 远程访问的LLC-loads数远高于本地,LLC-load-misses占比接近本地,进一步说明本地L3未缓存远程数据,每次访问都需发起跨节点请求。
内容的提问来源于stack exchange,提问作者pleiadesian

