Geant4 Cross Reference |
1 // Copyright (C) 2010, Guy Barrand. All rights reserved. 2 // See the file tools.license for terms. 3 4 #ifndef toolx_mpi_wait_buffer 5 #define toolx_mpi_wait_buffer 6 7 #include <mpi.h> 8 9 #include <ostream> 10 11 namespace toolx { 12 namespace mpi { 13 14 inline bool wait_buffer(std::ostream& a_out,int a_rank,int a_src,int a_tag,const MPI_Comm& a_comm, 15 int& a_buffer_size,char*& a_buffer,int& a_probe_src,bool a_verbose = false) { 16 a_buffer = 0; 17 a_buffer_size = 0; 18 a_probe_src = -1; 19 20 MPI_Status status; 21 if(::MPI_Probe(a_src,a_tag,a_comm,&status)!=MPI_SUCCESS) { 22 a_out << "toolx::mpi::wait_buffer : rank " << a_rank << " : MPI_Probe : failed." << std::endl; 23 return false; 24 } 25 26 if(::MPI_Get_count(&status,MPI_CHAR,&a_buffer_size)!=MPI_SUCCESS) { 27 a_out << "toolx::mpi::wait_buffer : rank " << a_rank << " : MPI_Get_count : failed." << std::endl; 28 a_buffer_size = 0; 29 return false; 30 } 31 32 a_probe_src = status.MPI_SOURCE; 33 34 if(!a_buffer_size) { 35 a_out << "exlb::mpi::wait_buffer : MPI_Get_count returns zero data." << std::endl; 36 a_probe_src = -1; 37 return false; 38 } 39 40 if(a_verbose) a_out << "toolx::mpi::wait_buffer : rank " << a_rank << " : get_count " << a_buffer_size << std::endl; 41 42 a_buffer = new char[a_buffer_size]; 43 if(!a_buffer) { 44 a_out << "toolx::mpi::wait_buffer : rank " << a_rank << " : can't alloc buffer of size " << a_buffer_size << std::endl; 45 a_buffer_size = 0; 46 a_probe_src = -1; 47 return false; 48 } 49 50 if(::MPI_Recv(a_buffer,a_buffer_size,MPI_CHAR,status.MPI_SOURCE,status.MPI_TAG,a_comm,&status)!=MPI_SUCCESS) { 51 a_out << "toolx::mpi::wait_buffer : rank " << a_rank << " : MPI_Recv : failed." << std::endl; 52 a_buffer_size = 0; 53 delete [] a_buffer; 54 a_buffer = 0; 55 a_probe_src = -1; 56 return false; 57 } 58 59 if(a_verbose) a_out << "toolx::mpi::wait_buffer : rank " << a_rank << " : unpack data ..." << std::endl; 60 61 return true; 62 } 63 64 }} 65 66 #endif