基于MPI的vtk并行数据通信使用经验分享

您所在的位置:网站首页 receive的用法总结 基于MPI的vtk并行数据通信使用经验分享

基于MPI的vtk并行数据通信使用经验分享

2023-04-13 01:29| 来源: 网络整理| 查看: 265

在使用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