15个进程,3行5列,结合MPI_Comm_split函数,MPI_Bcast实现行广播和列广播。
Bcast广播时,如果通讯域是split之后的,则会按照color相同的进行广播,即color相同的为一组,每个组内编号为root的向组内其他进程广播。
下面的代码首先是按照列划分组并广播,然后是按照行划分组并广播。
#include "mpi.h"
#include "stdio.h"
int main(int argc, char** argv) {
int dataCol = 0, dataRow = 11;
MPI_Comm colComm, rowComm;
int worldRank, worldSize;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &worldRank);
MPI_Comm_size(MPI_COMM_WORLD, &worldSize);
if (worldRank / 5 == 0) {
dataCol = worldRank;
}
int colorCol = worldRank % 5;
int keyRow = worldRank / 5;
MPI_Comm_split(MPI_COMM_WORLD, colorCol, keyRow, &colComm);
MPI_Bcast(&dataCol, 1, MPI_INT, 0, colComm);
printf("worldRank = %d, data = %d ", worldRank, dataCol);
fflush(stdout);
MPI_Barrier(MPI_COMM_WORLD);
if (worldRank == 0) {
printf("\n");
}
if (worldRank % 5 == 0) {
dataRow = worldRank;
}
int colorRow = worldRank / 5;
int keyCol = worldRank % 5;
MPI_Comm_split(MPI_COMM_WORLD, colorRow, keyCol, &rowComm);
MPI_Bcast(&dataRow, 1, MPI_INT, 0, rowComm);
printf("worldRank = %d, data = %d ", worldRank, dataRow);
fflush(stdout);
MPI_Finalize();
return 0;
}
运行结果如下: