Changeset 1520 for XIOS/dev/branch_openmp/extern/src_ep_dev/ep_recv.cpp
- Timestamp:
- 06/04/18 19:25:08 (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/dev/branch_openmp/extern/src_ep_dev/ep_recv.cpp
r1374 r1520 19 19 namespace ep_lib 20 20 { 21 22 21 23 22 int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm, MPI_Status *status) 24 23 { 25 24 26 if(!comm.is_ep) 27 { 28 ::MPI_Status mpi_status; 29 ::MPI_Recv(buf, count, to_mpi_type(datatype), src<0? MPI_ANY_SOURCE : src, tag<0? MPI_ANY_TAG: tag, to_mpi_comm(comm.mpi_comm), &mpi_status); 30 31 status->ep_src = src; 32 status->ep_tag = tag; 33 status->ep_datatype = datatype; 34 35 return 0; 36 } 37 38 Message_Check(comm); 25 if(!comm->is_ep) return MPI_Recv_mpi(buf, count, datatype, src, tag, comm, status); 26 27 Debug("MPI_Recv with EP"); 39 28 40 29 MPI_Request request; … … 45 34 } 46 35 47 36 48 37 49 38 50 39 int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm, MPI_Request *request) 51 40 { 52 41 if(!comm->is_ep) return MPI_Irecv_mpi(buf, count, datatype, src, tag, comm, request); 42 53 43 Debug("MPI_Irecv with EP"); 54 44 int dest_rank; 55 45 MPI_Comm_rank(comm, &dest_rank); 56 46 47 *request = new ep_request; 48 memcheck("new " << *request <<" : in ep_lib::MPI_Irecv, *request = new ep_request"); 57 49 58 if(!comm.is_ep) 50 (*request)->mpi_request = new ::MPI_Request; 51 memcheck("new " << (*request)->mpi_request << " : in ep_lib::MPI_Irecv, (*request)->mpi_request = new ::MPI_Request"); 52 53 (*request)->buf = buf; 54 (*request)->comm = comm; 55 (*request)->type = 2; 56 (*request)->state = 0; 57 58 59 (*request)->ep_src = src; 60 (*request)->ep_tag = tag; 61 (*request)->ep_datatype = datatype; 62 63 if(EP_PendingRequests == 0 ) EP_PendingRequests = new std::list< MPI_Request* >; 64 65 EP_PendingRequests->push_back(request); 66 67 int world_rank; 68 MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); 69 if(world_rank==2) 59 70 { 60 ::MPI_Request mpi_request; 61 ::MPI_Irecv(buf, count, to_mpi_type(datatype), src<0? MPI_ANY_SOURCE : src, tag<0? MPI_ANY_TAG: tag, to_mpi_comm(comm.mpi_comm), &mpi_request); 71 printf("ep %d inserted one pending request %p\n", world_rank, *request); 72 } 73 74 memcheck("EP_PendingRequests["<<ep_rank<<"]->size() = " << EP_PendingRequests->size()); 62 75 63 request->mpi_request = new ::MPI_Request(mpi_request); 64 request->ep_src = src; 65 request->ep_datatype = datatype; 66 request->ep_tag = tag; 67 } 76 #ifdef _showinfo 77 if(comm->is_intercomm) 78 { 79 int ep_dest_loc = comm->ep_rank_map->at(dest_rank).first; 80 int ep_src_loc = comm->ep_comm_ptr->intercomm->intercomm_rank_map->at(src).first; 81 int mpi_tag = tag_combine(tag, ep_src_loc, ep_dest_loc); 82 int mpi_dest = comm->ep_comm_ptr->intercomm->intercomm_rank_map->at(src).second.first; 68 83 69 request->buf = buf;70 request->comm = comm;71 request->type = 2; 84 printf("Irecv : ep_src_loc = %d, ep_dest_loc = %d, mpi_src = %d, mpi_dest = %d, mpi_tag = %d\n", ep_src_loc, ep_dest_loc, comm->ep_comm_ptr->size_rank_info[2].first, mpi_dest, mpi_tag); 85 } 86 #endif 72 87 73 request->ep_src = src; 74 request->ep_tag = tag; 75 request->ep_datatype = datatype; 88 return Request_Check(); 89 } 90 91 int MPI_Mrecv(void *buf, int count, MPI_Datatype datatype, MPI_Message *message, MPI_Status *status) 92 { 93 Debug("MPI_Mrecv with MPI/EP"); 76 94 95 status->mpi_status = new ::MPI_Status; 96 memcheck("new " << status->mpi_status << " : in ep_lib::MPI_Mrecv, status->mpi_status = new ::MPI_Status"); 97 98 ::MPI_Mrecv(buf, count, to_mpi_type(datatype), static_cast< ::MPI_Message* >((*message)->mpi_message), to_mpi_status_ptr(*status)); 77 99 100 101 status->ep_src = (*message)->ep_src; 102 status->ep_datatype = datatype; 103 status->ep_tag = (*message)->ep_tag; 78 104 79 /* With Improbe*/80 Message_Check(comm);105 memcheck("delete " << (*message)->mpi_message << " : in ep_lib::MPI_Mrecv, delete (*message)->mpi_message"); 106 delete (*message)->mpi_message; 81 107 82 if(EP_PendingRequests == 0 ) 83 { 84 EP_PendingRequests = new std::list< MPI_Request* >; 85 } 108 #ifdef _check_sum 109 check_sum_recv(buf, count, datatype, message->ep_src, message->ep_tag); 110 #endif 86 111 112 return Request_Check(); 113 } 87 114 88 EP_PendingRequests->push_back(request);89 90 91 Request_Check();92 93 return 0;94 }95 115 96 116 int MPI_Imrecv(void *buf, int count, MPI_Datatype datatype, MPI_Message *message, MPI_Request *request) 97 117 { 98 Debug("MPI_Imrecv ");118 Debug("MPI_Imrecv with MPI/EP"); 99 119 100 request->type = 3; 120 (*request)->type = 3; 121 (*request)->ep_datatype = datatype; 122 (*request)->ep_tag = (*message)->ep_tag; 123 (*request)->ep_src = (*message)->ep_src; 124 125 (*request)->state = 1; 126 127 ::MPI_Imrecv(buf, count, to_mpi_type(datatype), to_mpi_message_ptr(*message), to_mpi_request_ptr(*request)); 128 129 memcheck("delete " << (*message)->mpi_message << " : in ep_lib::MPI_Imrecv, delete (*message)->mpi_message"); 130 delete (*message)->mpi_message; 101 131 102 ::MPI_Request mpi_request; 103 ::MPI_Imrecv(buf, count, to_mpi_type(datatype), static_cast< ::MPI_Message* >(message->mpi_message), &mpi_request); 132 #ifdef _check_sum 133 check_sum_recv(buf, count, datatype, message->ep_src, message->ep_tag); 134 #endif 104 135 105 request->mpi_request = new ::MPI_Request(mpi_request);106 request->ep_datatype = datatype;107 request->ep_tag = message->ep_tag;108 request->ep_src = message->ep_src;109 136 110 delete message->mpi_message; 111 112 return 0; 137 return Request_Check(); 113 138 } 114 139 115 140 116 int MPI_Mrecv(void *buf, int count, MPI_Datatype datatype, MPI_Message *message, MPI_Status *status)141 int MPI_Recv_mpi(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm, MPI_Status *status) 117 142 { 118 Debug("EP Mrecv called\n"); 143 Debug("MPI_Recv with MPI"); 144 status->ep_src = src; 145 status->ep_tag = tag; 146 status->ep_datatype = datatype; 147 148 return ::MPI_Recv(buf, count, to_mpi_type(datatype), src<0? MPI_ANY_SOURCE : src, tag<0? MPI_ANY_TAG: tag, to_mpi_comm(comm->mpi_comm), to_mpi_status_ptr(*status)); 149 } 150 151 int MPI_Irecv_mpi(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm, MPI_Request *request) 152 { 153 Debug("MPI_Irecv with MPI"); 154 int dest_rank; 155 MPI_Comm_rank(comm, &dest_rank); 156 157 *request = new ep_request; 158 memcheck("new "<< *request <<" : in ep_lib::MPI_Irecv, *request = new ep_request"); 119 159 120 ::MPI_Status mpi_status; 121 ::MPI_Mrecv(buf, count, to_mpi_type(datatype), static_cast< ::MPI_Message* >(message->mpi_message), &mpi_status); 122 123 status->mpi_status = new ::MPI_Status(mpi_status); 124 status->ep_src = message->ep_src; 125 status->ep_datatype = datatype; 126 status->ep_tag = message->ep_tag; 127 128 delete message->mpi_message; 129 130 //check_sum_recv(buf, count, datatype, message->ep_src, message->ep_tag); 131 132 return 0; 160 (*request)->mpi_request = new ::MPI_Request; 161 memcheck("new "<< (*request)->mpi_request <<" : in ep_lib::MPI_Irecv, (*request)->mpi_request = new ::MPI_Request"); 162 163 (*request)->ep_src = src; 164 (*request)->ep_datatype = datatype; 165 (*request)->type = 2; 166 (*request)->ep_tag = tag; 167 168 return ::MPI_Irecv(buf, count, to_mpi_type(datatype), src<0? MPI_ANY_SOURCE : src, tag<0? MPI_ANY_TAG: tag, to_mpi_comm(comm->mpi_comm), to_mpi_request_ptr(*request)); 133 169 } 134 135 170 } 136 171
Note: See TracChangeset
for help on using the changeset viewer.