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"
20#include "arcane/core/IParallelMng.h"
22#include "arcane/impl/ParallelTopology.h"
41, m_is_machine_master(false)
42, m_is_process_master(false)
49void ParallelTopology::
53 m_parallel_mng->barrier();
74 ByteConstArrayView name;
76 bool operator<(
const NamePid& b)
const
78 int s = ::strcmp((
const char*)name.data(), (
const char*)b.name.data());
89 bool operator()(ByteConstArrayView a, ByteConstArrayView b)
const
91 return ::strcmp((
const char*)a.data(), (
const char*)b.data()) > 0;
96void ParallelTopology::
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();
104 String host_name = platform::getHostName();
105 Int64 pid = platform::getProcessId();
108 Integer max_len = pm->reduce(Parallel::ReduceMax, len);
113 my_name.copy(host_name.utf8());
114 my_name.resize(max_len,
'\0');
116 pm->allGather(my_name, all_names);
119 m_machine_ranks.clear();
120 m_process_ranks.clear();
122 typedef std::map<ByteConstArrayView, Int32, _Comparer> MasterRankMap;
123 typedef std::map<NamePid, Int32> MasterProcessRankMap;
125 MasterRankMap machine_ranks_map;
126 MasterProcessRankMap process_ranks_map;
128 for (Integer irank = 0; irank < nb_rank; ++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;
136 bool is_same_process =
false;
137 if (is_same_name && all_pids[irank] == pid)
138 is_same_process =
true;
141 m_machine_ranks.add(irank);
143 m_process_ranks.add(irank);
145 MasterRankMap::iterator i_master = machine_ranks_map.find(rank_name);
146 if (i_master == machine_ranks_map.end()) {
149 machine_ranks_map.insert(std::make_pair(rank_name, irank));
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));
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;
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;
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]) {
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]) {
195 tm->info(4) <<
" MachineRank=" << m_machine_rank
196 <<
" ProcessRank=" << m_process_rank;
205 return m_parallel_mng;
211bool ParallelTopology::
212isMasterMachine()
const
214 return m_is_machine_master;
223 return m_machine_ranks;
232 return m_machine_rank;
238bool ParallelTopology::
239isMasterProcess()
const
241 return m_is_process_master;
250 return m_process_ranks;
259 return m_process_rank;
266masterMachineRanks()
const
268 return m_master_machine_ranks;
275masterProcessRanks()
const
277 return m_master_process_ranks;
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.
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.
ConstArrayView< Int64 > Int64ConstArrayView
C equivalent of a 1D array of 64-bit integers.
UniqueArray< Byte > ByteUniqueArray
Dynamic 1D array of characters.
ConstArrayView< Byte > ByteConstArrayView
C equivalent of a 1D array of characters.
std::int32_t Int32
Signed integer type of 32 bits.