基于MPI的vtk并行数据通信使用经验分享 |
您所在的位置:网站首页 › receive的用法总结 › 基于MPI的vtk并行数据通信使用经验分享 |
在使用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 中对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技术人员答疑解惑,欢迎您的加入! |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |