📜  并行随机存取机

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


并行随机访问机器(PRAM)是一个模型,大多数并行算法都考虑使用该模型。在这里,多个处理器连接到单个内存块。一个PRAM模型包含-

  • 一组类似类型的处理器。

  • 所有处理器共享一个公共存储单元。处理器之间只能通过共享内存进行通信。

  • 内存访问单元(MAU)将处理器与单个共享内存连接。

PRAM架构

在此, n个处理器可以在特定的时间单位内对n个数据执行独立的操作。这可能会导致不同处理器同时访问相同的内存位置。

为了解决此问题,在PRAM模型上实施了以下约束-

  • 独占读取独占写入(EREW) -此处不允许两个处理器同时读取或写入同一内存位置。

  • 独占读并发写入(ERCW) -此处不允许两个处理器同时从同一存储位置读取,但不允许同时写入同一存储位置。

  • 并发独占写入(CREW) -此处允许所有处理器同时从同一内存位置读取,但不允许同时写入同一内存位置。

  • 并发读取并发写入(CRCW) -允许所有处理器同时读取或写入同一内存位置。

有很多方法可以实现PRAM模型,但是最突出的方法是-

  • 共享内存模型
  • 消息传递模型
  • 数据并行模型

共享内存模型

共享内存强调控制并行性而不是数据并行性。在共享内存模型中,多个进程在不同的处理器上独立执行,但是它们共享一个公共的内存空间。由于任何处理器活动,如果任何内存位置发生任何变化,其余的处理器都可以看到。

当多个处理器访问同一内存位置时,可能会发生在任何特定时间点,一个以上的处理器正在访问同一内存位置。假设一个正在读取该位置,而另一个正在该位置上书写。这可能会造成混乱。为避免这种情况,实施了一些控制机制,如锁/信号量,以确保相互排斥。

共享内存模型

共享内存编程已在以下实现-

  • 线程库-线程库允许多个控制线程在同一内存位置中同时运行。线程库提供了一个支持通过子例程库进行多线程处理的接口。它包含用于

    • 创建和销毁线程
    • 调度线程执行
    • 在线程之间传递数据和消息
    • 保存和还原线程上下文

线程库的示例包括-用于Solaris的SolarisTM线程,在Linux中实现的POSIX线程,在Windows NT和Windows 2000中可用的Win32线程,以及作为标准JavaTM开发工具包(JDK)一部分的JavaTM线程。

  • 分布式共享内存(DSM)系统-DSM系统在松耦合架构上创建共享内存的抽象,以便在没有硬件支持的情况下实现共享内存编程。它们实现标准库并使用现代操作系统中存在的高级用户级内存管理功能。例子包括胎痕标记系统,Munin,IVY,Shasta,Brazos和Cashmere。

  • 程序注释包-在具有统一内存访问特性的体系结构上实现。程序注释包最著名的示例是OpenMP。 OpenMP实现功能并行性。它主要关注于循环的并行化。

共享内存的概念提供了对共享内存系统的低级控制,但是它往往是乏味且错误的。它比应用程序编程更适用于系统编程。

共享内存编程的优点

  • 全局地址空间为存储提供了一种用户友好的编程方法。

  • 由于内存靠近CPU,因此进程之间的数据共享是快速而统一的。

  • 无需明确指定进程之间的数据通信。

  • 流程通信的开销可以忽略不计。

  • 这很容易学习。

共享内存编程的缺点

  • 它不是便携式的。
  • 管理数据局部性非常困难。

消息传递模型

消息传递是分布式存储系统中最常用的并行编程方法。在这里,程序员必须确定并行性。在这种模型中,所有处理器都具有自己的本地存储单元,并且它们通过通信网络交换数据。

消息传递模型

处理器使用消息传递库在它们之间进行通信。与发送的数据一起,消息包含以下组件-

  • 从中发送消息的处理器的地址;

  • 发送处理器中数据存储位置的起始地址;

  • 发送数据的数据类型;

  • 发送数据的数据大小;

  • 消息发送到的处理器的地址;

  • 接收处理器中数据的存储位置的起始地址。

