湖南大学SCCI并行计算组-MPI并行编程教程-06

湖南大学SCCI并行计算组
MPI并行编程教程06

四、进程组(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;
}


中文版mpi编程手册 写得很详细 都志辉编著 李三立审阅 陈渝刘鹏 校对 本书介绍目前最常见的并行程序—MPI并行程序的设计方法它适合高校三四年级本科 生非计算机专业研究生作为教材和教学自学参考书也适合于广大的并行计算高性能计 算用户作为自学参考书使用对于有FORTRAN和C编程经验的人员都可以阅读并掌握 本书的内容 首先介绍了并行程序设计的基础提供给读者进行并行程序设计所需要的基本知识然 后介绍了MPI的基本功能从简单的例子入手告诉读者MPI程序设计的基本过程和框架 这一部分是具有C或/FORTRAN串行程序设计经验的人员很容易理解和接受的接下来介绍 MPI程序设计的高级特征是已经掌握了MPI基本程序设计的人员进一步编写简洁高效的 MPI程序使用各种高级和复杂的MPI功能所需要的最后一部分介绍了MPI的最新发展和 扩充MPI-2 主要包括三个部分动态进程管理远程存储访问和并行文件读写 本书包括了MPI-1的全部调用和MPI-2的关键扩充部分的调用并附以大量的图表和示 例性程序对程序的关键部分给出了讲解或注释读者若能将例子和对MPI调用的讲解结合 起来学习会取得更好的效果 本书的目的不仅是教给读者如何去编写从简单到复杂的MPI并行程序更重要的是 希望在学习本书之后在读者以后解决问题的过程中能够树立并行求解的概念使并行方 法真正成为广大应用人员和程序开发员手中的重要工具
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值