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

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

add folder for MPI EP-RMA development. Current: MPI_Win, MPI_win_create, MPI_win_fence, MPI_win_free

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   
24
25    if(num_ep == 1)  // server
26    {
27      for(int i=0; i<num_ep_max; i++)
28      {
29        win->server_win[i] = new ::MPI_Win;
30      }
31
32      printf("Calling MPI_Win_create from server, rank = %d\n", rank);
33      for(int i=0; i<num_ep_max; i++)
34      {
35        ::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]));
36        win->comm = comm;
37      }
38    }
39    else  // client
40    {
41      win->client_win = new ::MPI_Win;
42     
43      for(int i=0; i<num_ep_max; i++)
44      {
45        if(rank_loc == i)
46        {
47          printf("Calling MPI_Win_create from client, rank = %d\n", rank);
48          ::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)); 
49          win->comm = comm;
50        }
51        MPI_Barrier_local(comm);
52      }
53
54      // #pragma omp critical (win_create)
55      // {
56      //   ::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));
57      //   win->comm = comm;
58      // }
59    }
60    return 0;
61  }
62
63
64
65  int MPI_Win_free(MPI_Win *win)
66  {
67    int rank, rank_loc, num_ep;
68   
69
70    MPI_Comm_rank(win->comm, &rank);
71    rank_loc = win->comm.ep_comm_ptr->size_rank_info[1].first;
72    num_ep = win->comm.ep_comm_ptr->size_rank_info[1].second;
73   
74   
75    int num_ep_max;
76    MPI_Allreduce(&num_ep, &num_ep_max, 1, MPI_INT, MPI_MAX, win->comm);
77
78    //printf("rank_loc = %d, thread_num = %d, num_ep_max = %d\n", rank_loc, omp_get_thread_num(), num_ep_max);
79
80    if(num_ep == 1)
81    {
82      printf("Calling MPI_Win_free from server, rank = %d\n", rank);
83      for(int i=0; i<num_ep_max; i++)
84      {
85        ::MPI_Win_free(static_cast< ::MPI_Win*>(win->server_win[i]));
86      }
87    }
88    else
89    {
90      for(int i=0; i<num_ep_max; i++)
91      {
92        if(rank_loc == i)
93        {
94          printf("Calling MPI_Win_free from client, rank = %d\n", rank);
95          ::MPI_Win_free(static_cast< ::MPI_Win*>(win->client_win)); 
96        }
97        MPI_Barrier_local(win->comm);
98      }
99    }
100    return 0;
101  }
102
103
104
105  int MPI_Win_fence(int assert, MPI_Win win)
106  {
107    int rank, rank_loc, num_ep;
108   
109    MPI_Comm_rank(win.comm, &rank);
110    rank_loc = win.comm.ep_comm_ptr->size_rank_info[1].first;
111    num_ep = win.comm.ep_comm_ptr->size_rank_info[1].second;
112   
113    int num_ep_max;
114    MPI_Allreduce(&num_ep, &num_ep_max, 1, MPI_INT, MPI_MAX, win.comm);
115
116    if(num_ep == 1)
117    {
118      printf("Calling MPI_Win_fence from server, rank = %d\n", rank);
119      for(int i=0; i<num_ep_max; i++)
120      {
121        ::MPI_Win_fence(assert, *static_cast< ::MPI_Win*>(win.server_win[i]));
122      }
123    }
124    else
125    {
126      for(int i=0; i<num_ep_max; i++)
127      {
128        if(rank_loc == i)
129        {
130          printf("Calling MPI_Win_fence from client, rank = %d\n", rank);
131          ::MPI_Win_fence(assert, *static_cast< ::MPI_Win*>(win.client_win)); 
132        }
133        MPI_Barrier_local(win.comm);
134      }
135    }
136
137    return 0; 
138  }
139
140}
141
142
Note: See TracBrowser for help on using the repository browser.