处理器可以通过以下任何一种方法相互通信-

  • 点对点通讯
  • 集体交流
  • 消息传递接口

点对点通讯

点对点通信是消息传递的最简单形式。在这里,可以通过以下任何一种传输模式将消息从发送处理器发送到接收处理器:

  • 同步模式-仅在收到确认已传送前一条消息的确认后才发送下一条消息,以保持消息的顺序。

  • 异步模式-要发送下一条消息,不需要接收上一条消息的传送确认。

集体交流

集体通信涉及两个以上的消息传递处理器。以下模式允许集体通信-

  • 屏障-如果通信中包含的所有处理器都运行特定的模块(称为屏障模块)以进行消息传递,则可以使用屏障模式。

  • 广播-广播有两种类型-

    • 一对一-在此,具有单个操作的一个处理器向所有其他处理器发送相同的消息。

    • 所有到所有-在这里,所有处理器将消息发送到所有其他处理器。

广播的消息可能是三种类型-

  • 个性化-唯一消息发送到所有其他目标处理器。

  • 非个性化-所有目标处理器都收到相同的消息。

  • 减少-在减少广播中,组中的一个处理器从该组中所有其他处理器收集所有消息,并将它们组合为一个消息,该组中的所有其他处理器都可以访问。

消息传递的优点

  • 提供对并行性的低级控制;
  • 它是便携式的;
  • 错误少;
  • 并行同步和数据分发中的开销更少。

消息传递的缺点

  • 与并行共享内存代码相比,消息传递代码通常需要更多的软件开销。

邮件传递库

有许多消息传递库。在这里,我们将讨论两个最常用的消息传递库-

  • 消息传递接口(MPI)
  • 并行虚拟机(PVM)

消息传递接口(MPI)

提供分布式存储系统中所有并发进程之间的通信是一种通用标准。大多数常用的并行计算平台至少提供一种消息传递接口的实现。它已实现为称为的预定义函数的集合,并且可以从诸如C,C++,Fortran等语言中调用。与其他消息传递库相比,MPI既快速又可移植。

消息传递接口的优点

  • 仅在共享内存体系结构或分布式内存体系结构上运行;

  • 每个处理器都有自己的局部变量。

  • 与大型共享内存计算机相比,分布式内存计算机更便宜。

消息传递接口的缺点

  • 并行算法需要更多的编程更改;
  • 有时很难调试;和
  • 在节点之间的通信网络中表现不佳。

并行虚拟机(PVM)

PVM是一种便携式消息传递系统,旨在连接单独的异构主机以形成单个虚拟机。它是一个单一的可管理并行计算资源。大型计算问题,如超导性研究,分子动力学模拟和矩阵算法,可以通过使用许多计算机的内存和合计功率来更经济地解决。它在不兼容的计算机体系结构的网络中管理所有消息路由,数据转换,任务调度。

PVM的功能

  • 非常容易安装和配置;
  • 多个用户可以同时使用PVM。
  • 一个用户可以执行多个应用程序;
  • 这是一个小包装;
  • 支持C,C++,Fortran;
  • 对于给定的PVM程序运行,用户可以选择计算机组。
  • 这是一个消息传递模型,
  • 基于过程的计算;
  • 支持异构架构。

数据并行编程

数据并行编程模型的主要重点是同时对数据集执行操作。数据集被组织成某种结构,例如数组,超立方体等。处理器对同一数据结构共同执行操作。每个任务都在相同数据结构的不同分区上执行。

这是限制性的,因为并非所有算法都可以根据数据并行性指定。这就是为什么数据并行性不通用的原因。

数据并行语言有助于指定数据分解和映射到处理器。它还包括数据分发语句,这些语句使程序员可以控制数据(例如,哪些数据将在哪个处理器上运行),以减少处理器内的通信量。