MPICH笔记(五):聚合通信

MPICH笔记(五):聚合通信

官方文档索引:

https://www.mpich.org/static/docs/v3.2/

概述:

大体有三类聚合通信\(^{[1]}\):

1) 同步。

2)数据迁移。如:MPI_Bcast广播、MPI_Scatter散射、MPI_Gather聚合、MPI_Allgather聚合结果存到每个进程、AlltoAll数据全交换(有点像矩阵的转职)。

3)聚合运算。如归约(MPI_Reduce)、扫描(MPI_Scan)。

代码:

#include <iostream>
#include "mpi.h"

using namespace std;

int main(void) {
    MPI_Init(nullptr, nullptr);
    int rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    printf("Rank %d > Reach %d\n", rank, __LINE__);
    MPI_Barrier(MPI_COMM_WORLD);
    printf("Rank %d > Reach %d\n", rank, __LINE__);
    MPI_Finalize();
    return 0;
}

 

执行命令:

mpiexec -n 8 ./文件名

 

输出:

Rank 1 > Reach 10
Rank 2 > Reach 10
Rank 6 > Reach 10
Rank 3 > Reach 10
Rank 4 > Reach 10
Rank 7 > Reach 10
Rank 0 > Reach 10
Rank 5 > Reach 10
Rank 0 > Reach 12
Rank 1 > Reach 12
Rank 2 > Reach 12
Rank 3 > Reach 12
Rank 4 > Reach 12
Rank 5 > Reach 12
Rank 6 > Reach 12
Rank 7 > Reach 12

去掉MPI_Barrier(MPI_COMM_WORLD)之后

输出:

Rank 2 > Reach 10
Rank 2 > Reach 12
Rank 3 > Reach 10
Rank 3 > Reach 12
Rank 0 > Reach 10
Rank 0 > Reach 12
Rank 5 > Reach 10
Rank 5 > Reach 12
Rank 7 > Reach 10
Rank 7 > Reach 12
Rank 4 > Reach 10
Rank 4 > Reach 12
Rank 6 > Reach 10
Rank 6 > Reach 12
Rank 1 > Reach 10
Rank 1 > Reach 12

可以看到,由于Barrier将所有进程进行了同步,所以使用Barrier的代码所有进程保证都先执行了第10行的内容,之后才是第12行的内容,而不使用Barrier的代码自然没有这个限制。

 

参考资料:

[1]: 《并行计算的编程模型(Programming Models for Parallel Computing)》第一版,Pavan Balaji [美]、美国阿贡国家实验室编著,张云泉、李士刚、逄仁波、袁良译,机械工业出版社。