什么是MPI
MPI(Message Passing Interface)是目前最重要的一个基于消息传递的并行编程工具,它具有移植性好、功能强大、效率高等许多优点,而且有多种不同的免费、高效、实用的实现版本,几乎所有的并行计算机厂商都提供对它的支持,成为了事实上的并行编程标准。
MPI是一个库,而不是一门语言,因此对MPI的使用必须和特定的语言结合起来进行。MPI不是一个独立的自包含系统,而是建立在本地并行程序设计环境之上,其进程管理和I/O均由本地并行程序设计环境提供。例如,MPI可以建立在IBM SP2的POE/MPL之上,也可以建立在Intel Paragon的OSF/NX。除了这些商业版本的MPI实现,还有一些免费版的MPI实现,主要有MPICH,LAM和CHIMP。
Linux下MPI环境的搭建
在Linux环境下搭建MPI环境:
sudo apt-get install mpich
编写C语言或C++代码时,在头文件中包含include "mpi.h"
便可以在代码中使用mpi的并行语句了。
C语言编译mpi程序:mpicc example.c -o example
C++编译mpi程序:mpic++ example.c -o example
运行mpi程序:mpiexec -n 4 ./example
(4为指定运行的进程数)
利用MPI计算π值
根据积分法易得,求π值的串行代码如下:
int n = 100, x,sum;
int h = 1.0/n;
for(int i=1; i<=n; i++)
{
x= (i - 0.5)/n;
sun += 4.0/(1+x*x);
}
pi = sum*h;
printf("pi = %d\n",pi);
不难改成mpi并行代码:
//*计算π的C语言 MPI编程代码段*//
#include "mpi.h"
#include <stdio.h>
#include <math.h>
double f(double);
double f(double a)
{
return (4.0/(1.0 + a*a));
}
int main(int argc, char *argv[])
{
int done = 0, n, myid, numprocs, i;
double PI25DT = 3.141592653589793238462643;
double mypi, pi, h, sum, x;
double startwtime = 0.0, endwtime;
int namelen;
char processor_name[MPI_MAX_PROCESSOR_NAME];
MPI_Init(&argc, &argv); //mpi的初始化
MPI_Comm_size(MPI_COMM_WORLD, &numprocs); //获取线程数
MPI_Comm_rank(MPI_COMM_WORLD, &myid); //获取线程id值
MPI_Get_processor_name(processor_name, &namelen); //获取处理器名称
fprintf(stderr, "Process %d on %s\n", myid, processor_name);
n = 0;
while(!done)
{
if(myid == 0)
{
/* printf("Enter the number of intervals: (0 quits)");
scanf("%d",&n); */
if(n == 0)
n = 100;
else
n = 0;
startwtime = MPI_Wtime();
}
MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD); //进行广播传送消息
if(n == 0)
done = 1;
else
{
h =