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"
42, m_is_machine_master(false)
43, m_is_process_master(false)
50void ParallelTopology::
54 m_parallel_mng->barrier();
75 ByteConstArrayView name;
77 bool operator<(
const NamePid& b)
const
79 int s = std::strcmp((
const char*)name.data(), (
const char*)b.name.data());
90 bool operator()(ByteConstArrayView a, ByteConstArrayView b)
const
92 return ::strcmp((
const char*)a.data(), (
const char*)b.data()) > 0;
97void ParallelTopology::
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();
105 String host_name = platform::getHostName();
106 Int64 pid = platform::getProcessId();
109 Integer max_len = pm->reduce(Parallel::ReduceMax, len);
114 my_name.copy(host_name.utf8());
115 my_name.resize(max_len,
'\0');
117 pm->allGather(my_name, all_names);
120 m_machine_ranks.clear();
121 m_process_ranks.clear();
123 typedef std::map<ByteConstArrayView, Int32, _Comparer> MasterRankMap;
124 typedef std::map<NamePid, Int32> MasterProcessRankMap;
126 MasterRankMap machine_ranks_map;
127 MasterProcessRankMap process_ranks_map;
129 for (Integer irank = 0; irank < nb_rank; ++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;
137 bool is_same_process =
false;
138 if (is_same_name && all_pids[irank] == pid)
139 is_same_process =
true;
142 m_machine_ranks.add(irank);
144 m_process_ranks.add(irank);
146 MasterRankMap::iterator i_master = machine_ranks_map.find(rank_name);
147 if (i_master == machine_ranks_map.end()) {
150 machine_ranks_map.insert(std::make_pair(rank_name, irank));
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));
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;
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;
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]) {
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]) {
196 tm->info(4) <<
" MachineRank=" << m_machine_rank
197 <<
" ProcessRank=" << m_process_rank;
206 return m_parallel_mng;
212bool ParallelTopology::
213isMasterMachine()
const
215 return m_is_machine_master;
224 return m_machine_ranks;
233 return m_machine_rank;
239bool ParallelTopology::
240isMasterProcess()
const
242 return m_is_process_master;
251 return m_process_ranks;
260 return m_process_rank;
267masterMachineRanks()
const
269 return m_master_machine_ranks;
276masterProcessRanks()
const
278 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.