source: XIOS/dev/branch_openmp/extern/ep_dev/ep_accumulate.cpp @ 1503

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

rank_map is passed from vector to map, in order to have more flexibility in comm_split

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