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

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

1916

被折叠的 条评论
为什么被折叠?



