硬件软件权衡
有许多方法可以降低硬件成本。一种方法是将通信辅助和网络不太紧密地集成到处理节点中,从而增加通信延迟和占用率。
另一种方法是在软件而不是硬件中提供自动复制和一致性。后一种方法在主存储器中提供复制和一致性,并且可以在各种粒度下执行。它允许使用现成的商品部件作为节点和互连,从而最大限度地降低硬件成本。这给程序员带来了实现良好性能的压力。
宽松的内存一致性模型
共享地址空间的内存一致性模型定义了相同或不同位置的内存操作相对于彼此执行的顺序约束。实际上,任何支持共享地址空间命名模型的系统层都必须具有内存一致性模型,其中包括程序员的接口、用户系统接口和硬件软件接口。与该层交互的软件必须了解其自己的内存一致性模型。
系统规范
架构的系统规范指定了内存操作的排序和重新排序,以及实际上可以从中获得多少性能。
以下是使用程序顺序放宽的几个规范模型 −
放宽写入到读取的程序顺序 − 此类模型允许硬件抑制第一级缓存中遗漏的写入操作的延迟。当写入未命中位于写入缓冲区中且对其他处理器不可见时,处理器可以完成在其缓存中命中的读取,甚至可以完成在其缓存中遗漏的单个读取。
放宽写入到读取和写入到写入的程序顺序 − 允许写入绕过之前对各个位置的未完成写入,允许在更新主内存之前将多个写入合并到写入缓冲区中。因此,多个写入未命中会重叠并变得无序可见。其动机是进一步最小化写入延迟对处理器休息时间的影响,并通过使新数据值对其他处理器可见来提高处理器之间的通信效率。
放宽所有程序顺序 −除了进程内的数据和控制依赖关系外,默认情况下不保证任何程序顺序。因此,好处是多个读取请求可以同时未完成,并且按程序顺序可以被后续写入绕过,并且它们本身可以无序完成,从而允许我们隐藏读取延迟。这种类型的模型对于动态调度的处理器特别有用,它可以继续读取未命中的其他内存引用。它们允许许多重新排序,甚至消除由编译器优化完成的访问。
编程接口
编程接口假设在同步操作之间根本不需要维护程序顺序。确保所有同步操作都明确标记或标识为这样。运行时库或编译器将这些同步操作转换为系统规范所要求的合适的保序操作。
然后,系统确保顺序一致的执行,即使它可以以任何方式在同步操作之间重新排序操作,而不会破坏对进程内某个位置的依赖关系。这样,编译器就可以在同步点之间灵活地进行所需的重新排序,同时还允许处理器执行其内存模型允许的尽可能多的重新排序。在程序员的界面上,一致性模型应该至少与硬件接口的一致性模型一样弱,但不必相同。
翻译机制
在大多数微处理器中,将标签转换为顺序维护机制相当于在每个标记为同步的操作之前和/或之后插入合适的内存屏障指令。它将使用单独的加载/存储来保存指令,指示要执行的顺序并避免额外的指令。但是,由于操作通常不频繁,因此这不是大多数微处理器迄今为止所采用的方式。
克服容量限制
我们讨论了仅在处理器高速缓存中提供硬件自动复制和一致性的系统。处理器缓存无需先在本地主内存中复制,而是在引用时直接复制远程分配的数据。
这些系统的一个问题是本地复制的范围仅限于硬件缓存。如果从高速缓存中替换了一个块,则在再次需要时必须从远程内存中获取它。本节讨论的系统的主要目的是解决复制容量问题,同时仍然提供硬件一致性和缓存块的细粒度以提高效率。
三级缓存
要解决复制容量问题,一种方法是使用大型但速度较慢的远程访问缓存。当机器的节点本身是小规模多处理器时,为了提高性能,可以简单地将其放大,这是实现功能所必需的。它还将保存已从本地处理器缓存内存替换的复制远程块。
仅缓存内存架构 (COMA)
在 COMA 机器中,整个主内存中的每个内存块都有一个与之关联的硬件标签。没有固定节点,始终可以保证为内存块分配空间。数据动态迁移到访问/吸引它们的节点的主内存中或在主内存中复制。当访问远程块时,它会在吸引力内存中复制并带入缓存,并由硬件在两个位置保持一致。数据块可以驻留在任何吸引力内存中,并且可以轻松地从一个内存移动到另一个内存。
降低硬件成本
降低成本意味着将专用硬件的某些功能转移到在现有硬件上运行的软件上。软件在主内存中管理复制和一致性比在硬件缓存中管理要容易得多。低成本方法倾向于在主内存中提供复制和一致性。为了有效地控制一致性,辅助的每个其他功能组件都可以从硬件专业化和集成中受益。
研究工作旨在通过不同的方法降低成本,例如通过在专用硬件中执行访问控制,但将其他活动分配给软件和商用硬件。另一种方法是在软件中执行访问控制,旨在在没有专门硬件支持的商用节点和网络上分配一致的共享地址空间抽象。
对并行软件的影响
宽松内存一致性模型需要并行程序将所需的冲突访问标记为同步点。编程语言提供了将某些变量标记为同步的支持,然后编译器会将其转换为合适的保序指令。为了限制编译器自己对共享内存访问的重新排序,编译器可以自己使用标签。