← Home

MPI 入门笔记

1 March, 2022

周二的高性能计算导论课上提到了 MPI,小作业里也用到了,但是代码没太看懂。于是寻找了一份 MPI 的教程,中文翻译质量不错但必要时还是得看英文。

Basic Facts

简单使用指南

基本要求

进程间点对点通信

多进程同步

Bcast vs Scatter

Gather

Allgather

count = 1 的 reduce count = 2 的 reduce

Allreduce

通讯器与组

例如,用 16 个 process 运行以下代码(只保留核心部分):

int world_rank, world_size;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
MPI_Comm_size(MPI_COMM_WORLD, &world_size);

int color = world_rank / 4;

MPI_Comm row_comm;
MPI_Comm_split(MPI_COMM_WORLD, color, world_rank, &row_comm);

int row_rank, row_size;
MPI_Comm_rank(row_comm, &row_rank);
MPI_Comm_size(row_comm, &row_size);

printf("World rank & size: %d / %d\t", world_rank, world_size);
printf("Row rank & size: %d / %d\n", row_rank, row_size);

原本是 (world_rank, 16) 的 process 在新的通讯器中会变为 (world_rank / 4, 16)

MPI_Comm_split

如果将 world_rank / 4 改为 world_rank % 4 那么将会由横向划分变为纵向划分,原理类似。

实话说,教程里这部分过于简略,基本上没看懂。

听去年选课的同学说,课上实际使用 MPI 的时候,一般不需要分组创建通讯器,只需要 MPI_COMM_WORLD 一把梭即可,所以这里也不再深究了。

杂项