MPI_Init(&argc, &argv);
被第一个调用的MPI函数用于并行环境初始化,其后面的代码到MPI_Finalize之前的代码可以在每个进程都被执行一次。
MPI_Finalize();
退出MPI系统,除了主进程(rank==0)其他所有的进程都必结束。但是经测试该函数后面的代码还是会执行,why?
MPI_Comm_rank(MPI_COMM_WORLD, &myid);
初始化,这样以后就根据myid的值来区分每个进程。
MPI_Comm_size(MPI_COMM_WORLD, &ThreadSize);
初始化,将开启的线程数存放在ThreadSize中。
MPI_Send(&d[i],1,MPI_DOUBLE,0,myid,MPI_COMM_WORLD);
将当前线程中的d[0]地址处的数据发送给myid线程,1表示个数发送一个,0是tag,接受和发送的双方要设置一致。
MPI_Recv(&receive,1,MPI_DOUBLE,receiveId,100,MPI_COMM_WORLD,&status);
当前线程接受来自receiveID线程的数据。
以上的六个函数是MPI库中最常用的函数。除此之外还有一些其他的函数,能使进程间的通信非常方便。
MPI_Bcast(&d[0], N, MPI_DOUBLE, 0, MPI_COMM_WORLD);
广播操作,将各个线程的d数组的N个值全部都和当前线程相同
MPI_Reduce(&num2,&sum_num2,1,MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
将各个线程中num2求和并存在当前线程的sum_num2中。MPI_SUM是加和操作,还有求最大值求最小值等。注意,加和时不能讲num1和sum_num1都这是成一个变量,会出错,比如我们对a变量加和时可以 a = a+a;将得到的和仍然存在a中,这里不行。和的存储必须用另外一个变量。
MPI_Allreduce(&num1,&sum_num1,1,MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
将各个进程中的num1数字加和存储在sum_num1中。然后再将sum_num1广播出去。
mpicc -o test test.c
编译C文件
mpicxx - o test test.cpp
编译C++文件
mpiexec -n 4 ./test
或者mpirun -n 4 ./test
开启四个线程执行test程序
mpiexec和mpirun的区别
- mpiexec是在MPI标准中定义的,具体MPI定义的标准是什么可以自己google之
- mpirun是有许多MPI各自实现的命名,因为他从来没有被标准化过,所以各个版本的MPI总是存在细微的差异。
- 我们正常使用就用mpiexec即可。