赞
踩
MPI(Message-Passing-Interface 消息传递接口)实现并行是进程级别的,通过通信在进程之间进行消息传递。MPI并不是一种新的开发语言,它是一个定义了可以被C、C++和Fortran程序调用的函数库。这些函数库里面主要涉及的是两个进程之间通信的函数。
MPI是一个跨语言的通讯协议,用于编写并行计算机。支持点对点和广播。MPI是一个信息传递应用程序接口,包括协议和和语义说明,他们指明其如何在各种实现中发挥其特性。MPI的目标是高性能,大规模性,和可移植性。MPI在今天仍为高性能计算的主要模型。
主要的MPI-1模型不包括共享内存概念,MPI-2只有有限的分布共享内存概念。 但是MPI程序经常在共享内存的机器上运行。在MPI模型周边设计程序比在NUMA架构下设计要好因为MPI鼓励内存本地化。
尽管MPI属于OSI参考模型的第五层或者更高,他的实现可能通过传输层的sockets和Transmission Control Protocol (TCP)覆盖大部分的层。大部分的MPI实现由一些指定惯例集(API)组成,可由C,C++,Fortran,或者有此类库的语言比如C#, Java or Python直接调用。MPI优于老式信息传递库是因为他的可移植性和速度。
与OpenMP并行程序不同,MPI是一种基于信息传递的并行编程技术。消息传递接口是一种编程接口标准,而不是一种具体的编程语言。简而言之,MPI标准定义了一组具有可移植性的编程接口 。
MPI需要在官网上下载安装包进行安装,在linux上,再通过mpi编译器编译:
mpicxx psrs.cpp -o psrs
运行:
mpirun -np 2 ./psrs // 2代表进程数
关键语法可参考链接, 介绍得很详细:
主要API:
double Trap(double a, double b, int n, double(*f)(double)){
double integral, h;
h = (b-a)/n;
int rank, size;
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
int local_n;
double local_a, local_b, local_sum, total_sum;
local_n = n/size; // n必须为size的整数倍
local_a = a + rank*local_n*h;
local_b = local_a + local_n*h;
for (int k = 0; k <= local_n - 1; ++k) {
local_sum += f(local_a + k*h);
}
local_sum *= h;
// printf("process %d : local_sum = %fl", rank, local_sum);
MPI_Reduce(&local_sum, &total_sum, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
// if(rank == 0)
return total_sum;
}
void Mat_vect_mult(
int A[],
int x[],
int y[],
const int &m,
const int &n
){
int i, j;
for (i = 0; i < m; ++i) {
y[i] = 0;
for (j = 0; j < n; ++j) {
y[i] += A[i*n + j]*x[j];
}
}
}
void Solve(){
int rank, size;
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
int m = M, n = N;
int *A, *y;
if(rank == 0){
int fin = open("testData", O_RDONLY | O_CREAT);
A = (int *)malloc(sizeof(int) * m * n);
read(fin, A, m * n *sizeof(int));
}
int *subMat = (int *)malloc(sizeof(int) * m * n / size);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。