到现在为止,我们一直在思量单个多核 CPU 机器。但并行编程的现实天然延伸到多 CPU 的使用。这些处理器大概存在于一台机器上,也大概存在于以某种方式相互连接的差别机器上。
很显着,内存的组织也会对并行计算的完美运行产生影响。
前两种模式,即共享内存和消息通报,也以这两种模式的形式在这一领域得到了扩展:
每个处理器都有自己的本地内存,由高速缓存表示,通常性能很高,由于 CPU 与该内存地域之间的数据交换非常频繁。但这一地域是有限的,而且各个处理器还经常需要共享工作数据,而这只能通过与总线相连的共享内存来实现。
这就是环境变得玄妙的地方。程序员必须仔细管理各个处理器之间同时使用数据的同步问题。
其中一个 CPU 将从共享内存中获取数据值,并将其复制到缓存中,以某种方式举行处理。与此同时,另一个 CPU 将需要相同的值,它也会将共享内存中的数据复制到自己的缓存中。一段时间后,第一个 CPU 将完成处理,并将结果写入共享内存,更新其中的值。但在此期间,第二个 CPU 正在处理一个不再有效的值,因此这里的数据一致性已经丢失。因此,很显着,必须(通过硬件或编程)实施类似于单个进程内线程的并发管理机制和同步。
那么,为什么要使用这种模式呢?主要原因是共享内存系统非常快,由于它们主要依赖硬件而不是软件。究竟上,CPU 访问共享内存资源的许多控制和同步机制都可以通过硬件来解决。
另一种模式是现在广泛使用的分布式内存模式。与前一种模式差别的是,连接各个 CPU 的不是物理总线,而是网络互连。究竟上,这种模式主要用于物理上位于差别机器上的 CPU,纵然它们之间的间隔相当远。
在这种模式下,每个 CPU 除了拥有自己的专用高速缓存外,还拥有一个本地内存,在正常环境下可以满负荷使用。当需要与其他 CPU 共享数据时,数据将通过网络发送。这样就不会再出现数据一致性问题,由于每个处理器都对自己的数据负责。另一个优点是,由于不再有物理总线,而只有网络连接,因此理论上可以在该系统中添加无限多的 CPU。
但这种模式的缺点是,网络连接的速率不如物理总线快,而且最紧张的是,差别 CPU 之间的通信和数据交换需要一个消息通报机制。消息的管理,包罗由各个 CPU 创建、发送和读取消息,一方面消除了一致性问题,但却大大降低了程序的执行速率。
参考资料
加快度是一个数字,表示运行相同问题的两个系统之间的性能差别。在我们的例子中,加快度 S 可视为执行串行程序 ts 所花费的时间与我们创建的并行程序执行相同操作所花费的时间 tp 之间的比率。所用时间 t 是处理单位 N 数量的函数,处理单位可以是 CPU、内核或 GPU,但 N 通常指处理器的数量。因此,并行系统的耗时可以用 t(N)来表示,而串行系统的耗时则可以用 t(1)来表示,由于串行系统相当于只有一个处理器的系统:
换句话说,加快度让我们了解到采用并行解法与串行解法相比在性能上的上风。此外,如果将 N 个处理器的数量与提速指数举行比力,我们还可以进一步对算法或程序举行分类: