Intel Core 2 Duo 的预取

Posted

技术标签:

【中文标题】Intel Core 2 Duo 的预取【英文标题】:Prefetch for Intel Core 2 Duo 【发布时间】:2009-11-16 13:12:26 【问题描述】:

有没有人使用过 Core 2 Duo 处理器的预取指令?

我一直在为一系列 P4 机器成功使用(标准?)预取集(prefetchntaprefetcht1 等),但在 Core 2 Duo 上运行代码时,@ 987654324@ 指令什么都不做,prefetchnta 指令效果较差。

我评估性能的标准是 BLAS 1 向量向量 (axpy) 操作的时序结果,当向量大小足够大以支持缓存外行为时。

英特尔是否引入了新的预取指令?

【问题讨论】:

我看到的结果如下。在 P4 上:使用 prefetchnta 可确保性能与向量大小成线性关系,即使达到缓存外行为也是如此。使用 prefetchnta 不会降低小尺寸的性能。在 Core2 上:虽然 prefetchnta 在大尺寸上有些帮助,但不保留线性缩放。它还会降低小尺寸的性能(大约 1/3!)。硬件预取是否妨碍了我,还是我需要在 core 2 duo 上使用 prefetchnta 做一些特别的事情? 软件预取必须是tuned for the microarchitecture,例如在加载之前预取多远。此外,在具有更好硬件预取的较新 uarch 中,一些模式不再受益于 SW 预取 【参考方案1】:

来自英特尔 64 和 IA-32 架构上的 Intel reference document,查看第 163 和 77 页:

奔腾 4 和英特尔至强处理器 基于英特尔 NetBurst 微架构引入硬件 除了软件预取 预取。硬件预取器 透明地操作以获取数据 和来自内存的指令流 无需程序员 干涉。随后的 微架构不断改进 并向硬件添加功能 预取机制。早些时候 硬件实现 预取机制侧重于 预取数据和指令 记忆到 L2;更近 实现提供了额外的 将数据从 L2 预取到的功能 L1。在英特尔 NetBurst 中 微架构,硬件 prefetcher 可以跟踪 8 个独立的 流。

奔腾 M 处理器还提供 数据的硬件预取器。它可以 跟踪 12 个独立的流 正向和 4 个流 向后的方向。处理器的 PREFETCHNTA 指令还取 64 字节进入第一级数据 缓存而不污染 二级缓存。

Intel Core Solo 和 Intel Core Duo 处理器提供更先进的 数据的硬件预取器比 奔腾 M 处理器。主要区别 总结在表2-10中。

【讨论】:

【参考方案2】:

我不知道您的代码是否存在问题,但请考虑缓存行大小(决定用于预取指令的步幅大小)可能因不同处理器而异。因此,如果您在不满足此假设的 CPU 上使用不同缓存行大小的假设下优化的代码,则必然会降低性能。

This question 这里询问如何确定预取缓存行大小。

【讨论】:

【参考方案3】:

我在一个紧凑的循环中尝试过一次,我试图优化加载的 4 个双精度,每个循环执行大约 15 个浮点操作。 我发现要对 core 2 duo 产生积极影响,需要在代码中至少提前 16 个循环设置预取,而对于较旧的处理器,提前 4 个循环就足够了。

【讨论】:

以上是关于Intel Core 2 Duo 的预取的主要内容,如果未能解决你的问题,请参考以下文章

linux发行版中的i386/i686/x86-64/有啥区别?

如何在英特尔至强可扩展处理器上禁用 L3 缓存预取器?

Intel Core Microarchitecture Pipeline

python 2.7 与第 11 代 Intel Core i9 的兼容性问题?

基于Intel® Core™ i5 机器人控制器

如何关闭windows中缓存的预取?