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/IParallelMng.h"
22#include "arcane/impl/ParallelTopology.h"
36ParallelTopology(IParallelMng* pm)
40, m_is_machine_master(false)
41, m_is_process_master(false)
48void ParallelTopology::
52 m_parallel_mng->barrier();
68 ByteConstArrayView name;
70 bool operator<(
const NamePid& b)
const
72 int s = ::strcmp((
const char*)name.data(),(
const char*)b.name.data());
84 bool operator()(ByteConstArrayView a,ByteConstArrayView b)
const
86 return ::strcmp((
const char*)a.data(),(
const char*)b.data())>0;
91void ParallelTopology::
94 IParallelMng* pm = m_parallel_mng;
95 ITraceMng* tm = m_parallel_mng->traceMng();
99 String host_name = platform::getHostName();
100 Int64 pid = platform::getProcessId();
108 my_name.copy(host_name.utf8());
109 my_name.resize(max_len,
'\0');
114 m_machine_ranks.clear();
115 m_process_ranks.clear();
117 typedef std::map<ByteConstArrayView,Int32,_Comparer> MasterRankMap;
118 typedef std::map<NamePid,Int32> MasterProcessRankMap;
120 MasterRankMap machine_ranks_map;
121 MasterProcessRankMap process_ranks_map;
123 for( Integer irank=0; irank<nb_rank; ++irank ){
125 bool is_same_name =
true;
126 for( Integer j=0; j<max_len; ++j )
127 if (rank_name[j]!=my_name[j]){
128 is_same_name =
false;
131 bool is_same_process =
false;
132 if (is_same_name && all_pids[irank]==pid)
133 is_same_process =
true;
136 m_machine_ranks.add(irank);
138 m_process_ranks.add(irank);
140 MasterRankMap::iterator i_master = machine_ranks_map.find(rank_name);
141 if (i_master==machine_ranks_map.end()){
144 machine_ranks_map.insert(std::make_pair(rank_name,irank));
149 NamePid mp(rank_name,all_pids[irank]);
150 MasterProcessRankMap::iterator i_master = process_ranks_map.find(mp);
151 if (i_master==process_ranks_map.end()){
152 process_ranks_map.insert(std::make_pair(mp,irank));
156 tm->info(4) <<
"NAME RANK="<< irank <<
" n=" << (
const char*)rank_name.data()
157 <<
" same_rank=" << is_same_name
158 <<
" same_process=" << is_same_process;
164 if (m_machine_ranks[0]==my_rank)
165 m_is_machine_master =
true;
166 if (m_process_ranks[0]==my_rank)
167 m_is_process_master =
true;
169 m_master_machine_ranks.clear();
170 for( MasterRankMap::const_iterator i(machine_ranks_map.begin()); i!=machine_ranks_map.end(); ++i )
171 m_master_machine_ranks.add(i->second);
172 std::sort(std::begin(m_master_machine_ranks),std::end(m_master_machine_ranks));
173 for( Integer i=0, n=m_master_machine_ranks.size(); i<n; ++i ){
174 if (m_master_machine_ranks[i]==m_machine_ranks[0]){
180 m_master_process_ranks.clear();
181 for( MasterProcessRankMap::const_iterator i(process_ranks_map.begin()); i!=process_ranks_map.end(); ++i )
182 m_master_process_ranks.add(i->second);
183 std::sort(std::begin(m_master_process_ranks),std::end(m_master_process_ranks));
184 for( Integer i=0, n=m_master_process_ranks.size(); i<n; ++i ){
185 if (m_master_process_ranks[i]==m_process_ranks[0]){
190 tm->info(4) <<
" MachineRank=" << m_machine_rank
191 <<
" ProcessRank=" << m_process_rank;
200 return m_parallel_mng;
206bool ParallelTopology::
207isMasterMachine()
const
209 return m_is_machine_master;
218 return m_machine_ranks;
224Int32 ParallelTopology::
227 return m_machine_rank;
233bool ParallelTopology::
234isMasterProcess()
const
236 return m_is_process_master;
245 return m_process_ranks;
251Int32 ParallelTopology::
254 return m_process_rank;
261masterMachineRanks()
const
263 return m_master_machine_ranks;
270masterProcessRanks()
const
272 return m_master_process_ranks;
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual Int32 commSize() const =0
Nombre d'instance dans le communicateur.
virtual void allGather(ConstArrayView< char > send_buf, ArrayView< char > recv_buf)=0
Effectue un regroupement sur tous les processeurs. Il s'agit d'une opération collective....
virtual char reduce(eReduceType rt, char v)=0
Effectue la réduction de type rt sur le réel v et retourne la valeur.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Vue constante d'un tableau de type T.
Integer len(const char *s)
Retourne la longueur de la chaîne s.
UniqueArray< Int64 > Int64UniqueArray
Tableau dynamique à une dimension d'entiers 64 bits.
UniqueArray< Byte > ByteUniqueArray
Tableau dynamique à une dimension de caractères.
ConstArrayView< Byte > ByteConstArrayView
Equivalent C d'un tableau à une dimension de caractères.
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
Int32 Integer
Type représentant un entier.