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;
}
运行结果如下: