parallel_mpi.h Source File

LibRPA: parallel_mpi.h Source File
LibRPA
parallel_mpi.h
1 #ifndef PARALLEL_MPI_H
2 #define PARALLEL_MPI_H
3 
4 #include "atomic_basis.h"
5 #include "matrix.h"
6 #include "complexmatrix.h"
7 #include "vector3_order.h"
8 #include <mpi.h>
9 #include <string>
10 #include <cassert>
11 #include <set>
12 #include <vector>
13 #include <utility>
14 #include <map>
15 #include <memory>
16 
17 using std::vector;
18 using std::map;
19 using std::pair;
20 
21 namespace LIBRPA {
22 
23 enum ParallelRouting {
24  ATOM_PAIR,
25  R_TAU,
26  LIBRI,
27  COUNT
28 };
29 
30 extern const string parallel_routing_notes[ParallelRouting::COUNT];
31 
32 extern ParallelRouting parallel_routing;
33 
34 void set_parallel_routing(const string &option, const int &atpais_num, const int &Rt_num, ParallelRouting &routing);
35 
36 namespace MPI_Wrapper
37 {
38  void allreduce_matrix(const matrix& mat_send, matrix& mat_recv, MPI_Comm mpi_comm);
39  void allreduce_ComplexMatrix(const ComplexMatrix& cmat_send, ComplexMatrix & cmat_recv, MPI_Comm mpi_comm);
40  void reduce_matrix(const matrix& mat_send, matrix& mat_recv, int root, MPI_Comm mpi_comm);
41  void reduce_ComplexMatrix(const ComplexMatrix& cmat_send, ComplexMatrix& cmat_recv, int root, MPI_Comm mpi_comm);
42 };
43 
45 {
46 private:
47  bool initialized_;
48  bool comm_set_;
49 public:
50  MPI_Comm comm;
51  int myid;
52  int nprocs;
53 public:
55  MPI_COMM_handler(MPI_Comm comm_in);
56  ~MPI_COMM_handler() {};
57  void init();
58  void reset_comm(MPI_Comm comm_in);
59  bool is_root() const { return this->myid == 0; }
60  void barrier() const;
61  string str() const;
62  void check_initialized() const;
63  void allreduce_matrix(matrix &mat_send, matrix &mat_recv) const;
64  void allreduce_ComplexMatrix(ComplexMatrix &cmat_send, ComplexMatrix & cmat_recv) const;
65  void reduce_matrix(matrix &mat_send, matrix & cmat_recv, int root) const;
66  void reduce_ComplexMatrix(ComplexMatrix &cmat_send, ComplexMatrix & cmat_recv, int root) const;
67 };
68 
69 enum class CTXT_LAYOUT {R, C};
70 enum class CTXT_SCOPE {R, C, A};
71 
72 void CTXT_barrier(int ictxt, CTXT_SCOPE scope = CTXT_SCOPE::A);
73 
75 {
76 private:
77  MPI_COMM_handler mpi_comm_h;
78  char layout_ch;
79  bool initialized_;
80  bool pgrid_set_;
81  bool comm_set_;
82 public:
83  int ictxt;
84  CTXT_LAYOUT layout;
85  int myid;
86  int nprocs;
87  int nprows;
88  int npcols;
89  int mypcol;
90  int myprow;
91  BLACS_CTXT_handler() { comm_set_ = pgrid_set_ = initialized_ = false; }
92  BLACS_CTXT_handler(MPI_Comm comm_in): mpi_comm_h(comm_in) { comm_set_ = true; pgrid_set_ = initialized_ = false; }
93  ~BLACS_CTXT_handler() {};
94 
95  void init();
96  void reset_comm(MPI_Comm comm_in);
97  void set_grid(const int &nprows_in, const int &npcols_in, CTXT_LAYOUT layout_in = CTXT_LAYOUT::R);
98  void set_square_grid(bool more_rows = true, CTXT_LAYOUT layout_in = CTXT_LAYOUT::R);
99  void set_horizontal_grid();
100  void set_vertical_grid();
101  std::string info() const;
102  int get_pnum(int prow, int pcol) const;
103  void get_pcoord(int pid, int &prow, int &pcol) const;
104  void barrier(CTXT_SCOPE scope = CTXT_SCOPE::A) const;
106  void exit();
107  bool initialized() const { return initialized_; }
108 };
109 
111 {
112 private:
113  // BLACS parameters obtained upon construction
114  int ictxt_;
115  int nprocs_;
116  int myid_;
117  int nprows_;
118  int myprow_;
119  int npcols_;
120  int mypcol_;
121  void set_blacs_params_(int ictxt, int nprocs, int myid, int nprows, int myprow, int npcols, int mypcol);
122  int set_desc_(const int &m, const int &n, const int &mb, const int &nb,
123  const int &irsrc, const int &icsrc);
124 
125  // Array dimensions
126  int m_;
127  int n_;
128  int mb_;
129  int nb_;
130  int irsrc_;
131  int icsrc_;
132  int lld_;
133  int m_local_;
134  int n_local_;
135 
137  bool empty_local_mat_ = false;
138 
140  bool initialized_ = false;
141 
142 public:
143  int desc[9];
144  Array_Desc(const BLACS_CTXT_handler &blacs_ctxt_h);
145  Array_Desc(const int &ictxt);
147  int init(const int &m, const int &n,
148  const int &mb, const int &nb,
149  const int &irsrc, const int &icsrc);
151  int init_1b1p(const int &m, const int &n,
152  const int &irsrc, const int &icsrc);
153  int init_square_blk(const int &m, const int &n,
154  const int &irsrc, const int &icsrc);
155  int indx_g2l_r(int gindx) const;
156  int indx_g2l_c(int gindx) const;
157  int indx_l2g_r(int lindx) const;
158  int indx_l2g_c(int lindx) const;
159  const int& ictxt() const { return ictxt_; }
160  const int& m() const { return m_; }
161  const int& n() const { return n_; }
162  const int& mb() const { return mb_; }
163  const int& nb() const { return nb_; }
164  const int& lld() const { return lld_; }
165  const int& irsrc() const { return irsrc_; }
166  const int& icsrc() const { return icsrc_; }
167  const int& m_loc() const { return m_local_; }
168  const int& n_loc() const { return n_local_; }
169  const int& myprow() const { return myprow_; }
170  const int& mypcol() const { return mypcol_; }
171  const int& nprows() const { return nprows_; }
172  const int& npcols() const { return npcols_; }
173  std::string info() const;
174  std::string info_desc() const;
175  bool is_src() const;
176  void barrier(CTXT_SCOPE scope = CTXT_SCOPE::A);
177 };
178 
181 std::pair<Array_Desc, Array_Desc> prepare_array_desc_mr2d_src_and_all(
182  const BLACS_CTXT_handler &ctxt_h, const int &m, const int &n, const int &mb,
183  const int &nb, const int &irsrc, const int &icsrc);
184 
186 std::set<std::pair<int, int>> get_necessary_IJ_from_block_2D(const AtomicBasis &atbasis_row, const AtomicBasis &atbasis_col, const Array_Desc& arrdesc);
187 
188 std::set<std::pair<int, int>> get_necessary_IJ_from_block_2D_sy(const char &uplo, const AtomicBasis &atbasis, const Array_Desc& arrdesc);
189 
190 } // namespace LIBRPA
191 
193 {
194 public:
195  static vector<double> pack_mat(const map<size_t,map<size_t,map<Vector3_Order<int>,shared_ptr<matrix>>>> &Cs_m);
196  // static map<size_t,map<size_t,map<Vector3_Order<int>,shared_ptr<matrix>>>> unpack_mat(vector<double> &pack);
197 
198  Parallel_MPI();
199  ~Parallel_MPI();
200 
201  // void set_blacs_parameters();
202  // void set_blacs_mat(
203  // int *desc, int &loc_row, int &loc_col,
204  // const int tot_row, const int tot_col,
205  // const int row_blk=1, const int col_blk=1 );
206  static int globalIndex(int localIndex, int nblk, int nprocs, int myproc);
207  static int localIndex(int globalIndex, int nblk, int nprocs, int myproc);
208 };
209 
211 vector<int> dispatcher(int ist, int ied, unsigned myid, unsigned size, bool sequential);
212 vector<pair<int, int>> dispatcher(int i1st, int i1ed, int i2st, int i2ed,
213  unsigned myid, unsigned size, bool sequential, bool favor_1st);
214 
215 vector<pair<int,int>> pick_upper_trangular_tasks(vector<int> list_row, vector<int> list_col);
216 vector<pair<int,int>> dispatch_upper_trangular_tasks(const int &natoms, const int &myid, const int &nprows, const int &npcols, const int &myprow, const int &mypcol);
217 
224 vector<pair<int, int>> find_duplicate_ordered_pair(int n, const vector<pair<int, int>>& ordered_pairs, const MPI_Comm &comm);
225 
226 template <typename T>
227 vector<T> dispatch_vector(vector<T> world_vec, unsigned myid, unsigned size, bool sequential)
228 {
229  vector<int> ids = dispatcher(0, world_vec.size(), myid, size, sequential);
230  vector<T> local_vec;
231  for ( auto id: ids )
232  local_vec.push_back(world_vec[id]);
233  return local_vec;
234 }
235 
236 template <typename T1, typename T2>
237 vector<pair<T1, T2>> dispatch_vector_prod(vector<T1> vec1, vector<T2> vec2, unsigned myid, unsigned size, bool sequential, bool favor_1st)
238 {
239  vector<pair<int, int>> ids = dispatcher(0, int(vec1.size()), 0, int(vec2.size()), myid, size, sequential, favor_1st);
240  vector<pair<T1, T2>> local_vec;
241  for ( auto id: ids )
242  local_vec.push_back({vec1[id.first], vec2[id.second]});
243  return local_vec;
244 }
245 
246 #endif
Definition: complexmatrix.h:20
Definition: parallel_mpi.h:111
int init(const int &m, const int &n, const int &mb, const int &nb, const int &irsrc, const int &icsrc)
initialize the array descriptor
Definition: parallel_mpi.cpp:329
int init_1b1p(const int &m, const int &n, const int &irsrc, const int &icsrc)
initialize the array descriptor such that each process has exactly one block
Definition: parallel_mpi.cpp:335
Definition: atomic_basis.h:12
Definition: parallel_mpi.h:75
void exit()
call gridexit to reset process grid
Definition: parallel_mpi.cpp:215
Definition: parallel_mpi.h:45
Definition: parallel_mpi.h:193
Definition: vector3_order.h:15
Definition: matrix.h:23
utilies to handle square matrix and related operations
Definition: analycont.cpp:14
std::pair< Array_Desc, Array_Desc > prepare_array_desc_mr2d_src_and_all(const BLACS_CTXT_handler &ctxt_h, const int &m, const int &n, const int &mb, const int &nb, const int &irsrc, const int &icsrc)
Definition: parallel_mpi.cpp:434
std::set< std::pair< int, int > > get_necessary_IJ_from_block_2D(const AtomicBasis &atbasis_row, const AtomicBasis &atbasis_col, const Array_Desc &arrdesc)
obtain the necessary atom pair of atomic basis to build the block-cyclic submatrix
Definition: parallel_mpi.cpp:442