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