0x00 前言
本篇是MPI的入门教程,主要是为了简单地了解MPI的设计和基本用法,方便和现在的Hadoop、Spark做对比,并尝试理解它们之间在设计上有什么区别。
身处Hadoop、Spark这些优秀的分布式开发框架蓬勃发展的今天,老的分布式编程模型是否没有必要学习?这个很难回答,但是我更倾向于花一个下午的时候来学习和了解它。
关于并发和并行编程系列的文章请参考文章集合
文章结构
- 举个最简单的例子,通过这个例子让大家对MPI有一个基本的理解。
- 解释一些和MPI相关的概念。
- 列举一些MPI的常用函数,以及基本用法
- 通过两个例子详细说明MPI的用法
0x01 举个栗子
安装
建议在Ubuntu上安装,不过笔者尝试一下,报了各种错。正好Win10可以安装一个Linux的bash,就安装了一下,用起来和原生Linux没什么区别,挺方便。
一句搞定。
sudo apt-get install libcr-dev mpich2 mpich2-doc
helloworld
MPI的c语言版helloworld。这是一个最简单的版本,相当于是每个进程都打印一下helloworld。
该例子中的一些方法以及概念在后面都会解释,而且会有两个比这个功能更全一点的例子来帮助理解。
#include <mpi.h>
#include <stdio.h>
int main (int argc, char* argv[])
{
int rank, size;
MPI_Init (&argc, &argv); /* starts MPI*/
MPI_Comm_rank (MPI_COMM_WORLD, &rank); /* get current process id*/
MPI_Comm_size (MPI_COMM_WORLD, &size); /* get number of processes*/
printf( "Hello world from process %d of %d\n", rank, size );
MPI_Finalize();
return 0;
}
运行
先编译,如果有for循环的话,记得加上后面的参数。
mpicc mpi_hello.c -o hello -std=c99
再运行:
$ mpirun -np 5 ./hello
Hello world from process 0 of 5
Hello world from process 1 of 5
Hello world from process 2 of 5
Hello world from process 3 of 5
Hello world from process 4 of 5
总结
从上面的简单例子可以看出 一个MPI程序的框架结构可以用下图表示 把握了其结构之后,下面的主要任务就是掌握MPI提供的各种通信方法与手段。
安装时遇到的问题
来一个我在Ubuntu16.04下遇到的错误,实在不想解决这些乱七八糟的,就跳过了。
$sudo apt-get install libcr-dev mpich2 mpich2-doc
Reading package lists... Done
Building dependency tree
Reading state information... Done
Package mpich2 is not available, but