source: XIOS/trunk/src/client_client_dht_template.hpp @ 1638

Last change on this file since 1638 was 1638, checked in by yushan, 5 years ago

dev on ADA

File size: 6.0 KB
RevLine 
[721]1/*!
2   \file client_client_dht_template.hpp
3   \author Ha NGUYEN
4   \since 01 Oct 2015
[839]5   \date 15 April 2016
[721]6
7   \brief Distributed hashed table implementation.
8 */
9
10#ifndef __XIOS_CLIENT_CLIENT_DHT_TEMPLATE_HPP__
11#define __XIOS_CLIENT_CLIENT_DHT_TEMPLATE_HPP__
12
13#include "xios_spl.hpp"
14#include "array_new.hpp"
15#include "mpi.hpp"
16#include "policy.hpp"
[1542]17#include  <unordered_map>
[829]18#include "dht_data_types.hpp"
[721]19
20namespace xios
21{
[833]22template<typename T, class HierarchyPolicy = DivideAdaptiveComm> class CClientClientDHTTemplate;
[721]23
24/*!
25  \class CClientClientDHTTemplate
26  This class provides the similar features like \class CClientServerMappingDistributed,
27which implements a simple distributed hashed table; Moreover, by extending with hierarchical structure,
28it allows to reduce greatly the number of communication among processes.
29*/
30template<typename T, typename HierarchyPolicy>
31class CClientClientDHTTemplate: public HierarchyPolicy
32{
33  public:
34    typedef T InfoType;
[727]35    static const int infoTypeSize = sizeof(InfoType);
[1542]36//    typedef typename std::unordered_map<InfoType, std::vector<size_t> > InfoType2IndexMap;
37    typedef typename std::unordered_map<size_t,InfoType> Index2InfoTypeMap;
38    typedef typename std::unordered_map<size_t,std::vector<InfoType> > Index2VectorInfoTypeMap;
[721]39
40  public:
[829]41    CClientClientDHTTemplate(const Index2InfoTypeMap& indexInfoInitMap,
[1638]42                             const ep_lib::MPI_Comm& clientIntraComm);
[721]43
[860]44    CClientClientDHTTemplate(const Index2VectorInfoTypeMap& indexInfoInitMap,
[1638]45                             const ep_lib::MPI_Comm& clientIntraComm);
[860]46
[721]47    void computeIndexInfoMapping(const CArray<size_t,1>& indices);
48
[860]49    const Index2VectorInfoTypeMap& getInfoIndexMap() const {return indexToInfoMappingLevel_; }
[869]50    Index2VectorInfoTypeMap& getInfoIndexMap() {return indexToInfoMappingLevel_; }
[843]51    int getNbClient() { return nbClient_; }
52
[721]53    /** Default destructor */
54    virtual ~CClientClientDHTTemplate();
55
56  protected:
[1638]57    CClientClientDHTTemplate(const ep_lib::MPI_Comm& clientIntraComm);
[892]58
59  protected:
60
61
[721]62    // Redistribute index and info among clients
[829]63    void computeDistributedIndex(const Index2InfoTypeMap& indexInfoInitMap,
[1638]64                                 const ep_lib::MPI_Comm& intraCommLevel,
[721]65                                 int level);
66
[860]67    void computeDistributedIndex(const Index2VectorInfoTypeMap& indexInfoInitMap,
[1638]68                                 const ep_lib::MPI_Comm& intraCommLevel,
[860]69                                 int level);
70
71
[721]72    void computeHashIndex(std::vector<size_t>& indexClientHash, int nbClient);
73
74    void computeIndexInfoMappingLevel(const CArray<size_t,1>& indices,
[1638]75                                      const ep_lib::MPI_Comm& intraCommLevel,
[721]76                                      int level);
77
[833]78    void computeSendRecvRank(int level, int rank);
79
80    void sendRecvRank(int level,
81                      const std::vector<int>& sendNbRank, const std::vector<int>& sendNbElements,
[839]82                      std::vector<int>& recvNbRank, std::vector<int>& recvNbElements);
[833]83
[721]84  protected:
[830]85    // Send information to clients
86    void sendInfoToClients(int clientDestRank, unsigned char* info, int infoSize,
[1638]87                           const ep_lib::MPI_Comm& clientIntraComm,
88                           std::vector<ep_lib::MPI_Request>& requestSendInfo);
89    void sendInfoToClients(int clientDestRank, unsigned char* info, int infoSize,
90                           const ep_lib::MPI_Comm& clientIntraComm,
91                           ep_lib::MPI_Request* requestSendInfo);
[721]92
[839]93    void recvInfoFromClients(int clientSrcRank, unsigned char* info, int infoSize,
[1638]94                            const ep_lib::MPI_Comm& clientIntraComm,
95                            std::vector<ep_lib::MPI_Request>& requestRecvInfo);
96    void recvInfoFromClients(int clientSrcRank, unsigned char* info, int infoSize,
97                             const ep_lib::MPI_Comm& clientIntraComm,
98                             ep_lib::MPI_Request* requestRecvInfo);
99                                                       
[839]100
[721]101    // Send global index to clients
[833]102    void sendIndexToClients(int clientDestRank, size_t* indices, size_t indiceSize,
[1638]103                            const ep_lib::MPI_Comm& clientIntraComm,
104                            std::vector<ep_lib::MPI_Request>& requestSendIndexGlobal);
105    void sendIndexToClients(int clientDestRank, size_t* indices, size_t indiceSize,
106                            const ep_lib::MPI_Comm& clientIntraComm,
107                            ep_lib::MPI_Request* requestSendIndexGlobal);
[721]108
[839]109    void recvIndexFromClients(int clientSrcRank, size_t* indices, size_t indiceSize,
[1638]110                             const ep_lib::MPI_Comm& clientIntraComm,
111                             std::vector<ep_lib::MPI_Request>& requestRecvIndex);
112    void recvIndexFromClients(int clientSrcRank, size_t* indices, size_t indiceSize,
113                              const ep_lib::MPI_Comm& clientIntraComm,
114                              ep_lib::MPI_Request* requestRecvIndex);
[721]115
[839]116    void sendRecvOnReturn(const std::vector<int>& sendNbRank, std::vector<int>& sendNbElements,
117                          const std::vector<int>& recvNbRank, std::vector<int>& recvNbElements);
[721]118
119  protected:
120    //! Mapping of global index to the corresponding client
[860]121    Index2VectorInfoTypeMap index2InfoMapping_;
[721]122
[830]123    //! A mapping of index to the corresponding information in each level of hierarchy
[860]124    Index2VectorInfoTypeMap indexToInfoMappingLevel_;
[721]125
[867]126    //! Rank of client to send on each DHT level
[833]127    std::vector<std::vector<int> > sendRank_;
[721]128
[867]129    //! Rank of client to receive on each DHT level
[833]130    std::vector<std::vector<int> > recvRank_;
131
[721]132    //! Flag to specify whether data is distributed or not
133    bool isDataDistributed_;
[843]134
135    //! Number of client
136    int nbClient_;
[721]137};
138
139typedef CClientClientDHTTemplate<int> CClientClientDHTInt;
[924]140typedef CClientClientDHTTemplate<size_t> CClientClientDHTSizet;
[941]141typedef CClientClientDHTTemplate<double> CClientClientDHTDouble;
[829]142typedef CClientClientDHTTemplate<PairIntInt> CClientClientDHTPairIntInt;
[721]143
144} // namespace xios
145#endif // __XIOS_CLIENT_CLIENT_DHT_TEMPLATE_HPP__
Note: See TracBrowser for help on using the repository browser.