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

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

bug fixed in MPI_Gather(v)

File size: 3.3 KB
RevLine 
[1134]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
[1147]16namespace ep_lib
17{
[1134]18
[1147]19  int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm, MPI_Status *status)
20  {
[1134]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;
[1147]44  }
[1134]45
46
47
48
[1147]49  int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm, MPI_Request *request)
50  {
[1134]51
[1147]52    Debug("MPI_Irecv with EP");
[1134]53    int dest_rank;
54    MPI_Comm_rank(comm, &dest_rank);
55
[1147]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);
[1134]61
[1147]62      request->mpi_request = mpi_request;
[1134]63      request->ep_src = src;
64      request->ep_datatype = datatype;
65      request->ep_tag = tag;
[1147]66    }
[1134]67
[1147]68    Message_Check(comm);
[1134]69               
70
[1147]71    request->mpi_request = MPI_REQUEST_NULL_STD;
72    request->buf = buf;
[1134]73    request->comm = comm;
[1147]74    request->type = 2;
[1134]75
[1147]76    request->ep_src = src;
[1134]77    request->ep_tag = tag;
78    request->ep_datatype = datatype;
79
[1147]80    /* With Improbe*/
81    Message_Check(comm);
[1134]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;
[1147]95  }
[1134]96
[1147]97  int MPI_Imrecv(void *buf, int count, MPI_Datatype datatype, MPI_Message *message, MPI_Request *request)
98  {
99    Debug("MPI_Imrecv");
[1134]100
[1147]101    request->type = 3;
[1134]102
103    ::MPI_Request mpi_request;
104    ::MPI_Message mpi_message = static_cast< ::MPI_Message >(message->mpi_message);
105               
[1147]106    ::MPI_Imrecv(buf, count, static_cast< ::MPI_Datatype>(datatype), &mpi_message, &mpi_request);
[1134]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;
[1147]115  }
[1134]116
117
118  int MPI_Mrecv(void *buf, int count, MPI_Datatype datatype, MPI_Message *message, MPI_Status *status)
[1147]119  {
[1134]120    Debug("EP Mrecv called\n");
121
122    ::MPI_Status mpi_status;
123    ::MPI_Message mpi_message = static_cast< ::MPI_Message >(message->mpi_message);
[1147]124   
125    ::MPI_Mrecv(buf, count, static_cast< ::MPI_Datatype>(datatype), &mpi_message, &mpi_status);
[1134]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;
[1147]135  }
[1134]136
[1147]137}
[1134]138
139
Note: See TracBrowser for help on using the repository browser.