12 #include "../shell/Shell.h"
15 1 + (
sizeof(
TgtInfo ) - 1 )/
sizeof( double );
27 recvBufSize_( reserveBufSize ),
28 setSendBuf_( setRecvBufSize, 0 ),
29 setRecvBuf_( setRecvBufSize, 0 ),
33 getHandlerBuf_(
TgtInfo::headerSize, 0 ),
44 MPI_Barrier( MPI_COMM_WORLD );
57 recvReq_.resize( Shell::numNodes() );
58 sendReq_.resize( Shell::numNodes() );
64 temp.MPI_SOURCE = temp.MPI_TAG = temp.MPI_ERROR = 0;
65 doneStatus_.resize( Shell::numNodes(), temp );
89 "Returns number of nodes that simulation runs on.",
94 "Returns index of current node.",
99 "Size of the send a receive buffers for each node.",
107 "Handles process call",
110 "Handles reinit call",
116 static Finfo* procShared[] = {
120 "Shared message for process and reinit",
121 procShared,
sizeof( procShared ) /
sizeof(
const Finfo* )
124 static Finfo* postMasterFinfos[] = {
132 static Cinfo postMasterCinfo (
136 sizeof( postMasterFinfos ) /
sizeof (
Finfo* ),
140 return &postMasterCinfo;
168 unsigned int reqIndex = 0;
178 &sendReq_[ reqIndex++ ]
185 MPI_Barrier( MPI_COMM_WORLD );
193 unsigned int reqIndex = 0;
203 &sendReq_[ reqIndex++ ]
210 MPI_Barrier( MPI_COMM_WORLD );
228 op->
opBuffer( e, &getReturnBuf[0] );
230 int size = getReturnBuf[0];
232 &getReturnBuf[1], size, MPI_DOUBLE,
250 double* getReturnBuf )
259 unsigned int numField = elm->
numField( di - start );
260 getReturnBuf[0] = numField;
261 for (
unsigned int j = 0; j < numField; ++j ) {
262 Eref er( elm, di, j );
265 unsigned int size = buf[0];
266 memcpy( &getReturnBuf[k], &buf[1], size *
sizeof(
double ) );
272 for (
unsigned int i = start; i < end; ++i ) {
273 Eref er( elm, i, 0 );
276 unsigned int size = buf[0];
277 memcpy( &getReturnBuf[k], &buf[1], size *
sizeof(
double ) );
292 &getReturnBuf[0], k, MPI_DOUBLE,
305 MPI_Test( &setSendReq_, &
isSetSent_, &setSendStatus_ );
309 MPI_Test( &setRecvReq_, &
isSetRecv_, &setRecvStatus_ );
313 int requestingNode = setRecvStatus_.MPI_SOURCE;
315 MPI_Get_count( &setRecvStatus_, MPI_DOUBLE, &count );
327 double* buf = &temp[0];
390 if ( done == MPI_UNDEFINED )
392 for (
int i = 0; i < done; ++i ) {
394 unsigned int recvNode = doneIndex;
398 MPI_Get_count( &doneStatus_[i], MPI_DOUBLE, &recvSize );
400 assert( recvSize <= static_cast< int >(
recvBufSize_ ) );
401 double* buf = &
recvBuf_[ recvNode ][0];
403 for (
int j = 0; j < recvSize; j += 4 ) {
409 while ( j < recvSize ) {
420 assert( buf - &
recvBuf_[recvNode][0] == j );
423 unsigned int k = recvNode;
451 cerr <<
"Error: PostMaster::addToSendBuf on node " <<
453 ": Data size (" << size <<
") goes past end of buffer\n";
457 tgt->
set( e.
objId(), bindIndex, size );
464 unsigned int size,
unsigned int hopType )
470 cerr <<
"Error: PostMaster::addToSetBuf on node " <<
472 ": Data size (" << size <<
") goes past end of buffer\n";
481 tgt->
set( e.
objId(), opIndex, hopType );
525 static MPI_Request getSendReq;
526 static MPI_Request getRecvReq;
527 static MPI_Status getSendStatus;
538 MPI_Irecv( &getRecvBuf[0],
555 while ( !complete ) {
556 MPI_Test( &getRecvReq, &complete, &getSendStatus );
557 assert ( complete != MPI_UNDEFINED );
561 return &getRecvBuf[0];
569 vector< double >& getRecvBuf )
573 static MPI_Request getSendReq;
574 static MPI_Request getRecvReq;
575 static MPI_Status doneStatus;
577 unsigned int targetNode = e.
getNode();
593 MPI_Irecv( &getRecvBuf[0],
611 MPI_Test( &getRecvReq, &done, &doneStatus );
612 assert ( done != MPI_UNDEFINED );
624 vector< vector< double > >& getRecvBuf,
625 vector< unsigned int >& numOnNode )
653 MPI_Irecv( &getRecvBuf[i][0],
673 unsigned int received = 0;
674 vector< int > getDoneIndices( Shell::numNodes(), 0 );
675 while( received < Shell::numNodes() - 1 ) {
676 MPI_Testsome( Shell::numNodes() -1, &getRecvReq[0], &done,
677 &getDoneIndices[0], &doneStatus[0] );
678 if ( done == MPI_UNDEFINED )
681 for (
int i = 0; i < done; ++i ) {
682 int doneIndex = getDoneIndices[i];
683 unsigned int recvNode = doneIndex;
692 numOnNode[recvNode] = getRecvBuf[recvNode][0];
724 for (
unsigned int i =0; i <
sendBuf_.size(); ++i )
const unsigned char MooseGetVecHop
static const OpFunc * lookop(unsigned int opIndex)
vector< double > setRecvBuf_
void handleRemoteGet(const Eref &e, const OpFunc *op, int requestingNode)
Handles 'get' calls from another node, to an object on mynode.
void dispatchSetBuf(const Eref &e)
Sends off contets of Set buffer.
static double op(double x)
unsigned int getNumNodes() const
unsigned int bindIndex() const
unsigned int getNode() const
double * addToSendBuf(const Eref &e, unsigned int bindIndex, unsigned int size)
Returns pointer to Send buffer for filling in arguments.
unsigned int dataIndex() const
unsigned int dataSize() const
void remoteGetVec(const Eref &e, unsigned int bindIndex, vector< vector< double > > &getRecvBuf, vector< unsigned int > &size)
This is a blocking call. However, it must still handle other.
virtual void sendBuffer(const Eref &e, double *buf) const =0
vector< vector< double > > recvBuf_
static const unsigned int headerSize
Element * element() const
unsigned int fieldIndex() const
static const int CONTROLTAG
unsigned int getBufferSize() const
virtual void opBuffer(const Eref &e, double *buf) const =0
Executes the OpFunc by converting args.
vector< unsigned int > sendSize_
void reinit(const Eref &e, ProcPtr p)
virtual void opVecBuffer(const Eref &e, double *buf) const
Executes the OpFunc for all data by converting a vector of args.
const unsigned char MooseGetHop
void process(const Eref &e, ProcPtr p)
vector< double > setSendBuf_
unsigned int recvBufSize_
double * remoteGet(const Eref &e, unsigned int bindIndex)
Blocking call to get a value from a remote node.
static unsigned int myNode
vector< int > doneIndices_
void clearPendingSetGet()
Clears arrived set and get calls.
int innerGetVec(const Eref &e, const OpFunc *op, double *getReturnBuf)
void setBufferSize(unsigned int size)
virtual unsigned int numField(unsigned int rawIndex) const =0
Returns number of field entries for specified data.
virtual bool hasFields() const =0
unsigned int getMyNode() const
Finfo * getSrcFinfo(unsigned int i) const
const Cinfo * cinfo() const
const unsigned char MooseSetVecHop
const unsigned char MooseSetHop
virtual bool isGlobal() const =0
True if there is a copy of every dataEntry on all nodes.
virtual unsigned int localDataStart() const =0
Returns index of first data entry on this node.
vector< vector< double > > sendBuf_
virtual unsigned int numLocalData() const =0
Returns number of local data entries on this node.
void clearPendingRecv()
Clears arrived messages.
unsigned int numRecvDone_
void clearPending()
All arrived messages and set calls are handled and cleared.
vector< vector< T > > resize(vector< vector< T > >table, unsigned int n, T init)
static unsigned int numNodes
void set(ObjId id, unsigned int bindIndex, unsigned int size)
void remoteFieldGetVec(const Eref &e, unsigned int bindIndex, vector< double > &getRecvBuf)
This is a blocking call. However, it must still handle other.
void handleRemoteGetVec(const Eref &e, const OpFunc *op, int requestingNode)
void finalizeSends()
Checks that all sends have gone out.
static unsigned int myNode()
double * addToSetBuf(const Eref &e, unsigned int opIndex, unsigned int size, unsigned int hopType)
Returns pointer to Set buffer for filling in arguments.
static const Cinfo * initCinfo()
static const Cinfo * initCinfo()
static unsigned int numNodes()
vector< double > getHandlerBuf_
static const unsigned int reserveBufSize
static const int RETURNTAG
static const unsigned int setRecvBufSize