source: XIOS/dev/branch_yushan_merged/extern/src_ep_dev/ep_recv.cpp @ 1147

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

bug fixed in MPI_Gather(v)

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