Pentium 4处理器架构/微架构/流水线 (11) - NetBurst执行核详解 - Load/Store操作/存储转发

Loads and Stores

Pentium 4处理器采用以下技术来加速访存操作的执行:

  • 投机执行读存操作
  • 对于读存和写存操作,重排序读存操作
  • 允许多个缓存未中共存的情形(即无需等待上一个缓存未中解决,开始开始下一个读存操作)。有几个缓存行填充缓冲区,就允许有几个缓存未中共存。
  • 缓冲写存操作(也支持用来存储转发机制,参看下条)
  • 从写存操作中获取数据,转发给对应(同一地址)的读存操作

性能增强不可以超过内存访问带宽和处理器提供的缓冲区资源的限制。预约站的访存发射口(Port0:Store Data;Port3:Store Address;Port2:Load)可以在每个周期发射最多1条读存操作和1条写存操作。处理器中有48个读存缓冲区和24个写存缓冲区。只有当相应操作的缓冲区可用时,访存指令才能被分发到预约站。这些缓冲区会保存访存微指令及其操作地址信息,直到访存操作完成,微指令退役,然后会被回收供后续访存指令使用。

Pentium 4处理器被设计为允许访存操作乱序执行,既可以和其他指令一起参与乱序执行,多个访存操作之间也可以乱序执行。

读存操作可以投机执行,即,在前面的分支指令决断之前,通过分支预测机制“投机式地”读取数据。但是需要注意,投机读存操作不可以引发缺页异常(如果真的发生缺页,则不投机执行该条读存操作)。通过将多个读存操作重排序,可以避免某个读存操作未中导致后续读存操作停顿。将读存操作与其他的非同一地址的访存操作(读和写)一起重排序,可以进一步增强指令并行性,使得处理器可以更快的获得操作数据,开始执行更多的指令。

写存操作必须按照程序设计顺序执行,从而保证执行结果的正确性。

若读存操作时发生缓存未中,则需要向数据源(例如上级缓存或者存储器)请求数据。这种情形(outstanding load miss)并不会阻止其他的读存操作被发射执行并完成。换句话说,发生读操作缓存未中时,无需等待数据返回,即可开始执行下一条读存操作指令(假设指令执行资源都已具备)。Pentium 4处理器支持最多达4个读操作缓存未中的情形。

写存缓冲区使得处理器可以继续执行后续指令,无需等待某个写存操作完成存储器或缓存更新。这种机制可以提升处理器性能。对于(数据)依赖链而言,写存操作通常不在关键路径上,这样稍微延迟写操作,可以更有效的使用访存总线周期。

Store Forwarding

假设程序中某个写存操作位于读存操作之前,如果处理器预测到读操作与写操作的目标并不是同一个线性地址,则后面的读操作可以先执行。如果读写操作的目标是同一个地址,则读操作必须等待写操作的数据可用。但是有了存储转发机制,读操作无需等待到写操作的数据到达存储器层次结构中(即缓存或者存储器中)且写操作指令退役后,才能读取数据。只要如下的条件满足,写操作的数据可以直接转发给读操作:

  • 读写顺序:指令按照先写后读顺序,即要转发的数据是程序中前面的写存操作产生的,且写存指令已经执行(不必退役)
  • 数据长度:读取的数据必须是存储的数据的子集(包括真子集,即相同长度)。
  • 对齐方式:存储不能绕回缓存行边界,且要读取的线性地址必须与存储地址相同。

你可能感兴趣的:(Intel微架构,Pentium,4,NetBurst,性能优化,流水线,指令集)