硬件预取器是在相邻的虚拟地址上运行,还是在连续的硬件地址上运行?想象一下,你有一个跨越多个页面的大量字节的情况。在虚拟地址空间中,字节是连续的,但实际上页面可以在硬件中的不相交页面中分配。我希望prefetcher能够在开始引入属于下一页的缓存行之前使用TLB进行适当的转换。
这是这样吗? 我找不到证实这一点的信息,并希望有人能提供更多见解。我主要是要求x86,但任何见解都会受到赞赏
答案 0 :(得分:1)
对于AMD处理器我无法回答这个问题,但我可以为英特尔处理器解答这个问题。
据我所知,硬件预取程序不应在当前的英特尔处理器上跨页边界预取高速缓存行。
来自英特尔的Intel® 64 and IA-32 Architectures Optimization Reference Manual,第7.5.2节,硬件预取:
自动硬件预取可以根据先前的数据丢失将高速缓存行带入统一的最后一级缓存。它将尝试在预取流之前预取两个缓存行。硬件预取器的特征是:
- [...]
- 它不会预取4 KB页面边界。在硬件预取程序开始从新页面预取之前,程序必须启动新页面的需求加载。
上面的段落是关于“统一的最后一级缓存”,但在L1d土地上事情并不好:
2.3.5.4,数据预取
数据预取到L1数据缓存
满足以下条件时,加载操作会触发数据预取:
[...]
预取数据与触发它的加载指令位于同一个4K字节页面内。
或者在L2中:
以下两个硬件预取程序从内存中获取数据到L2缓存和最后一级缓存:
空间预取器:[...]
Streamer:此预取程序监视来自L1缓存的读取请求,用于升序和降序地址序列。受监视的读取请求包括由加载和存储操作以及硬件预取程序发起的L1 DCache请求,以及用于代码获取的L1 ICache请求。当检测到前向或后向请求流时,预取了预期的高速缓存行。预取的缓存行必须位于同一个4K页面中。
但是,处理器可能会预取分页数据。来自英特尔的Intel® 64 and IA-32 Architectures Software Developer Manuals,第3A卷,4.10.2.3, TLB使用的详细信息:
处理器可以缓存预取和访问所需的转换,这些转换是在执行的代码路径中实际上永远不会发生的推测性执行的结果。
卷3A,4.10.3.1,分页结构的缓存:
处理器可以在分页结构缓存中创建条目,用于预取和访问的访问,这些访问是在执行的代码路径中实际上永远不会发生的推测性执行的结果。
我知道您询问过硬件预取,但您应该可以使用软件预取数据(而不是说明):
在较旧的微体系结构中,导致数据转换后备缓冲区(DTLB)未命中的PREFETCH将被丢弃。在基于Nehalem,Westmere,Sandy Bridge和更新的微架构,Intel Core 2处理器和Intel Atom处理器的处理器中,PREFETCH导致DTLB未命中 被提取跨越页面边界。