湖南大学SCCI并行计算组-MPI并行编程教程-06
湖南大学SCCI并行计算组-MPI并行编程教程
·
四、进程组(process group)和通信域(communicator)
1. 进程组(process group)
定义
MPI中的进程组是一系列进程的集合,同一个进程可以属于不同的进程组
功能
组没有上下文,不能用于通信。进程组可以创建通信域(通过MPI_Comm_create_group函数)
2. 通信域(communicator)定义
定义
通信域包括上下文(context)和进程组(group),一个通信域只对应一个进程组。
功能
最基本的通信域是MPI_COMM_WORLD,它是由mpiexec启动的所有进程。
3. 通信域操作
(1) 从原有通信域划分新通信域:MPI_Comm_split
函数原型
int MPI_Comm_split
(
MPI_Comm ori_comm,
int my_color,
int my_key,
MPI_Comm * new_comm
)
参数解释
①MPI_Comm ori_comm
原通信域
②int my_color
颜色
③int my_key
key值
④MPI_Comm * new_comm
新通信域
注意
该MPI_Comm_split函数需要被每个ori_comm通信域中的进程调用。
函数作用
将ori_comm通信域中的进程进行划分;且每个调用该MPI_Comm_split函数的进程,都将进入对应的my_color的组中;在同一个my_color组中,组内进程my_key值越小,排序越在前;最后将新的my_color组的通信域返回给new_comm。
例
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
int main(int argc,char ** argv)
{
/******************************************************
* //MPI初始化及相关基本设置; 假设开启了5个进程: 0,1,2,3,4
*******************************************************/
MPI_Init(&argc,&argv);
MPI_Comm ori_comm = MPI_COMM_WORLD;
int my_ori_rank;
int ori_comm_size;
MPI_Comm_rank(ori_comm,&my_ori_rank);
MPI_Comm_size(ori_comm,&ori_comm_size);
/******************************************************
* 输出:
* Origin:0/5
* Origin:1/5
* Origin:2/5
* Origin:3/5
* Origin:4/5
*******************************************************/
printf("Origin:%d/%d\n",my_ori_rank,ori_comm_size);
/******************************************************
* 我们想要得到如下分组:
* color 0: 0,1
* color 1: 2,
* color 2: 4,3
*******************************************************/
//----------分组准备--------------
//设置本进程要去的组
int my_color;
//设置本进程在新组里的位序
int my_key;
//设置新组的通信子
MPI_Comm new_comm;
//0号进程:要去0组,组内排第1个
//1号进程:要去0组,组内排第2个
if(my_ori_rank==0||my_ori_rank==1)
{
my_color = 0;
if(my_ori_rank==0) my_key = 0;
if(my_ori_rank==1) my_key = 1;
}
//0号进程:要去1组,组内排第1个
if(my_ori_rank==2)
{
my_color = 1;
my_key = 0;
}
//3号进程:要去2组,组内排第2个
//4号进程:要去2组,组内排第1个
if(my_ori_rank==3||my_ori_rank==4)
{
my_color = 2;
if(my_ori_rank==3) my_key = 1;
if(my_ori_rank==4) my_key = 0;
}
//----------利用MPI_Comm_split函数开始划分--------------
MPI_Comm_split(ori_comm, my_color, my_key, &new_comm);
//----------分完以后输出检查--------------
int my_new_rank;
int new_comm_size;
MPI_Comm_rank(new_comm,&my_new_rank);
MPI_Comm_size(new_comm,&new_comm_size);
printf("Origin:%d/%d ==> New:%d/%d\n",
my_ori_rank,ori_comm_size,
my_new_rank,new_comm_size);
/******************************************************
* 输出:
* Origin:0/5 ==> New:0/2
* Origin:1/5 ==> New:1/2
* Origin:2/5 ==> New:0/1
* Origin:3/5 ==> New:1/2
* Origin:4/5 ==> New:0/2
*******************************************************/
//使用完划分后的通讯子后应该用MPI_Comm_free(MPI_Comm * comm)即时释放资源
MPI_Comm_free(&new_comm);
MPI_Finalize();
return 0;
}
更多推荐
已为社区贡献2条内容
所有评论(0)