source: XIOS/dev/branch_openmp/extern/ep_dev/ep_win.cpp @ 1385

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

dev EP-RMA : MPI_Put, MPI_Get

File size: 3.6 KB
Line 
1#include "ep_lib.hpp"
2#include <mpi.h>
3#include "ep_declaration.hpp"
4#include "ep_mpi.hpp"
5
6
7namespace ep_lib
8{
9
10
11  int MPI_Win_create(void *base, MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm, MPI_Win *win)
12  {
13    int rank, rank_loc, num_ep;
14    MPI_Comm_rank(comm, &rank);
15    rank_loc = comm.ep_comm_ptr->size_rank_info[1].first;
16    num_ep = comm.ep_comm_ptr->size_rank_info[1].second;
17   
18    win->is_ep = comm.is_ep;
19
20    int num_ep_max;
21    MPI_Allreduce(&num_ep, &num_ep_max, 1, MPI_INT, MPI_MAX, comm);
22
23    assert(num_ep_max > 1);
24   
25   
26
27    if(num_ep == 1)  // server
28    {
29      for(int i=0; i<num_ep_max; i++)
30      {
31        win->server_win[i] = new ::MPI_Win;
32      }
33
34      printf("Calling MPI_Win_create from server, rank = %d\n", rank);
35      for(int i=0; i<num_ep_max; i++)
36      {
37        ::MPI_Win_create(base, to_mpi_aint(size.mpi_aint), disp_unit, to_mpi_info(info.mpi_info), to_mpi_comm(comm.mpi_comm), static_cast< ::MPI_Win*>(win->server_win[i]));
38        win->comm = comm;
39      }
40    }
41    else  // client
42    {
43      win->client_win = new ::MPI_Win;
44     
45      for(int i=0; i<num_ep_max; i++)
46      {
47        if(rank_loc == i)
48        {
49          printf("Calling MPI_Win_create from client, rank = %d\n", rank);
50          ::MPI_Win_create(base, to_mpi_aint(size.mpi_aint), disp_unit, to_mpi_info(info.mpi_info), to_mpi_comm(comm.mpi_comm), static_cast< ::MPI_Win*>(win->client_win)); 
51          win->comm = comm;
52        }
53        MPI_Barrier_local(comm);
54      }
55
56      // #pragma omp critical (win_create)
57      // {
58      //   ::MPI_Win_create(base, to_mpi_aint(size.mpi_aint), disp_unit, to_mpi_info(info.mpi_info), to_mpi_comm(comm.mpi_comm), static_cast< ::MPI_Win*>(win->client_win));
59      //   win->comm = comm;
60      // }
61    }
62    return 0;
63  }
64
65
66
67  int MPI_Win_free(MPI_Win *win)
68  {
69    int rank, rank_loc, num_ep;
70   
71
72    MPI_Comm_rank(win->comm, &rank);
73    rank_loc = win->comm.ep_comm_ptr->size_rank_info[1].first;
74    num_ep = win->comm.ep_comm_ptr->size_rank_info[1].second;
75   
76   
77    int num_ep_max;
78    MPI_Allreduce(&num_ep, &num_ep_max, 1, MPI_INT, MPI_MAX, win->comm);
79
80    //printf("rank_loc = %d, thread_num = %d, num_ep_max = %d\n", rank_loc, omp_get_thread_num(), num_ep_max);
81
82    if(num_ep == 1)
83    {
84      printf("Calling MPI_Win_free from server, rank = %d\n", rank);
85      for(int i=0; i<num_ep_max; i++)
86      {
87        ::MPI_Win_free(static_cast< ::MPI_Win*>(win->server_win[i]));
88      }
89    }
90    else
91    {
92      for(int i=0; i<num_ep_max; i++)
93      {
94        if(rank_loc == i)
95        {
96          printf("Calling MPI_Win_free from client, rank = %d\n", rank);
97          ::MPI_Win_free(static_cast< ::MPI_Win*>(win->client_win)); 
98        }
99        MPI_Barrier_local(win->comm);
100      }
101    }
102    return 0;
103  }
104
105
106
107  int MPI_Win_fence(int assert, MPI_Win win)
108  {
109    int rank, rank_loc, num_ep;
110   
111    MPI_Comm_rank(win.comm, &rank);
112    rank_loc = win.comm.ep_comm_ptr->size_rank_info[1].first;
113    num_ep = win.comm.ep_comm_ptr->size_rank_info[1].second;
114   
115    int num_ep_max;
116    MPI_Allreduce(&num_ep, &num_ep_max, 1, MPI_INT, MPI_MAX, win.comm);
117
118    if(num_ep == 1)
119    {
120      printf("Calling MPI_Win_fence from server, rank = %d\n", rank);
121      for(int i=0; i<num_ep_max; i++)
122      {
123        ::MPI_Win_fence(assert, *static_cast< ::MPI_Win*>(win.server_win[i]));
124      }
125    }
126    else
127    {
128      for(int i=0; i<num_ep_max; i++)
129      {
130        if(rank_loc == i)
131        {
132          printf("Calling MPI_Win_fence from client, rank = %d\n", rank);
133          ::MPI_Win_fence(assert, *static_cast< ::MPI_Win*>(win.client_win)); 
134        }
135        MPI_Barrier_local(win.comm);
136      }
137    }
138
139    return 0; 
140  }
141
142}
143
144
Note: See TracBrowser for help on using the repository browser.