Changeset 1520 for XIOS/dev/branch_openmp/extern/src_ep_dev/ep_type.hpp
- Timestamp:
- 06/04/18 19:25:08 (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/dev/branch_openmp/extern/src_ep_dev/ep_type.hpp
r1374 r1520 12 12 #include <numeric> 13 13 #include <bitset> 14 //#include <memory.h>15 14 #include <algorithm> 16 15 #include <assert.h> … … 24 23 #endif 25 24 25 #ifdef _Memory_check 26 #define memcheck(x) std::cout << x << std::endl 27 #else 28 #define memcheck(x) 29 #endif 30 31 26 32 #define BUFFER_SIZE 10000 27 33 28 //#define NUM_THREADS 12 29 30 typedef std::pair< int, int > SIZE_RANK_INFO; // < rank, size> 31 32 typedef std::vector< std::pair<int, int> > RANK_MAP; // at(ep_rank) = <ep_rank_local, mpi_rank> 33 34 typedef std::vector<std::pair< std::pair<int, int>, std::pair<int, int> > > INTERCOMM_RANK_MAP; 34 #include "ep_status.hpp" 35 #include "ep_request.hpp" 36 #include "ep_info.hpp" 37 #include "ep_message.hpp" 38 #include "ep_barrier.hpp" 39 #include "ep_comm.hpp" 40 #include "ep_intercomm.hpp" 41 #include "ep_window.hpp" 35 42 36 43 37 typedef struct38 {39 int first;40 int second;41 int third;42 } Triple_int;43 44 44 45 namespace ep_lib 45 46 { 46 //#define EP_UNDEFINED -3276647 47 48 48 class ep_communicator; 49 49 class ep_intercomm; 50 class OMPbarrier;51 typedef ep_communicator* EP_Comm;52 class MPI_Comm;53 50 54 51 55 class MPI_Status56 {57 public:58 59 void* ep_datatype;60 int ep_src;61 int ep_tag;62 void* mpi_status;63 };64 65 class MPI_Message66 {67 public:68 69 void* mpi_message;70 int ep_src;71 int ep_tag;72 void* mpi_status;73 74 MPI_Message() {}75 MPI_Message(void* message);76 };77 78 typedef std::list<MPI_Message > Message_list;79 80 81 class OMPbarrier82 {83 private:84 int nbThreads; //<The number of threads for this barrier85 int currentNbThread; //<The current number of threads waiting86 bool sense; //<Direct barrier feedback protection87 omp_lock_t mutex; //<To have an atomic int88 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 flush115 }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_intercomm133 {134 public:135 136 void *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 //~ep_intercomm(){delete mpi_inter_comm;}151 bool operator == (ep_intercomm right);152 bool operator != (ep_intercomm right);153 154 155 156 };157 158 159 class ep_communicator160 {161 public:162 163 SIZE_RANK_INFO size_rank_info[3]; // 0: ep_rank, ep_size164 // 1: ep_rank_loc, num_ep165 // 2: mpi_rank, mpi_size166 167 168 MPI_Comm *comm_list;169 170 Message_list *message_queue;171 172 173 int comm_label;174 175 ep_intercomm *intercomm;176 177 ep_communicator();178 bool operator == (ep_communicator right);179 bool operator != (ep_communicator right);180 181 };182 183 184 struct BUFFER185 {186 void * void_buffer[12];187 };188 189 190 class MPI_Comm191 {192 public:193 194 bool is_ep;195 bool is_intercomm;196 197 BUFFER *my_buffer;198 OMPbarrier *ep_barrier;199 RANK_MAP *rank_map;200 void* mpi_comm;201 EP_Comm ep_comm_ptr;202 MPI_Comm *mem_bridge;203 void* mpi_bridge;204 205 MPI_Comm();206 MPI_Comm(void* comm);207 //~MPI_Comm(){delete mpi_comm;}208 209 210 bool operator == (MPI_Comm right);211 bool operator != (MPI_Comm right);212 bool is_null();213 214 };215 216 217 class MPI_Info218 {219 public:220 221 void* mpi_info;222 223 MPI_Info();224 MPI_Info(void* info);225 };226 227 228 class MPI_Request229 {230 public:231 232 void* mpi_request;233 234 int type; //! type of the non-blocking communication. 1: Isend; 2:Irecv; 3:Imrecv; 4:Issend235 void* buf;236 237 int ep_src;238 int ep_tag;239 void* ep_datatype;240 241 MPI_Comm comm; //! EP communicator related to the communication242 243 MPI_Request() {}244 MPI_Request(void* request);245 bool operator == (MPI_Request right);246 247 };248 249 250 52 class MPI_Aint 251 53 { … … 256 58 MPI_Aint() {} 257 59 MPI_Aint(void* aint); 258 //MPI_Aint(int a): mpi_aint(a) {} 60 MPI_Aint(int aint); 61 MPI_Aint operator=(int a); 259 62 }; 260 63 … … 262 65 { 263 66 public: 264 67 265 68 void* mpi_fint; 266 69 267 70 MPI_Fint() {} 268 71 MPI_Fint(void* fint); 269 //MPI_Fint(int f): mpi_fint(f) {} 270 72 271 73 }; 74 75 272 76 273 77 … … 278 82 static std::list<std::pair<std::pair<int, int>, MPI_Comm * > > tag_list; 279 83 84 static std::list< std::pair<std::pair<int, int> , std::pair<MPI_Comm * , std::pair<int, int> > > > intercomm_list; 85 280 86 static std::map<std::pair<int, int>, MPI_Comm > fc_comm_map; 281 87 282 // static std::map<std::pair<int, int>, MPI_Comm > *fc_comm_map_ptr;283 // #pragma omp threadprivate(fc_comm_map_ptr)284 // // <MPI_Fint,thread_num> EP_Comm285 88 286 89 }
Note: See TracChangeset
for help on using the changeset viewer.