1. 简介
MPI 全名叫 Message Passing Interface,即信息传递接口,作用是可以通过 MPI 可以在不同进程间传递消息,从而可以并行地处理任务,即进行并行计算。
2. 第一个MPI程序“Hello Word”

运行结果:

程序的执行流程:

从上面的简单例子可以看出,一个MPI程序的框架结构可以用下图表示:

3. 六个MPI基本函数
(1)MPI初始化

(2)MPI结束
(3)当前进程标识
(4)通信域包含的进程数
(5)消息发送

(6)消息接收

4. MPI并行程序的两种基本模式
(1) 对等模式(以Jacobi迭代为例)
对于MPI的SPMD(Single Program Multiple Data)程序,实现对等模式的问题是比较容易理解和接受的,因为各个部分地位相同功能和代码基本一致,只不过是处理的数据或对象不同,也容易用同样的程序来实现。
Jacobi迭代就是用上下左右周围的四个点取平均值来得到新的点。
while (not converged) {
for (i,j)
xnew[i][j] = (x[i+1][j] + x[i-1][j] + x[i][j+1] + x[i][j-1])/4;
for (i,j)
x[i][j] = xnew[i][j];
}
收敛性测试如下:
diffnorm = 0;
for (i,j)
diffnorm += (xnew[i][j] - x[i][j]) * (xnew[i][j] - x[i][j]);
diffnorm = sqrt(diffnorm);
Jacobi迭代的局部性很好可以取得很高的并行性,是并行计算中常见的一个例子。将参加迭代的数据按块分割后,各块之间除了相邻的元素需要通信外,在各块的内部可以完全独立地并行计算,随着计算规模的扩大,通信的开销相对于计算来说比例会降低,这将更有利于提高并行效果。

由于在迭代过程中边界点新值的计算需要相邻边界其它块的数据,因此在每一个数据块的两侧又各增加1列的数据空间(注意FORTRAN数组在内存中是按列优先排列的),用于存放从相邻数据块通信得到的数据。
在迭代之前,每个进程都需要从相邻的进程得到数据块,同时每一个进程也都需要向相邻的进程提供数据块,由于每一个新迭代点的值是由相邻点的旧值得到,所以这里引入一个中间数组用来记录临时得到的新值,一次迭代完成后再统一进行更新操作。
Fortran程序(列主序)的分割及通讯:

C程序(行主序)的分割及通讯:


在边界上的点不用更新,初始值定义如下(上下两边都是-1,中间的数值取为进程编号):

最低0.47元/天 解锁文章
67

被折叠的 条评论
为什么被折叠?



