AFEPack
组合类型 | 命名空间 | 函数
MPI.h文件参考

对MPI的接口 更多...

#include <string>
#include <vector>
#include <list>
#include <map>
#include <mpi.h>
#include <AFEPack/DerefIterator.h>
#include <AFEPack/BinaryBuffer.h>

浏览该文件的源代码。

组合类型

struct  MPI::Remote_pointer< T >
struct  MPI::Shared_type_filter::all
struct  MPI::Shared_type_filter::between< D0, D1 >
struct  MPI::Shared_type_filter::only< D >
struct  MPI::Shared_type_filter::except< D >
struct  MPI::Shared_type_filter::greater_than< D >
struct  MPI::Shared_type_filter::less_than< D >
struct  MPI::Shared_type_filter::negate< FILTER >
struct  MPI::Shared_object< T >
struct  MPI::Shared_list< T, CNT >
struct  MPI::Shared_ptr_list< T, CNT >
struct  MPI::Transmit_map< T, SHARED_TYPE_FILTER >

命名空间

namespace  MPI
namespace  MPI::Shared_type_filter

函数

int MPI::get_comm_tag (MPI_Comm comm)
int MPI::get_comm_int (MPI_Comm comm)
template<class DataIterator , class TargetIterator >
void MPI::sendrecv_data (MPI_Comm comm, int n, DataIterator start_send_data, DataIterator start_recv_data, TargetIterator start_target)
template<class T , class DATA_PACKER , class SHARED_TYPE_FILTER >
void MPI::sync_data (MPI_Comm comm, Transmit_map< T, SHARED_TYPE_FILTER > &map, DATA_PACKER &data_packer, void(DATA_PACKER::*pack)(T *, int, AFEPack::ostream<> &), void(DATA_PACKER::*unpack)(T *, int, AFEPack::istream<> &))
template<class T , class SHARED_LIST , class DATA_PACKER >
void MPI::sync_data (MPI_Comm comm, SHARED_LIST &shlist, DATA_PACKER &data_packer, void(DATA_PACKER::*pack)(T *, int, AFEPack::ostream<> &), void(DATA_PACKER::*unpack)(T *, int, AFEPack::istream<> &))
template<class T , class SHARED_LIST , class DATA_PACKER , class SHARED_TYPE_FILTER >
void MPI::sync_data (MPI_Comm comm, SHARED_LIST &shlist, DATA_PACKER &data_packer, void(DATA_PACKER::*pack)(T *, int, AFEPack::ostream<> &), void(DATA_PACKER::*unpack)(T *, int, AFEPack::istream<> &), const SHARED_TYPE_FILTER &stf)
template<class T , class SHARED_LIST , class DATA_PACKER >
void MPI::sync_data (MPI_Comm comm, SHARED_LIST &shlist, DATA_PACKER &data_packer, void(DATA_PACKER::*pack)(T *, int, AFEPack::ostream<> &), void(DATA_PACKER::*unpack)(T *, int, AFEPack::istream<> &), bool(DATA_PACKER::*filter)(T *))
template<class T , class SHARED_LIST , class DATA_PACKER , class SHARED_TYPE_FILTER >
void MPI::sync_data (MPI_Comm comm, SHARED_LIST &shlist, DATA_PACKER &data_packer, void(DATA_PACKER::*pack)(T *, int, AFEPack::ostream<> &), void(DATA_PACKER::*unpack)(T *, int, AFEPack::istream<> &), bool(DATA_PACKER::*filter)(T *), const SHARED_TYPE_FILTER &stf)

详细描述

对MPI的接口

作者:
Ruo Li <rli>
日期:
Fri Sep 25 14:58:29 2009

我们对 MPI 提供一个简单而一致的接口,所有的数据传送均通过此方式进行, 整个数据发送和接收的实现原理是:

1. 构造一个共享对象列表,表示一个实际的数据事实上在不同的进程均有其 备份,如果两个进程上有共享对象,那么我们判定这两个进程之间需要交 换数据;

2. 通过这个共享对象列表,可以构建所谓数据发送映射图表;

3. 在此数据映射发送图表上,我们完成需要交换的数据的打包、交换和解包 操作。

在实际的实现和使用上:

1. 共享对象列表有两个实现,一个是 Shared_list,另一个是 Shared_ptr_list。共享的对象对我们的应用来说,事实上就是几何遗传 树中的几何体,这样的列表的构建一般都由几何遗传树自己完成。作为用 户,可以在几何遗传树提供的列表上进行筛选,获得子列表以提升效率;

2. 数据发送映射图表的实现为类 Transmit_map,其构建方式提供多个接口 函数,均命名为 build。其中可以支持对共享对象进行过滤,以获得效率 上的提升。

3. 我们称一个类为数据打包器(DATA_PACKER),如果其提供了一个打包函数, 一个解包函数,选择性地,其还可以提供一个共享对象过滤函数(参考 sync_data 函数的说明)。通过一个 Transmit_map 和一个数据打包器就 能够最终完成数据的通讯。

作为一个典型的使用方式,可以参考 MPI::FaceData 名空间中的类的实现方 式,其中将上述的实现进一步包装成为给最终用户使用的一个非常友好的接 口,使得最终用户仅仅需要指定哪些数据需要传送就够了。当然,这也带来 了一些限制。

其它的使用例子,可以参考 HGeometryMatcher 中在自适应的时候对几何体 进行匹配的部分的实现,以及 HLoadBalance 中的两处应用。