mpi从MPI_COMM_WORLD通信器生成一个无通信能力的group(MPI_Comm_group) -> 然后再选择一些进程(MPI_Group_incl) -> 赋予通信能力(MPI_Com)
程序员文章站
2022-06-22 20:02:19
...
一、本文目的
mpi从MPI_COMM_WORLD通信器生成一个无通信能力的group(MPI_Comm_group) -> 然后再选择一些进程(MPI_Group_incl) -> 赋予通信能力(MPI_Comm_create_group)
二、代码分享
#include <iostream>
#include <vector>
#include <cstdlib>
#include <time.h>
#include <mpi.h>
#include <cassert>
#include <cstring>
#include <cmath>
using namespace std;
int main(int argc, char** argv) {
// MPI_COMM_WORLD是MPI程序启动起来最原始的一个进程组
MPI_Init(NULL, NULL);
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
// 一个正常的通信器,应该包含上下文,ID和组,MPI_COMM_WORLD就是这样,但是MPI_Comm_group创建的通信器 只包含ID和组
// MPI_Comm_group创建的通信器,与其他通信器对象的工作方式相同,只是不能进行进程间通信(因为他没有上下文的信息),只能获取该组内进程的rank size
MPI_Group world_group;
// MPI_COMM_WORLD代表新创建的这个组world_group,是从MPI_COMM_WORLD这个大组里面get到的
MPI_Comm_group(MPI_COMM_WORLD, &world_group);
//
int n = 7;
const int ranks[7] = {1,2,3,5,7,11,13};
// 从MPI_COMM_WORLD里面特定选择几个进程,而不是全部
// 这个函数选择出来的组,和上游的prime_group保持一致,还是无法进程间通信,只包含ID和组
MPI_Group prime_group;
// world_group -> 上游
// 7->代表要拿7个进程的数据
// ranks -> 哪7个进程
// prime_group -> 放在这里面
MPI_Group_incl(world_group,7,ranks,&prime_group);
//将上面的prime_group,给加上 进程间通信的功能,变成一个完整的 通信器 或者 组
MPI_Group prime_comm;
// MPI_COMM_WORLD -> 最基准的通信器,为什么要是MPI_COMM_WORLD,也不详
// prime_group -> 上游
// 0代表的是tag,具体意义不详
MPI_Comm_create_group(MPI_COMM_WORLD, prime_group, 0, &prime_comm);
// 要确定好prime_comm是不是NULL,正常的话不为NULL
int prime_rank = -1;
int prime_size = -1;
if(prime_comm != MPI_COMM_NULL){
MPI_Comm_rank(prime_comm, &prime_rank);
MPI_Comm_size(prime_comm, &prime_size);
}
printf("WORLD RANK/SIZE: %d/%d \t NOW RANK/SIZE: %d/%d\n", world_rank, world_size, prime_rank, prime_size);
MPI_Group_free(&world_group);
MPI_Group_free(&prime_group);
if(prime_comm != MPI_COMM_NULL){
MPI_Group_free(&prime_comm);
}
MPI_Finalize();
}
三、结果展示
上一篇: Ribbon的负载均衡策略及原理