/*! \file ep_test.cpp \since 2 may 2016 \brief Definitions of MPI test function: MPI_Test, MPI_Testsome, MPI_Testany, MPI_Testall */ #include "ep_lib.hpp" #include #include "ep_declaration.hpp" #include "ep_mpi.hpp" using namespace std; namespace ep_lib { int MPI_Test(MPI_Request *request, int *flag, MPI_Status *status) { Debug("MPI_Test with EP"); if(*request==0) return *flag=true; if((*request)->type !=1 && (*request)->type !=2 && (*request)->type !=3) { printf("MPI_Test : Error in request type\n"); exit(1); } if((*request)->type == 2) // irecv message not probed { *flag = false; return Request_Check(); } else //(*request)->type == 1 || (*request)->type == 3 // isend or imrecv { ::MPI_Status mpi_status; ::MPI_Test(to_mpi_request_ptr(*request), flag, &mpi_status); if(*flag) { status->mpi_status=new ::MPI_Status(mpi_status); status->ep_src = (*request)->ep_src; status->ep_tag = (*request)->ep_tag; status->ep_datatype = (*request)->ep_datatype; (*request)->state = 2; memcheck("delete "<< (*request)->mpi_request << " : in ep_lib::MPI_Test, delete (*request)->mpi_request"); delete (*request)->mpi_request; delete *request; *request=0; } } return Request_Check(); } int MPI_Testall(int count, MPI_Request *array_of_requests, int *flag, MPI_Status *array_of_statuses) { Debug("MPI_Testall with EP"); *flag = false; int rank = array_of_requests[0]->comm->ep_comm_ptr->size_rank_info[0].first; for(int i=0; itype == 2) { *flag=false; return Request_Check(); } } ::MPI_Request* mpi_request = new ::MPI_Request[count]; ::MPI_Status* mpi_status = new ::MPI_Status[count]; for(int i=0; i(array_of_requests[i]->mpi_request); } ::MPI_Testall(count, mpi_request, flag, mpi_status); if(*flag) { for(int i=0; iep_src; array_of_statuses[i].ep_tag = array_of_requests[i]->ep_tag; array_of_statuses[i].ep_datatype = array_of_requests[i]->ep_datatype; array_of_requests[i]->state = 2; memcheck("delete "<< array_of_requests[i]->mpi_request <<" : in ep_lib::MPI_Testall, array_of_requests["<mpi_request"); delete array_of_requests[i]->mpi_request; delete array_of_requests[i]; array_of_requests[i]=0; } } return Request_Check(); } }