source: XMLIO_V2/dev/common/src/xmlio/manager/mpi_manager.hpp @ 286

Last change on this file since 286 was 286, checked in by ymipsl, 13 years ago

reprise en main de la version de H. Ozdoba. Correction de différentes erreurs de conception et bug.
Version NEMO operationnel en client/server, interoperabilita avec OASIS, reconstition de fichiers via netcdf4/HDF5

YM

File size: 6.3 KB
Line 
1/* ************************************************************************** *
2 *      Copyright © IPSL/LSCE, XMLIOServer, Avril 2010 - Octobre 2011         *
3 * ************************************************************************** */
4
5#ifndef __MPI_INTERFACE_HPP__
6#define __MPI_INTERFACE_HPP__
7
8/**
9 * \file    mpi_interface.hpp
10 * \brief   Gestion des communications MPI via une surcouche interne (entête).
11 * \author  Hervé Ozdoba
12 * \version 0.4
13 * \date    28 Juin 2011
14 */
15
16#ifndef __XIOS_NO_EXTERN
17
18// M(essage) P(assing) I(nterface) headers
19#include <mpi.h>
20
21// C++ standard headers
22#include <vector>
23
24#endif //__XIOS_NO_EXTERN
25
26// XMLIOServer headers
27#include "xmlioserver_spl.hpp"
28#include "buffer.hpp"
29#include "circular_buffer.hpp"
30#include "linear_buffer.hpp"
31
32// ////////////////////////////// Déclarations ///////////////////////////// //
33
34namespace xmlioserver
35{
36   /// \brief Espace de nommage pour les communications via la bibliothÚque MPI.
37   namespace comm
38   {
39      typedef MPI_Fint     MPIComm; /*!< \brief Identifiant de communicateur MPI (Fortran).   */
40      typedef MPI_Fint    MPIGroup; /*!< \brief Identifiant de groupe MPI (Fortran).          */
41      typedef MPI_Fint  MPIRequest; /*!< \brief Identifiant de requête MPI (Fortran).         */
42      typedef MPI_Fint  *MPIStatus; /*!< \brief Identifiant de statut MPI (Fortran).          */
43      typedef MPI_Fint MPIDataType; /*!< \brief Identifiant de type de données MPI (Fortran). */
44     
45      /**
46       * \class CMPIManager
47       * \brief Surcouche interne de la bibliàothÚque M(essage) P(assing) I(nterface).
48       */
49      class CMPIManager
50      {
51         public : // Initialisation & Finalisation
52         
53            static void Initialise(int * argc, char *** argv);
54            static void InitialiseClient(int * argc, char *** argv);
55            static void InitialiseServer(int * argc, char *** argv);
56            static void Finalize(void);
57
58         public : // Communicateurs
59         
60         
61           
62            static inline MPI_Comm GetCommWorld(void)           
63            { return (MPI_COMM_WORLD); }
64           
65            static int GetCommRank(MPI_Comm _comm = MPI_COMM_WORLD);
66            static int GetCommSize(MPI_Comm _comm = MPI_COMM_WORLD);       
67           
68            static MPI_Comm CreateComm(MPI_Group _group, MPI_Comm _pcomm=MPI_COMM_WORLD);
69
70            static inline MPI_Comm GetCommClient(void) 
71            { return CommClient; }   
72            static inline MPI_Comm GetCommServer(void) 
73            { return CommServer; }   
74            static inline MPI_Comm GetCommClientServer(void)             
75            { return CommClientServer; }   
76            static inline int GetNbClient(void)             
77            { return NbClient; }   
78            static inline int GetNbServer(void)             
79            { return NbServer; }   
80
81            static inline bool IsConnected(void)             
82            { return (NbServer==0)?true:false; }   
83
84            static inline bool IsClient(void)             
85            { return _IsClient; }   
86
87            static inline bool IsServer(void)             
88            { return _IsServer; }   
89
90         public : // Autre
91         
92            static void Barrier(MPI_Comm _comm = MPI_COMM_WORLD);
93           
94            static bool DispatchClient(bool       _is_server,
95                                       MPI_Comm & _comm_client,
96                                       MPI_Comm & _comm_client_server,
97                                       MPI_Comm & _comm_server,
98                                       MPI_Comm _comm_parent);
99
100         public : // Groupes
101         
102            static MPI_Group GetGroupWorld(void);
103            static MPI_Group GetGroup(MPI_Comm Comm);
104            static MPI_Group CreateSubGroup(MPI_Group _pgroup, const std::vector<int> & _ranks);
105            static MPI_Group CreateSubGroup(MPI_Group _pgroup, int _min_rank, int _max_rank, int _intval = 1);
106
107         public : // Tests
108         
109       
110         
111            static bool IsMaster(MPI_Comm _comm = MPI_COMM_WORLD);
112            static bool IsRank(int _rank, MPI_Comm _comm = MPI_COMM_WORLD);
113
114         public : // Communication simple
115         
116            static void Send (MPI_Comm _comm, int _dest_rank, char * _data,
117                              std::size_t _size, MPI_Request & _request);
118            static void Wait (MPI_Request & _request);
119            static bool Test (MPI_Request & _request);
120
121           
122            static bool HasReceivedData(MPI_Comm _comm, int _src_rank);
123           
124            static std::size_t GetReceivedDataSize(MPI_Comm _comm, int _src_rank);
125
126            static void Receive(MPI_Comm _comm, int _src_rank, char * _data);
127           
128            static void AllGather(int _indata, std::vector<int> & _outdata,
129                                  MPI_Comm _comm = MPI_COMM_WORLD);
130
131            static void AllGather(const std::vector<int> & _indata,
132                                        std::vector<int> & _outdata,
133                                  MPI_Comm _comm = MPI_COMM_WORLD);
134
135
136         public : // Communication 'complexe'
137         
138
139            static void SendLinearBuffer(MPI_Comm _comm, int _dest_rank, CLinearBuffer & _lbuffer, MPI_Request & _request);
140            static void ReceiveLinearBuffer(MPI_Comm _comm, int _src_rank, CLinearBuffer & _lbuffer);
141            static boost::shared_ptr<CLinearBuffer> ReceiveLinearBuffer(MPI_Comm _comm, int _src_rank);
142            static void ReceiveCircularBuffer(MPI_Comm _comm, int _src_rank, CCircularBuffer & _cbuffer);
143           
144           
145
146         public : // Mémoire (non fonctionnel ....)
147         
148            static void AllocMemory(void * _data, std::size_t _size);
149            static void FreeMemory (void * _data);
150         
151          private :
152         
153            static bool Initialized ;
154            static MPI_Comm CommClient ;
155            static MPI_Comm CommServer ;
156            static MPI_Comm CommClientServer ;
157            static int NbClient ;
158            static int NbServer ;
159
160            static bool _IsClient ;
161            static bool _IsServer ;
162            static bool using_server ;
163            static bool using_oasis ;
164           
165      }; // class CMPIManager
166     
167
168     
169   } // namespace comm
170} // namespace xmlioserver
171
172#endif //__MPI_INTERFACE_HPP__
Note: See TracBrowser for help on using the repository browser.