source: XIOS/dev/branch_openmp/extern/src_ep_dev/ep_merge.cpp @ 1295

Last change on this file since 1295 was 1295, checked in by yushan, 7 years ago

EP update all

File size: 8.0 KB
Line 
1#include "ep_lib.hpp"
2#include <mpi.h>
3#include "ep_declaration.hpp"
4
5using namespace std;
6
7
8namespace ep_lib {
9
10  int MPI_Intercomm_merge_unique_leader(MPI_Comm inter_comm, bool high, MPI_Comm *newintracomm)
11  {
12    Debug("intercomm_merge with unique leader\n");
13
14
15
16    int ep_rank, ep_rank_loc, mpi_rank;
17    int ep_size, num_ep, mpi_size;
18
19    ep_rank = inter_comm.ep_comm_ptr->size_rank_info[0].first;
20    ep_rank_loc = inter_comm.ep_comm_ptr->size_rank_info[1].first;
21    mpi_rank = inter_comm.ep_comm_ptr->size_rank_info[2].first;
22    ep_size = inter_comm.ep_comm_ptr->size_rank_info[0].second;
23    num_ep = inter_comm.ep_comm_ptr->size_rank_info[1].second;
24    mpi_size = inter_comm.ep_comm_ptr->size_rank_info[2].second;
25
26    int local_high = high;
27    int remote_high;
28
29    int remote_ep_size = inter_comm.ep_comm_ptr->intercomm->remote_rank_map->size();
30
31    int local_ep_rank, local_ep_rank_loc, local_mpi_rank;
32    int local_ep_size, local_num_ep, local_mpi_size;
33
34    local_ep_rank = inter_comm.ep_comm_ptr->intercomm->local_comm->ep_comm_ptr->size_rank_info[0].first;
35    local_ep_rank_loc = inter_comm.ep_comm_ptr->intercomm->local_comm->ep_comm_ptr->size_rank_info[1].first;
36    local_mpi_rank = inter_comm.ep_comm_ptr->intercomm->local_comm->ep_comm_ptr->size_rank_info[2].first;
37    local_ep_size = inter_comm.ep_comm_ptr->intercomm->local_comm->ep_comm_ptr->size_rank_info[0].second;
38    local_num_ep = inter_comm.ep_comm_ptr->intercomm->local_comm->ep_comm_ptr->size_rank_info[1].second;
39    local_mpi_size = inter_comm.ep_comm_ptr->intercomm->local_comm->ep_comm_ptr->size_rank_info[2].second;
40
41
42    if(local_ep_rank == 0)
43    {
44      MPI_Status status[2];
45      MPI_Request request[2];
46      MPI_Isend(&local_high, 1, MPI_INT, 0, inter_comm.ep_comm_ptr->intercomm->intercomm_tag, inter_comm, &request[0]);
47      MPI_Irecv(&remote_high, 1, MPI_INT, 0, inter_comm.ep_comm_ptr->intercomm->intercomm_tag, inter_comm, &request[1]);
48
49      MPI_Waitall(2, request, status);
50    }
51
52
53    MPI_Bcast(&remote_high, 1, MPI_INT, 0, *(inter_comm.ep_comm_ptr->intercomm->local_comm));
54
55
56
57    MPI_Comm_dup(inter_comm, newintracomm);
58
59    int my_ep_rank = local_high<remote_high? local_ep_rank: local_ep_rank+remote_ep_size;
60
61
62    int intra_ep_rank, intra_ep_rank_loc, intra_mpi_rank;
63    int intra_ep_size, intra_num_ep, intra_mpi_size;
64
65    intra_ep_rank = newintracomm->ep_comm_ptr->size_rank_info[0].first;
66    intra_ep_rank_loc = newintracomm->ep_comm_ptr->size_rank_info[1].first;
67    intra_mpi_rank = newintracomm->ep_comm_ptr->size_rank_info[2].first;
68    intra_ep_size = newintracomm->ep_comm_ptr->size_rank_info[0].second;
69    intra_num_ep = newintracomm->ep_comm_ptr->size_rank_info[1].second;
70    intra_mpi_size = newintracomm->ep_comm_ptr->size_rank_info[2].second;
71
72
73    MPI_Barrier_local(*newintracomm);
74
75
76    int *reorder;
77    if(intra_ep_rank_loc == 0)
78    {
79      reorder = new int[intra_ep_size];
80    }
81
82
83    MPI_Gather(&my_ep_rank, 1, MPI_INT, reorder, 1, MPI_INT, 0, *newintracomm);
84    if(intra_ep_rank_loc == 0)
85    {
86      ::MPI_Bcast(reorder, intra_ep_size, static_cast< ::MPI_Datatype> (MPI_INT), 0, static_cast< ::MPI_Comm>(newintracomm->mpi_comm));
87
88      vector< pair<int, int> > tmp_rank_map(intra_ep_size);
89
90
91      for(int i=0; i<intra_ep_size; i++)
92      {
93        tmp_rank_map[reorder[i]] = newintracomm->rank_map->at(i) ;
94      }
95
96      newintracomm->rank_map->swap(tmp_rank_map);
97
98      tmp_rank_map.clear();
99    }
100
101    MPI_Barrier_local(*newintracomm);
102
103    (*newintracomm).ep_comm_ptr->size_rank_info[0].first = my_ep_rank;
104
105    if(intra_ep_rank_loc == 0)
106    {
107      delete[] reorder;
108    }
109
110    return MPI_SUCCESS;
111  }
112
113
114
115
116
117  int MPI_Intercomm_merge(MPI_Comm inter_comm, bool high, MPI_Comm *newintracomm)
118  {
119
120    assert(inter_comm.is_intercomm);
121
122    if(inter_comm.ep_comm_ptr->intercomm->local_comm->ep_comm_ptr->comm_label == -99)
123    {
124        return MPI_Intercomm_merge_unique_leader(inter_comm, high, newintracomm);
125    }
126
127
128    Debug("intercomm_merge kernel\n");
129
130    int ep_rank_loc;
131    int num_ep;
132
133    ep_rank_loc = inter_comm.ep_comm_ptr->size_rank_info[1].first;
134    num_ep = inter_comm.ep_comm_ptr->size_rank_info[1].second;
135
136
137
138    int remote_ep_size = inter_comm.ep_comm_ptr->intercomm->remote_rank_map->size();
139
140
141    MPI_Barrier(inter_comm);
142
143
144    ::MPI_Comm mpi_intracomm;
145    MPI_Comm *ep_intracomm;
146
147    if(ep_rank_loc == 0)
148    {
149
150      ::MPI_Comm mpi_comm = static_cast< ::MPI_Comm>(inter_comm.ep_comm_ptr->intercomm->mpi_inter_comm);
151
152      ::MPI_Intercomm_merge(mpi_comm, high, &mpi_intracomm);
153      MPI_Info info;
154      MPI_Comm_create_endpoints(mpi_intracomm, num_ep, info, ep_intracomm);
155
156      inter_comm.ep_comm_ptr->comm_list->mem_bridge = ep_intracomm;
157
158    }
159
160    MPI_Barrier_local(inter_comm);
161
162    int inter_rank;
163    MPI_Comm_rank(inter_comm, &inter_rank);
164   
165    int my_ep_rank = high? inter_rank+remote_ep_size : inter_rank;
166    int my_ep_rank_loc = inter_comm.ep_comm_ptr->intercomm->local_comm->ep_comm_ptr->size_rank_info[1].first;
167    int my_num_ep_loc = inter_comm.ep_comm_ptr->intercomm->local_comm->ep_comm_ptr->size_rank_info[1].second;
168    int my_num_ep_total = inter_comm.ep_comm_ptr->comm_list->mem_bridge[0].ep_comm_ptr->size_rank_info[1].second;
169    int my_ep_size = inter_comm.ep_comm_ptr->comm_list->mem_bridge[0].ep_comm_ptr->size_rank_info[0].second;
170
171    int tmp_intra_ep_rank_loc = high?my_ep_rank_loc+my_num_ep_total-my_num_ep_loc: my_ep_rank_loc;
172
173
174    *newintracomm = inter_comm.ep_comm_ptr->comm_list->mem_bridge[tmp_intra_ep_rank_loc];
175
176    int newintracomm_ep_rank = (*newintracomm).ep_comm_ptr->size_rank_info[0].first;
177    int newintracomm_ep_rank_loc = (*newintracomm).ep_comm_ptr->size_rank_info[1].first;
178    int newintracomm_mpi_rank = (*newintracomm).ep_comm_ptr->size_rank_info[2].first;
179    int newintracomm_ep_size = (*newintracomm).ep_comm_ptr->size_rank_info[0].second;
180    int newintracomm_num_ep = (*newintracomm).ep_comm_ptr->size_rank_info[1].second;
181    int newintracomm_mpi_size = (*newintracomm).ep_comm_ptr->size_rank_info[2].second;
182
183
184    int buf[3];
185    buf[0] = my_ep_rank;
186    buf[1] = tmp_intra_ep_rank_loc;
187    buf[2] = newintracomm->ep_comm_ptr->size_rank_info[2].first;
188
189    // printf("my_ep_rank = %d, tmp_intra_ep_rank_loc = %d, mpi_rank = %d\n", my_ep_rank, tmp_intra_ep_rank_loc, newintracomm->ep_comm_ptr->size_rank_info[2].first);
190
191    int *rankmap_buf;
192    rankmap_buf = new int [3*my_ep_size];
193
194    MPI_Allgather(buf, 3, MPI_INT, rankmap_buf, 3, MPI_INT, *newintracomm);
195
196   
197    // printf(" ID = %d : rankmap_buf = (%d %d %d), (%d %d %d), (%d %d %d), (%d %d %d), (%d %d %d), (%d %d %d), (%d %d %d), (%d %d %d), (%d %d %d), (%d %d %d), (%d %d %d), (%d %d %d), (%d %d %d), (%d %d %d), (%d %d %d), (%d %d %d)\n", newintracomm_ep_rank,
198    //                     rankmap_buf[0], rankmap_buf[1], rankmap_buf[2], rankmap_buf[3], rankmap_buf[4], rankmap_buf[5], rankmap_buf[6], rankmap_buf[7], rankmap_buf[8], rankmap_buf[9],
199    //                     rankmap_buf[10], rankmap_buf[11], rankmap_buf[12], rankmap_buf[13], rankmap_buf[14], rankmap_buf[15], rankmap_buf[16], rankmap_buf[17], rankmap_buf[18], rankmap_buf[19],
200    //                     rankmap_buf[20], rankmap_buf[21], rankmap_buf[22], rankmap_buf[23], rankmap_buf[24], rankmap_buf[25], rankmap_buf[26], rankmap_buf[27], rankmap_buf[28], rankmap_buf[29],
201    //                     rankmap_buf[30], rankmap_buf[31], rankmap_buf[32], rankmap_buf[33], rankmap_buf[34], rankmap_buf[35], rankmap_buf[36], rankmap_buf[37], rankmap_buf[38], rankmap_buf[39],
202    //                     rankmap_buf[40], rankmap_buf[41], rankmap_buf[42], rankmap_buf[43], rankmap_buf[44], rankmap_buf[45], rankmap_buf[46], rankmap_buf[47]);
203
204
205    for(int i=0; i<newintracomm_ep_size; i++)
206    {
207      (*newintracomm).rank_map->at(rankmap_buf[3*i]).first  = rankmap_buf[3*i+1];
208      (*newintracomm).rank_map->at(rankmap_buf[3*i]).second = rankmap_buf[3*i+2];
209    }
210
211
212    (*newintracomm).ep_comm_ptr->size_rank_info[0].first = my_ep_rank;
213    (*newintracomm).ep_comm_ptr->size_rank_info[1].first = tmp_intra_ep_rank_loc;
214   
215
216    delete[] rankmap_buf;
217
218   
219    return MPI_SUCCESS;
220
221  }
222
223
224}
Note: See TracBrowser for help on using the repository browser.