简单的 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).
值得注意的是, 由于四个进程是并行执行, 所以即使输出的顺序有变化也是正常的, 程序中并没有限制哪个进程在前, 哪个进程在后.
2.2 MPI 程序的四个基本函数
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
本函数则用来标识相应进程组中有多少个进程.
来源: http://www.bubuko.com/infodetail-2978285.html