From: Wolfgang Bangerth Date: Tue, 11 Jan 2022 19:09:20 +0000 (-0700) Subject: Query the size of the reply message from MPI. X-Git-Tag: v9.4.0-rc1~593^2~5 X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=26bb12502ae717417a771c75e98c146fbd01f50c;p=dealii.git Query the size of the reply message from MPI. This avoids requiring the user to do so by hand. --- diff --git a/include/deal.II/base/mpi_consensus_algorithms.templates.h b/include/deal.II/base/mpi_consensus_algorithms.templates.h index 54aa6e8daf..c6d21aa189 100644 --- a/include/deal.II/base/mpi_consensus_algorithms.templates.h +++ b/include/deal.II/base/mpi_consensus_algorithms.templates.h @@ -424,36 +424,45 @@ namespace Utilities const int tag_deliver = Utilities::MPI::internal::Tags:: consensus_algorithm_nbx_process_deliver; -# ifdef DEBUG // Just to be sure, double check that the message really // is already here -- in other words, that the following - // MPI_Recv is going to return immediately + // MPI_Recv is going to return immediately. But as part of + // this, we also use the status object to query the size + // of the message so that we can resize the receive buffer. + int request_is_pending; + MPI_Status status; { - int request_is_pending; - const auto ierr = MPI_Iprobe(target, - tag_deliver, - this->comm, - &request_is_pending, - MPI_STATUS_IGNORE); + const int ierr = MPI_Iprobe(target, + tag_deliver, + this->comm, + &request_is_pending, + &status); AssertThrowMPI(ierr); - - (void)request_is_pending; - Assert(request_is_pending, ExcInternalError()); } -# endif + + (void)request_is_pending; + Assert(request_is_pending, ExcInternalError()); // OK, so yes, a message is here. Receive it. - std::vector recv_buffer; - this->process.prepare_buffer_for_answer(target, recv_buffer); - - const int ierr = MPI_Recv(recv_buffer.data(), - recv_buffer.size() * sizeof(T2), - MPI_BYTE, - target, - tag_deliver, - this->comm, - MPI_STATUS_IGNORE); - AssertThrowMPI(ierr); + int message_size; + { + const int ierr = + MPI_Get_count(&status, MPI_BYTE, &message_size); + AssertThrowMPI(ierr); + } + Assert(message_size % sizeof(T2) == 0, ExcInternalError()); + std::vector recv_buffer(message_size / sizeof(T2)); + + { + const int ierr = MPI_Recv(recv_buffer.data(), + recv_buffer.size() * sizeof(T2), + MPI_BYTE, + target, + tag_deliver, + this->comm, + MPI_STATUS_IGNORE); + AssertThrowMPI(ierr); + } this->process.read_answer(target, recv_buffer); }