有没有人使用过 Core 2 Duo 处理器的预取指令?
我一直在为一系列 P4 机器成功使用(标准?)预取集( , 等),但是在 Core 2 Duo 上运行代码时,指令似乎prefetchnta
什么都不做,而且指令更少有效的。prefetcht1
prefetcht(i)
prefetchnta
我评估性能的标准是 BLAS 1 向量向量 (axpy) 操作的时序结果,当向量大小足够大以支持缓存外行为时。
英特尔是否引入了新的预取指令?
从有关英特尔 64 和 IA-32 架构的英特尔参考文档中,查看第 163 页和第 77 页:
基于 Intel NetBurst 微架构的 Pentium 4 和 Intel Xeon 处理器除了软件预取外,还引入了硬件预取。硬件预取器透明地操作以从内存中获取数据和指令流,而无需程序员干预。随后的微架构继续改进并向硬件预取机制添加功能。硬件预取机制的早期实现侧重于将数据和指令从内存预取到 L2;最近的实现提供了将数据从 L2 预取到 L1 的附加功能。在英特尔 NetBurst 微架构中,硬件预取器可以跟踪 8 个独立的流。
Pentium M 处理器还为数据提供了硬件预取器。它可以在正向跟踪 12 个单独的流,在反向跟踪 4 个流。处理器的 PREFETCHNTA 指令还将 64 字节取入一级数据高速缓存,而不会污染二级高速缓存。
Intel Core Solo 和 Intel Core Duo 处理器提供比 Pentium M 处理器更先进的数据硬件预取器。表 2-10 总结了主要差异。
我在一个紧密的循环中尝试过一次,我试图优化加载的 4 个双精度,每个循环执行大约 15 个浮点操作。我发现要对 core 2 duo 产生积极影响,需要在代码中至少提前 16 个循环设置预取,而对于较旧的处理器,提前 4 个循环就足够了。
我不知道这是否可能是您的代码的问题,但请考虑缓存行大小(它确定用于预取指令的步幅大小)可能因不同的处理器而异。因此,如果您在不满足此假设的 CPU 上使用不同缓存行大小的假设下优化的代码,则必然会降低性能。
这个问题here询问如何确定预取缓存行大小。