Exemplo n.º 1
0
    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();
	}
      
    

    }
Exemplo n.º 2
0
int
ProcessCommunicator :: initExchange(int tag)
{
    int result = 1;
    result &= initSend(tag);
    result &= initReceive(tag);

    return result;
}
Exemplo n.º 3
0
    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;
	}
      
    }