Intel64及IA-32架构优化指南第7章——7.2 数据的硬件预取,7.3 预取以及与Cache相关的指令
7.2 数据的硬件预取
奔腾M、Intel Core Solo以及Intel Core Duo处理器以及基于Intel Core微架构与Intel NetBurst微架构的处理器提供了硬件数据预取机制,这种机制监测应用程序数据访问模式并自动预取数据。该行为是自动的,并且不需要程序员干涉。
对于基于Intel NetBurst微架构的处理器,硬件数据预取器的特征有:
1、它需要在最后级Cache中两个相继的Cache失败来触发该机制;这两个Cache失败必须满足Cache失败的跨度比硬件预取机制的触发距离短这一条件(见表2-23)。
2、试图在当前数据访问位置往前保留256个字节。
3、每4K字节页只关注一条流(加载或存储)。
4、可以从八个不同4K字节区域预取多达8条同时的、独立的流。
5、不预取跨4K字节边界。这独立于分页模式。
6、将数据预取到第二/第三级Cache。
7、不预取UC或WC存储器类型。
8、关注加载与存储流。为存储流发布为所有权读(RFO)事务并为加载流发布读数据。
除了上述提到的第2项与第4项之外,大部分其它特征也应用于奔腾M、Intel Core Solo以及Intel Core Duo处理器。在奔腾M处理器中所实现的硬件预取器将数据取到一个二级Cache中。它能向前跟踪12条独立的流并向后跟踪4条独立的流。Intel Core Solo处理器的硬件预取器能跟踪16条向前的流以及4条向后的流。在Intel Core Duo处理器上,硬件预取器在每个核中独立地取数据。
基于Intel Core微架构处理器的硬件预取机制在3.7.3小节以及3.7.4小节中讨论。尽管在硬件实现技术中的不同,不过硬件预取对软件的整个获益在Intel Core微架构与之前的架构之间是类似的。
7.3 预取和与Cache相关的指令
由程序员或编译器所插入的PREFETCH指令在奔腾4上,在数据实际被需要之前,访问最少两个Cache行的数据(在奔腾M处理器上是一个Cache行的数据)。这隐藏了在需要处理已驻留在Cache中的数据的时候,对数据访问的延迟。
许多算法能能事先提供关于要被请求数据的信息。在存储器访问以长的、固定的数据访问模式的情况下,自动硬件预取器应该偏向于软件预取。
数据引用模式能被分为以下几类:
● 临时的——数据很快会被再次使用
● 空间的——数据将以毗邻的位置来使用(比如,在同一个Cache行中)
● 非临时的——数据被访问一次,但在不久的将来不会被重新使用(比如,对于某些多媒体数据类型,作为一个3D图形应用程序的顶点缓存)
这些数据特征在以下的讨论中使用。