硬件软件权衡


有许多方法可以降低硬件成本。一种方法是将通信辅助和网络不太紧密地集成到处理节点中,并增加通信延迟和占用。

另一种方法是在软件而不是硬件中提供自动复制和一致性。后一种方法在主存储器中提供复制和一致性,并且可以以各种粒度执行。它允许使用现成的商品部件进行节点和互连,从而最大限度地降低硬件成本。这给程序员带来了获得良好性能的压力。

宽松的内存一致性模型

共享地址空间的内存一致性模型定义了相同或不同位置中的内存操作似乎相对于彼此执行的顺序的约束。实际上,任何支持共享地址空间命名模型的系统层都必须有一个内存一致性模型,其中包括程序员接口、用户系统接口和硬件软件接口。与该层交互的软件必须了解其自己的内存一致性模型。

系统规格

体系结构的系统规范指定了内存操作的排序和重新排序以及实际上可以从中获得多少性能。

以下是使用程序顺序放宽的几个规范模型 -

  • 放宽写入到读取程序顺序- 此类模型允许硬件抑制第一级高速缓存中错过的写入操作的延迟。当写入未命中位于写入缓冲区中并且对其他处理器不可见时,处理器可以完成在其高速缓存存储器中命中的读取,甚至在其高速缓存存储器中未命中的单个读取。

  • 放宽写入到读取和写入到写入的程序顺序- 允许写入绕过先前未完成的写入到各个位置,从而可以在更新主内存之前将多个写入合并到写入缓冲区中。因此,多个写入未命中会重叠并且变得乱序可见。其动机是进一步最小化写入延迟对处理器中断时间的影响,并通过使新数据值对其他处理器可见来提高处理器之间的通信效率。

  • 放宽所有程序顺序- 默认情况下,除了进程内的数据和控制依赖性之外,不保证任何程序顺序。因此,好处是多个读取请求可以同时处理,并且按程序顺序可以被稍后的写入绕过,并且它们本身可以无序完成,从而允许我们隐藏读取延迟。这种类型的模型对于动态调度的处理器特别有用,它可以继续过去对其他内存引用的读取未命中。它们允许进行许多重新排序,甚至消除由编译器优化完成的访问。

编程接口

编程接口假定在同步操作之间根本不必维护程序顺序。确保所有同步操作都被明确标记或识别。运行时库或编译器将这些同步操作转换为系统规范所需的适当的保序操作。

然后,系统可以确保顺序一致的执行,即使它可以按照其期望的任何方式对同步操作之间的操作进行重新排序,而不破坏对进程内的位置的依赖性。这使得编译器在同步点之间有足够的灵活性来进行其所需的重新排序,并且还允许处理器执行其内存模型允许的尽可能多的重新排序。在程序员的接口处,一致性模型应该至少与硬件接口的一致性模型一样弱,但不必相同。

翻译机制

在大多数微处理器中,将标签转换为顺序维护机制相当于在标记为同步的每个操作之前和/或之后插入合适的内存屏障指令。它将保存带有单独加载/存储的指令,指示要执行的顺序并避免额外的指令。然而,由于操作通常不频繁,这并不是大多数微处理器迄今为止所采取的方式。

克服容量限制

我们已经讨论了仅在处理器高速缓冲存储器中提供硬件自动复制和一致性的系统。处理器高速缓存无需首先将其复制到本地主存储器中,而是根据引用直接复制远程分配的数据。

这些系统的一个问题是本地复制的范围仅限于硬件缓存。如果从高速缓存中替换了一个块,那么当再次需要它时,必须从远程存储器中获取它。本节讨论的系统的主要目的是解决复制容量问题,但仍然提供硬件的一致性和高速缓存块的细粒度,以提高效率。

三级缓存

要解决复制容量问题,一种方法是使用较大但速度较慢的远程访问缓存。当机器的节点本身就是小型多处理器并且可以简单地增大以提高性能时,这是功能所必需的。它还将保存已从本地处理器高速缓存替换的复制远程块。

仅高速缓存内存架构 (COMA)

在 COMA 机器中,整个主内存中的每个内存块都有一个与其链接的硬件标签。不存在始终保证为内存块分配空间的固定节点。数据动态迁移到访问/吸引它们的节点的主存储器或在主存储器中复制。当访问远程块时,它会被复制到吸引内存中并进入高速缓存,并由硬件在两个位置保持一致。数据块可以驻留在任何吸引存储器中并且可以容易地从一个存储器移动到另一个存储器。

降低硬件成本

降低成本意味着将专用硬件的某些功能转移到在现有硬件上运行的软件。软件在主内存中管理复制和一致性比在硬件缓存中更容易。低成本方法倾向于在主存储器中提供复制和一致性。为了有效地控制一致性,辅助的每个其他功能组件都可以受益于硬件专业化和集成。

研究工作旨在通过不同的方法降低成本,例如在专用硬件中执行访问控制,但将其他活动分配给软件和商用硬件。另一种方法是在软件中执行访问控制,旨在在没有专门硬件支持的情况下在商品节点和网络上分配一致的共享地址空间抽象。

对并行软件的影响

宽松的内存一致性模型需要并行程序将所需的冲突访问标记为同步点。编程语言支持将某些变量标记为同步,然后编译器将其转换为合适的保序指令。为了限制编译器自己对共享内存访问的重新排序,编译器可以自己使用标签。