MPI_Comm_group與MPI_Comm_create_group小例子
阿新 • • 發佈:2018-11-08
訪問本站觀看效果更佳
函式原型
MPI_Comm_group(
MPI_Comm comm,
MPI_Group* group)
group 和communicator類似,但是缺少上下文所以無法實現程序間通訊,只能獲取組間的rank以及size。
MPI_Comm_create_group是與group相關的最常用函式之一,它可以利用一個group物件建立新的通訊域。
函式原型:
MPI_Comm_create_group(
MPI_Comm comm,
MPI_Group group,
int tag,
MPI_Comm* newcomm)
)
MPI_Group_incl函式:挑選組內特定rank程序構建新的group
函式原型:
MPI_Group_incl(
MPI_Group group,
int n,
const int ranks[],
MPI_Group* newgroup)
下面展示一個例項:
// Get the rank and size in the original communicator int world_rank, world_size; MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); MPI_Comm_size(MPI_COMM_WORLD, &world_size); // Get the group of processes in MPI_COMM_WORLD MPI_Group world_group; MPI_Comm_group(MPI_COMM_WORLD, &world_group); int n = 7; const int ranks[7] = {1, 2, 3, 5, 7, 11, 13}; // Construct a group containing all of the prime ranks in world_group MPI_Group prime_group; MPI_Group_incl(world_group, 7, ranks, &prime_group); // Create a new communicator based on the group MPI_Comm prime_comm; MPI_Comm_create_group(MPI_COMM_WORLD, prime_group, 0, &prime_comm); int prime_rank = -1, prime_size = -1; // If this rank isn't in the new communicator, it will be // MPI_COMM_NULL. Using MPI_COMM_NULL for MPI_Comm_rank or // MPI_Comm_size is erroneous if (MPI_COMM_NULL != prime_comm) { MPI_Comm_rank(prime_comm, &prime_rank); MPI_Comm_size(prime_comm, &prime_size); } printf("WORLD RANK/SIZE: %d/%d \t PRIME RANK/SIZE: %d/%d\n", world_rank, world_size, prime_rank, prime_size); MPI_Group_free(&world_group); MPI_Group_free(&prime_group); MPI_Comm_free(&prime_comm);