📜  硬件软件的权衡

📅  最后修改于: 2020-12-13 15:22:43             🧑  作者: Mango


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

另一种方法是在软件而非硬件中提供自动复制和一致性。后一种方法在主内存中提供复制和一致性,并且可以以各种粒度执行。它允许将现成的商品零件用于节点和互连,从而将硬件成本降至最低。这给程序员带来了实现良好性能的压力。

宽松的内存一致性模型

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

系统规格

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

以下是一些使用程序顺序松弛的规范模型-

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

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

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

编程界面

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

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

翻译机制

在大多数微处理器中,将标签转换为顺序维护机制等同于在标记为同步的每个操作之前和/或之后插入合适的存储屏障指令。它将保存带有单独加载/存储的指令,以指示要执行的顺序并避免额外的指令。但是,由于操作通常很少,因此到目前为止,这并不是大多数微处理器所采用的方法。

克服容量限制

我们讨论了仅在处理器缓存中提供硬件自动复制和一致性的系统。处理器缓存无需先在本地主存储器中进行复制,而是在引用后直接复制远程分配的数据。

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

第三级缓存

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

纯缓存内存架构(COMA)

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

降低硬件成本

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

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

对并行软件的影响

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