source: XIOS/dev/branch_openmp/extern/src_ep_dev/ep_allocate.cpp @ 1521

Last change on this file since 1521 was 1521, checked in by yushan, 3 years ago

save dev. TO DO : test with xios

File size: 2.4 KB
Line 
1#include "ep_lib.hpp"
2#include <mpi.h>
3#include "ep_declaration.hpp"
4#include "ep_mpi.hpp"
5
6namespace ep_lib
7{
8
9
10
11  int MPI_Alloc_mem(MPI_Aint size, MPI_Info info, void *baseptr)
12  {
13    ::MPI_Alloc_mem(to_mpi_aint(size), to_mpi_info(info), baseptr);
14    //::MPI_Alloc_mem(size.mpi_aint, MPI_INFO_NULL_STD, baseptr);
15    return 0;
16   }
17   
18  int MPI_Alloc_mem(unsigned long size, MPI_Info info, void *baseptr)
19  {
20    ::MPI_Alloc_mem(size, *(static_cast< ::MPI_Info*>(info->mpi_info)), baseptr);
21    //::MPI_Alloc_mem(size, MPI_INFO_NULL_STD, baseptr);
22    return 0;
23  }
24
25  int MPI_Win_allocate (MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm, void *baseptr, MPI_Win *win)
26  {
27    int rank, rank_loc, num_ep;
28    MPI_Comm_rank(comm, &rank);
29    rank_loc = comm->ep_comm_ptr->size_rank_info[1].first;
30    num_ep = comm->ep_comm_ptr->size_rank_info[1].second;
31   
32    *win = new ep_win;
33   
34    (*win)->is_ep = comm->is_ep;
35
36    int num_ep_max;
37    MPI_Allreduce(&num_ep, &num_ep_max, 1, MPI_INT, MPI_MAX, comm);
38
39    assert(num_ep_max > 1);
40   
41    info = new ep_info;
42
43    if(num_ep == 1)  // server
44    {
45      for(int i=0; i<num_ep_max; i++)
46      {
47        (*win)->server_win[i] = new ::MPI_Win;
48      }
49
50      printf("Calling MPI_Win_allocate from server, rank = %d\n", rank);
51      for(int i=0; i<num_ep_max; i++)
52      {
53        ::MPI_Win_allocate(to_mpi_aint(size), disp_unit, to_mpi_info(info), to_mpi_comm(comm->mpi_comm), baseptr, static_cast< ::MPI_Win*>((*win)->server_win[i]));
54        (*win)->comm = comm;
55      }
56    }
57    else  // client
58    {
59      (*win)->client_win = new ::MPI_Win;
60     
61      for(int i=0; i<num_ep; i++)
62      {
63        if(rank_loc == i)
64        {
65          printf("Calling MPI_Win_allocate from client, rank = %d\n", rank);
66          ::MPI_Win_allocate(to_mpi_aint(size), disp_unit, to_mpi_info(info), to_mpi_comm(comm->mpi_comm), baseptr, static_cast< ::MPI_Win*>((*win)->client_win)); 
67          (*win)->comm = comm;
68        }
69        MPI_Barrier_local(comm);
70      }
71
72      if(num_ep_max > num_ep)
73      {
74        #pragma omp master
75        {
76          for(int i=0; i<num_ep_max-num_ep; i++)
77          {
78            (*win)->null_win[i] = new ::MPI_Win;
79            ::MPI_Win_allocate(0, disp_unit, to_mpi_info(info), to_mpi_comm(comm->mpi_comm), baseptr, static_cast< ::MPI_Win*>((*win)->null_win[i])); 
80          } 
81        } 
82      }
83
84    }
85    return 0;
86  }
87
88}
Note: See TracBrowser for help on using the repository browser.