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

AlderLake能否无需非临时指令消除RFO/WA?技术问询

Intel AlderLake(i7-12700H)STREAM测试中的RFO/WA优化疑问

测试环境与初始结果

测试仅使用8个性能核,执行命令:

# 仅使用性能核
OMP_NUM_THREADS=8 numactl -C 0-7 ./stream_c.exe

初始测试结果(使用STREAM默认带宽统计逻辑):

-------------------------------------------------------------
STREAM version $Revision: 5.10 $
-------------------------------------------------------------
This system uses 8 bytes per array element.
-------------------------------------------------------------
Array size = 400000000 (elements), Offset = 0 (elements)
Memory per array = 3051.8 MiB (= 3.0 GiB).
Total memory required = 9155.3 MiB (= 8.9 GiB).
Each kernel will be executed 10 times.
 The *best* time for each kernel (excluding the first iteration)
 will be used to compute the reported bandwidth.
-------------------------------------------------------------
Number of Threads requested = 8
Number of Threads counted = 8
-------------------------------------------------------------
Your clock granularity/precision appears to be 1 microseconds.
Each test below will take on the order of 122497 microseconds.
   (= 122497 clock ticks)
Increase the size of the arrays if this shows that
you are not getting at least 20 clock ticks per test.
-------------------------------------------------------------
WARNING -- The above is only a rough guideline.
For best results, please be sure you know the
precision of your system timer.
-------------------------------------------------------------
Function    Best Rate MB/s  Avg time     Min time     Max time
Copy:           52570.6     0.124356     0.121741     0.130264
Scale:          53046.5     0.123956     0.120649     0.125336
Add:            51644.6     0.187153     0.185886     0.189544
Triad:          51564.1     0.187952     0.186176     0.190740
-------------------------------------------------------------
Solution Validates: avg error less than 1.000000e-13 on all three arrays
-------------------------------------------------------------

带宽统计逻辑的修正与异常结果

STREAM默认的带宽统计未考虑写分配(WA/RFO,Read For Ownership)——写入未缓存的内存时会触发额外的读取请求,因此默认的字节数统计偏小:

// 默认bytes定义
static double   bytes[4] = {
    2 * sizeof(STREAM_TYPE) * STREAM_ARRAY_SIZE,
    2 * sizeof(STREAM_TYPE) * STREAM_ARRAY_SIZE,
    3 * sizeof(STREAM_TYPE) * STREAM_ARRAY_SIZE,
    3 * sizeof(STREAM_TYPE) * STREAM_ARRAY_SIZE
};

针对RFO场景修正后的字节数统计:

// 修正后bytes定义(考虑RFO的额外读取)
static double   bytes[4] = {
    3 * sizeof(STREAM_TYPE) * STREAM_ARRAY_SIZE,
    3 * sizeof(STREAM_TYPE) * STREAM_ARRAY_SIZE,
    4 * sizeof(STREAM_TYPE) * STREAM_ARRAY_SIZE,
    4 * sizeof(STREAM_TYPE) * STREAM_ARRAY_SIZE
};

修正后的测试结果却超出了内存理论峰值带宽:

Function    Best Rate MB/s  Avg time     Min time     Max time
Copy:           79788.6     0.123881     0.120318     0.127139
Scale:          78227.6     0.124536     0.122719     0.127953
Add:            68944.0     0.186474     0.185658     0.187657
Triad:          70287.2     0.187193     0.182110     0.192889

原地Scale测试的验证

将Scale测试改为原地操作(无RFO/WA,统计2 * sizeof(STREAM_TYPE) * STREAM_ARRAY_SIZE),结果带宽回到53 GB/s左右,符合预期:

Scale:          53705.2     0.123021     0.119169     0.132730

这说明实际测试中并未触发RFO/WA,但二进制文件中未使用非临时存储指令(如MOVNTPS),也无memcpy调用,因此产生以下核心疑问与解答:


核心疑问与解答

1. AlderLake是否能在特定场景下消除RFO/WA?

是的,Intel AlderLake(第12代酷睿)支持硬件层面的RFO消除优化,无需依赖非临时存储指令。这种优化被称为"Write-Without-Read"或"No-Allocate Write",针对特定内存访问模式生效。

2. 具备该能力的CPU范围

  • Intel:第12代及以后的酷睿处理器(AlderLake、RaptorLake等),Ice Lake及之后的Xeon Scalable处理器也支持类似优化。
  • AMD:Zen 3及以后的处理器(如Ryzen 5000系列及更新)也引入了类似的RFO消除机制。

3. 适用条件

要触发RFO消除,需满足以下关键条件:

  • 连续大粒度写入:写入操作是连续的、大尺寸内存访问,STREAM测试的数组为大尺寸堆分配,完全符合该模式。
  • 缓存行对齐:写入操作必须对齐到64字节缓存行边界——测试中已将数组设置为64字节对齐,满足要求。
  • 无后续读取依赖:写入的缓存行在短时间内没有被读取的需求,STREAM的Copy/Scale等操作中目标数组写入后无立即读取逻辑,符合该条件。
  • 硬件微架构支持:仅较新的处理器具备对应的硬件优化,这也是旧平台无法触发该机制的原因。

这种优化的本质是硬件识别到连续大尺寸写入模式,直接将数据写入内存而不先读取缓存行,从而避免了RFO带来的额外带宽开销。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 14:39:55