int MPI_Recv_Nospin( void* buff, const int count, MPI_Datatype datatype, const int from, const int tag, MPI_Comm comm, MPI_Status* status ) { MPI_Request req; PMPI_Irecv( buff, count, datatype, from, tag, comm, &req ); timespec ts{ 0, nsec_start }; int flag = 0; while ( !flag ) { nanosleep( &ts, nullptr ); ts.tv_nsec = std::min( size_t(ts.tv_nsec << 1), nsec_max ); PMPI_Request_get_status( req, &flag, status ); } return status->MPI_ERROR; }
int MPI_Send_Nospin( void *buff, const int count, MPI_Datatype datatype, const int dest, const int tag, MPI_Comm comm ) { MPI_Request req; PMPI_Isend( buff, count, datatype, dest, tag, comm, &req ); MPI_Status status; timespec ts{ 0, nsec_start }; int flag = 0; while ( !flag ) { nanosleep( &ts, nullptr ); ts.tv_nsec = std::min( size_t(ts.tv_nsec << 1), nsec_max ); PMPI_Request_get_status( req, &flag, &status ); } return status.MPI_ERROR; }
void ompi_request_get_status_f(MPI_Fint *request, ompi_fortran_logical_t *flag, MPI_Fint *status, MPI_Fint *ierr) { int c_ierr; MPI_Status c_status; MPI_Request c_req = PMPI_Request_f2c( *request ); OMPI_LOGICAL_NAME_DECL(flag); /* This seems silly, but someone will do it */ if (OMPI_IS_FORTRAN_STATUS_IGNORE(status)) { *flag = OMPI_INT_2_LOGICAL(0); c_ierr = MPI_SUCCESS; } else { c_ierr = PMPI_Request_get_status(c_req, OMPI_LOGICAL_SINGLE_NAME_CONVERT(flag), &c_status); OMPI_SINGLE_INT_2_LOGICAL(flag); PMPI_Status_c2f( &c_status, status ); } if (NULL != ierr) *ierr = OMPI_INT_2_FINT(c_ierr); }
int MPI_Request_get_status( MPI_Request request, int *flag, MPI_Status *status){ return PMPI_Request_get_status( request, flag, status); }