source: XIOS/dev/branch_openmp/extern/ep_dev/ep_dup.cpp @ 1518

Last change on this file since 1518 was 1518, checked in by yushan, 4 years ago

optimisation partially finished. To do : special case for intercomm_create and intercomm_merge

File size: 4.3 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  int MPI_Comm_dup_mpi(MPI_Comm comm, MPI_Comm *newcomm)
10  {
11    newcomm = new MPI_Comm;
12    (*newcomm)->is_ep = false;
13
14    ::MPI_Comm *output = new ::MPI_Comm;
15     
16    ::MPI_Comm_dup(to_mpi_comm(comm->mpi_comm), output);
17
18    (*newcomm)->mpi_comm = output;
19  }
20
21  int MPI_Comm_dup_intracomm(MPI_Comm comm, MPI_Comm *newcomm)
22  {
23    int ep_rank_loc = comm->ep_comm_ptr->size_rank_info[1].first;
24    int num_ep      = comm->ep_comm_ptr->size_rank_info[1].second;
25
26
27    if(0 == ep_rank_loc)
28    {
29      MPI_Info info;
30      MPI_Comm *out_comm;
31
32      MPI_Comm_create_endpoints(comm->mpi_comm, num_ep, info, out_comm);
33      comm->ep_comm_ptr->comm_list[0]->mem_bridge = out_comm;
34    }
35
36    MPI_Barrier_local(comm);
37
38    *newcomm = (comm->ep_comm_ptr->comm_list[0]->mem_bridge[ep_rank_loc]);
39   
40  }
41
42  int MPI_Comm_dup(MPI_Comm comm, MPI_Comm *newcomm)
43  {
44   
45    if(!comm->is_ep)
46    {
47      Debug("MPI_Comm_dup with MPI\n");
48      return MPI_Comm_dup_mpi(comm, newcomm); 
49    }
50
51    if(comm->is_intercomm) return MPI_Comm_dup_intercomm(comm, newcomm);
52
53   
54    return MPI_Comm_dup_intracomm(comm, newcomm); 
55
56   
57  }
58
59  int MPI_Comm_dup_intercomm(MPI_Comm comm, MPI_Comm *newcomm)
60  {
61   
62    int newcomm_ep_rank =comm->ep_comm_ptr->intercomm->size_rank_info[0].first; 
63    int newcomm_ep_rank_loc = comm->ep_comm_ptr->intercomm->size_rank_info[1].first;
64    int newcomm_num_ep = comm->ep_comm_ptr->intercomm->size_rank_info[1].second;
65
66
67    if(0 == newcomm_ep_rank_loc)
68    {
69      //printf("in dup , newcomm_ep_rank_loc = 0 :  ep %d\n", comm->ep_comm_ptr->intercomm->size_rank_info[0].first);
70
71      MPI_Info info;
72      MPI_Comm *out_comm;
73
74      MPI_Comm_create_endpoints(comm->mpi_comm, newcomm_num_ep, info, out_comm);
75
76      ::MPI_Comm *mpi_inter_comm = new ::MPI_Comm;
77      ::MPI_Comm_dup(to_mpi_comm(comm->ep_comm_ptr->intercomm->mpi_inter_comm), mpi_inter_comm);
78
79      for(int i=0; i<newcomm_num_ep; i++)
80      {
81        out_comm[i]->is_intercomm = true;
82        out_comm[i]->ep_comm_ptr->comm_label = comm->ep_comm_ptr->comm_list[i]->ep_comm_ptr->comm_label;
83        out_comm[i]->ep_comm_ptr->intercomm = new ep_lib::ep_intercomm;
84#ifdef _showinfo
85        printf("new out_comm[%d]->ep_comm_ptr->intercomm = %p\n", i, out_comm[i]->ep_comm_ptr->intercomm);
86#endif
87        out_comm[i]->ep_comm_ptr->intercomm->mpi_inter_comm = mpi_inter_comm;
88      }
89
90
91      comm->ep_comm_ptr->comm_list[0]->mem_bridge = out_comm;
92    }
93
94    MPI_Barrier_local(comm);
95
96    *newcomm = (comm->ep_comm_ptr->comm_list[0]->mem_bridge[newcomm_ep_rank_loc]);
97
98    (*newcomm)->ep_comm_ptr->size_rank_info[0] = comm->ep_comm_ptr->size_rank_info[0];
99    (*newcomm)->ep_comm_ptr->size_rank_info[1] = comm->ep_comm_ptr->size_rank_info[1];
100    (*newcomm)->ep_comm_ptr->size_rank_info[2] = comm->ep_comm_ptr->size_rank_info[2];
101
102    (*newcomm)->ep_comm_ptr->intercomm->size_rank_info[0] = comm->ep_comm_ptr->intercomm->size_rank_info[0];
103    (*newcomm)->ep_comm_ptr->intercomm->size_rank_info[1] = comm->ep_comm_ptr->intercomm->size_rank_info[1];
104    (*newcomm)->ep_comm_ptr->intercomm->size_rank_info[2] = comm->ep_comm_ptr->intercomm->size_rank_info[2];
105
106    (*newcomm)->ep_comm_ptr->intercomm->intercomm_tag = comm->ep_comm_ptr->intercomm->intercomm_tag;
107
108
109    int ep_rank_loc = (*newcomm)->ep_comm_ptr->size_rank_info[1].first;
110   
111    if(ep_rank_loc == 0)
112    {
113      int world_rank;
114      MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
115
116      (*newcomm)->ep_comm_ptr->intercomm->intercomm_rank_map = new INTERCOMM_RANK_MAP;
117      (*newcomm)->ep_comm_ptr->intercomm->local_rank_map = new EP_RANK_MAP;
118
119      *(*newcomm)->ep_comm_ptr->intercomm->intercomm_rank_map = *comm->ep_comm_ptr->intercomm->intercomm_rank_map;
120      *(*newcomm)->ep_comm_ptr->intercomm->local_rank_map     = *comm->ep_comm_ptr->intercomm->local_rank_map;
121    }
122
123    MPI_Barrier_local(comm);
124
125    if(ep_rank_loc !=0 )
126    {
127      int target = (*newcomm)->ep_comm_ptr->intercomm->intercomm_tag;
128      (*newcomm)->ep_comm_ptr->intercomm->intercomm_rank_map = (*newcomm)->ep_comm_ptr->comm_list[target]->ep_comm_ptr->intercomm->intercomm_rank_map; 
129      (*newcomm)->ep_comm_ptr->intercomm->local_rank_map     = (*newcomm)->ep_comm_ptr->comm_list[target]->ep_comm_ptr->intercomm->local_rank_map;
130    }
131
132   
133
134
135
136   
137  }
138
139
140
141}
142
143
Note: See TracBrowser for help on using the repository browser.