流式数据与 non-temporal 访问
更新时间:2026-10-01。当数据只用一次(大拷贝、视频帧、日志),让它经过缓存只会挤掉真正复用的数据。
本文要回答的问题
- non-temporal store 和普通写有何不同?
- 什么情况下绕过缓存反而更快/更慢?
一、绕过缓存
non-temporal/streaming 指令把写直接合并送入 write-combining 缓冲并下发内存,不分配缓存行、不读旧数据(省一次 RFO),从而保护缓存中的热数据。大块顺序写带宽接近峰值。
二、使用条件
通常要求地址对齐、顺序写;写完若马上或在其它核读取,需要 store fence 保证可见。关键判据是“数据短期内不复用”——若会复用,绕过缓存等于自废武功。
三、常见坑
- 对会复用的数据用 NT。
- 不对齐/乱序写,WC 合并失效。
- 写完漏 fence 导致读取不到。
小结
non-temporal 为一次性流式数据绕过缓存、避免污染并省 RFO,但要对齐、顺序、配合 fence,复用语义下禁用。下一篇 直接缓存访问与 cache coloring。
总结
大块一次性数据(大拷贝、视频帧、日志)若走普通写,会分配缓存行、先做一次 RFO 读旧值,并把真正复用的热数据挤走;non-temporal/streaming 指令借 write-combining 合并后直接写内存,不分配行、不读旧数据,从而保护缓存、让顺序写带宽逼近峰值——但前提是地址对齐、顺序写、写完在它核读取前用 store fence 保证可见,且数据短期内确实不复用,否则绕过缓存反而更慢。