source: XIOS/dev/dev_trunk_omp/extern/src_ep_dev/ep_accumulate.cpp @ 1646

Last change on this file since 1646 was 1646, checked in by yushan, 5 years ago

branch merged with trunk @1645. arch file (ep&mpi) added for ADA

File size: 5.4 KB
Line 
1#ifdef _usingEP
2#include "ep_lib.hpp"
3#include <mpi.h>
4#include "ep_declaration.hpp"
5#include "ep_mpi.hpp"
6
7using namespace std;
8
9namespace ep_lib
10{
11
12        int MPI_Accumulate(const void *origin_addr, int origin_count, MPI_Datatype origin_datatype, 
13                     int target_rank, MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Op op, MPI_Win win)
14  {
15    int target_mpi_rank   = win->comm->ep_rank_map->at(target_rank).second;
16    int target_local_rank = win->comm->ep_rank_map->at(target_rank).first;
17    int num_ep = win->comm->ep_comm_ptr->size_rank_info[1].second;
18    if(num_ep==1)
19      return  ::MPI_Accumulate(origin_addr, origin_count, to_mpi_type(origin_datatype), target_mpi_rank, to_mpi_aint(target_disp), target_count, to_mpi_type(target_datatype), 
20                               to_mpi_op(op), to_mpi_win(win->server_win[target_local_rank]));
21
22    else
23        return  ::MPI_Accumulate(origin_addr, origin_count, to_mpi_type(origin_datatype), target_mpi_rank, to_mpi_aint(target_disp), target_count, to_mpi_type(target_datatype), 
24                               to_mpi_op(op), to_mpi_win(win->client_win));
25  }
26
27  int MPI_Raccumulate(const void *origin_addr, int origin_count, MPI_Datatype origin_datatype, 
28                     int target_rank, MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Op op, MPI_Win win, MPI_Request *request)
29  {
30    int target_mpi_rank   = win->comm->ep_rank_map->at(target_rank).second;
31    int target_local_rank = win->comm->ep_rank_map->at(target_rank).first;
32    int num_ep = win->comm->ep_comm_ptr->size_rank_info[1].second;
33    ::MPI_Request mpi_request;
34
35    if(num_ep==1)
36    {
37      int return_value = ::MPI_Raccumulate(origin_addr, origin_count, to_mpi_type(origin_datatype), target_mpi_rank, to_mpi_aint(target_disp), target_count, to_mpi_type(target_datatype), 
38                                   to_mpi_op(op), to_mpi_win(win->server_win[target_local_rank]), &mpi_request);
39      (*request)->mpi_request = new ::MPI_Request(mpi_request);
40
41      (*request)->ep_datatype = origin_datatype;
42      (*request)->type = 1;
43      return return_value;
44    }
45
46    else
47    {
48      int return_value = ::MPI_Raccumulate(origin_addr, origin_count, to_mpi_type(origin_datatype), target_mpi_rank, to_mpi_aint(target_disp), target_count, to_mpi_type(target_datatype), 
49                                   to_mpi_op(op), to_mpi_win(win->client_win), &mpi_request);
50      (*request)->mpi_request = new ::MPI_Request(mpi_request);
51
52      (*request)->ep_datatype = origin_datatype;
53      (*request)->type = 1;
54      return return_value;
55    }
56  }
57
58
59  int MPI_Get_accumulate(const void *origin_addr, int origin_count, MPI_Datatype origin_datatype, void *result_addr, 
60                         int result_count, MPI_Datatype result_datatype, int target_rank, MPI_Aint target_disp,
61                         int target_count, MPI_Datatype target_datatype, MPI_Op op, MPI_Win win)
62  {
63    int target_mpi_rank   = win->comm->ep_rank_map->at(target_rank).second;
64    int target_local_rank = win->comm->ep_rank_map->at(target_rank).first;
65    int num_ep = win->comm->ep_comm_ptr->size_rank_info[1].second;
66    if(num_ep==1)
67      return ::MPI_Get_accumulate(origin_addr, origin_count, to_mpi_type(origin_datatype), result_addr, result_count, to_mpi_type(result_datatype), target_mpi_rank, to_mpi_aint(target_disp), target_count,
68                                  to_mpi_type(target_datatype), to_mpi_op(op), to_mpi_win(win->server_win[target_local_rank]));
69    else
70      return ::MPI_Get_accumulate(origin_addr, origin_count, to_mpi_type(origin_datatype), result_addr, result_count, to_mpi_type(result_datatype), target_mpi_rank, to_mpi_aint(target_disp), target_count,
71                                  to_mpi_type(target_datatype), to_mpi_op(op), to_mpi_win(win->client_win));
72  }
73
74  int MPI_Rget_accumulate(const void *origin_addr, int origin_count, MPI_Datatype origin_datatype, void *result_addr, 
75                         int result_count, MPI_Datatype result_datatype, int target_rank, MPI_Aint target_disp,
76                         int target_count, MPI_Datatype target_datatype, MPI_Op op, MPI_Win win, MPI_Request *request)
77  {
78    int target_mpi_rank   = win->comm->ep_rank_map->at(target_rank).second;
79    int target_local_rank = win->comm->ep_rank_map->at(target_rank).first;
80    int num_ep = win->comm->ep_comm_ptr->size_rank_info[1].second;
81    ::MPI_Request mpi_request;
82    if(num_ep==1)
83    {
84      int return_value = ::MPI_Rget_accumulate(origin_addr, origin_count, to_mpi_type(origin_datatype), result_addr, result_count, to_mpi_type(result_datatype), target_mpi_rank, to_mpi_aint(target_disp), target_count,
85                                      to_mpi_type(target_datatype), to_mpi_op(op), to_mpi_win(win->server_win[target_local_rank]), &mpi_request);
86      (*request)->mpi_request = new ::MPI_Request(mpi_request);
87
88      (*request)->ep_datatype = origin_datatype;
89      (*request)->type = 1;
90      return return_value;
91    }
92    else
93    {
94      int return_value = ::MPI_Rget_accumulate(origin_addr, origin_count, to_mpi_type(origin_datatype), result_addr, result_count, to_mpi_type(result_datatype), target_mpi_rank, to_mpi_aint(target_disp), target_count,
95                                      to_mpi_type(target_datatype), to_mpi_op(op), to_mpi_win(win->client_win), &mpi_request);
96      (*request)->mpi_request = new ::MPI_Request(mpi_request);
97
98      (*request)->ep_datatype = origin_datatype;
99      (*request)->type = 1;
100      return return_value;
101    }
102  }
103
104}
105#endif
Note: See TracBrowser for help on using the repository browser.