Proto  3.2
Proto_Copier.H
Go to the documentation of this file.
1 #pragma once
2 #ifndef _PROTO_COPIER_
3 #define _PROTO_COPIER_
4 
5 #include "Proto_MemType.H"
6 #include "Proto_Memory.H"
7 #include "Proto_SPMD.H"
8 #include "Proto_Box.H"
10 #include "Proto_DataIndex.H"
11 #include <unordered_map>
12 #include <cstdint>
13 #include "Proto_MayDay.H"
14 
15 namespace Proto
16 
17 {
18 // =======================================================================
19 // DECLARATIONS
20 
21  template<typename P_SRC, typename P_DST> struct BufferEntry;
22  template<typename P_SRC, typename P_DST> struct MotionItem;
23  template<typename P_SRC, typename P_DST> class CopierIterator;
24 
26  {
30  };
31 // =======================================================================
32 // ABSTRACT COPIER CLASS
33 
34  /// Abstract Generic Parallel Copier
35  /**
36  Copier is an abstract super-class that handles the MPI communication
37  component of a generic parallel copy operation. Copying is executed
38  by processing a set of "motion plans" which define how data moves
39  from, to, and within this process.
40 
41  The construction of the motion plans must be defined using the abstract
42  buildMotionPlans() function.
43 
44  The template parameter class OP defines the serialization of any underlying
45  dataholders. Generally OP must have a reference to the dataholder(s) themselves
46  and must also implement the following API:
47 
48  void linearIn (void* a_buffer, Box a_range, DataIndex a_patchIndex);
49  void linearOut(void* a_buffer, Box a_domain, DataIndex a_patchIndex);
50  void size(Box a_region, DataIndex a_patchIndex);
51  void localCopy(Box a_domain, DataIndex a_domainIndex, Box a_range, DataIndex a_rangeIndex);
52 
53  linearIn: Reads data from a_buffer into the part of a patch designated by a_patchIndex intersecting a_range
54  linearOut: Writes data to a_buffer from the part of a patch designated by a_patchIndex intersecting a_domain
55  size: Computes the number of elements in the patch designated by a_patchIndex intersectiong a_region
56  localCopy: Executes the copy operation between two data patches located on the same parallel process
57  */
58 
59  template<class OP, typename P_SRC, typename P_DST, MemType SRC_MEM, MemType DST_MEM>
60  class Copier
61  {
62  template<typename PP_SRC, typename PP_DST> friend class MotionItem;
63  template<typename PP_SRC, typename PP_DST> friend class CopierIterator;
64 
65  public:
66 
67 
68  Copier();
69  Copier(OP a_op);
70  Copier(Copier& a_copier) = delete;
71 
72  // Destructor is virtual to handle potential polymorphic destruct
73  inline virtual ~Copier();
74  inline void define(OP a_op);
75  inline void clear();
76  virtual void buildMotionPlans(OP& a_op) = 0;
77 
80  inline bool operator==(const Copier<OP, P_SRC, P_DST, SRC_MEM, DST_MEM>& a_rhs) const;
81  inline void execute();
82  inline void sort();
83  std::vector<MotionItem<P_SRC, P_DST>>& motionPlan(MotionType a_type);
84  inline CopierIterator<P_SRC, P_DST> begin(MotionType a_type) const;
85  inline void print() const;
86 
87 
88  protected:
89 
90  OP m_op;
91 
92  std::vector<MotionItem<P_SRC, P_DST>> m_localMotionPlan;
93  std::vector<MotionItem<P_SRC, P_DST>> m_fromMotionPlan;
94  std::vector<MotionItem<P_SRC, P_DST>> m_toMotionPlan;
95 
96  bool m_isDefined = false;
97 
98  private:
99 
100  void makeItSo();
101  void makeItSoBegin();
102  void makeItSoLocal();
103  void makeItSoEnd();
104 
105  void completePendingSends() const;
106  void allocateBuffers();
107  void writeToSendBuffers();
108  void postSends() const;
109  void readFromRecvBuffers();
110  void postRecvs() const;
111 
112  // Copy buffers
113  void clearBuffers();
114  void clearMotionPlan();
115 
120 
121 
122 #ifdef PR_MPI
123  mutable std::vector<BufferEntry<P_SRC, P_DST>> m_fromMe;
124  mutable std::vector<BufferEntry<P_SRC, P_DST>> m_toMe;
125 
126  mutable int m_numSends;
127  mutable int m_numRecvs;
128 
129  mutable std::vector<MPI_Request> m_sendRequests, m_recvRequests;
130  mutable std::vector<MPI_Status> m_sendStatus, m_recvStatus;
131 #endif
132  }; // end class Copier
133 
134 // =======================================================================
135 // STRUCTURES
136 
137  template<typename P_SRC, typename P_DST>
138  struct BufferEntry
139  {
140  void* buffer;
141  size_t size;
143  unsigned int procID;
144 
145  inline bool operator<(const BufferEntry& a_rhs) const;
146  }; // end struct BufferEntry
147 
148  template<typename P_SRC, typename P_DST>
149  struct MotionItem
150  {
155  int procID;
157 
158  inline MotionItem(){}
159 
160  inline MotionItem(const DataIndex<P_SRC>& a_fromIndex,
161  const DataIndex<P_DST>& a_toIndex,
162  const Box& a_fromRegion,
163  const Box& a_toRegion);
164 
165  inline bool operator==(const MotionItem<P_SRC, P_DST>& a_rhs) const;
166  inline bool operator<(const MotionItem<P_SRC, P_DST>& a_rhs) const;
167  }; // end struct MotionItem
168 
169 // =======================================================================
170 // COPIER ITERATOR
171 
172  template<typename P_SRC, typename P_DST>
174  {
175  public:
176 
177  inline CopierIterator(const std::vector<MotionItem<P_SRC, P_DST>>* a_motionPlan);
178  inline const MotionItem<P_SRC, P_DST>& operator()() const;
179  inline const MotionItem<P_SRC, P_DST>& operator[](size_t a_index) const;
180  inline const MotionItem<P_SRC, P_DST>& operator*() const;
181  inline void operator++();
182  inline bool ok();
183  inline void reset();
184  inline size_t size() const;
185 
186  private:
187 
188  const vector<MotionItem<P_SRC, P_DST>>* m_motionPlan;
189  unsigned int m_current;
190  }; // end class CopierIterator
191 
192 
193 #include "implem/Proto_CopierImplem.H"
194 } // end namespace Proto
195 #endif //end include guard
CopierIterator< P_SRC, P_DST > begin(MotionType a_type) const
Definition: Proto_Copier.H:124
Box fromRegion
Definition: Proto_Copier.H:153
Copier< OP, P_SRC, P_DST, SRC_MEM, DST_MEM > & operator=(const Copier< OP, P_SRC, P_DST, SRC_MEM, DST_MEM > &a_rhs)=delete
void clearMotionPlan()
Definition: Proto_Copier.H:71
OP m_op
Definition: Proto_Copier.H:90
std::vector< MotionItem< P_SRC, P_DST > > m_localMotionPlan
Definition: Proto_Copier.H:92
void completePendingSends() const
Definition: Proto_Copier.H:197
friend class MotionItem
Definition: Proto_Copier.H:62
friend class CopierIterator
Definition: Proto_Copier.H:63
void print() const
Definition: Proto_Copier.H:463
Box toRegion
Definition: Proto_Copier.H:154
CoordPermutation rotation
Definition: Proto_Copier.H:156
unsigned int procID
Definition: Proto_Copier.H:143
Definition: Proto_Copier.H:23
void makeItSoLocal()
Definition: Proto_Copier.H:173
void makeItSo()
Definition: Proto_Copier.H:143
Defines discrete rotations in logically rectangular coordinate systems.
Definition: Proto_CoordPermutation.H:13
const MotionItem< P_SRC, P_DST > * item
Definition: Proto_Copier.H:142
void * m_sendBuffer
Definition: Proto_Copier.H:118
virtual void buildMotionPlans(OP &a_op)=0
Definition: Proto_Copier.H:29
Definition: Proto_Copier.H:27
Copier()
Definition: Proto_Copier.H:6
std::vector< MotionItem< P_SRC, P_DST > > m_toMotionPlan
Definition: Proto_Copier.H:94
An interval in DIM dimensional space.
Definition: Proto_Box.H:29
void clearBuffers()
Definition: Proto_Copier.H:46
unsigned int m_current
Definition: Proto_Copier.H:189
void allocateBuffers()
Definition: Proto_Copier.H:216
void postSends() const
Definition: Proto_Copier.H:309
void * m_recvBuffer
Definition: Proto_Copier.H:119
std::vector< MotionItem< P_SRC, P_DST > > m_fromMotionPlan
Definition: Proto_Copier.H:93
bool m_isDefined
Definition: Proto_Copier.H:96
size_t m_sendCapacity
Definition: Proto_Copier.H:116
std::vector< MotionItem< P_SRC, P_DST > > & motionPlan(MotionType a_type)
Definition: Proto_Copier.H:90
MotionType
Definition: Proto_Copier.H:25
DataIndex< P_DST > toIndex
Definition: Proto_Copier.H:152
Definition: Proto_Array.H:17
void makeItSoEnd()
Definition: Proto_Copier.H:186
void clear()
Definition: Proto_Copier.H:64
void define(OP a_op)
Definition: Proto_Copier.H:35
ACCEL_DECORATION Array< T, N > & operator*(int scale, Array< T, N > &arr)
Premultiplication by a scalar int.
bool operator==(const Copier< OP, P_SRC, P_DST, SRC_MEM, DST_MEM > &a_rhs) const
Definition: Proto_Copier.H:103
void postRecvs() const
Definition: Proto_Copier.H:405
virtual ~Copier()
Definition: Proto_Copier.H:28
void readFromRecvBuffers()
Definition: Proto_Copier.H:374
size_t size
Definition: Proto_Copier.H:141
DataIndex< P_SRC > fromIndex
Definition: Proto_Copier.H:151
void * buffer
Definition: Proto_Copier.H:140
void makeItSoBegin()
Definition: Proto_Copier.H:152
Definition: Proto_Copier.H:21
MotionItem()
Definition: Proto_Copier.H:158
void execute()
Definition: Proto_Copier.H:112
int procID
Definition: Proto_Copier.H:155
void sort()
Definition: Proto_Copier.H:82
Abstract Generic Parallel Copier.
Definition: Proto_Copier.H:60
const vector< MotionItem< P_SRC, P_DST > > * m_motionPlan
Definition: Proto_Copier.H:188
void writeToSendBuffers()
Definition: Proto_Copier.H:294
Definition: Proto_Copier.H:28
size_t m_recvCapacity
Definition: Proto_Copier.H:117
Definition: Proto_Copier.H:22