在使用MPI进行并行程序开发时,会涉及到进程间数据通信的问题。比如,在进行CFD后处理软件开发时,对于vtk等数据类型,不方便直接利用MPI的标准接口进行进程间通信。因此,将从四个方面总结基于MPI进行并行程序开发时,对于vtk数据类型实现进程间通信所涉及到的一些功能及其简单用法。希望能够给读者提供帮助。
基本概念--PART 1
MPI概念
◉ 1. MPI(message passing interface)信息传输接口,是一种用于分布式计算多节点之间通信的标准。
◉ 2. MPI典型的通信类型包括:点对点通信(阻塞通信、非阻塞通信)、集体通信(广播、收集等)。
◉ 3. MPI是一种标准,其应用依赖于它的具体实现。如MPICH、OpenMPI、IntelMPI、MSMPI等,其中MSMPI就是Windows系统中的常用的并行库。
启动方式
◉ 1. 电脑上安装一种mpi实现,如openMPI、MPICH等;
◉2. 编译要并行执行的程序,如程序的可执行文件为mpi_test.exe。使用mpi的并行启动命令启动,如:
openMpi:mpirun -np 2 ./mpi_test
MS-MPI(mpich): mpiexec -np 2 ./mpi_test
中,-np 2指出并行所使用的进程数为2。
MSMPI通信标准接口--PART 2
这里列举一些常用到的MPI通信接口
初始化MPI

获取进程id

点对点发送数据

点对点收数据

广播
由通信组内的一个进程广播数据到组内的所有进程:

搜集
搜集组内所有进程的数据到一个进程中:

结束MPI

基于Boost.MPI的自定义数据类型通信方法--PART 3
在程序开发过程中,会使用到很多自定义的数据类型。这些数据类型通常是一些基本数据类型的组合。数据类型之间也可能存在组合或继承关系。MPI的标准接口也支持这种自定义数据类型的传输,但其使用极为不便。这种情况下,通常会借助第三方库。
这里我们介绍一下对于自定义的数据类型,如何用Boost.MPI进行传输。
Boost.MPI
■(实现的封装,编译时会依赖MPICH、OpenMPI等)
通过对MPI标准通信函数的封装,简化函数接口;
借助Boost.Serialization,通过对自定义数据的序列化,实现自定义类型数据的传输。
以下为使用Boost.MPI进行通讯的案例

使用Boost.MPI的基本思路总结为:
-
1) 创建一个mpi::environment对象,实现MPI的初始化,对象析构时MPI结束;
-
2) 创建一个mpi::communicator对象进行通信。
■案例中对std::string类型数据进行了传输,因为
#include <boost/serialization/string.hpp>
中对std::string类型进行了序列化。

可以总结为以下步骤:
-
1) 使用boost::serialization对自定义类型进行序列化;
-
2) 序列化之后的类型可直接使用boost::mpi::communicator进行传输。
基于vtkMPIController的vtk数据类型通信方法--PART 4
通过第3节,我们了解了自定义数据类型的通信方法。自定义数据类型由于是我们自己开发,可以清楚的知道是如何由基本类型组合而成,从而借助Boost实现传输。但对于vtk这种第三方库的数据类型,我们无法轻易知晓其内部的数据类型组成。
这种情况下使用Boost对类型序列化的方式是不方便的。所幸,vtk本身提供了工具专门用于解决其数据类型的通信问题。
vtkMPIController
◉ 实现对vtk数据类型的传输。其基本接口如下:
MPI初始化:
void vtkMPIController::Initialize();
MPI结束:
void vtkMPIController::Finalize();
获取进程ID:
int vtkMultiProcessController::GetLocalProcessId();
发送数据:
int vtkMultiProcessController::Send (vtkDataObject * data,int remoteId,int tag );
int vtkMultiProcessController::Send(vtkDataArray * data,int remoteId,int tag );
接收数据:
int vtkMultiProcessController::Receive (vtkDataObject * data,int remoteId,int tag );
int vtkMultiProcessController::Receive (vtkDataArray * data,int remoteId,int tag );
使用vtkMPIController的基本思路总结为:
-
1) 创建一个vtkMpiController对象;
-
2) void vtkMPIController::Initialize() 执行mpi初始化;
-
3) 调用通信接口进行通信;
-
4) void vtkMPIController::Finalize()结束mpi通信。
需要注意的是,vtkMPIController传输的数据类型为vtkDataObject 或vtkDataArray。其API中使用的都是基类类型指针,具体发送数据时,都需要知道数据的具体类型。因为收数据的过程实质上是对数据的构造,抽象类型不能构造,所以实际传输时必须已知具体类型,而不能是抽象类型。
以上就是在基于MPI的CFD后处理软件开发过程中,对于vtk数据类型通信的理解和使用经验,希望能够帮助您了解MPI并行程序以及能够实现简单的并行通信应用。
如有疑问可进FastCAE微信群和QQ群,群内主要交流CAE相关技术问题,有FastCAE技术人员答疑解惑,欢迎您的加入!
本文介绍了在使用MPI进行并行程序开发时,如何处理vtk数据类型的进程间通信问题。文章涵盖了MPI的基本概念,如点对点和集体通信,以及通过MPI标准接口、Boost.MPI库和vtkMPIController进行数据传输的方法。特别是对于vtk数据类型,文章详细阐述了如何利用vtkMPIController来实现传输,强调了传输时需知悉具体数据类型的重要性。
384

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



