#include "mpi_test_incl.h" class Master : public MasterBase { public: Master(int slaves, int iters, FILE* fpLog) : MasterBase(slaves, iters, fpLog) {} void RcvSyncP2P(); }; void Master::RcvSyncP2P() { MPI_Request send_request, recv_request; MPI_Status status; int retErr = MPI_SUCCESS; int testSndNum; int slaveRank = 1; int slaveIdx = 0; int flag; while(mSlavesFinished < mSlaves) { slaveRank = slaveIdx + 1; fflush(mFpLog); MPI_Irecv(&(mRcvNumsBuf[slaveIdx]), 1, MPI::INT, slaveRank, MPI::ANY_TAG, MPI_COMM_WORLD, &recv_request); retErr = MPI_Wait(&recv_request, &status); // if ((retErr != MPI_SUCCESS) && ((retErr&0xFFFFFF) != 0x29A20F) ) if (retErr != MPI_SUCCESS) { handleMPIerror(mFpLog, "Receive error ", retErr, &status); mIsSlaveLives[slaveIdx] = 0; ++mSlavesFinished; } else { // receive OK. Test for end of iterations // fprintf(mFpLog, "From rank %d, Got number = %d \n", slaveRank, mRcvNumsBuf[slaveIdx]); ++mSlavesRcvIters[slaveIdx]; if (mSlavesRcvIters[slaveIdx] == nIters)// no more receive { fprintf(mFpLog, "\n\nFrom rank %d, Got number = %d \n", slaveRank, mRcvNumsBuf[slaveIdx]); fprintf(mFpLog, "Slave %d finished\n\n", slaveRank); ++mSlavesFinished; } } int nLoopIters = 0; do { slaveIdx = (slaveIdx + 1) % mSlaves; } while(!mIsSlaveLives[slaveIdx] && nLoopIters++