MPI编程的对象模型
作者:葛启云来源:原创日期:2012-08-11人气:1807
从理论上来说,MPI所有的通信功能可以用它的六个基本的调用来实现:MPI初始化,它是MPI程序的第一个调用,完成MPI程序的所有初始化工作。MPI结束,它是MPI程序的最后一个调用,它是MPI程序的最后一条可执行语句,否则程序的运行结果实不可预知的。当前进程标识,这一调用返回调用进程在给定的通信域中的进程标识号,有了这一标识号,不同的进程就可以将自身和其它的进程区别开来,实现各进程的并行和协作。在MPI中,进程标识号是从0开始编号的。通信子(Communicator)包括通信组和通信上下文。通信组即所有参与通信的进程的集合,通信上下文提供一个相对独立的通信区域,不同的消息在通信的上下文中进行传递,不同上下文的消息互不干涉。通讯域包含的进程数,这一调用返回给定的通信域中所包含的进程的个数,不同的进程通过这一调用得知在给定的通信域中一共有多少个进程在并行执行。消息发送,把缓冲区中coun个datatype数据类型的数据发送到目的进程dest,本次发送的消息标识是tag,使用这一标识,可以把本次发送的消息和本进程向同一目的进程发送的其它消息区别开来。发送缓冲区是由count个类型为datatype的连续数据空间组成,起始地址为buf。其中datatype数据类型可以是MPI的预定义类型,也可以是用户自定义的类型。消息接收,从指定的进程source接收消息,并且该消息的数据类型和消息标识和本接收进程指定的datatype和tag相一致,接收到的消息所包含的数据元素的个数最多不能超过count。接收缓冲区是由count个类型为datatype的连续元素空间组成,由datatype指定其类型,起始地址为buf.接收消息的长度必须小于或等于接收缓冲区的长度,这是因为如果接收到的数据过大,MPI没有截断,接收缓冲区会发生溢出错误,因此编程者要保证接收缓冲区的长度不小于发送数据的长度。
MPI的两种最基本的并行程序设计模式是对等模式和主从模式。可以说绝大部分MPI的程序都是这两种模式之一或二者的组合。MPI程序一般是SPMD程序,当然也可以用MPI来编写MPMD程序,但是,所有的MPMD程序,都可以用SPMD程序来表达,二者的表达能力是相同的。
三、MPI的对象化
由上节的描述可知,每个并行程序的开始都都需要初始化MPI运行环境,而程序最终需要退出MPI环境,而每个进程都需要知道他在通信域的大小及其在通信域内的序号,因此我们将MPI包装成一个类CMPIObject,
CMPIObject.h
#includeintgetRank();
intgetSize();
inlineintsendArray(double*,intcount,intdest,inttag);
inlinetintrecvArray(double*,intcout,intsource,inttah);//等等,其他函数}
该类在构造函数时初始化MPI环境,在析构函数中推出MPI环境,如下代码演示了,如何构造CMPIObject对象。
//##########CMPIObject.cpp#########//
CMPIObject::CMPIObject(){
MPI_Init():
MPI_Comm_rank(MPI_COMM_WORLD,&m_nRank);
MPI_Comm_size(MPI_COMM_WORLD,&m_nSize);}
CMPIObject::~CMPIObject{MPI_Finalize();}
使用如上CMPIObject类,简化了MPI库函数的应用,有助于MPI在面向对象程序中的应用。
四、总结
面向对象编程思想是目前软件模式的主流,它具有很好的重用性。将MPI库函数用类包装,可以方便研究人员使用。本文为MPI的包装提供了一个很好的构想,希望后继者能够将其完善。
MPI的两种最基本的并行程序设计模式是对等模式和主从模式。可以说绝大部分MPI的程序都是这两种模式之一或二者的组合。MPI程序一般是SPMD程序,当然也可以用MPI来编写MPMD程序,但是,所有的MPMD程序,都可以用SPMD程序来表达,二者的表达能力是相同的。
三、MPI的对象化
由上节的描述可知,每个并行程序的开始都都需要初始化MPI运行环境,而程序最终需要退出MPI环境,而每个进程都需要知道他在通信域的大小及其在通信域内的序号,因此我们将MPI包装成一个类CMPIObject,
CMPIObject.h
#includeintgetRank();
intgetSize();
inlineintsendArray(double*,intcount,intdest,inttag);
inlinetintrecvArray(double*,intcout,intsource,inttah);//等等,其他函数}
该类在构造函数时初始化MPI环境,在析构函数中推出MPI环境,如下代码演示了,如何构造CMPIObject对象。
//##########CMPIObject.cpp#########//
CMPIObject::CMPIObject(){
MPI_Init():
MPI_Comm_rank(MPI_COMM_WORLD,&m_nRank);
MPI_Comm_size(MPI_COMM_WORLD,&m_nSize);}
CMPIObject::~CMPIObject{MPI_Finalize();}
使用如上CMPIObject类,简化了MPI库函数的应用,有助于MPI在面向对象程序中的应用。
四、总结
面向对象编程思想是目前软件模式的主流,它具有很好的重用性。将MPI库函数用类包装,可以方便研究人员使用。本文为MPI的包装提供了一个很好的构想,希望后继者能够将其完善。
热门排行
推荐信息
期刊知识
- 2025年中科院分区表已公布!Scientific Reports降至三区
- 官方认定!CSSCI南大核心首批191家“青年学者友好期刊名单”
- 2023JCR影响因子正式公布!
- 国内核心期刊分级情况概览及说明!本篇适用人群:需要发南核、北核、CSCD、科核、AMI、SCD、RCCSE期刊的学者
- 我用了一个很复杂的图,帮你们解释下“23版最新北大核心目录有效期问题”。
- 重磅!CSSCI来源期刊(2023-2024版)最新期刊目录看点分析!全网首发!
- CSSCI官方早就公布了最新南核目录,有心的人已经拿到并且投入使用!附南核目录新增期刊!
- 北大核心期刊目录换届,我们应该熟知的10个知识点。
- 注意,最新期刊论文格式标准已发布,论文写作规则发生重大变化!文字版GB/T 7713.2—2022 学术论文编写规则
- 盘点那些评职称超管用的资源,1,3和5已经“绝种”了