MPI学习4--------通信域

本文介绍MPI中的通信域概念,并通过两个实例演示如何设置不同的通信域并执行特定的通信操作。第一个实例展示了如何手动创建进程组并绑定到通信域,分别在不同通信域内执行Allreduce操作;第二个实例则介绍了使用MPI_Comm_split函数按指定规则自动分配进程到不同通信域。

MPI学习4--------通信域

给出4个进程,设置两个通信域。0,1进程为一个通信域。2,3进程为一个通信域。通信域1中进行Allreduce加,通信域2中进行Allreduce乘。

//接受两个参数,将进程组group与通信域comm进行绑定
int MPI_Comm_group (MPI_Comm comm,MPI_Group *group )
//设置进程组中的进程为数组ranks中的值
int MPI_Group_incl ( MPI_Group group, int n, int *ranks, MPI_Group *group_out )
//创建一个新的通信域
int MPI_Comm_create ( MPI_Comm comm, MPI_Group group, MPI_Comm *comm_out )
//给出4个进程,设置两个通信域。0,1进程为一个通信域。2,3进程为一个通信域。通信域1中进行Allreduce加,通信域2中进行Allreduce乘。

#include <iostream>
#include <mpi.h>

using std::cout;
using std::endl;

int main(int argc, char **argv)
{
    int myid, procnum;
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &myid);
    MPI_Comm_size(MPI_COMM_WORLD, &procnum);

    MPI_Group worldGroup;//创建一个进程组
    MPI_Comm_group(MPI_COMM_WORLD,&worldGroup);//将该进程组与MPI_COMM_WORLD通信域进行绑定

    MPI_Group group1,group2;
    const int group1P[2]={0,1};
    const int group2P[2]={2,3};
    MPI_Group_incl(worldGroup,2,&group1P[0],&group1);//设置进程组group1中的进程为group1P
    MPI_Group_incl(worldGroup,2,&group2P[0],&group2);//设置进程组group2中的进程为group2P

    MPI_Comm comm1,comm2;
    MPI_Comm_create(MPI_COMM_WORLD,group1,&comm1);//将进程组group1与通信域comm1进行绑定
    MPI_Comm_create(MPI_COMM_WORLD,group2,&comm2);//将进程组group2与通信域comm2进行绑定

    int x=3,y;
    if(myid==0||myid==1)
    {
        MPI_Allreduce(&x,&y,1,MPI_INT,MPI_SUM,comm1);
        cout<<"进程组1中两个x的和为:"<<y<<endl;
    }
    if(myid==2||myid==3)
    {
        MPI_Allreduce(&x,&y,1,MPI_INT,MPI_PROD,comm2);
        cout<<"进程组2中两个x的乘积为:"<<y<<endl;
    }

    MPI_Finalize();
    return 0;
}

结果

进程组1中两个x的和为:6
进程组1中两个x的和为:6
进程组2中两个x的乘积为:9
进程组2中两个x的乘积为:9

第二种分组方式

//根据color和key创建新的通信域,color为组号,key为当前的进程id
int MPI_Comm_split ( MPI_Comm comm, int color, int key, MPI_Comm *comm_out )
//8个进程,分2个组,每个组4个进程

#include<iostream>
#include<mpi.h>

using namespace std;

int main(int argc,char **argv){
    int myid,procnum;
    int group_id;
    int group_num=2;
    int a=5,b=5;
    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&myid);
    MPI_Comm_size(MPI_COMM_WORLD,&procnum);

    MPI_Comm group_comm;
    MPI_Group group;
    
    group_id=myid/(procnum/group_num);//0,1一组,2,3一组,。。。
    
    //分组,0,1为1组,2,3为一组,4,5为一组,6,7为一组
    MPI_Comm_split(MPI_COMM_WORLD,group_id,myid,&group_comm);
    MPI_Comm_group(group_comm,&group);

    if(myid<4){
        a=1;b=1;
    }

    MPI_Allreduce(&a,&b,1,MPI_INT,MPI_SUM,group_comm);

    cout<<"id:"<<myid<<"="<<b<<endl;

    MPI_Finalize();

    return 0;
}

结果

id:0=4
id:1=4
id:2=4
id:3=4
id:4=20
id:5=20
id:6=20
id:7=20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值