缓存预取是在硬件地址空间还是虚拟地址空间完成的?

问题描述 投票:0回答:1

硬件预取器是在连续的虚拟地址上操作,还是在连续的硬件地址上操作?想象一下这样的情况:您有一个跨越多个页面的大字节数组。在虚拟地址空间中,字节是连续的,但实际上页面可以分配在硬件中不相交的页面中。我希望预取器能够在开始引入属于下一页的缓存行之前使用 TLB 进行适当的转换。

是这样吗? 我找不到证实这一点的信息,希望有人能提供更多见解。

我主要要求 x86,但任何见解将不胜感激

performance caching memory x86 prefetch
1个回答
5
投票

我无法回答 AMD 处理器的问题,但我可以回答英特尔处理器的问题。

据我所知,硬件预取器不应在当前的英特尔处理器上跨页边界预取缓存行。

摘自英特尔的 Intel® 64 和 IA-32 架构优化参考手册,第 7.5.2 节,硬件预取

自动硬件预取可以根据先前的数据未命中将缓存线带入统一的末级缓存。它将尝试在预取流之前预取两个缓存行。硬件预取器的特点是:

  • [...]
  • 它不会跨 4 KB 页面边界预取。在硬件预取器开始从新页面预取之前,程序必须启动新页面的需求加载。

上面的段落谈论的是“统一的末级缓存”,但在 L1d 领域情况并没有更好:

2.3.5.4、数据预取

数据预取至L1数据缓存

满足以下条件时,加载操作会触发数据预取:

  • [...]

  • 预取的数据与触发它的加载指令位于同一 4K 字节页面内。

或者在 L2 中:

以下两个硬件预取器将数据从内存取到二级缓存和末级缓存:

空间预取器:[...]

Streamer:此预取器监视来自 L1 缓存的读取请求,以获取地址的升序和降序序列。受监控的读取请求包括由加载和存储操作以及硬件预取器发起的 L1 DCache 请求,以及用于代码获取的 L1 ICache 请求。当检测到向前或向后的请求流时,预取预期的高速缓存行。预取的缓存行必须位于同一个 4K 页中。

但是,处理器可能会预取分页数据。来自英特尔的Intel® 64 和 IA-32 架构软件开发人员手册,第 3A 卷,4.10.2.3,TLB 使用详细信息

处理器可能会缓存预取和访问所需的翻译,这些翻译是推测执行的结果,而在执行的代码路径中实际上永远不会发生。

第 3A 卷,4.10.3.1,分页结构的缓存

处理器可能会在分页结构缓存中创建条目,用于预取所需的转换以及作为推测执行结果的访问,而这些操作实际上永远不会发生在执行的代码路径中。

我知道您问过硬件预取,但您应该能够使用软件预取数据(而不是指令):

在较旧的微体系结构中,导致数据转换后备缓冲区 (DTLB) 未命中的 PREFETCH 将被丢弃。在基于 Nehalem、Westmere、Sandy Bridge 和较新微架构的处理器、Intel Core 2 处理器和 Intel Atom 处理器中,PREFETCH 会导致 DTLB 缺失 跨页边界获取。

© www.soinside.com 2019 - 2024. All rights reserved.