source: XIOS/dev/branch_openmp/extern/src_ep_dev/ep_type.hpp @ 1355

Last change on this file since 1355 was 1355, checked in by yushan, 6 years ago

unify MPI_Comm type

File size: 5.2 KB
Line 
1#ifndef EP_TYPE_HPP_INCLUDED
2#define EP_TYPE_HPP_INCLUDED
3
4
5#include <iostream>
6#include <stdlib.h>
7#include <stdio.h>
8#include <list>
9#include <map>
10#include <omp.h>
11#include <vector>
12#include <numeric>
13#include <bitset>
14//#include <memory.h>
15#include <algorithm>
16#include <assert.h>
17#include <math.h>
18#include <string.h>
19
20#ifdef _Debug
21#define Debug(x) std::cout << x << std::endl
22#else
23#define Debug(x)
24#endif
25
26#define BUFFER_SIZE 10000
27
28//#define NUM_THREADS 12
29
30typedef std::pair< int, int > SIZE_RANK_INFO; // < rank, size>
31
32typedef std::vector< std::pair<int, int> > RANK_MAP;  // at(ep_rank) = <ep_rank_local, mpi_rank>
33
34typedef std::vector<std::pair< std::pair<int, int>, std::pair<int, int> > > INTERCOMM_RANK_MAP;
35
36
37typedef struct
38{
39  int first;
40  int second;
41  int third;
42} Triple_int;
43
44namespace ep_lib
45{
46  //#define EP_UNDEFINED -32766
47
48  class ep_communicator;
49  class ep_intercomm;
50  class OMPbarrier;
51  typedef ep_communicator* EP_Comm;
52  class MPI_Comm;
53
54
55  class MPI_Status
56  {
57    public:
58
59      int ep_datatype;
60      int ep_src;
61      int ep_tag;
62      void* mpi_status;
63  };
64
65  class MPI_Message
66  {
67    public:
68
69      int mpi_message;
70      int ep_src;
71      int ep_tag;
72      void* mpi_status;
73
74      MPI_Message() {}
75      MPI_Message(int message): mpi_message(message) {}
76  };
77
78  typedef std::list<MPI_Message > Message_list;
79
80
81  class OMPbarrier
82  {
83    private:
84      int nbThreads;          //<The number of threads for this barrier
85      int currentNbThread;    //<The current number of threads waiting
86      bool sense;             //<Direct barrier feedback protection
87      omp_lock_t mutex;       //<To have an atomic int
88
89      OMPbarrier(OMPbarrier&){}
90      OMPbarrier& operator=(OMPbarrier&){return *this;}
91
92    public:
93      /** Constructor with the number of threads */
94      explicit OMPbarrier(const int inNbThreads)
95          : nbThreads(inNbThreads), currentNbThread(0), sense(false) {
96          omp_init_lock( &mutex );
97      }
98
99      /** Destructor, release the omp lock */
100      ~OMPbarrier(){
101          omp_destroy_lock( &mutex );
102      }
103
104      /** Perform a barrier */
105      void wait(){
106          const bool mySense = sense;
107          omp_set_lock( &mutex );
108          const int nbThreadsArrived = (++currentNbThread);
109          omp_unset_lock( &mutex );
110
111          if(nbThreadsArrived == nbThreads) {
112              currentNbThread = 0;
113              sense = !sense;
114              #pragma omp flush
115          }
116          else {
117              volatile const bool* const ptSense = &sense;
118              while( (*ptSense) == mySense){
119              }
120          }
121      }
122
123
124      /** Change the number of threads */
125      void setNbThreads(const int inNbThread){
126          omp_set_lock( &mutex );
127          nbThreads = inNbThread;
128          omp_unset_lock( &mutex );
129      }
130  };
131
132  class ep_intercomm
133  {
134    public:
135
136    int *mpi_inter_comm;
137
138    RANK_MAP *intercomm_rank_map;
139    RANK_MAP *local_rank_map;
140    RANK_MAP *remote_rank_map;
141
142
143    SIZE_RANK_INFO size_rank_info[3];
144
145
146    MPI_Comm *local_comm;
147    int intercomm_tag;
148
149    ep_intercomm();
150    bool operator == (ep_intercomm right);
151    bool operator != (ep_intercomm right);
152   
153
154
155  };
156
157
158  class ep_communicator
159  {
160    public:
161
162    SIZE_RANK_INFO size_rank_info[3]; // 0: ep_rank,     ep_size
163                                      // 1: ep_rank_loc, num_ep
164                                      // 2: mpi_rank,    mpi_size
165
166
167    MPI_Comm *comm_list;
168
169    Message_list *message_queue;
170
171
172    int comm_label;
173
174    ep_intercomm *intercomm;
175
176    ep_communicator();
177    bool operator == (ep_communicator right);
178    bool operator != (ep_communicator right);
179   
180  };
181
182
183  struct BUFFER
184  {
185    void * void_buffer[12];
186  };
187
188
189  class MPI_Comm
190  {
191    public:
192
193    bool is_ep;
194    bool is_intercomm;
195
196    BUFFER     *my_buffer;
197    OMPbarrier *ep_barrier;
198    RANK_MAP   *rank_map;
199    int* mpi_comm;
200    EP_Comm ep_comm_ptr;
201    MPI_Comm *mem_bridge;
202    int* mpi_bridge;
203
204    MPI_Comm(); 
205    //MPI_Comm(const MPI_Comm &comm);
206    MPI_Comm(int* comm);
207
208
209    bool operator == (MPI_Comm right);
210    bool operator != (MPI_Comm right);
211    bool is_null();
212
213  };
214
215
216  class MPI_Info
217  {
218    public:
219
220      int mpi_info;
221
222      MPI_Info(){ }
223      MPI_Info(int info): mpi_info(info) {}
224  };
225
226
227  class MPI_Request
228  {
229    public:
230
231      int mpi_request;
232
233      int type; //! type of the non-blocking communication. 1: Isend; 2:Irecv; 3:Imrecv; 4:Issend
234      void* buf;
235
236      int ep_src;
237      int ep_tag;
238      int ep_datatype;
239
240      MPI_Comm comm;    //! EP communicator related to the communication
241
242      MPI_Request() {}
243      MPI_Request(int request): mpi_request(request) {}
244      bool operator == (MPI_Request right);
245
246  };
247
248 
249  class MPI_Aint
250  {
251    public:
252
253    unsigned long mpi_aint;
254
255    MPI_Aint() {}
256    MPI_Aint(int a): mpi_aint(a) {}
257  };
258
259  class MPI_Fint
260  {
261    public:
262
263    int mpi_fint;
264
265    MPI_Fint() {}
266    MPI_Fint(int f): mpi_fint(f) {}
267   
268  };
269
270
271  static MPI_Comm *passage;
272
273  static int TAG = 40000;
274
275  static std::list<std::pair<std::pair<int, int>, MPI_Comm * > > tag_list;
276
277  static std::map<std::pair<int, int>, MPI_Comm >  fc_comm_map;
278
279  static std::map<std::pair<int, int>, MPI_Comm >  *fc_comm_map_ptr;
280  #pragma omp threadprivate(fc_comm_map_ptr)
281            //    <MPI_Fint,thread_num>   EP_Comm
282
283}
284
285
286
287#endif // EP_TYPE_HPP_INCLUDED
288
Note: See TracBrowser for help on using the repository browser.