source: XIOS/dev/branch_yushan/extern/src_ep_dev/ep_dup.cpp @ 1063

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

server mode OK for both multiple and one file mode. Tested with test_client

File size: 4.4 KB
Line 
1#include "ep_lib.hpp"
2#include <mpi.h>
3#include "ep_declaration.hpp"
4
5namespace ep_lib
6{
7
8
9
10  int MPI_Comm_dup_dev(MPI_Comm comm, MPI_Comm *newcomm)
11  {
12    if(!comm.is_ep)
13    {
14      Debug("Comm_dup MPI\n");
15      newcomm = new MPI_Comm;
16      newcomm->is_ep = comm.is_ep;
17
18      ::MPI_Comm input = static_cast< ::MPI_Comm>(comm.mpi_comm);
19      ::MPI_Comm output;
20
21     
22      ::MPI_Comm_dup(input, &output);
23
24      newcomm->mpi_comm = output;
25
26      return 0;
27    }
28
29    if(!comm.mpi_comm) return 0;
30
31
32    int my_rank = comm.ep_comm_ptr->size_rank_info[1].first;
33    int num_ep  = comm.ep_comm_ptr->size_rank_info[1].second;
34
35
36    if(0 == my_rank)
37    {
38      MPI_Info info;
39      ::MPI_Comm mpi_dup;
40
41      ::MPI_Comm in_comm = static_cast< ::MPI_Comm>(comm.mpi_comm);
42
43      ::MPI_Comm_dup(in_comm, &mpi_dup);
44
45      MPI_Comm_create_endpoints(mpi_dup, num_ep, info, newcomm);
46      comm.ep_comm_ptr->comm_list->mem_bridge = newcomm;
47    }
48
49    MPI_Barrier_local(comm);
50
51    newcomm = &(comm.ep_comm_ptr->comm_list->mem_bridge[my_rank]);
52
53    return MPI_SUCCESS;
54  }
55
56
57
58  int MPI_Comm_dup(MPI_Comm comm, MPI_Comm *newcomm)
59  {
60    if(!comm.is_ep)
61    {
62      Debug("Comm_dup MPI\n");
63      newcomm = new MPI_Comm;
64      newcomm->is_ep = comm.is_ep;
65
66      ::MPI_Comm input = static_cast< ::MPI_Comm>(comm.mpi_comm);
67      ::MPI_Comm output;
68
69     
70      ::MPI_Comm_dup(input, &output);
71
72      newcomm->mpi_comm = output;
73
74      return 0;
75    }
76
77    if(comm.is_intercomm) return MPI_Comm_dup_intercomm(comm, newcomm);
78
79    // for intracomm
80    if(comm.mpi_comm == MPI_COMM_NULL_STD) return 0;
81
82
83    int my_rank = comm.ep_comm_ptr->size_rank_info[1].first;
84    int num_ep  = comm.ep_comm_ptr->size_rank_info[1].second;
85
86
87    if(0 == my_rank)
88    {
89      MPI_Info info;
90      MPI_Comm *out_comm;
91      ::MPI_Comm mpi_dup;
92
93      ::MPI_Comm in_comm = static_cast< ::MPI_Comm>(comm.mpi_comm);
94
95      ::MPI_Comm_dup(in_comm, &mpi_dup);
96
97      MPI_Comm_create_endpoints(mpi_dup, num_ep, info, out_comm);
98      comm.ep_comm_ptr->comm_list->mem_bridge = out_comm;
99    }
100
101    MPI_Barrier(comm);
102
103    *newcomm = (comm.ep_comm_ptr->comm_list->mem_bridge[my_rank]);
104
105    return MPI_SUCCESS;
106  }
107
108  int MPI_Comm_dup_intercomm(MPI_Comm comm, MPI_Comm *newcomm)
109  {
110   
111    if(comm.mpi_comm == MPI_COMM_NULL_STD) return 0;
112
113    int my_rank = comm.ep_comm_ptr->size_rank_info[1].first;
114    int num_ep  = comm.ep_comm_ptr->size_rank_info[1].second;
115
116
117    if(0 == my_rank)
118    {
119      MPI_Info info;
120      MPI_Comm *out_comm;
121      ::MPI_Comm mpi_dup;
122
123      ::MPI_Comm in_comm = static_cast< ::MPI_Comm>(comm.mpi_comm);
124
125      ::MPI_Comm_dup(in_comm, &mpi_dup);
126
127      MPI_Comm_create_endpoints(mpi_dup, num_ep, info, out_comm);
128
129      ::MPI_Comm mpi_inter;
130
131      ::MPI_Comm_dup(static_cast< ::MPI_Comm>(comm.ep_comm_ptr->intercomm->mpi_inter_comm), &mpi_inter);
132     
133      for(int i=0; i<num_ep; i++)
134      {
135        out_comm[i].ep_comm_ptr->comm_label = comm.ep_comm_ptr->comm_list[i].ep_comm_ptr->comm_label;
136        out_comm[i].ep_comm_ptr->intercomm = new ep_intercomm;
137
138        out_comm[i].ep_comm_ptr->intercomm->mpi_inter_comm = mpi_inter;
139        out_comm[i].is_intercomm = true;
140
141        out_comm[i].ep_comm_ptr->intercomm->intercomm_rank_map = new RANK_MAP;
142        out_comm[i].ep_comm_ptr->intercomm->local_rank_map = new RANK_MAP;
143        out_comm[i].ep_comm_ptr->intercomm->remote_rank_map = new RANK_MAP;
144
145        out_comm[i].ep_comm_ptr->intercomm->intercomm_rank_map = comm.ep_comm_ptr->comm_list[i].ep_comm_ptr->intercomm->intercomm_rank_map;
146        out_comm[i].ep_comm_ptr->intercomm->local_rank_map = comm.ep_comm_ptr->comm_list[i].ep_comm_ptr->intercomm->local_rank_map;
147        out_comm[i].ep_comm_ptr->intercomm->remote_rank_map = comm.ep_comm_ptr->comm_list[i].ep_comm_ptr->intercomm->remote_rank_map;
148
149        out_comm[i].ep_comm_ptr->intercomm->local_comm = comm.ep_comm_ptr->comm_list[i].ep_comm_ptr->intercomm->local_comm;       
150        out_comm[i].ep_comm_ptr->intercomm->intercomm_tag = comm.ep_comm_ptr->comm_list[i].ep_comm_ptr->intercomm->intercomm_tag;
151
152        for(int j =0; j<3; j++)
153        {
154          out_comm[i].ep_comm_ptr->intercomm->size_rank_info[j] = comm.ep_comm_ptr->comm_list[i].ep_comm_ptr->intercomm->size_rank_info[j];
155        }
156
157      }
158
159      comm.ep_comm_ptr->comm_list->mem_bridge = out_comm;
160    }
161
162    MPI_Barrier(comm);
163
164    *newcomm = comm.ep_comm_ptr->comm_list->mem_bridge[my_rank];
165   
166
167    return MPI_SUCCESS;
168  }
169
170
171
172}
173
174
Note: See TracBrowser for help on using the repository browser.