欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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();
}

mpi从MPI_COMM_WORLD通信器生成一个无通信能力的group(MPI_Comm_group) -> 然后再选择一些进程(MPI_Group_incl) -> 赋予通信能力(MPI_Com)

三、结果展示

mpi从MPI_COMM_WORLD通信器生成一个无通信能力的group(MPI_Comm_group) -> 然后再选择一些进程(MPI_Group_incl) -> 赋予通信能力(MPI_Com)

mpi从MPI_COMM_WORLD通信器生成一个无通信能力的group(MPI_Comm_group) -> 然后再选择一些进程(MPI_Group_incl) -> 赋予通信能力(MPI_Com)