目录
1 MPI的基础概念及历史
1.1 MPI的概念
1.2 MPI的历史
2 Ubuntu基础编译环境配置
2.1 更新软件包列表
2.2 配置基础编译环境
3 MPICH安装
3.1 什么是MPICH
3.2 MPICH的安装
4 文本编辑工具VIM
4.1 VIM简单介绍
4.2 VIM的下载与安装
5 第一个MPI程序
6 MPI程序的编译与运行
6.1 MPI程序的编译
6.2 MPI程序的运行
MPI,全称Message Passing Interface(消息传递接口),是业界定义的一种消息传递标准,用于编写并行计算的程序,广泛应用于高性能计算领域。
MPI标准定义了库函数核心的基本语法和语义,在C, C++和Fortran语言中也可以写出具有消息传递功能的程序。
MPI具有以下三个目标:
在 90 年代之前,程序员可没我们这么幸运。对于不同的计算架构写并发程序是一件困难而且冗长的事情。当时,很多软件库可以帮助写并发程序,但是没有一个大家都接受的标准来做这个事情。
在当时,大多数的并发程序只出现在科学和研究的领域。最广为接受的模型就是消息传递模型。什么是消息传递模型?它其实只是指程序通过在进程间传递消息(消息可以理解成带有一些信息和数据的一个数据结构)来完成某些任务。在实践中,并发程序用这个模型去实现特别容易。举例来说,主进程(master process)可以通过对从进程(slave process)发送一个描述工作的消息来把这个工作分配给它。另一个例子就是一个并发的排序程序可以在当前进程中对当前进程可见的(我们称作本地的,locally)数据进行排序,然后把排好序的数据发送的邻居进程上面来进行合并的操作。几乎所有的并行程序可以使用消息传递模型来描述。
以下是MPI标准诞生的大事表。
MPI包含了80个人40个组织的共同努力,他们主要都在美国和欧洲。主流的电脑供应商也涉足MPI,还有大学的研究员,政府公务员和产业界。
起初GNU/Linux系统中,用户必须通过源码,自己编译他们想使用的每一个程序。在Debian出现之后,人们认为有必要在系统中添加一种机制用来管理安装在计算机上的软件包,人们将这套系统称为dpkg。不久之后,redhat也开始着手建立自己的包管理系统rpm。
Linux的创造者们很快又陷入了新的窘境。他们希望通过一种快捷、实用而且高效的方式来安装软件包。这些软件包可以自动处理相互之间的依赖关系,并且在升级过程中维护他们的配置文件。Debian又一次充当了开路先锋的角色。它首创了APT(Advanced Packaging Tool)。
apt是一个很完整和先进的软件包管理程序,使用它可以让你既简单又准确地找到你要的的软件包, 安装或卸载都很简洁。它还可以让你的所有软件都更新到最新状态,而且也可以用来对你的Debian系统进行升级。
在下载与安装编译环境之前,为了使软件包保持最新的状态,需要在命令行中键入命令sudo apt-get update
,从源服务器下载最新的软件包列表。
为了正常编译MPI代码,需要安装C, C++与Fortran的编译环境。
Ubuntu缺省情况下,并没有提供这些语言的编译环境,因此需要手动安装。如果单独安装这些编译环境非常麻烦。幸运的是,build-essential工具提供了许多与编译相关的软件包,包括gcc/g++/gfortran等编译器、libc6-dev等必要的库与其他工具。于是,我们只需要通过包管理器安装build-essential即可。
apt-get命令的 -y 选项默认安装过程中同意所有的默认选择。sudo apt-get install -y build-essential
下载与安装完成后,可键入下面的命令观察gcc版本信息。gcc -v
MPICH是MPI标准的一种重要的实现,可以免费从网上下载。MPICH的开发与MPI规范的制订是同步进行的,因此MPICH最能反映MPI的变化和发展。
MPICH的开发主要是由Argonne National Laboratory和Mississippi State University共同完成的,在这一过程中IBM也做出了自己的贡献,但是MPI规范的标准化工作是由MPI论坛完成的。MPICH是MPI最流行的非专利实现,由Argonne国家实验室和密西西比州立大学联合开发,具有更好的可移植性,现阶段多流行的是MPICH2。
下表是不同语言对应的编译命令。
软件包中包含了mpich,可以直接通过apt-get下载安装。
sudo apt-get install -y mpich
观察mpicc版本信息mpicc -v
Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。
基本上 vi/vim 共分为三种模式,分别是命令模式(Command mode),输入模式(Insert mode)和底线命令模式(Last line mode)。 这三种模式的作用分别是:
命令模式:用户刚刚启动 vi/vim,便进入了命令模式。此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。
输入模式:在命令模式下按下i就进入了输入模式。可按esc
键,退出输入模式,切换到命令模式。
底线命令模式:在命令模式下按下:(英文冒号)就进入了底线命令模式。
简单的说,我们可以将这三个模式抽象成下图。
通过apt-get包管理器下载文本编辑工具vim。sudo apt-get install -y vim
切换到用户家目录cd ~
利用vim新建一份代码文件vim mpi.c
vim进入后默认为控制模式。需要按字母i
进入编辑模式,写入MPI程序代码。
#include
#include
int main(int argc, char **argv)
{
MPI_Init(&argc, &argv);
printf("Hello World!\n");
MPI_Finalize();
return 0;
}
按esc
键进入控制模式,输入:wq
保存并退出文件。
利用 mpicc 命令编译MPI代码文件。mpicc 是编译并链接用C编写的MPI程序的命令。mpicc mpi.c -o mpi.o
利用 mpirun 命令运行程序。其中 -np 选项指定处理器数目。mpirun 是MPI程序的启动脚本,它可以简化作业的启动程序,并且尽可能把不同特征屏蔽掉,提供给用户一个通用的MPI并行机的概念。mpirun -np 8 ./mpi.o