学习MPI并行编程记录
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学习MPI并⾏编程记录
简单的MPI程序⽰例
⾸先,我们来看⼀个简单的MPI程序实例。
如同我们学习各种语⾔的第⼀个程序⼀样,对于MPI的第⼀个程序同样是"Hello Word"。
/* Case 1 hellow.c */
#include <stdio.h>
#include "mpi.h"
int main( int argc, char *argv[] ) {
int rank;
int size;
MPI_Init( argc, argv );
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
printf( "Hello world from process %d of %d\n", rank, size );
MPI_Finalize();
return 0;
}
根据上⼀节的介绍,我们使⽤如下命令编译和链接这个程序:
mpicc –o hellow hellow.c
运⾏这个例⼦可以在可执⾏⽂件的⽬录中执⾏mpiexec –np 4 ./hellow。
运⾏结果如下:
Hello world from process 0 of 4
Hello world from process 1 of 4
Hello world from process 2 of 4
Hello world from process 3 of 4
这个程序在MPI程序运⾏的每个进程中分别打印各⾃的MPI进程号(0~3)和总进程数(4)。
值得注意的是,由于四个进程是并⾏执⾏,所以即使输出的顺序有变化也是正常的,程序中并没有限制哪个进程在前,哪个进程在后。
程序的四个基本函数
1.MPI_Init和MPI_Finalize
MPI_Init⽤来初始化MPI执⾏环境,建⽴多个MPI进程之间的联系,为后续通信做准备。
⽽MPI_Finalize则是结束MPI执⾏环境。
如同OpenMP定义并⾏区⼀样,这两个函数就是⽤来定义MPI程序的并⾏区的。
也就是说,除了检测是否初始化的函数之外,不应该在这两个函数定义的区域之外调⽤其他MPI函数。
2.MPI_Comm_rank
参考书籍介绍过SPMD的程序形式,给出的例⼦中需要通过进程标识和总数来分配数据。
MPI_Comm_rank就是来标识各个MPI进程的,告诉调⽤该函数的进程“我是谁?”。
MPI_Comm_rank返回整型的错误值,需要提供两个函数参数:
MPI_Comm类型的通信域,标识参与计算的MPI进程组。
整型指针,返回进程在相应进程组中的进程号。
进程号从0开始编号。
3.MPI_Comm_size
本函数则⽤来标识相应进程组中有多少个进程。