1.MPI 简介
MPI(Message Passing Interface)是目前最重要的一个基于消息传递的并行编程工具,它具有移植性好、功能强大、效率高等许多优点,而且有多种不同的免费、高效、实用的实现版本,几乎所有的并行计算机厂商都提供对它的支持,成为了事实上的并行编程标准。
MPI是一个库,而不是一门语言,因此对MPI的使用必须和特定的语言结合起来进行。MPI不是一个独立的自包含系统,而是建立在本地并行程序设计环境之上,其进程管理和I/O均由本地并行程序设计环境提供。例如,MPI可以建立在IBM SP2的POE/MPL之上,也可以建立在Intel Paragon的OSF/NX。除了这些商业版本的MPI实现,还有一些免费版的MPI实现,主要有MPICH,LAM和CHIMP。
2.实验环境
本文是在KD机群上跑的实验,在Windows下也可搭建MPI运行环境,本文在这里不做详细介绍。
编译mpi程序: mpicc demo.c –o demo.o;运行mpi程序: mpirun -np 4 ./demo.o
3.实例
(1)用MPI编程实现PI的计算。
算法描述:键盘输入步骤次数 n,并把 n 广播给本通信环境中的所有进程,通过MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD); 各个进程计算自己的mypi = width * sum; 通过 MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);由进程 0 进行归约,把每个进程计算出来的 mypi 进行相加(MPI_SUM),赋给pi 。
#include<stdio.h>
#include<mpi.h>
#include<math.h>
int main(int argc, char *argv[]){
int my_rank, num_procs;
int i, n = 0;
double sum, width, local, mypi, pi;
double start = 0.0, stop = 0.0;
int proc_len;
char processor_name[MPI_MAX_PROCESSOR_NAME];
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
MPI_Comm_rank(MP