C++ mpi module for stochmagnet_main Package
MPI_CoreToCoreIMessage.h
1 #ifndef MPI_CoreToCoreIMessage_H
2 #define MPI_CoreToCoreIMessage_H
3 
4 //inherited class header
5 #include "MPI_CoreToCoreMessage.h"
6 
24 template<typename T>
26 
27  //attributes
28 private :
29 
30  //UML inheritance classes
33 
34  //state attributes
35  tUCInt mRequestsNumber;
36  tMPIRequest mRequests[2];
37  tMPIStatus mStatus;
38  T* mReplacedValues;
39  std::valarray<T> mBuffer;
40 
41 public:
42  // CONSTRUCTORS
46  mRequestsNumber=1;
47  mReplacedValues=null;
48  }
49 
50  // DESTRUCTORS
53  virtual ~MPI_CoreToCoreIMessage(void) {
54 
55  }
56 
57 public:
58 
62  inline static CORE_UniquePointer<SelfClass> New() {
63  CORE_UniquePointer<SelfClass> p(new SelfClass(),CORE_Object::Delete());
64  return p;
65  };
66 
67  //memory management
68  //=================
71  virtual tMemSize getMemorySize() const override{
72  return sizeof(*this)+this->getContentsMemorySize();
73  }
82  virtual tMemSize getContentsMemorySize() const override {
84  }
85  //sender methods
86  //===============
87 
88  //primary type variable
89  //----------------------
90 
99  inline static void Send(const MPI_Environment& env,const tMPICoreId& dstCore,
100  const T& data,const tMPITag& tag,
101  tMPIRequest& request) {
102  MPI_Isend(&data,1,MPI_Type::GetPrimaryType<T>(),dstCore,tag,env.getWorld(),&request);
103  }
104 
105 
106  //pointer of primary type
107  //------------------------
108 
117  inline static void Send(const MPI_Environment& env,const tMPICoreId& dstCore,
118  const T* data,const tMPICount& nData,const tMPITag& tag,
119  tMPIRequest& request) {
120  MPI_Isend(data,nData,MPI_Type::GetPrimaryType<T>(),dstCore,tag,env.getWorld(),&request);
121  }
122 
123 
124  //valarray primary type
125  //---------------------
133  inline static void Send(const MPI_Environment& env,const tMPICoreId& dstCore,
134  const std::valarray<T>& data,const tMPITag& tag,
135  tMPIRequest& request) {
136  MPI_Isend(&data[0],data.size(),MPI_Type::GetPrimaryType<T>(),dstCore,tag,env.getWorld(),&request);
137  }
138 
146  virtual void send(const MPI_Environment& env,const tMPICoreId& dstCore,
147  const std::valarray<T>& data,const tMPITag& tag) override {
148  mRequestsNumber=1;
149  Send(env,dstCore,data,tag,mRequests[0]);
150  }
151 
152 
153 
154 
155  //MPI type
156  //--------
164  virtual void send(const MPI_Environment& env,const tMPICoreId& dstCore,
165  const T* data,const tMPICount& nData,const tMPIType& dataType,const tMPITag& tag) override {
166  Send(env,dstCore,data,nData,dataType,tag,mRequests[0]);
167  }
168 
176  inline static void Send(const MPI_Environment& env,const tMPICoreId& dstCore,
177  const T* data,const tMPICount& nData,const tMPIType& dataType,const tMPITag& tag,
178  tMPIRequest& request) {
179  MPI_Isend(data,nData,dataType,dstCore,tag,env.getWorld(),&request);
180  }
181 
182 
183 
184  //receive methods
185  //===============
186 
187  //primary type variable
188  //----------------------
196  inline static tBoolean Receive(const MPI_Environment& env,
197  const tMPICoreId& srcCore,T& data,const tMPITag& tag,
198  tMPIRequest& request) {
199  MPI_Irecv(&data,1,MPI_Type::GetPrimaryType<T>(),srcCore,tag,env.getWorld(),&request);
200  return true;
201  }
202 
203  //valarray primary type
204  //---------------------
205 
213  inline static tBoolean Receive(const MPI_Environment& env,const tMPICoreId& srcCore,
214  std::valarray<T>& data,const tMPITag& tag,
215  tMPIRequest& request) {
216  MPI_Irecv(&data[0],data.size(),MPI_Type::GetPrimaryType<T>(),srcCore,tag,env.getWorld(),&request);
217  return true;
218  }
219 
220 
227  virtual void receive(const MPI_Environment& env,const tMPICoreId& srcCore,
228  std::valarray<T>& data,const tMPITag& tag) override {
229  mRequestsNumber=1;
230  Receive(env,srcCore,data,tag,mRequests[0]);
231 
232  }
233 
234 
235 
236 
237  //pointer of primary type
238  //------------------------
239 
240 
249  inline static void Receive(const MPI_Environment& env,const tMPICoreId& srcCore,
250  T* buffer,const tMPICount& nData,const tMPITag& tag,
251  tMPIRequest& request ) {
252  MPI_Irecv(buffer,nData,MPI_Type::GetPrimaryType<T>(),srcCore,tag,env.getWorld(),&request);
253  }
254 
255 
256 
257 
258 
259 
260  //MPI type
261  //--------
262 
263 
273  inline static void Receive(const MPI_Environment& env,const tMPICoreId& dstCore,
274  T* buffer,const tMPICount& nData,const tMPIType& dataType,const tMPITag& tag,tMPIRequest& request) {
275  MPI_Irecv(buffer,nData,dataType,dstCore,tag,env.getWorld(),&request);
276  }
277 
278 
287  virtual void receive(const MPI_Environment& env,const tMPICoreId& dstCore,
288  T* buffer,const tMPICount& nData,const tMPIType& dataType,const tMPITag& tag) override {
289  Receive(env,dstCore,buffer,nData,dataType,tag,mRequests[0]);
290  }
291 
292 
293  //send & receive methods
294  //=======================
295 
296  //primary type variable
297  //----------------------
298 
309  inline static void SendNReceive(const MPI_Environment& env,const tMPICoreId& dstCore,const tMPICoreId& srcCore,
310  const T& sentData,const tMPITag& sentTag,
311  T& receivedData,const tMPITag& receivedTag,
312  tMPIRequest requests[2]) {
313 
314 
315  Send(env,dstCore,sentData,sentTag,requests[0]);
316  Receive(env,srcCore,receivedData,receivedTag,requests[1]);
317 
318 
319  }
329  virtual void sendNReceive(const MPI_Environment& env,const tMPICoreId& dstCore,const tMPICoreId& srcCore,
330  const T& sentData,const tMPITag& sentTag,
331  T& receivedData,const tMPITag& receivedTag) override {
332  mRequestsNumber=2;
333  SendNReceive(env,dstCore,srcCore,
334  sentData,sentTag,
335  receivedData,receivedTag,mRequests);
336  }
337 
338  //pointer of primary type
339  //------------------------
340 
341 
342 
354  inline static void SendNReceive(const MPI_Environment& env,const tMPICoreId& dstCore,
355  const T* sentData,const int& nSentData,const tMPITag& sentTag,
356  T* receivedData,const int& nReceivedData,const tMPITag& receivedTag,
357  tMPIRequest requests[2]) {
358  ASSERT_IN(sentData!=receivedData);
359  ASSERT_IN(nSentData==nReceivedData);
360 
361  Send(env,dstCore,sentData,nSentData,sentTag,requests[0]);
362  Receive(env,dstCore,receivedData,nReceivedData,receivedTag,requests[1]);
363 
364  // MPI_Isendrecv(sentData,nSentData,MPI_Type::GetPrimaryType<T>(),
365  // dstCore,sentTag,
366  // receivedData,nReceivedData,MPI_Type::GetPrimaryType<T>(),
367  // dstCore,receivedTag,
368  // env.getWorld(),requests[0]);
369 
370  }
371 
372 
373 
374 
375  //valarray primary type
376  //---------------------
377 
378 
390  inline static void SendNReceive(const MPI_Environment& env,const tMPICoreId& dstCore,const tMPICoreId& srcCore,
391  const std::valarray<T>& sentData,const tMPITag& sentTag,
392  std::valarray<T>& receivedData,const tMPITag& receivedTag,
393  tMPIRequest requests[2]) {
394 
395  ASSERT_IN(&sentData!=&receivedData);
396  if (receivedData.size()<sentData.size()) receivedData.resize( sentData.size());
397 
398  Send(env,dstCore,sentData,sentTag,requests[0]);
399  Receive(env,srcCore,receivedData,receivedTag,requests[1]);
400 
401 
402  // MPI_Isendrecv(&sentData[0],sentData.size(),MPI_Type::GetPrimaryType<T>(),
403  // dstCore,sentTag,
404  // &receivedData[0],receivedData.size(),MPI_Type::GetPrimaryType<T>(),
405  // srcCore,receivedTag,
406  // env.getWorld(),&request);
407 
408  }
409 
410 
411 
421  virtual void sendNReceive(const MPI_Environment& env,const tMPICoreId& dstCore,const tMPICoreId& srcCore,
422  const std::valarray<T>& sentData,const tMPITag& sentTag,
423  std::valarray<T>& receivedData,const tMPITag& receivedTag) override {
424  mRequestsNumber=2;
425  SendNReceive(env,dstCore,srcCore,
426  sentData,sentTag,
427  receivedData,receivedTag,mRequests);
428  }
429 
430 
431  //MPI type
432  //--------
433 
434 
449  inline static void SendNReceive(const MPI_Environment& env,const tMPICoreId& dstCore,const tMPICoreId& srcCore,
450  const T* sentData,const tMPICount& nSentData,const tMPIType& sentDataType,const tMPITag& sentTag,
451  T* receivedData,const tMPICount& nReceivedData,const tMPIType& receivedDataType,const tMPITag& receivedTag,
452  tMPIRequest requests[2]) {
453  ASSERT_IN(&sentData!=&receivedData);
454  Send(env,dstCore,sentData,nSentData,sentDataType,sentTag,requests[0]);
455  Receive(env,srcCore,receivedData,nReceivedData,receivedDataType,receivedTag,requests[1]);
456 
457  // MPI_Isendrecv(&sentData[0],nSentData,sentDataType,
458  // dstCore,sentTag,
459  // &receivedData[0],nReceivedData,receivedDataType,
460  // srcCore,receivedTag,
461  // env.getWorld(),&request);
462 
463  }
464 
478  inline static void SendNReceive(const MPI_Environment& env,const tMPICoreId& dstCore,
479  const T* sentData,const tMPICount& nSentData,const tMPIType& sentDataType,const tMPITag& sentTag,
480  T* receivedData,const tMPICount& nReceivedData,const tMPIType& receivedDataType,const tMPITag& receivedTag,
481  tMPIRequest requests[2]) {
482  ASSERT_IN(&sentData!=&receivedData);
483  Send(env,dstCore,sentData,nSentData,sentDataType,sentTag,requests[0]);
484  Receive(env,dstCore,receivedData,nReceivedData,receivedDataType,receivedTag,requests[1]);
485 
486  // MPI_Isendrecv(&sentData[0],nSentData,sentDataType,
487  // dstCore,sentTag,
488  // &receivedData[0],nReceivedData,receivedDataType,
489  // dstCore,receivedTag,
490  // env.getWorld(),&request);
491 
492  }
493 
494 
508  virtual void sendNReceive(const MPI_Environment& env,const tMPICoreId& dstCore,const tMPICoreId& srcCore,
509  const T* sentData,const tMPICount& nSentData,const tMPIType& sentDataType,const tMPITag& sentTag,
510  T* receivedData,const tMPICount& nReceivedData,const tMPIType& receivedDataType,const tMPITag& receivedTag) override {
511  mRequestsNumber=2;
512  SendNReceive(env,dstCore,srcCore,
513  sentData,nSentData,sentDataType,sentTag,
514  receivedData,nReceivedData,receivedDataType,receivedTag,
515  mRequests);
516  }
517 
518  //exchange methods
519  //=======================
520 
521  //primary type variable
522  //----------------------
523 
524 
525  //pointer of primary type
526  //------------------------
527 
528 
529  //valarray primary type
530  //---------------------
531 
538  virtual void exchange(const MPI_Environment& env,const tMPICoreId& dstCore,
539  std::valarray<T>& data,const tMPITag& tag) override {
540 
541  // MPI_Isendrecv_replace(data,nData,dataType,
542  // dstCore,tag,
543  // dstCore,tag,
544  // env.getWorld(),MPI_STATUS_IGNORE);
545 
546  mRequestsNumber=2;
547  Send(env,dstCore,data,tag,mRequests[0]);
548 
549  if (mBuffer.size()!=data.size()) mBuffer.resize(data.size());
550  Receive(env,dstCore,mBuffer,tag,mRequests[1]);
551 
552  mReplacedValues=&data[0];
553 
554  }
555 
556 
557 
558  //MPI type
559  //--------
560 
561 
562 
563 
566  virtual int wait() override {
567 
568  int i=0;
569  switch (mRequestsNumber) {
570  case 2:
571  i=MPI_Wait(&mRequests[1],&mStatus);
572 
573  case 1:
574  i=MPI_Wait(&mRequests[0],&mStatus);
575 
576  }
577  if (mReplacedValues!=null) {
578 
579  memcpy(mReplacedValues,&mBuffer[0],mBuffer.size()*sizeof(T));
580 
581  mReplacedValues=null;
582  }
583  return i;
584  }
585 
589  virtual void getElementsNumber(tMPICount& nElements) override {
590  MPI_Wait(&mRequests[0],&mStatus);
591  MPI_Get_count(&mStatus,MPI_Type::GetPrimaryType<T>(),&nElements);
592  }
593 
594 
595 
598  virtual tBoolean isFinished() override {
599  int isFinished;
600  tBoolean ok=true;
601  for (tUCInt i=0;i<mRequestsNumber;i++) {
602  MPI_Test(&mRequests[i],&isFinished,&mStatus);
603  ok=ok && (isFinished==1);
604  }
605  if (ok) {
606  if (mReplacedValues!=null) {
607  memcpy(mReplacedValues,&mBuffer[0],mBuffer.size()*sizeof(T));
608  mReplacedValues=null;
609  }
610  }
611  return ok;
612  }
613 };
614 
615 #endif
class Free introduced for deleting a smart pointer
Definition: CORE_Object.h:113
This class is a class to send / receive unblocking message from one to core to one core.
Definition: MPI_CoreToCoreIMessage.h:25
virtual void sendNReceive(const MPI_Environment &env, const tMPICoreId &dstCore, const tMPICoreId &srcCore, const std::valarray< T > &sentData, const tMPITag &sentTag, std::valarray< T > &receivedData, const tMPITag &receivedTag) override
receiving a data with flag to dstCore
Definition: MPI_CoreToCoreIMessage.h:421
static void Receive(const MPI_Environment &env, const tMPICoreId &dstCore, T *buffer, const tMPICount &nData, const tMPIType &dataType, const tMPITag &tag, tMPIRequest &request)
blocking send a data with tag to dstCore
Definition: MPI_CoreToCoreIMessage.h:273
virtual ~MPI_CoreToCoreIMessage(void)
destroy
Definition: MPI_CoreToCoreIMessage.h:53
virtual void receive(const MPI_Environment &env, const tMPICoreId &srcCore, std::valarray< T > &data, const tMPITag &tag) override
receiving a data with flag to dstCore
Definition: MPI_CoreToCoreIMessage.h:227
static tBoolean Receive(const MPI_Environment &env, const tMPICoreId &srcCore, std::valarray< T > &data, const tMPITag &tag, tMPIRequest &request)
receive a data with tag from source core
Definition: MPI_CoreToCoreIMessage.h:213
static void Receive(const MPI_Environment &env, const tMPICoreId &srcCore, T *buffer, const tMPICount &nData, const tMPITag &tag, tMPIRequest &request)
blocking receive a data with tag from srcCore
Definition: MPI_CoreToCoreIMessage.h:249
static void SendNReceive(const MPI_Environment &env, const tMPICoreId &dstCore, const T *sentData, const tMPICount &nSentData, const tMPIType &sentDataType, const tMPITag &sentTag, T *receivedData, const tMPICount &nReceivedData, const tMPIType &receivedDataType, const tMPITag &receivedTag, tMPIRequest requests[2])
receiving a data with flag to dstCore
Definition: MPI_CoreToCoreIMessage.h:478
virtual void getElementsNumber(tMPICount &nElements) override
get the number of element of the message
Definition: MPI_CoreToCoreIMessage.h:589
static void Send(const MPI_Environment &env, const tMPICoreId &dstCore, const T &data, const tMPITag &tag, tMPIRequest &request)
none blocking of sending a data with flag to dstCore
Definition: MPI_CoreToCoreIMessage.h:99
static void SendNReceive(const MPI_Environment &env, const tMPICoreId &dstCore, const tMPICoreId &srcCore, const T &sentData, const tMPITag &sentTag, T &receivedData, const tMPITag &receivedTag, tMPIRequest requests[2])
blocking swapping a data with tag to dst Core and receive a data from src core
Definition: MPI_CoreToCoreIMessage.h:309
virtual void send(const MPI_Environment &env, const tMPICoreId &dstCore, const std::valarray< T > &data, const tMPITag &tag) override
none blocking of sending a data with flag to dstCore
Definition: MPI_CoreToCoreIMessage.h:146
static tBoolean Receive(const MPI_Environment &env, const tMPICoreId &srcCore, T &data, const tMPITag &tag, tMPIRequest &request)
blocking receive a data with tag from source core
Definition: MPI_CoreToCoreIMessage.h:196
virtual void exchange(const MPI_Environment &env, const tMPICoreId &dstCore, std::valarray< T > &data, const tMPITag &tag) override
receiving a data with flag to dstCore
Definition: MPI_CoreToCoreIMessage.h:538
virtual tBoolean isFinished() override
return true if the communication is finihed
Definition: MPI_CoreToCoreIMessage.h:598
static void SendNReceive(const MPI_Environment &env, const tMPICoreId &dstCore, const tMPICoreId &srcCore, const T *sentData, const tMPICount &nSentData, const tMPIType &sentDataType, const tMPITag &sentTag, T *receivedData, const tMPICount &nReceivedData, const tMPIType &receivedDataType, const tMPITag &receivedTag, tMPIRequest requests[2])
receiving a data with flag to dstCore
Definition: MPI_CoreToCoreIMessage.h:449
virtual void receive(const MPI_Environment &env, const tMPICoreId &dstCore, T *buffer, const tMPICount &nData, const tMPIType &dataType, const tMPITag &tag) override
blocking send a data with tag to dstCore
Definition: MPI_CoreToCoreIMessage.h:287
static void Send(const MPI_Environment &env, const tMPICoreId &dstCore, const std::valarray< T > &data, const tMPITag &tag, tMPIRequest &request)
none blocking of sending a data with flag to dstCore
Definition: MPI_CoreToCoreIMessage.h:133
virtual int wait() override
wait the end of the message
Definition: MPI_CoreToCoreIMessage.h:566
virtual tMemSize getContentsMemorySize() const override
return nthe memory size of the included associations
Definition: MPI_CoreToCoreIMessage.h:82
virtual void sendNReceive(const MPI_Environment &env, const tMPICoreId &dstCore, const tMPICoreId &srcCore, const T *sentData, const tMPICount &nSentData, const tMPIType &sentDataType, const tMPITag &sentTag, T *receivedData, const tMPICount &nReceivedData, const tMPIType &receivedDataType, const tMPITag &receivedTag) override
receiving a data with flag to dstCore
Definition: MPI_CoreToCoreIMessage.h:508
static void SendNReceive(const MPI_Environment &env, const tMPICoreId &dstCore, const tMPICoreId &srcCore, const std::valarray< T > &sentData, const tMPITag &sentTag, std::valarray< T > &receivedData, const tMPITag &receivedTag, tMPIRequest requests[2])
blocking swapping a data with tag to dst Core and receive a data from src core
Definition: MPI_CoreToCoreIMessage.h:390
MPI_CoreToCoreIMessage()
create
Definition: MPI_CoreToCoreIMessage.h:45
static CORE_UniquePointer< SelfClass > New()
create an unique instance of the class This
Definition: MPI_CoreToCoreIMessage.h:62
static void Send(const MPI_Environment &env, const tMPICoreId &dstCore, const T *data, const tMPICount &nData, const tMPITag &tag, tMPIRequest &request)
none blocking of sending a data with flag to dstCore
Definition: MPI_CoreToCoreIMessage.h:117
static void SendNReceive(const MPI_Environment &env, const tMPICoreId &dstCore, const T *sentData, const int &nSentData, const tMPITag &sentTag, T *receivedData, const int &nReceivedData, const tMPITag &receivedTag, tMPIRequest requests[2])
blocking swapping a data with tag to dst Core and receive a data from src core
Definition: MPI_CoreToCoreIMessage.h:354
static void Send(const MPI_Environment &env, const tMPICoreId &dstCore, const T *data, const tMPICount &nData, const tMPIType &dataType, const tMPITag &tag, tMPIRequest &request)
blocking send a data with tag to dstCore
Definition: MPI_CoreToCoreIMessage.h:176
virtual void send(const MPI_Environment &env, const tMPICoreId &dstCore, const T *data, const tMPICount &nData, const tMPIType &dataType, const tMPITag &tag) override
blocking send a data with tag to dstCore
Definition: MPI_CoreToCoreIMessage.h:164
virtual void sendNReceive(const MPI_Environment &env, const tMPICoreId &dstCore, const tMPICoreId &srcCore, const T &sentData, const tMPITag &sentTag, T &receivedData, const tMPITag &receivedTag) override
receiving a data with flag to dstCore
Definition: MPI_CoreToCoreIMessage.h:329
virtual tMemSize getMemorySize() const override
return the memory size of the class
Definition: MPI_CoreToCoreIMessage.h:71
This class is a interface class to send / receive message with primitive type T from one to core to o...
Definition: MPI_CoreToCoreMessage.h:29
virtual tMemSize getContentsMemorySize() const override
return nthe memory size of the included associations
Definition: MPI_CoreToCoreMessage.h:70
This class is a Environment class to define MPI world.
Definition: MPI_Environment.h:36
const tMPIComm & getWorld() const
get the world of the environment for reading
Definition: MPI_Environment.h:165
This class is a Test class for EMicroM package which uses the module tests.
Definition: MPI_Test.h:15