Changeset 1539 for XIOS/dev/branch_openmp/extern/src_ep_dev/ep_message.cpp
- Timestamp:
- 06/12/18 11:54:13 (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/dev/branch_openmp/extern/src_ep_dev/ep_message.cpp
r1533 r1539 32 32 std::list<MPI_Request* >::iterator it; 33 33 34 //show_EP_PendingRequests(EP_PendingRequests);34 show_EP_PendingRequests(EP_PendingRequests); 35 35 36 36 … … 81 81 } 82 82 83 if((*(*it))-> state == 0)83 if((*(*it))->probed == false) 84 84 { 85 85 #pragma omp critical (_query0) 86 86 { 87 MPI_Iprobe ((*(*it))->ep_src, (*(*it))->ep_tag, ((*(*it))->comm), &probed, &status);87 MPI_Iprobe_endpoint((*(*it))->ep_src, (*(*it))->ep_tag, ((*(*it))->comm), &probed, &status); 88 88 if(probed) 89 89 { … … 95 95 96 96 97 MPI_Improbe ((*(*it))->ep_src, (*(*it))->ep_tag, (*(*it))->comm, &probed, message, &status);97 MPI_Improbe_endpoint((*(*it))->ep_src, (*(*it))->ep_tag, (*(*it))->comm, &probed, message, &status); 98 98 99 99 } … … 107 107 MPI_Imrecv((*(*it))->buf, recv_count, (*(*it))->ep_datatype, message, *it); 108 108 (*(*it))->type = 3; 109 (*(*it))-> state = 1;109 (*(*it))->probed = true; 110 110 111 111 memcheck("delete "<< status.mpi_status <<" : in ep_lib::Request_Check, delete status.mpi_status"); … … 133 133 int Message_Check(MPI_Comm comm) 134 134 { 135 if(!comm->is_ep) return MPI_SUCCESS; 136 137 if(comm->is_intercomm) 138 { 139 Message_Check_intercomm(comm); 140 } 141 142 return Message_Check_intracomm(comm); 143 144 } 145 146 147 int Message_Check_intracomm(MPI_Comm comm) 135 if(comm->is_ep) return Message_Check_endpoint(comm); 136 } 137 138 139 int Message_Check_endpoint(MPI_Comm comm) 148 140 { 149 141 … … 204 196 } 205 197 206 207 int Message_Check_intercomm(MPI_Comm comm)208 {209 if(!comm->ep_comm_ptr->intercomm->mpi_inter_comm) return 0;210 211 Debug("Message probing for intercomm\n");212 213 int flag = true;214 ::MPI_Message message;215 ::MPI_Status status;216 int current_ep_rank;217 MPI_Comm_rank(comm, ¤t_ep_rank);218 219 while(flag) // loop until the end of global queue "comm->ep_comm_ptr->intercomm->mpi_inter_comm"220 {221 Debug("Message probing for intracomm\n");222 223 #pragma omp critical (_mpi_call)224 {225 ::MPI_Iprobe(MPI_ANY_SOURCE, MPI_ANY_TAG, to_mpi_comm(comm->ep_comm_ptr->intercomm->mpi_inter_comm), &flag, &status);226 if(flag)227 {228 Debug("find message in mpi comm \n");229 ::MPI_Mprobe(status.MPI_SOURCE, status.MPI_TAG, to_mpi_comm(comm->ep_comm_ptr->intercomm->mpi_inter_comm), &message, &status);230 }231 }232 233 234 if(flag)235 {236 237 MPI_Message msg = new ep_message;238 msg->mpi_message = new ::MPI_Message(message);239 240 memcheck("new "<< msg <<" : in ep_lib::Message_Check, msg = new ep_message");241 memcheck("new "<< msg->mpi_message <<" : in ep_lib::Message_Check, msg->mpi_message = new ::MPI_Message");242 243 244 msg->ep_tag = bitset<15>(status.MPI_TAG >> 16).to_ulong();245 int src_loc = bitset<8> (status.MPI_TAG >> 8) .to_ulong();246 int dest_loc = bitset<8> (status.MPI_TAG) .to_ulong();247 int src_mpi = status.MPI_SOURCE;248 249 msg->ep_src = get_ep_rank(comm, src_loc, src_mpi);250 #ifdef _showinfo251 printf("status.MPI_TAG = %d, src_loc = %d, dest_loc = %d, ep_tag = %d\n", status.MPI_TAG, src_loc, dest_loc, msg->ep_tag);252 #endif253 254 msg->mpi_status = new ::MPI_Status(status);255 memcheck("new "<< msg->mpi_status <<" : in ep_lib::Message_Check, msg->mpi_status = new ::MPI_Status");256 257 #pragma omp critical (_query)258 {259 #pragma omp flush260 comm->ep_comm_ptr->comm_list[dest_loc]->ep_comm_ptr->message_queue->push_back(msg);261 memcheck("comm->ep_comm_ptr->comm_list["<<dest_loc<<"]->ep_comm_ptr->message_queue->size = "<<comm->ep_comm_ptr->comm_list[dest_loc]->ep_comm_ptr->message_queue->size());262 #pragma omp flush263 }264 }265 }266 267 Message_Check_intracomm(comm);268 269 return MPI_SUCCESS;270 }271 272 273 198 274 199 void show_EP_PendingRequests(std::list< ep_lib::MPI_Request* > * EP_PendingRequest) … … 310 235 311 236 } 237
Note: See TracChangeset
for help on using the changeset viewer.