论文部分内容阅读
一、MPI简介
(1)MPI是一个库而不是一门语言,它可以被FORTRAN77/C/Fortran
90/C++调用,从语法上说它遵守所有对库函数调用的规则。
(2)MPI是一种标准或规范的代表,而不特指某一个对它的具体实现。迄今为止所有的并行计算机制造商都提供对MPI的支持,可以在网上免费得到MPI在不同并行计算机上的实现,一个正确的MPI程序可以不加修改地在所有的并行机上运行。
(3)MPI是一种消息传递编程模型,并成为这种编程模型的代表并事实上的标准。MPI虽然很庞大,但是它的最终目的是服务于进程间通信这一目标。编程者不需要去努力掌握许多其它的全新概念就可以学习编写MPI程序。
二、基于MPI的并行程序编程
从理论上来说,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
#include int getRank();
int getSize();
inline int sendArray(double *,int count,int dest,int tag);
inlinet int recvArray(double *,int cout,int source,int tah);//等等,其他函数}
该类在构造函数时初始化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的包装提供了一个很好的构想,希望后继者能够将其完善。
参考文献:
[1]陈林,基于Linux机群的大型结构并行有限元分析.南京:硕士论文,2006.
[2]都志辉,MPI并行程序设计.北京.清华大学出版社.2001.
[3]李师贤,蒋爱军等译, C++primer中文版.北京:人民邮电出版社,2006.
作者简介:
葛启云(1980-),男,硕士研究生,研究方向:有限元方法的并行计算。
(1)MPI是一个库而不是一门语言,它可以被FORTRAN77/C/Fortran
90/C++调用,从语法上说它遵守所有对库函数调用的规则。
(2)MPI是一种标准或规范的代表,而不特指某一个对它的具体实现。迄今为止所有的并行计算机制造商都提供对MPI的支持,可以在网上免费得到MPI在不同并行计算机上的实现,一个正确的MPI程序可以不加修改地在所有的并行机上运行。
(3)MPI是一种消息传递编程模型,并成为这种编程模型的代表并事实上的标准。MPI虽然很庞大,但是它的最终目的是服务于进程间通信这一目标。编程者不需要去努力掌握许多其它的全新概念就可以学习编写MPI程序。
二、基于MPI的并行程序编程
从理论上来说,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
#include int getRank();
int getSize();
inline int sendArray(double *,int count,int dest,int tag);
inlinet int recvArray(double *,int cout,int source,int tah);//等等,其他函数}
该类在构造函数时初始化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的包装提供了一个很好的构想,希望后继者能够将其完善。
参考文献:
[1]陈林,基于Linux机群的大型结构并行有限元分析.南京:硕士论文,2006.
[2]都志辉,MPI并行程序设计.北京.清华大学出版社.2001.
[3]李师贤,蒋爱军等译, C++primer中文版.北京:人民邮电出版社,2006.
作者简介:
葛启云(1980-),男,硕士研究生,研究方向:有限元方法的并行计算。