原文链接:https://nyu-cds.github.io/python-mpi/01-introduction/

定义

Program:驻留在磁盘上的可执行文件

Process:程序的一个或多个执行实例。进程有独立的地址空间。

Task:在 MPI 中,进程有时称为任务,但它们可以互换使用。我们将始终使用“过程”而不是“任务”。

Thread (or lightweight process):进程中的一个或多个控制线程。线程共享相同的地址空间。

p9XZub4.png

什么是 parallel computing ?

传统上,软件是为串行计算而编写的:

  • 一个问题被分解成一系列离散的指令
  • 指令依次执行
  • 在单个处理器上执行
  • 任何时刻只能执行一条指令

p9XZtKO.png

从最简单的意义上讲,并行计算是同时使用多个计算资源来解决一个计算问题:

  • 一个问题被分解成可以同时解决的离散部分
  • 每个部分进一步分解为一系列指令
  • 每个部分的指令在不同的处理器上同时执行
  • 采用整体控制/协调机制

p9XZUqe.png

为什么我们需要parallel programming?

需要解决更大的问题需要更多的内存计算需要更长的时间可能需要大量的数据

并行编程提供

  • 更多 CPU 资源
  • 更多内存资源
  • 解决串行程序无法解决的问题的能力
  • 更快解决问题的能力

两种基础的方法

Shared Memory Computer

  • 大多数笔记本电脑/个人电脑使用
  • 多核 (CPU)
  • 共享一个全局内存空间
  • 核心可以有效地交换/共享数据

[p9XedyT.png

Distributed Memory (ex. Compute cluster)

  • 具有多个核心的节点集合
  • 每个节点使用自己的本地内存
  • 共同解决问题
  • 通过消息在节点和核心之间进行通信
  • 节点联网在一起

p9XealV.png

Parallel programming models

基于指令的并行编程语言

  • OpenMP(使用最广泛)

  • 高性能 Fortran (HPF) 是另一个例子

  • 指令告诉处理器如何在处理器之间分配数据和工作

  • 指令在串行代码中显示为注释

  • 在共享内存架构上实现

消息传递(Message Passing)

  • MPI(最广泛使用)
  • 传递消息以在进程之间发送/接收数据
  • 每个进程都有自己的局部变量
  • 可用于共享或分布式内存架构

优点和缺点

OpenMP 的优点

  • 比 MPI 更容易编程和调试

  • 可以增量添加指令 - 逐渐并行化

  • 仍然可以将程序作为串行代码运行

  • 串行代码语句通常不需要修改

  • 代码更容易理解,也许更容易维护

OpenMP 的缺点

  • 只能在共享内存计算机中运行

  • 需要支持 OpenMP 的编译器

  • 主要用于循环并行化

MPI的优点

  • 在共享或分布式内存架构上运行

  • 可用于比 OpenMP 更广泛的问题

  • 每个进程都有自己的局部变量

  • 分布式内存计算机比大型共享内存计算机便宜

MPI 的缺点

  • 需要更多的编程更改才能从串行版本变为并行版本
  • 可能更难调试
  • 性能受节点间通信网络的限制

Parallel programming issues

目标是减少执行时间

  • 计算时间

  • 空闲时间——等待来自其他处理器的数据

  • 通信时间——处理器发送和接收消息所花费的时间

负载均衡

  • 在可用处理器之间平均分配工作

减少沟通

  • 减少传递的消息数量
  • 减少消息中传递的数据量

在可能的情况下 - 重叠通信和计算

许多问题只适用于有限数量的处理器

Amdahl’s law

p9XmUNd.png

  • speedup 是整个程序执行的理论加速比
  • n 是并行线程/进程的数量
  • P 是算法中可以并行的部分

基本上这就是说,通过使用 n 个内核,程序将看到的加速量取决于程序有多少是串行的(只能在单个 CPU 内核上运行)以及有多少是并行的(可以拆分在多个 CPU 内核之间)。

p9XmBgP.png

Programming approaches

SPMD - 单个程序,多个数据流

  • 每个处理器在不同的数据上执行相同的程序

  • 一个并行执行模型,假定多个协作进程执行一个程序

  • 最常见的并行编程风格和 MPI 使用的一种

MPMD - 多个程序,多个数据流

  • 多个处理器执行至少两个独立的程序
  • Manager/worker 策略属于此类
  • 网络浏览器和网络服务器是另一个例子

什么是 MPI?

MPI代表消息传递接口

  • 函数库 (C/C++) 或子例程 (Fortran)

历史

  • 1980 年代通过 Argonne 的 P4 和 Oak Ridge PVM 的早期消息
  • MPI-1 于 1994 年完成(1.1 - 1995,1.2 - ?,1.3 - 2008)
  • MPI-2 于 1998 年完成(2.1 - 2008,2.2 - 2009)
  • MPI-3 于 2012 年完成(3.1 - 2015)
  • MPI-3 特性逐渐添加到 MPI 实现中

Version differences

不同实现的例子

  • MPICH - 由 Argonne Nationa Labs 开发(免费软件)
  • MPI/LAM - 由 Indiana、OSC、Notre Dame 开发(免费软件)
  • MPI/Pro - 商业产品
  • Apple 的 X 网格
  • OpenMPI - 符合 MPI-2,线程安全

各种实现的相似性

  • 源代码兼容性(并行 I/O 除外)
  • 程序应该按原样编译和运行
  • 支持异构并行架构

各种实现的差异

  • 编译和链接命令
  • 如何启动 MPI 程序
  • 并行 I/O(来自 MPI-2)
  • 调试