source: XIOS/dev/branch_yushan/extern/src_ep_dev/ep_recv.cpp @ 1110

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

redefinition of mpi_any_source and mpi_any_tag

File size: 3.3 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
15
16namespace ep_lib {
17
18        int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm, MPI_Status *status)
19        {
20    int dest_rank;
21    MPI_Comm_rank(comm, &dest_rank);
22
23    if(!comm.is_ep)
24    {
25      ::MPI_Comm mpi_comm = static_cast< ::MPI_Comm >(comm.mpi_comm);
26      ::MPI_Status mpi_status;
27      ::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);
28
29      status->ep_src = src;
30      status->ep_tag = tag;
31      status->ep_datatype = datatype;
32
33      return 0; 
34    }
35
36    Message_Check(comm);
37
38    MPI_Request request;
39    MPI_Irecv(buf, count, datatype, src, tag, comm, &request);
40    MPI_Wait(&request, status);
41
42    return 0;
43        }
44
45
46
47
48        int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm, MPI_Request *request)
49        {
50
51                Debug("MPI_Irecv with EP");
52    int dest_rank;
53    MPI_Comm_rank(comm, &dest_rank);
54
55                if(!comm.is_ep)
56                {
57                  ::MPI_Request mpi_request;
58                  ::MPI_Comm mpi_comm = static_cast< ::MPI_Comm > (comm.mpi_comm);
59                  ::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);
60
61                  request->mpi_request = mpi_request;
62      request->ep_src = src;
63      request->ep_datatype = datatype;
64      request->ep_tag = tag;
65                }
66
67                Message_Check(comm);
68               
69
70                request->mpi_request = MPI_REQUEST_NULL_STD;
71                request->buf = buf;
72    request->comm = comm;
73                request->type = 2;
74
75                request->ep_src = src;
76    request->ep_tag = tag;
77    request->ep_datatype = datatype;
78
79
80   
81                /* With Improbe*/
82                Message_Check(comm);
83
84    int flag = false;
85    MPI_Message message;
86    MPI_Status status;
87   
88    MPI_Improbe(src, tag, comm, &flag, &message, &status);
89           
90    if(flag)
91    {
92      MPI_Imrecv(buf, count, datatype, &message, request);
93    }
94
95    return 0;
96        }
97
98        int MPI_Imrecv(void *buf, int count, MPI_Datatype datatype, MPI_Message *message, MPI_Request *request)
99        {
100                Debug("MPI_Imrecv");
101
102                request->type = 3;
103
104    ::MPI_Request mpi_request;
105    ::MPI_Message mpi_message = static_cast< ::MPI_Message >(message->mpi_message);
106               
107                ::MPI_Imrecv(buf, count, static_cast< ::MPI_Datatype>(datatype), &mpi_message, &mpi_request);
108
109    request->mpi_request = mpi_request;
110    request->ep_datatype = datatype;
111    request->ep_tag = message->ep_tag;
112    request->ep_src = message->ep_src;
113    request->buf = buf;
114
115    return 0;
116        }
117
118
119  int MPI_Mrecv(void *buf, int count, MPI_Datatype datatype, MPI_Message *message, MPI_Status *status)
120        {
121    Debug("EP Mrecv called\n");
122
123    ::MPI_Status mpi_status;
124    ::MPI_Message mpi_message = static_cast< ::MPI_Message >(message->mpi_message);
125               
126                ::MPI_Mrecv(buf, count, static_cast< ::MPI_Datatype>(datatype), &mpi_message, &mpi_status);
127
128    status->mpi_status = new ::MPI_Status(mpi_status);
129    status->ep_src = message->ep_src;
130    status->ep_datatype = datatype;
131    status->ep_tag = message->ep_tag;
132
133    //check_sum_recv(buf, count, datatype, message->ep_src, message->ep_tag);
134
135    return 0;
136        }
137
138
139 
140
141}
Note: See TracBrowser for help on using the repository browser.