先来看下mpi-3.2.1目录下examples中的hellow.c的代码(鼠标右键用gedit打开):
#include <stdio.h>
#include "mpi.h"//调用mpi接口
int main( int argc, char *argv[] )
{
int rank;
int size;
MPI_Init( 0, 0 );//MPI的初始化,营造一个并行计算环境
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 heollow.c -o hellow
mpirun -np 5 ./hellow
结果为:
Hello world from process 1 of 5
Hello world from process 2 of 5
Hello world from process 4 of 5
Hello world from process 0 of 5
Hello world from process 3 of 5
可以看到并不是按照进程号有小到大顺序输出,如果想要顺序输出,只需添加判别语句即可:
修改代码如下:
#include <stdio.h>
#include "mpi.h"
int main( int argc, char *argv[] )
{
int rank;
int size;
int i=0;
MPI_Init( 0, 0 );
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if (rank==0)//只需在此处添加判别语句
printf( "Hello world from process %d of %d\n", rank, size );
MPI_Finalize();
return 0;
}
结果:
~/mpich-3.2.1/examples$ mpirun -np 5 ./hellow
Hello world from process 0 of 5
不过只有一条输出,再修改rank==1, 就能输出rank 1的进程,一次类推。
其实通过这个例子,可以体会到并行计算和串行计算的很大不同。并行时没法使用更多的判断语句,因为每个进程都有自己的rank。我也是刚刚开始学习MPI,理解不是很深入,上课犯困没听太多,等我看完讲义再来补充。