延迟容忍度

微处理器的速度每十年增加十倍以上,但商用内存(DRAM)的速度仅增加一倍,即访问时间减半。因此,以处理器时钟周期计算的内存访问延迟在十年内增加了六倍。多处理器加剧了这一问题。

在基于总线的系统中,在处理器和内存之间建立高带宽总线往往会增加从内存获取数据的延迟。当内存物理分布时,网络和网络接口的延迟会添加到访问节点上的本地内存的延迟中。

延迟通常随着机器的大小而增加,因为更多的节点意味着相对于计算更多的通信,网络中用于一般通信的跳跃更多,并且可能有更多的争用。硬件设计的主要目标是减少数据访问的延迟,同时保持高可扩展带宽。

延迟容忍度概述

通过查看机器中的资源及其使用方式,可以最好地理解延迟容忍度的处理方式。从处理器的角度来看,从一个节点到另一个节点的通信架构可以看作是一条管道。管道的阶段包括源和目标处的网络接口,以及沿途的网络链路和交换机。通信辅助、本地内存/缓存系统和主处理器中也有阶段,具体取决于架构如何管理通信。

基线通信结构中的利用率问题是处理器或通信架构在给定时间内处于繁忙状态,而在通信管道中,每次只有一个阶段处于繁忙状态,因为传输的单个字从源传输到目标。延迟容忍度的目标是尽可能地重叠使用这些资源。

显式消息传递中的延迟容忍度

消息传递中的实际数据传输通常由发送方发起,使用发送操作。接收操作本身不会促使数据被传送,而是将数据从传入缓冲区复制到应用程序地址空间。接收方发起的通信是通过向数据源进程发出请求消息来完成的。然后,该进程通过另一个发送将数据发回。

同步发送操作的通信延迟等于将消息中的所有数据传送到目的地所需的时间、接收处理的时间以及返回确认的时间。同步接收操作的延迟是其处理开销;其中包括将数据复制到应用程序中,以及如果数据尚未到达则产生的额外延迟。我们希望在两端隐藏这些延迟,包括开销(如果可能)。

共享地址空间中的延迟容忍度

基本通信是通过在共享地址空间中进行读写来实现的。为方便起见,我们将其称为读写通信。接收方发起的通信通过读取操作完成,从而访问另一个处理器的内存或缓存中的数据。如果没有共享数据的缓存,则发送方发起的通信可以通过写入分配在远程内存中的数据来完成。

对于缓存一致性,写入的影响更加复杂:写入导致发送方还是接收方发起的通信取决于缓存一致性协议。无论是接收方发起的还是发送方发起的,在硬件支持的读写共享地址空间中的通信自然都是细粒度的,这使得容忍延迟非常重要。

在共享地址空间中块数据传输

在共享地址空间中,无论是通过硬件还是软件,数据的合并和块传输的启动都可以在用户程序中明确完成,也可以由系统透明地完成。显式块传输是通过在用户程序中执行类似于发送的命令来启动的。发送命令由通信辅助解释,它以流水线方式将数据从源节点传输到目的地。在目的地,通信辅助从网络接口提取数据字并将其存储在指定位置。

与发送-接收消息传递有两个主要区别,这两个区别都源于这样一个事实:发送过程可以直接指定程序数据结构,数据将放置在目的地,因为这些位置位于共享地址空间中。

在共享地址空间中处理长延迟事件

如果内存操作是非阻塞的,处理器就可以处理内存操作以外的其他指令。对于写入,如果将写入放入写入缓冲区,并且处理器继续运行,而缓冲区负责将写入发送到内存系统并根据需要跟踪其完成情况,则这通常很容易实现。不同之处在于,与写入不同,读取通常很快就会跟上一条需要读取返回值的指令。

共享地址空间中的预通信

预通信是一种已在商用微处理器中广泛采用的技术,其重要性在未来可能会增加。预取指令不会取代数据项的实际读取,并且如果要实现通过重叠隐藏延迟的目标,预取指令本身必须是非阻塞的。

在这种情况下,由于共享数据未被缓存,因此预取的数据被带入称为预取缓冲区的特殊硬件结构。当字在下一次迭代中实际读入寄存器时,它是从预取缓冲区的头部读取的,而不是从内存中读取的。如果要隐藏的延迟比计算单次循环迭代的时间大得多,我们将提前预取几次迭代,并且预取缓冲区中可能会同时有多个字。

共享地址空间中的多线程

在隐藏不同类型的延迟方面,硬件支持的多线程可能是一种多功能技术。与其他方法相比,它具有以下概念优势 −

  • 它不需要特殊的软件分析或支持。

  • 由于它是动态调用的,因此它可以像处理可预测的情况一样处理不可预测的情况,例如缓存冲突等。

  • 与预取一样,它不会改变内存一致性模型,因为它不会重新排序线程内的访问。

  • 虽然以前的技术旨在隐藏内存访问延迟,但多线程可以同样轻松地隐藏任何长延迟事件的延迟,只要可以在运行时检测到该事件。这也包括同步和指令延迟。

这种趋势可能会在未来发生变化,因为与处理器速度相比,延迟变得越来越长。此外,随着更复杂的微处理器已经提供可扩展用于多线程的方法,以及正在开发将多线程与指令级并行性相结合的新多线程技术,这种趋势在未来肯定会发生一些变化。