Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
ParallelTopology.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 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/* Informations sur la topologie d'allocation des coeurs de calcul. */
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/IParallelMng.h"
21
22#include "arcane/impl/ParallelTopology.h"
23
24#include <map>
25#include <algorithm>
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30ARCANE_BEGIN_NAMESPACE
31
32/*---------------------------------------------------------------------------*/
33/*---------------------------------------------------------------------------*/
34
35ParallelTopology::
36ParallelTopology(IParallelMng* pm)
37: m_parallel_mng(pm)
38, m_machine_rank(-1)
39, m_process_rank(-1)
40, m_is_machine_master(false)
41, m_is_process_master(false)
42{
43}
44
45/*---------------------------------------------------------------------------*/
46/*---------------------------------------------------------------------------*/
47
48void ParallelTopology::
49initialize()
50{
51 // Test pour être sur que tout le monde appèle cette méthode d'initialisation.
52 m_parallel_mng->barrier();
53 _init();
54}
55
56/*---------------------------------------------------------------------------*/
57/*---------------------------------------------------------------------------*/
58
59namespace
60{
61// Contient nom du noeud + pid pour connaitre les rangs maitres par processus.
62class NamePid
63{
64 public:
65 NamePid(ByteConstArrayView _name,Int64 _pid)
66 : name(_name), pid(_pid){}
67 public:
68 ByteConstArrayView name;
69 Int64 pid;
70 bool operator<(const NamePid& b) const
71 {
72 int s = ::strcmp((const char*)name.data(),(const char*)b.name.data());
73 if (s!=0)
74 return s>0;
75 return pid>b.pid;
76
77 }
78
79};
80// Comparateur pour le nom du noeud.
81class _Comparer
82{
83 public:
84 bool operator()(ByteConstArrayView a,ByteConstArrayView b) const
85 {
86 return ::strcmp((const char*)a.data(),(const char*)b.data())>0;
87 }
88};
89}
90
91void ParallelTopology::
92_init()
93{
94 IParallelMng* pm = m_parallel_mng;
95 ITraceMng* tm = m_parallel_mng->traceMng();
96 Int32 nb_rank = pm->commSize();
97 Int32 my_rank = pm->commRank();
98
99 String host_name = platform::getHostName();
100 Int64 pid = platform::getProcessId();
101 // Tous les rangs qui ont le même nom \a host_name sont sur la même machine
102 Integer len = host_name.utf8().size()+1;
103 Integer max_len = pm->reduce(Parallel::ReduceMax,len);
104 ByteUniqueArray all_names(max_len*nb_rank);
105 ByteUniqueArray my_name;
106 Int64UniqueArray all_pids(nb_rank);
107
108 my_name.copy(host_name.utf8()); // copy shrink array size to arg size
109 my_name.resize(max_len,'\0'); // add \0 to fill up to max_len
110
111 pm->allGather(my_name,all_names);
112 pm->allGather(Int64ConstArrayView(1,&pid),all_pids);
113
114 m_machine_ranks.clear();
115 m_process_ranks.clear();
116
117 typedef std::map<ByteConstArrayView,Int32,_Comparer> MasterRankMap;
118 typedef std::map<NamePid,Int32> MasterProcessRankMap;
119
120 MasterRankMap machine_ranks_map;
121 MasterProcessRankMap process_ranks_map;
122
123 for( Integer irank=0; irank<nb_rank; ++irank ){
124 ByteConstArrayView rank_name(max_len,&all_names[max_len*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;
129 break;
130 }
131 bool is_same_process = false;
132 if (is_same_name && all_pids[irank]==pid)
133 is_same_process = true;
134
135 if (is_same_name)
136 m_machine_ranks.add(irank);
137 if (is_same_process)
138 m_process_ranks.add(irank);
139 {
140 MasterRankMap::iterator i_master = machine_ranks_map.find(rank_name);
141 if (i_master==machine_ranks_map.end()){
142 // Comme le parcours des rangs est dans l'ordre des rangs,
143 // le rang maitre est le premier rencontré.
144 machine_ranks_map.insert(std::make_pair(rank_name,irank));
145 }
146 }
147
148 {
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));
153 }
154 }
155
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;
159 }
160
161 // Les rangs dans m_machine_ranks et m_process_ranks sont rangés
162 // par ordre croissant. On considère que le maître est le premier
163 // de la liste.
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;
168
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]){
175 m_machine_rank = i;
176 break;
177 }
178 }
179
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]){
186 m_process_rank = i;
187 break;
188 }
189 }
190 tm->info(4) << " MachineRank=" << m_machine_rank
191 << " ProcessRank=" << m_process_rank;
192}
193
194/*---------------------------------------------------------------------------*/
195/*---------------------------------------------------------------------------*/
196
197IParallelMng* ParallelTopology::
198parallelMng() const
199{
200 return m_parallel_mng;
201}
202
203/*---------------------------------------------------------------------------*/
204/*---------------------------------------------------------------------------*/
205
206bool ParallelTopology::
207isMasterMachine() const
208{
209 return m_is_machine_master;
210}
211
212/*---------------------------------------------------------------------------*/
213/*---------------------------------------------------------------------------*/
214
215Int32ConstArrayView ParallelTopology::
216machineRanks() const
217{
218 return m_machine_ranks;
219}
220
221/*---------------------------------------------------------------------------*/
222/*---------------------------------------------------------------------------*/
223
224Int32 ParallelTopology::
225machineRank() const
226{
227 return m_machine_rank;
228}
229
230/*---------------------------------------------------------------------------*/
231/*---------------------------------------------------------------------------*/
232
233bool ParallelTopology::
234isMasterProcess() const
235{
236 return m_is_process_master;
237}
238
239/*---------------------------------------------------------------------------*/
240/*---------------------------------------------------------------------------*/
241
242Int32ConstArrayView ParallelTopology::
243processRanks() const
244{
245 return m_process_ranks;
246}
247
248/*---------------------------------------------------------------------------*/
249/*---------------------------------------------------------------------------*/
250
251Int32 ParallelTopology::
252processRank() const
253{
254 return m_process_rank;
255}
256
257/*---------------------------------------------------------------------------*/
258/*---------------------------------------------------------------------------*/
259
260Int32ConstArrayView ParallelTopology::
261masterMachineRanks() const
262{
263 return m_master_machine_ranks;
264}
265
266/*---------------------------------------------------------------------------*/
267/*---------------------------------------------------------------------------*/
268
269Int32ConstArrayView ParallelTopology::
270masterProcessRanks() const
271{
272 return m_master_process_ranks;
273}
274
275/*---------------------------------------------------------------------------*/
276/*---------------------------------------------------------------------------*/
277
278ARCANE_END_NAMESPACE
279
280/*---------------------------------------------------------------------------*/
281/*---------------------------------------------------------------------------*/
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.
Definition Lima.cc:120
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.
Definition UtilsTypes.h:513
UniqueArray< Byte > ByteUniqueArray
Tableau dynamique à une dimension de caractères.
Definition UtilsTypes.h:509
ConstArrayView< Byte > ByteConstArrayView
Equivalent C d'un tableau à une dimension de caractères.
Definition UtilsTypes.h:634
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
Definition UtilsTypes.h:638
Int32 Integer
Type représentant un entier.