source: XIOS/dev/branch_openmp/extern/src_ep_dev/ep_recv.cpp @ 1207

Last change on this file since 1207 was 1196, checked in by yushan, 7 years ago

add request_check. test client and complete OK

File size: 4.8 KB
Line 
1/*!
2   \file ep_recv.cpp
3   \since 2 may 2016
4
5   \brief Definitions of MPI receive functions: MPI_Recv, MPI_Mrecv, MPI_Irecv, MPI_Imrecv
6 */
7
8
9#include "ep_lib.hpp"
10#include <mpi.h>
11#include "ep_declaration.hpp"
12
13using namespace std;
14
15extern std::list< ep_lib::MPI_Request* > * EP_PendingRequests;
16#pragma omp threadprivate(EP_PendingRequests)
17
18namespace ep_lib
19{
20 
21
22  int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm, MPI_Status *status)
23  {
24    int dest_rank;
25    MPI_Comm_rank(comm, &dest_rank);
26
27    if(!comm.is_ep)
28    {
29      ::MPI_Comm mpi_comm = static_cast< ::MPI_Comm >(comm.mpi_comm);
30      ::MPI_Status mpi_status;
31      ::MPI_Recv(buf, count, static_cast< ::MPI_Datatype >(datatype), src<0? MPI_ANY_SOURCE : src, tag<0? MPI_ANY_TAG: tag, mpi_comm, &mpi_status);
32
33      status->ep_src = src;
34      status->ep_tag = tag;
35      status->ep_datatype = datatype;
36
37      return 0; 
38    }
39
40    Message_Check(comm);
41
42    MPI_Request request;
43    MPI_Irecv(buf, count, datatype, src, tag, comm, &request);
44    MPI_Wait(&request, status);
45
46    return 0;
47  }
48
49
50
51
52  int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm, MPI_Request *request)
53  {
54
55    Debug("MPI_Irecv with EP");
56    int dest_rank;
57    MPI_Comm_rank(comm, &dest_rank);
58    int world_rank;
59    MPI_Comm_rank(MPI_COMM_WORLD_STD, &world_rank);
60
61    if(!comm.is_ep)
62    {
63      ::MPI_Request mpi_request;
64      ::MPI_Comm mpi_comm = static_cast< ::MPI_Comm > (comm.mpi_comm);
65      ::MPI_Irecv(buf, count, static_cast< ::MPI_Datatype> (datatype), src<0? MPI_ANY_SOURCE : src, tag<0? MPI_ANY_TAG: tag, mpi_comm, &mpi_request);
66
67      request->mpi_request = mpi_request;
68      request->ep_src = src;
69      request->ep_datatype = datatype;
70      request->ep_tag = tag;
71    }
72
73    request->mpi_request = MPI_REQUEST_NULL_STD;
74    request->buf = buf;
75    request->comm = comm;
76    request->type = 2;
77
78    request->ep_src = src;
79    request->ep_tag = tag;
80    request->ep_datatype = datatype;
81
82
83
84    /* With Improbe*/
85    Message_Check(comm);
86
87    if(EP_PendingRequests == 0 ) 
88    {
89      EP_PendingRequests = new std::list< MPI_Request* >;
90      //printf("proc %d(%d) : EP_PendingRequests allocated, add = %p\n", dest_rank, world_rank, EP_PendingRequests); 
91    }
92
93
94    EP_PendingRequests->push_back(request);
95
96    Request_Check();
97    //printf("proc %d(%d) : EP_PendingRequests insert one request, src = %d(%d), tag = %d(%d), size = %d; request add = %p\n",
98    //        dest_rank, world_rank, EP_PendingRequests->back()->ep_src, request->ep_src,
99    //        EP_PendingRequests->back()->ep_tag, request->ep_tag,
100    //        EP_PendingRequests->size(), request);
101   
102    // check all EP_PendingRequests     
103    //for(std::list<MPI_Request* >::iterator it = EP_PendingRequests->begin(); it!=EP_PendingRequests->end(); )
104    //{
105    //if((*it)->type == 3)
106    //{
107    //    EP_PendingRequests->erase(it);
108   //     it = EP_PendingRequests->begin();
109    //    continue;
110     // }
111       
112      //int probed = false;
113      //MPI_Message pending_message;
114      //MPI_Status pending_status;
115   
116      //MPI_Improbe((*it)->ep_src, (*it)->ep_tag, (*it)->comm, &probed, &pending_message, &pending_status);
117   
118      //if(probed)
119      //{
120        //int count;
121        //MPI_Get_count(&pending_status, (*it)->ep_datatype, &count);
122        //MPI_Imrecv((*it)->buf, count, (*it)->ep_datatype, &pending_message, *it);
123
124        //EP_PendingRequests->erase(it);
125        //if(EP_PendingRequests->empty()) return 0;
126       
127        //it = EP_PendingRequests->begin();
128        //continue;
129     // }
130
131      //it++;
132   // }
133   
134    return 0;
135  }
136
137  int MPI_Imrecv(void *buf, int count, MPI_Datatype datatype, MPI_Message *message, MPI_Request *request)
138  {
139    Debug("MPI_Imrecv");
140
141    request->type = 3;
142
143    ::MPI_Request mpi_request;
144    ::MPI_Message mpi_message = static_cast< ::MPI_Message >(message->mpi_message);
145               
146    ::MPI_Imrecv(buf, count, static_cast< ::MPI_Datatype>(datatype), &mpi_message, &mpi_request);
147
148    request->mpi_request = mpi_request;
149    request->ep_datatype = datatype;
150    request->ep_tag = message->ep_tag;
151    request->ep_src = message->ep_src;
152
153    return 0;
154  }
155
156
157  int MPI_Mrecv(void *buf, int count, MPI_Datatype datatype, MPI_Message *message, MPI_Status *status)
158  {
159    Debug("EP Mrecv called\n");
160
161    ::MPI_Status mpi_status;
162    ::MPI_Message mpi_message = static_cast< ::MPI_Message >(message->mpi_message);
163   
164    ::MPI_Mrecv(buf, count, static_cast< ::MPI_Datatype>(datatype), &mpi_message, &mpi_status);
165
166    status->mpi_status = new ::MPI_Status(mpi_status);
167    status->ep_src = message->ep_src;
168    status->ep_datatype = datatype;
169    status->ep_tag = message->ep_tag;
170
171    //check_sum_recv(buf, count, datatype, message->ep_src, message->ep_tag);
172
173    return 0;
174  }
175
176}
177
178
179
Note: See TracBrowser for help on using the repository browser.