1 #ifndef MPI_CoreToCoreIMessage_H
2 #define MPI_CoreToCoreIMessage_H
5 #include "MPI_CoreToCoreMessage.h"
35 tUCInt mRequestsNumber;
36 tMPIRequest mRequests[2];
39 std::valarray<T> mBuffer;
62 inline static CORE_UniquePointer<SelfClass>
New() {
100 const T& data,
const tMPITag& tag,
101 tMPIRequest& request) {
102 MPI_Isend(&data,1,MPI_Type::GetPrimaryType<T>(),dstCore,tag,env.
getWorld(),&request);
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);
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);
147 const std::valarray<T>& data,
const tMPITag& tag)
override {
149 Send(env,dstCore,data,tag,mRequests[0]);
165 const T* data,
const tMPICount& nData,
const tMPIType& dataType,
const tMPITag& tag)
override {
166 Send(env,dstCore,data,nData,dataType,tag,mRequests[0]);
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);
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);
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);
228 std::valarray<T>& data,
const tMPITag& tag)
override {
230 Receive(env,srcCore,data,tag,mRequests[0]);
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);
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);
288 T* buffer,
const tMPICount& nData,
const tMPIType& dataType,
const tMPITag& tag)
override {
289 Receive(env,dstCore,buffer,nData,dataType,tag,mRequests[0]);
310 const T& sentData,
const tMPITag& sentTag,
311 T& receivedData,
const tMPITag& receivedTag,
312 tMPIRequest requests[2]) {
315 Send(env,dstCore,sentData,sentTag,requests[0]);
316 Receive(env,srcCore,receivedData,receivedTag,requests[1]);
330 const T& sentData,
const tMPITag& sentTag,
331 T& receivedData,
const tMPITag& receivedTag)
override {
335 receivedData,receivedTag,mRequests);
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);
361 Send(env,dstCore,sentData,nSentData,sentTag,requests[0]);
362 Receive(env,dstCore,receivedData,nReceivedData,receivedTag,requests[1]);
391 const std::valarray<T>& sentData,
const tMPITag& sentTag,
392 std::valarray<T>& receivedData,
const tMPITag& receivedTag,
393 tMPIRequest requests[2]) {
395 ASSERT_IN(&sentData!=&receivedData);
396 if (receivedData.size()<sentData.size()) receivedData.resize( sentData.size());
398 Send(env,dstCore,sentData,sentTag,requests[0]);
399 Receive(env,srcCore,receivedData,receivedTag,requests[1]);
422 const std::valarray<T>& sentData,
const tMPITag& sentTag,
423 std::valarray<T>& receivedData,
const tMPITag& receivedTag)
override {
427 receivedData,receivedTag,mRequests);
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]);
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]);
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 {
513 sentData,nSentData,sentDataType,sentTag,
514 receivedData,nReceivedData,receivedDataType,receivedTag,
539 std::valarray<T>& data,
const tMPITag& tag)
override {
547 Send(env,dstCore,data,tag,mRequests[0]);
549 if (mBuffer.size()!=data.size()) mBuffer.resize(data.size());
550 Receive(env,dstCore,mBuffer,tag,mRequests[1]);
552 mReplacedValues=&data[0];
569 switch (mRequestsNumber) {
571 i=MPI_Wait(&mRequests[1],&mStatus);
574 i=MPI_Wait(&mRequests[0],&mStatus);
577 if (mReplacedValues!=
null) {
579 memcpy(mReplacedValues,&mBuffer[0],mBuffer.size()*
sizeof(T));
581 mReplacedValues=
null;
590 MPI_Wait(&mRequests[0],&mStatus);
591 MPI_Get_count(&mStatus,MPI_Type::GetPrimaryType<T>(),&nElements);
601 for (tUCInt i=0;i<mRequestsNumber;i++) {
606 if (mReplacedValues!=
null) {
607 memcpy(mReplacedValues,&mBuffer[0],mBuffer.size()*
sizeof(T));
608 mReplacedValues=
null;
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