void checkForRecvdMessages() { // SMART_ASSERT( fRecvdMessages.empty() ); static string where = "simx::Messenger::checkForRecvdMessages()"; // // MPI_Status status; // int recvd_msg; // handleMPIReturn( where, MPI_Test( &fRecvReq, &recvd_msg, &status )); int recvd_msg; MPI_Status status; if ( ( recvd_msg = testForRecvdMessages( status ) ) ) { int recv_size; handleMPIReturn( where, MPI_Get_count( &status, MPI_PACKED, &recv_size )); SMART_ASSERT( recv_size > 0 )( recv_size ); if ( status.MPI_TAG != SIMX_CONTROL_TAG ) { Logger::error() << where << " Message of Unknown MPI tag received " << endl; return; } Logger::debug2() << where << " Rank " << fMRank << "Message arrived from " << status.MPI_SOURCE << endl; recvPackedMessage( recv_size ); //Initiate another receive initReceive(); processReceivedMessages(); } }
int ProcessCommunicator :: initExchange(int tag) { int result = 1; result &= initSend(tag); result &= initReceive(tag); return result; }
void initCommunicator() { Logger::info() << "simx::Messenger: Checking if MPI has been initialized..." << std::endl; int mpi_running = 0; MPI_Initialized( &mpi_running ); if ( mpi_running ) { static string where = "simx::Messenger::initCommunicator()"; int mpi_res; Logger::info() << "simx::Messenger: MPI is active. Initializing simx communicator" << std::endl; int numMPIprocs; mpi_res = MPI_Comm_size( MPI_COMM_WORLD, &numMPIprocs ); handleMPIReturn( where, mpi_res ); //int* newRank = (int*)malloc( numMPIprocs * sizeof(int)); int newRank[numMPIprocs]; // if ( ! newRank ) // { // Logger::error() << "simx::Messenger: Malloc failure. " // << "Unable to initialize Messenger " << endl; // return; // } for ( int i = 0; i < numMPIprocs; i++ ) newRank[i] = i; handleMPIReturn( where, MPI_Comm_group( MPI_COMM_WORLD, &orig_group ) ); handleMPIReturn( where, MPI_Group_incl( orig_group, numMPIprocs, newRank, &new_group ) ); handleMPIReturn( where, MPI_Comm_create( MPI_COMM_WORLD, new_group, &SIMX_WORLD ) ); handleMPIReturn( where, MPI_Comm_rank ( SIMX_WORLD, &fMRank) ); simx::Logger::info() << "simx Messenger: SIMX_WORLD: Process Rank" << fMRank << std::endl; fMessengerActive = true; fRecvdMessages.clear(); initReceive(); } else { Logger::info() << "No MPI found, proceeding with simulation " << std::endl; } }