thi*_*dog 5 memory performance caching
硬件预取器是在连续的虚拟地址上运行,还是在连续的硬件地址上运行?想象一下你有一个跨越多个页面的大字节数组的情况。在虚拟地址空间中,字节是连续的,但实际上页面可以在硬件中以不相交的页面分配。我希望预取器能够在开始引入属于下一页的缓存行之前使用 TLB 进行适当的转换。
是这样吗?我找不到证实这一点的信息,希望有人能提供更多见解。
我主要要求 x86,但任何见解将不胜感激
小智 5
我无法回答 AMD 处理器的问题,但我可以回答英特尔处理器的问题。
\n据我所知,硬件预取器不应在当前的英特尔处理器上跨页边界预取缓存行。
\n来自 Intel \xc2\xae 64 和 IA-32 架构优化参考手册,第 7.5.2 节,硬件预取:
\n\n\n自动硬件预取可以根据先前的数据未命中将缓存行带入统一的最后一级缓存。它将尝试在预取流之前预取两个缓存行。硬件预取器的特点是:
\n\n
\n- [...]
\n- 它不会跨 4 KB 页边界预取。在硬件预取器开始从新页面预取之前,程序必须启动新页面的需求加载。
\n
上面的段落谈论的是“统一的末级缓存”,但在 L1d 领域情况并没有更好:
\n2.3.5.4、数据预取
\n\n\n数据预取至 L1 数据缓存
\n当满足以下条件时,加载操作会触发数据预取:
\n\n
\n- \n
[...]
\n- \n
预取数据与触发它的加载指令位于同一 4K 字节页内。
\n
或者在 L2 中:
\n\n\n以下两个硬件预取器将数据从内存取到二级缓存和末级缓存:
\n空间预取器:[...]
\nStreamer:此预取器监视来自 L1 缓存的读取请求,以了解地址的升序和降序序列。受监控的读取请求包括由加载和存储操作以及硬件预取器发起的 L1 DCache 请求,以及用于代码获取的 L1 ICache 请求。当检测到向前或向后的请求流时,预取预期的高速缓存行。预取的缓存行必须位于同一 4K 页中。
\n
但是,处理器可能会预取分页数据。来自 Intel \xc2\xae 64 和 IA-32 架构软件开发人员手册,第 3A 卷,4.10.2.3,TLB 使用详细信息:
\n\n\n处理器可以缓存预取和作为推测执行的结果的访问所需的转换,而这些推测执行实际上永远不会发生在执行的代码路径中。
\n
第 3A 卷,4.10.3.1,分页结构的缓存:
\n\n\n处理器可以在分页结构高速缓存中创建条目,用于预取所需的转换以及作为推测执行的结果的访问,而推测执行实际上永远不会发生在执行的代码路径中。
\n
我知道您询问了硬件预取,但您应该能够使用软件预取数据(而不是指令):
\n\n\n在较旧的微体系结构中,导致数据转换后备缓冲区 (DTLB) 未命中的 PREFETCH 将被丢弃。在基于 Nehalem、Westmere、Sandy Bridge 和较新微架构的处理器、Intel Core 2 处理器和 Intel Atom 处理器中,导致 DTLB 未命中的 PREFETCH 可以跨页边界获取。
\n