我对共享内存和分布式内存之间的区别感到困惑。你能说清楚吗?
是一个处理器的共享内存,还是为许多处理器分配的内存(用于网络)?
为什么我们需要分布式内存,如果我们有共享内存?
答案 0 :(得分:14)
共享内存和分布式内存是与某些类型的并行编程一起使用的低级编程抽象。共享内存允许多个处理元素在内存中共享相同的位置(即看到彼此读取和写入),而没有任何其他特殊指令,而分布式内存需要显式命令将数据从一个处理元素传输到另一个处理元素。
有关术语共享内存和分布式内存需要考虑两个问题。一个是编程抽象的含义,另一个是硬件实际实现的含义。
过去有真正的共享内存缓存一致的多处理器系统。系统通过共享总线相互通信并与共享主存储器通信。这意味着从任何处理器到主存储器的任何访问都具有相同的延迟。今天,这些类型的系统不是制造的。相反,处理元素和内存元素之间存在各种点对点链接(这就是for non-uniform memory access, or NUMA)的原因。但是,直接通过内存进行通信的想法仍然是一种有用的编程抽象。因此在许多系统中,这由硬件处理,程序员不需要插入任何特殊指令。使用这些抽象的一些常见编程技术是OpenMP和Pthreads。
分布式内存传统上与处理器在本地内存上执行计算相关联,然后一旦使用显式消息与远程处理器传输数据。这增加了程序员的复杂性,但简化了硬件实现,因为系统不再需要保持所有内存实际共享的错觉。传统上,这种类型的编程已经与具有数百或数千个处理元件的超级计算机一起使用。常用的技术是MPI。
但是,超级计算机并不是唯一具有分布式内存的系统。另一个例子是GPGPU编程,可用于今天出售的许多台式机和笔记本电脑系统。 CUDA和OpenCL都要求程序员明确管理CPU和GPU(或OpenCL中的其他加速器)之间的共享。这主要是因为当GPU编程开始时GPU和CPU内存被PCI总线分开,与在本地连接的存储器上执行计算相比,PCI总线具有非常长的延迟。因此编程模型是在假设存储器是分开的(或分布式的)并且两个处理元件(CPU和GPU)之间的通信需要显式通信的情况下开发的。现在许多系统在同一个芯片there are proposals上都有GPU和CPU元素,以允许GPGPU编程具有更像共享存储器的接口。
答案 1 :(得分:3)
在现代x86术语中,例如,一台物理计算机中的所有CPU共享内存。例如4插槽系统,带有4个18核CPU。每个CPU都有自己的内存控制器,但它们相互通信,因此所有CPU都是一个相干域的一部分。系统是NUMA共享内存,未分发。
一个装满这些机器的房间形成一个分布式内存集群,它通过网络发送消息进行通信。
实际考虑是分布式内存的一个主要原因:拥有数千或数百万个CPU内核与任何类型的一致性语义共享相同内存是不切实际的,这使得它值得称之为共享内存。