source: XIOS/dev/branch_openmp/extern/ep_dev/ep_recv.cpp @ 1501

Last change on this file since 1501 was 1500, checked in by yushan, 6 years ago

save dev

File size: 3.4 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#include "ep_mpi.hpp"
13
14using namespace std;
15
16extern std::list< ep_lib::MPI_Request* > * EP_PendingRequests;
17#pragma omp threadprivate(EP_PendingRequests)
18
19namespace ep_lib
20{
21 
22
23  int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm, MPI_Status *status)
24  {
25
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);
39
40    MPI_Request request;
41    MPI_Irecv(buf, count, datatype, src, tag, comm, &request);
42    MPI_Wait(&request, status);
43
44    return 0;
45  }
46
47
48
49
50  int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm, MPI_Request *request)
51  {
52
53    Debug("MPI_Irecv with EP");
54    int dest_rank;
55    MPI_Comm_rank(comm, &dest_rank);
56   
57
58    if(!comm->is_ep)
59    {
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);
62
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    }
68   
69    *request = new ep_request;
70    printf("new %p : in ep_lib::MPI_Irecv, *request = new ep_request\n", (*request));
71
72    (*request)->mpi_request = new ::MPI_Request;
73    printf("new %p : in ep_lib::MPI_Irecv, (*request)->mpi_request = new ::MPI_Request\n", (*request)->mpi_request);
74   
75    (*request)->buf = buf;
76    (*request)->comm = comm;
77    (*request)->type = 2;
78    (*request)->state = 0;
79   
80
81    (*request)->ep_src = src;
82    (*request)->ep_tag = tag;
83    (*request)->ep_datatype = datatype;
84   
85   
86    /* With Improbe*/
87
88    if(EP_PendingRequests == 0 ) 
89    {
90      EP_PendingRequests = new std::list< MPI_Request* >;
91    }
92
93    EP_PendingRequests->push_back(request);                                                               
94                                         
95    Request_Check();
96
97    return 0;
98  }
99
100  int MPI_Imrecv(void *buf, int count, MPI_Datatype datatype, MPI_Message *message, MPI_Request *request)
101  {
102    Debug("MPI_Imrecv");
103
104    (*request)->type = 3;
105       
106    ::MPI_Imrecv(buf, count, to_mpi_type(datatype), to_mpi_message_ptr(*message), to_mpi_request_ptr(*request));               
107
108    (*request)->ep_datatype = datatype;
109    (*request)->ep_tag = (*message)->ep_tag;
110    (*request)->ep_src = (*message)->ep_src;
111   
112   
113    return 0;
114  }
115
116
117  int MPI_Mrecv(void *buf, int count, MPI_Datatype datatype, MPI_Message *message, MPI_Status *status)
118  {
119    Debug("EP Mrecv called\n");
120
121    ::MPI_Status mpi_status;
122    ::MPI_Mrecv(buf, count, to_mpi_type(datatype), static_cast< ::MPI_Message* >((*message)->mpi_message), &mpi_status);
123
124    status->mpi_status = new ::MPI_Status(mpi_status);
125    status->ep_src = (*message)->ep_src;
126    status->ep_datatype = datatype;
127    status->ep_tag = (*message)->ep_tag;
128
129    delete (*message)->mpi_message;
130
131    //check_sum_recv(buf, count, datatype, message->ep_src, message->ep_tag);
132
133    return 0;
134  }
135
136}
137
138
139
Note: See TracBrowser for help on using the repository browser.