基于MPI的vtk并行数据通信

本文介绍了在使用MPI进行并行程序开发时,如何处理vtk数据类型的进程间通信问题。文章涵盖了MPI的基本概念,如点对点和集体通信,以及通过MPI标准接口、Boost.MPI库和vtkMPIController进行数据传输的方法。特别是对于vtk数据类型,文章详细阐述了如何利用vtkMPIController来实现传输,强调了传输时需知悉具体数据类型的重要性。

在使用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技术人员答疑解惑,欢迎您的加入!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值