Intel Core & Enhanced Core微架构(12)

版权声明:转载必须保留原出处,没有书面许可不可用于商用目的, https://blog.csdn.net/qq_43401808/article/details/85706488

Data Prefetch to L1 Caches

Intel Core微架构提供了2个硬件预取器,可以将数据预取到一级缓存中,由此加速程序访问数据的速度:

  • 数据缓存单元预取器(DCU prefetcher) – 这个预取器,也被称为流式预取器,按最近地址升序的读存操作触发。处理器认为这种类型的访存属于流式访存算法,会自动的预取下一行数据。
  • 基于指令指针的步长预取器 – 这个预取器持续的跟踪单条读存指令。如果侦测到有规律的步长,就会预取下一条数据,地址是当前地址加上侦测到的步长。这个预取器可以向前或者向后进行预取,可以侦测到的步长最大可达4K字节页面的一半,即2K个字节的步长。

数据预取适用于满足一下条件的读存操作:

  • 读存操作访问回写内存类型
  • 预取请求在4K页面的边界内(即不能跨存储器页面进行预取)
  • 在流水线中不能有进行中的fence或者lock(即不能有访存串行化指令或者总线封锁指令)
  • 不能有太多的读存未命中事件在处理过程中(预取操作优先级低,目的是节省访存带宽)
  • 总线也不能太忙(为其他操作节省总线资源)
  • 不能有持续的写存操作流(避免增加冲突,也节省带宽)

DCU预取具有如下的效果:

  • 如果程序中某个大结构体中的数据按照顺序存储,则可以提升性能
  • 如果访存模式过于松散而非局部访问,则可能会由于带宽问题导致轻微的降低性能

注:进行中的预取会占用带宽,松散的访存频繁导致缓存未命中而访存,造成带宽竞争。

  • 在某些罕见的情况下,如果程序算法设计为占用大部分高速缓存,无用的预取会导致程序需要的缓存行被evict。由于DCU的容量有限,这种情况下的硬件预取可能会导致严重的性能恶化。(注:可以查看BIOS设置是否有关闭DCU预取的选项)

硬件预取机制以来硬件逻辑来预测数据访问模式,做为对比,软件预取指令则依赖程序员来预测访问数据时缓存的命中情况。软件预取指令作为一种提示信息,让处理器提前将某个数据行读取到指定的某级缓存中。注意:软件预取的意图是预取数据,不要预取指令。

Data Prefetch Logic

根据一级数据缓存向二级缓存请求数据的历史模式,数据预取逻辑DPL可以预先将数据读取到二级缓存中。DPL维护者两个独立的来自于DCU的存储地址数组:一个记录上行流(12个条目),另一个记录下行流(4个条目)。DPL在每个条目中跟踪对一个4K字节大小的页面的访问。如果访问过的页面不在任何一个数组中,则会为该页面分配一个数组条目。

注:上行流即某个页面中按地址增大的顺序访问数据;下行流即按地址减小的顺序访问数据。每个条目跟踪一个页面,则DPL可以跟踪12个上行流页面和4个下行流页面。

数据预取逻辑DPL监视DCU的递增的读请求序列(被称为读请求流)。一旦DPL侦测到对某个流的第二次请求,它会预取下一个缓存行。例如,当DCU请求缓存行A和A+1,DPL会假设DCU接下来很快会需要缓存行A+2。如果DCU真的请求了A+2缓存行,则DPL会预取缓存行A+3。对于“下行流”请求模式,DPL采取类似的工作机制。

数据预取逻辑DPL是由Intel Pentium M处理器引入的,在Intel Core微架构上做了如下增强:

  • DPL可以侦测更加复杂的流模式,例如请求流跳过缓存行。DPL可以在每次二级缓存查询时做两个预取请求。Intel Core微架构中的数据预取逻辑在DCU实际发出读取请求之前可以提前预取最多达8个缓存行。
  • 数据预取逻辑可以根据总线带宽和请求的数量动态的调整预取行为。如果总线不忙的话,DPL可以预取的更远(即更多缓存行),否则DPL只做少量预取(即少数缓存行)。
  • DPL可以根据不同的应用和系统配置调整。注:例如BIOS选项。

处理器中的每个核独立操作DPL。英文原文如下:Entries for the two cores are handled separately.

猜你喜欢

转载自blog.csdn.net/qq_43401808/article/details/85706488