内存一致性需要缓存一致性吗?

问题描述 投票:0回答:1

缓存一致性涉及在存在缓存的情况下对单个内存位置的读/写顺序,而内存一致性是关于跨有/没有缓存的所有位置的访问排序。

通常,处理器/编译器保证弱内存排序,要求程序员插入适当的同步事件以确保内存一致性。

我的问题是,如果程序员无论如何都必须插入这些事件,是否有可能在基于缓存的处理器中实现内存一致性而不需要缓存一致性?这里有什么权衡?据我所知,GPU 没有一致的缓存,所以,这应该确实是可能的。

我的直觉是,如果没有缓存一致性,同步事件会变得非常慢,因为整个缓存可能需要在同步时失效/刷新,而不是通过一致性机制在后台连续刷新/失效特定行。但我找不到任何讨论这些权衡的材料(chatGPT 也没有帮助;))。

caching cpu-architecture cpu-cache consistency
1个回答
0
投票

书中有一节介绍了这一点,“并行计算机体系结构:硬件/软件方法”(可能有点过时)。

无一致性复制的共享地址空间

此类系统通过语言和编译器支持共享地址空间抽象,但没有自动复制和一致性,就像 CRAY T3D 和 T3E 在硬件中所做的那样。一种类型的示例是数据并行语言,如高性能 Fortran(请参阅第 2 章)。用户指定的数据分布以及所有者计算规则被编译器或运行时系统用来将节点外内存引用转换为显式消息,使消息更大,对齐数据以获得更好的空间局部性,等等。复制和一致性通常由用户决定,这会影响编程的便利性;或者,系统软件可以尝试自动管理主存储器中的一致复制。基于 C 和 C++ 的语言也正在做出与 HPF 类似的努力(Bodin 等人,1993 年;Larus、Richards 和 Viswanathan,1996 年)。

Split-C 语言采用了更灵活的基于语言和编译器的方法(Culler 等人,1993)。在这里,用户明确指定数组是本地的还是全局的(共享),并且对于全局数组指定它们应该如何在物理内存中布局。计算可以独立于数据布局进行分配,并且对全局数组的引用由编译器或运行时系统基于布局转换成消息。计算分配与数据分布的解耦使得该语言比负载平衡不规则程序的所有者计算规则更加灵活,但它仍然不提供对复制和一致性的自动支持,这对于程序员来说可能很难管理。当然,所有这些软件系统都可以轻松移植到硬件一致的共享地址空间机器,在这种情况下,隐式提供共享地址空间、复制和一致性。在这种情况下,运行时系统可用于管理主内存中的复制和一致性,并以比缓存块更大的块传输数据,但这些功能可能不是必需的。

上面提到的基于C++的语言有:

C** 并行编程:一种大粒度数据并行编程语言

为可扩展并行系统实现并行C++运行时系统

Split-C 中的并行编程

这些看起来就像 CUDA 的前身。因此,缺乏一致性对于大规模并行工作负载可能是有意义的,对于这些工作负载,相对较慢的同步(由于缺乏一致性)仍然只占整个运行时间的一小部分。

CRAY T3D 和 T3E 确实具有共享地址空间,但没有硬件支持的一致性。

© www.soinside.com 2019 - 2024. All rights reserved.