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

Last change on this file since 1365 was 1362, checked in by yushan, 6 years ago

unify type : MPI_Message MPI_Info

File size: 3.4 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"
[1295]12#include "ep_mpi.hpp"
[1134]13
14using namespace std;
15
[1196]16extern std::list< ep_lib::MPI_Request* > * EP_PendingRequests;
17#pragma omp threadprivate(EP_PendingRequests)
[1134]18
[1147]19namespace ep_lib
20{
[1185]21 
[1134]22
[1147]23  int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm, MPI_Status *status)
24  {
[1134]25
26    if(!comm.is_ep)
27    {
28      ::MPI_Status mpi_status;
[1295]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);
[1134]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;
[1147]45  }
[1134]46
47
48
49
[1147]50  int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm, MPI_Request *request)
51  {
[1134]52
[1147]53    Debug("MPI_Irecv with EP");
[1134]54    int dest_rank;
55    MPI_Comm_rank(comm, &dest_rank);
[1287]56   
[1134]57
[1147]58    if(!comm.is_ep)
59    {
60      ::MPI_Request mpi_request;
[1295]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);
[1134]62
[1147]63      request->mpi_request = mpi_request;
[1134]64      request->ep_src = src;
65      request->ep_datatype = datatype;
66      request->ep_tag = tag;
[1147]67    }
[1134]68
[1287]69    request->mpi_request = MPI_REQUEST_NULL.mpi_request;
[1147]70    request->buf = buf;
[1134]71    request->comm = comm;
[1147]72    request->type = 2;
[1134]73
[1147]74    request->ep_src = src;
[1134]75    request->ep_tag = tag;
76    request->ep_datatype = datatype;
77
[1187]78
79
[1147]80    /* With Improbe*/
81    Message_Check(comm);
[1134]82
[1187]83    if(EP_PendingRequests == 0 ) 
84    {
[1196]85      EP_PendingRequests = new std::list< MPI_Request* >;
[1187]86    }
87
[1196]88
[1185]89    EP_PendingRequests->push_back(request);
[1196]90
[1362]91
[1196]92    Request_Check();
[1187]93
[1134]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;
[1362]104    //::MPI_Message mpi_message = *(static_cast< ::MPI_Message* >(message->mpi_message));
105    ::MPI_Imrecv(buf, count, to_mpi_type(datatype), static_cast< ::MPI_Message* >(message->mpi_message), &mpi_request);         
106    //::MPI_Imrecv(buf, count, to_mpi_type(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;
[1362]112   
113    delete message->mpi_message;
[1134]114
115    return 0;
[1147]116  }
[1134]117
118
119  int MPI_Mrecv(void *buf, int count, MPI_Datatype datatype, MPI_Message *message, MPI_Status *status)
[1147]120  {
[1134]121    Debug("EP Mrecv called\n");
122
123    ::MPI_Status mpi_status;
[1362]124    //::MPI_Message mpi_message = *(static_cast< ::MPI_Message* >(message->mpi_message));
125    ::MPI_Mrecv(buf, count, to_mpi_type(datatype), static_cast< ::MPI_Message* >(message->mpi_message), &mpi_status);
126    //::MPI_Mrecv(buf, count, to_mpi_type(datatype), &mpi_message, &mpi_status);
[1134]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
[1362]133    delete message->mpi_message;
134
[1134]135    //check_sum_recv(buf, count, datatype, message->ep_src, message->ep_tag);
136
137    return 0;
[1147]138  }
[1134]139
[1147]140}
[1134]141
142
[1196]143
Note: See TracBrowser for help on using the repository browser.