延迟容忍度
微处理器的速度每十年增加十倍以上,但商品存储器 (DRAM) 的速度仅增加了一倍,即访问时间减半。因此,以处理器时钟周期计算的内存访问延迟在 10 年内增长了六倍。多处理器加剧了这个问题。
在基于总线的系统中,在处理器和存储器之间建立高带宽总线往往会增加从存储器获取数据的延迟。当内存物理分布时,网络和网络接口的延迟会添加到访问节点上的本地内存的延迟中。
延迟通常随着机器的大小而增加,因为更多的节点意味着相对于计算而言更多的通信、用于一般通信的网络中的更多跳跃以及可能更多的争用。硬件设计的主要目标是减少数据访问的延迟,同时保持高、可扩展的带宽。
延迟容忍概述
通过查看机器中的资源及其利用方式,可以最好地了解如何处理延迟容忍度。从处理器的角度来看,从一个节点到另一个节点的通信架构可以看作是一条管道。管道的各个阶段包括源和目的地的网络接口,以及沿途的网络链路和交换机。通信辅助、本地存储器/缓存系统和主处理器中也存在阶段,具体取决于架构如何管理通信。
基线通信结构中的利用率问题是处理器或通信架构在给定时间繁忙,并且在通信管道中,当正在传输的单个字从源到目的地时,一次只有一个阶段繁忙。延迟容忍的目标是尽可能地重叠使用这些资源。
显式消息传递中的延迟容忍
消息传递中的实际数据传输通常是发送者使用发送操作发起的。接收操作本身并不促使数据被传送,而是将数据从传入缓冲区复制到应用程序地址空间中。接收方发起的通信是通过向数据源进程发出请求消息来完成的。然后该进程通过另一次发送将数据发回。
同步发送操作的通信延迟等于将消息中的所有数据传送到目标所花费的时间、接收处理的时间以及返回确认的时间。同步接收操作的延迟是其处理开销;其中包括将数据复制到应用程序中,以及数据尚未到达时的额外延迟。我们希望在两端隐藏这些延迟,如果可能的话包括开销。
共享地址空间中的延迟容忍度
基线通信是通过共享地址空间中的读取和写入进行的。为了方便起见,将其称为读写通信。接收器发起的通信是通过读取操作完成的,这些操作导致来自另一个处理器的内存或高速缓存的数据被访问。如果没有共享数据的缓存,则发送方发起的通信可以通过写入分配在远程存储器中的数据来完成。
对于缓存一致性,写入的影响更加复杂:写入导致发送者或接收者发起的通信取决于缓存一致性协议。无论是接收方发起还是发送方发起,硬件支持的读写共享地址空间中的通信自然是细粒度的,这使得容忍延迟非常重要。
共享地址空间中的块数据传输
在共享地址空间中,无论是通过硬件还是软件,数据的合并和块传输的启动都可以在用户程序中显式完成或由系统透明地完成。显式块传输是通过执行类似于用户程序中发送的命令来启动的。发送命令由通信辅助解释,它以管道方式将数据从源节点传输到目的地。在目的地,通信辅助装置从网络接口拉入数据字并将它们存储在指定位置。
与发送-接收消息传递有两个主要区别,这两个区别都源于以下事实:发送进程可以直接指定将数据放置在目的地的程序数据结构,因为这些位置位于共享地址空间中。
继续处理共享地址空间中的长延迟事件
如果存储器操作被设为非阻塞,则处理器可以越过存储器操作继续执行其他指令。对于写入,如果将写入放入写入缓冲区中,并且处理器继续运行,而缓冲区负责向内存系统发出写入并根据需要跟踪其完成情况,那么实现起来通常非常简单。不同之处在于,与写入不同,读取之后通常很快就会有一条需要读取返回值的指令。
共享地址空间中的预通信
预通信是一种已在商用微处理器中广泛采用的技术,并且其重要性在未来可能会增加。预取指令不会取代数据项的实际读取,并且如果要实现通过重叠隐藏延迟的目标,预取指令本身必须是非阻塞的。
在这种情况下,由于共享数据没有被缓存,所以预取的数据被放入称为预取缓冲区的特殊硬件结构中。当该字在下一次迭代中实际读入寄存器时,它是从预取缓冲区的头部而不是从内存中读取的。如果隐藏的延迟远大于计算单循环迭代的时间,我们将提前预取几次迭代,并且预取缓冲区中一次可能有几个字。
共享地址空间中的多线程
就隐藏不同类型的延迟而言,硬件支持的多线程可能是通用技术。与其他方法相比,它具有以下概念优势 -
它不需要特殊的软件分析或支持。
由于它是动态调用的,因此它可以处理不可预测的情况,例如缓存冲突等,以及可预测的情况。
与预取一样,它不会更改内存一致性模型,因为它不会对线程内的访问进行重新排序。
虽然以前的技术旨在隐藏内存访问延迟,但多线程可以轻松隐藏任何长延迟事件的延迟,只要可以在运行时检测到该事件即可。这还包括同步和指令延迟。
这种趋势将来可能会改变,因为与处理器速度相比,延迟变得越来越长。此外,随着更复杂的微处理器已经提供了可扩展多线程的方法,并且随着新的多线程技术的开发将多线程与指令级并行性相结合,这种趋势在未来似乎肯定会发生一些变化。