Arcane  4.1.12.0
Developer documentation
Loading...
Searching...
No Matches
ParallelTopology.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* ParallelTopology.cc (C) 2000-2011 */
9/* */
10/* Information on the core allocation topology. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/NotImplementedException.h"
15#include "arcane/utils/TraceInfo.h"
16#include "arcane/utils/Array.h"
17#include "arcane/utils/ITraceMng.h"
18#include "arcane/utils/PlatformUtils.h"
19
20#include "arcane/core/IParallelMng.h"
21
22#include "arcane/impl/ParallelTopology.h"
23
24#include <map>
25#include <algorithm>
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30namespace Arcane
31{
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35
36ParallelTopology::
37ParallelTopology(IParallelMng* pm)
38: m_parallel_mng(pm)
39, m_machine_rank(-1)
40, m_process_rank(-1)
41, m_is_machine_master(false)
42, m_is_process_master(false)
43{
44}
45
46/*---------------------------------------------------------------------------*/
47/*---------------------------------------------------------------------------*/
48
49void ParallelTopology::
50initialize()
51{
52 // Test to ensure everyone calls this initialization method.
53 m_parallel_mng->barrier();
54 _init();
55}
56
57/*---------------------------------------------------------------------------*/
58/*---------------------------------------------------------------------------*/
59
60namespace
61{
62 // Contains node name + pid to know the master ranks per process.
63 class NamePid
64 {
65 public:
66
67 NamePid(ByteConstArrayView _name, Int64 _pid)
68 : name(_name)
69 , pid(_pid)
70 {}
71
72 public:
73
74 ByteConstArrayView name;
75 Int64 pid;
76 bool operator<(const NamePid& b) const
77 {
78 int s = ::strcmp((const char*)name.data(), (const char*)b.name.data());
79 if (s != 0)
80 return s > 0;
81 return pid > b.pid;
82 }
83 };
84 // Comparator for the node name.
85 class _Comparer
86 {
87 public:
88
89 bool operator()(ByteConstArrayView a, ByteConstArrayView b) const
90 {
91 return ::strcmp((const char*)a.data(), (const char*)b.data()) > 0;
92 }
93 };
94} // namespace
95
96void ParallelTopology::
97_init()
98{
99 IParallelMng* pm = m_parallel_mng;
100 ITraceMng* tm = m_parallel_mng->traceMng();
101 Int32 nb_rank = pm->commSize();
102 Int32 my_rank = pm->commRank();
103
104 String host_name = platform::getHostName();
105 Int64 pid = platform::getProcessId();
106 // All ranks with the same host_name are on the same machine
107 Integer len = host_name.utf8().size() + 1;
108 Integer max_len = pm->reduce(Parallel::ReduceMax, len);
109 ByteUniqueArray all_names(max_len * nb_rank);
110 ByteUniqueArray my_name;
111 Int64UniqueArray all_pids(nb_rank);
112
113 my_name.copy(host_name.utf8()); // copy shrink array size to arg size
114 my_name.resize(max_len, '\0'); // add \0 to fill up to max_len
115
116 pm->allGather(my_name, all_names);
117 pm->allGather(Int64ConstArrayView(1, &pid), all_pids);
118
119 m_machine_ranks.clear();
120 m_process_ranks.clear();
121
122 typedef std::map<ByteConstArrayView, Int32, _Comparer> MasterRankMap;
123 typedef std::map<NamePid, Int32> MasterProcessRankMap;
124
125 MasterRankMap machine_ranks_map;
126 MasterProcessRankMap process_ranks_map;
127
128 for (Integer irank = 0; irank < nb_rank; ++irank) {
129 ByteConstArrayView rank_name(max_len, &all_names[max_len * irank]);
130 bool is_same_name = true;
131 for (Integer j = 0; j < max_len; ++j)
132 if (rank_name[j] != my_name[j]) {
133 is_same_name = false;
134 break;
135 }
136 bool is_same_process = false;
137 if (is_same_name && all_pids[irank] == pid)
138 is_same_process = true;
139
140 if (is_same_name)
141 m_machine_ranks.add(irank);
142 if (is_same_process)
143 m_process_ranks.add(irank);
144 {
145 MasterRankMap::iterator i_master = machine_ranks_map.find(rank_name);
146 if (i_master == machine_ranks_map.end()) {
147 // Since the rank traversal is in rank order,
148 // the master rank is the first encountered.
149 machine_ranks_map.insert(std::make_pair(rank_name, irank));
150 }
151 }
152
153 {
154 NamePid mp(rank_name, all_pids[irank]);
155 MasterProcessRankMap::iterator i_master = process_ranks_map.find(mp);
156 if (i_master == process_ranks_map.end()) {
157 process_ranks_map.insert(std::make_pair(mp, irank));
158 }
159 }
160
161 tm->info(4) << "NAME RANK=" << irank << " n=" << (const char*)rank_name.data()
162 << " same_rank=" << is_same_name
163 << " same_process=" << is_same_process;
164 }
165
166 // The ranks in m_machine_ranks and m_process_ranks are sorted
167 // in ascending order. We consider the master to be the first
168 // in the list.
169 if (m_machine_ranks[0] == my_rank)
170 m_is_machine_master = true;
171 if (m_process_ranks[0] == my_rank)
172 m_is_process_master = true;
173
174 m_master_machine_ranks.clear();
175 for (MasterRankMap::const_iterator i(machine_ranks_map.begin()); i != machine_ranks_map.end(); ++i)
176 m_master_machine_ranks.add(i->second);
177 std::sort(std::begin(m_master_machine_ranks), std::end(m_master_machine_ranks));
178 for (Integer i = 0, n = m_master_machine_ranks.size(); i < n; ++i) {
179 if (m_master_machine_ranks[i] == m_machine_ranks[0]) {
180 m_machine_rank = i;
181 break;
182 }
183 }
184
185 m_master_process_ranks.clear();
186 for (MasterProcessRankMap::const_iterator i(process_ranks_map.begin()); i != process_ranks_map.end(); ++i)
187 m_master_process_ranks.add(i->second);
188 std::sort(std::begin(m_master_process_ranks), std::end(m_master_process_ranks));
189 for (Integer i = 0, n = m_master_process_ranks.size(); i < n; ++i) {
190 if (m_master_process_ranks[i] == m_process_ranks[0]) {
191 m_process_rank = i;
192 break;
193 }
194 }
195 tm->info(4) << " MachineRank=" << m_machine_rank
196 << " ProcessRank=" << m_process_rank;
197}
198
199/*---------------------------------------------------------------------------*/
200/*---------------------------------------------------------------------------*/
201
202IParallelMng* ParallelTopology::
203parallelMng() const
204{
205 return m_parallel_mng;
206}
207
208/*---------------------------------------------------------------------------*/
209/*---------------------------------------------------------------------------*/
210
211bool ParallelTopology::
212isMasterMachine() const
213{
214 return m_is_machine_master;
215}
216
217/*---------------------------------------------------------------------------*/
218/*---------------------------------------------------------------------------*/
219
220Int32ConstArrayView ParallelTopology::
221machineRanks() const
222{
223 return m_machine_ranks;
224}
225
226/*---------------------------------------------------------------------------*/
227/*---------------------------------------------------------------------------*/
228
229Int32 ParallelTopology::
230machineRank() const
231{
232 return m_machine_rank;
233}
234
235/*---------------------------------------------------------------------------*/
236/*---------------------------------------------------------------------------*/
237
238bool ParallelTopology::
239isMasterProcess() const
240{
241 return m_is_process_master;
242}
243
244/*---------------------------------------------------------------------------*/
245/*---------------------------------------------------------------------------*/
246
247Int32ConstArrayView ParallelTopology::
248processRanks() const
249{
250 return m_process_ranks;
251}
252
253/*---------------------------------------------------------------------------*/
254/*---------------------------------------------------------------------------*/
255
256Int32 ParallelTopology::
257processRank() const
258{
259 return m_process_rank;
260}
261
262/*---------------------------------------------------------------------------*/
263/*---------------------------------------------------------------------------*/
264
265Int32ConstArrayView ParallelTopology::
266masterMachineRanks() const
267{
268 return m_master_machine_ranks;
269}
270
271/*---------------------------------------------------------------------------*/
272/*---------------------------------------------------------------------------*/
273
274Int32ConstArrayView ParallelTopology::
275masterProcessRanks() const
276{
277 return m_master_process_ranks;
278}
279
280/*---------------------------------------------------------------------------*/
281/*---------------------------------------------------------------------------*/
282
283} // namespace Arcane
284
285/*---------------------------------------------------------------------------*/
286/*---------------------------------------------------------------------------*/
Interface of the parallelism manager for a subdomain.
Integer len(const char *s)
Returns the length of the string s.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
UniqueArray< Int64 > Int64UniqueArray
Dynamic 1D array of 64-bit integers.
Definition UtilsTypes.h:339
std::int64_t Int64
Signed integer type of 64 bits.
Int32 Integer
Type representing an integer.
ConstArrayView< Int32 > Int32ConstArrayView
C equivalent of a 1D array of 32-bit integers.
Definition UtilsTypes.h:482
ConstArrayView< Int64 > Int64ConstArrayView
C equivalent of a 1D array of 64-bit integers.
Definition UtilsTypes.h:480
UniqueArray< Byte > ByteUniqueArray
Dynamic 1D array of characters.
Definition UtilsTypes.h:335
ConstArrayView< Byte > ByteConstArrayView
C equivalent of a 1D array of characters.
Definition UtilsTypes.h:476
std::int32_t Int32
Signed integer type of 32 bits.