AFEPack
|
完成动态负载平衡的功能。此处的功能是为了使得分区能够不仅仅 在最初的背景单元上进行,使用的技术途径是将几何遗传树的根单 元几何体进行了更换。 更多...
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <cstdio>
#include <boost/program_options.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <AFEPack/Serialization.h>
#include "MPI.h"
#include "MPI_UGeometry_archive.h"
#include "MPI_Migration.h"
组合类型 | |
class | MPI::HLoadBalance< FOREST > |
struct | MPI::HLoadBalance< FOREST >::rank_map_val |
命名空间 | |
namespace | MPI |
宏定义 | |
#define | GDIM 0 |
#define | GEO HGeometry<GDIM,dow> |
#define | OBJ Shared_object<GEO> |
#define | GDIM 1 |
#define | GEO HGeometry<GDIM,dow> |
#define | OBJ Shared_object<GEO> |
#define | GDIM 2 |
#define | GEO HGeometry<GDIM,dow> |
#define | OBJ Shared_object<GEO> |
#define | GDIM 3 |
#define | GEO HGeometry<GDIM,dow> |
#define | OBJ Shared_object<GEO> |
#define | GDIM 0 |
#define | GEO HGeometry<GDIM,dow> |
#define | GDIM 1 |
#define | GEO HGeometry<GDIM,dow> |
#define | GDIM 2 |
#define | GEO HGeometry<GDIM,dow> |
#define | GDIM 3 |
#define | GEO HGeometry<GDIM,dow> |
#define | SYNC_DATA(D) |
#define | SYNC_DATA(D) |
#define | SYNC_DATA(D) |
函数 | |
template<class FOREST > | |
void | MPI::load_forest (const std::string &dirname, FOREST &forest, bool is_has_orphans=false) |
template<class FOREST > | |
void | MPI::load_mesh (const std::string &dirname, FOREST &forest, BirdView< FOREST > &mesh, bool is_has_orphans=false) |
template<class FOREST > | |
void | MPI::load_mesh (const std::string &dirname, bool is_has_orphans, FOREST &forest, u_int n_mesh,...) |
template<class FOREST > | |
void | MPI::load_mesh_set (const std::string &dirname, FOREST &forest, BirdViewSet< FOREST > &bvs, bool is_has_orphans=false) |
void | MPI::lb_collect_local_data_dir (MPI_Comm comm, const std::string &src_dir, const std::string &dst_dir) |
namespace lb_details | |
void | MPI::lb_sync_local_data_dir (MPI_Comm comm, const std::string &src_dir, const std::string &dst_dir) |
完成动态负载平衡的功能。此处的功能是为了使得分区能够不仅仅 在最初的背景单元上进行,使用的技术途径是将几何遗传树的根单 元几何体进行了更换。
关于动态负载平衡的基本目标确定为:对背景网格进行重新分区,从而完成一 定程度上的动态负载平衡。这个目标的实现分为下面的步骤:
1. 将每个背景单元上的负载进行计算;
2. 根据背景单元上的负载进行重新分区;
3. 对新的分区方式进行数据分析和准备;
4. 利用序列化将准备的数据存储,以此完成数据分拆;
5. 利用序列化将存储的数据重新在恰当的进程载入;
6. 对载入的数据进行分析、数据合并以及恢复;
在真正的并行机上实际进行并行计算的时候,数据在存储的时候将会由网络 文件系统(NFS)完成最终的硬件存储操作,这会导致非常严重的延迟。因此在 这样的情况下,我们使用下面的方式来进行实用的负载平衡:
1. 使用 HLoadBalance 类将系列化的数据存储在计算节点的本地硬盘上;
2. 使用 lb_sync_local_data_dir 函数将存储的数据在进程间进行交换,使 得每个进程都获得其进行载入时需要的数据文件;
3. 使用 HLoadBalance 类将数据从本地硬盘上载入;
HLoadBalance 在存储的时候会将本进程的在负载平衡以前的数据存储下来, 然后由 lb_sync_local_data_dir 进行分发,使得每个进程拥有负载平衡后 应该载入的数据,这样就在使用网络文件系统的硬件上解决了延迟问题。由 于存储在硬盘上的数据是一个系统的目录结构,对存储和载入数据的目录我 们有下面两点要求:
1. 为了避免出现由于偶然性所带来的问题,需要将数据交换前后的目录名给 一个不会碰巧被别人用的名字。与此同时,在数据网本节点的本地硬盘上 进行存储的时候,请先将可能出问题的目录删除一遍,以避免冲突。
2. 使用中,要求整个通讯器上的存储和载入数据的目录名是一致的,这样可 以使得在同一个计算节点上运行的进程不必进行数据的传输,提高程序运 行的效率。否则,检测不到数据在本地有,将会进行数据传输,这样尽管 运行不会出错,但是效率将会降低。
#define GDIM 0 |
#define GDIM 1 |
#define GDIM 2 |
#define GDIM 3 |
#define GDIM 0 |
#define GDIM 1 |
#define GDIM 2 |
#define GDIM 3 |
#define SYNC_DATA | ( | D | ) |
if (dim >= D) { \ sync_data(comm, _forest->template get_shared_list<D>(), *this, \ &this_t::template pack_set_new_rank<D>, \ &this_t::template unpack_set_new_rank<D>, \ type_filter); \ }
#define SYNC_DATA | ( | D | ) |
if (dim >= D) { \ sync_data(comm, _forest->template get_shared_list<D>(), *this, \ &this_t::template pack_check_new_rank<D>, \ &this_t::template unpack_check_new_rank<D>, \ type_filter); \ }
#define SYNC_DATA | ( | D | ) |
if (dim >= D) { \ sync_data(comm, _forest->template get_shared_list<D>(), *this, \ &this_t::template pack_global_index<D>, \ &this_t::template unpack_global_index<D>, \ type_filter); \ }