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
相关产品推荐
相关产品推荐

