Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
Parallel.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 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/* Parallel.cc (C) 2000-2024 */
9/* */
10/* Espace de nom des types gérant le parallélisme. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
15
16#include "arcane/utils/String.h"
17#include "arcane/utils/ArrayView.h"
18#include "arcane/utils/FatalErrorException.h"
19#include "arcane/utils/PlatformUtils.h"
20#include "arcane/utils/ITraceMng.h"
21
22#include "arcane/core/IParallelMng.h"
23#include "arcane/core/IParallelMng.h"
24#include "arcane/core/IParallelTopology.h"
25#include "arcane/core/IParallelReplication.h"
26#include "arcane/core/SerializeBuffer.h"
27
28#include <iostream>
29#include <map>
30#include <set>
31
32/*---------------------------------------------------------------------------*/
33/*---------------------------------------------------------------------------*/
40/*---------------------------------------------------------------------------*/
41/*---------------------------------------------------------------------------*/
42
43namespace Arcane
44{
45
46/*---------------------------------------------------------------------------*/
47/*---------------------------------------------------------------------------*/
48
51{
52 return getMPICommunicator();
53}
54
55/*---------------------------------------------------------------------------*/
56/*---------------------------------------------------------------------------*/
57
58extern "C++" void MessagePassing::
59namedBarrier(IParallelMng* pm,const String& name)
60{
61 // Copie les 1024 premiers caractères de name dans un tableau de Int32
62 // et fait une réduction 'max' sur ce tableau. Si la réduction est différente
63 // de notre valeur c'est qu'un des rang n'a pas la bonne barrière.
65
66 const int nsize = 256;
67 Int32 sbuf[nsize];
68 Int32 max_sbuf[nsize];
71 ByteArrayView buf_as_bytes(nsize*sizeof(Int32),(Byte*)sbuf);
72 buf.fill(0);
73 Integer len = arcaneCheckArraySize(name.length());
74 ByteConstArrayView name_as_bytes(len,(const Byte*)name.localstr());
75 Integer name_len = math::min(buf_as_bytes.size(),name_as_bytes.size());
76 buf_as_bytes.copy(name_as_bytes.subView(0,name_len));
77 buf[nsize-1] = 0;
78 max_buf.copy(buf);
79 pm->reduce(Parallel::ReduceMax,max_buf);
80
81 if (max_buf!=buf){
82 max_buf[nsize-1] = 0;
83 String max_string((const char*)max_buf.unguardedBasePointer());
84 ARCANE_FATAL("Bad namedBarrier expected='{0}' found='{1}'",
85 name,max_string);
86 }
87}
88
89/*---------------------------------------------------------------------------*/
90/*---------------------------------------------------------------------------*/
91
92extern "C++" void MessagePassing::
95{
96 const Int32 nb_string = input_strings.size();
97
98 // Créé un buffer pour sérialiser les noms des variables dont on dispose
99 SerializeBuffer send_buf;
100 send_buf.setMode(ISerializer::ModeReserve);
101 send_buf.reserve(DT_Int32,1);
102 for( Integer i=0; i<nb_string; ++i ){
103 send_buf.reserve(input_strings[i]);
104 }
105
106 send_buf.allocateBuffer();
108 send_buf.putInt32(nb_string);
109 for( Integer i=0; i<nb_string; ++i ){
110 send_buf.put(input_strings[i]);
111 }
112
113 // Récupère les infos des autres PE.
114 SerializeBuffer recv_buf;
115 pm->allGather(&send_buf,&recv_buf);
116
117 std::map<String,Int32> string_occurences;
118
119 Int32 nb_rank = pm->commSize();
121 for( Integer i=0; i<nb_rank; ++i ){
122 Int32 nb_string_rank = recv_buf.getInt32();
123 for( Integer z=0; z<nb_string_rank; ++z ){
124 String x;
125 recv_buf.get(x);
126 auto vo = string_occurences.find(x);
127 if (vo==string_occurences.end())
128 string_occurences.insert(std::make_pair(x,1));
129 else
130 vo->second = vo->second + 1;
131 }
132 }
133
134 // Parcours la liste des chaînes de caractète et range dans \a out_strings
135 // celles qui sont disponibles sur tous les rangs de \a pm
136 std::set<String> common_set;
137 {
138 auto end_iter = string_occurences.end();
139 for( Integer i=0; i<nb_string; ++i ){
140 String str = input_strings[i];
141 auto i_str = string_occurences.find(str);
142 if (i_str==end_iter)
143 // Ne devrait pas arriver
144 continue;
145 if (i_str->second!=nb_rank)
146 continue;
147 common_set.insert(str);
148 }
149 }
150
151 // Créé la liste finale en itérant sur \a common_set
152 // qui est trié alphabétiquement.
153 common_strings.clear();
154 for( const String& s : common_set )
155 common_strings.add(s);
156}
157
158/*---------------------------------------------------------------------------*/
159/*---------------------------------------------------------------------------*/
160
163{
166
167 Real mem_used = platform::getMemoryUsed();
168 Real mem_sum = 0.0;
169 Real mem_min = 0.0;
170 Real mem_max = 0.0;
171 Int32 mem_min_rank = 0;
172 Int32 mem_max_rank = 0;
174 tm->info() << "Date: " << platform::getCurrentDateTime() << " MEM=" << (Int64)(mem_used / 1e6)
175 << " MAX_MEM=" << (Int64)(mem_max / 1e6)
176 << " MIN_MEM=" << (Int64)(mem_min / 1e6)
177 << " AVG_MEM=" << (Int64)(mem_sum / 1e6) / pm->commSize()
178 << " MIN_RANK=" << mem_min_rank << " MAX_RANK=" << mem_max_rank;
179}
180
181/*---------------------------------------------------------------------------*/
182/*---------------------------------------------------------------------------*/
183
184} // End namespace Arcane
185
186/*---------------------------------------------------------------------------*/
187/*---------------------------------------------------------------------------*/
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Fichier contenant les déclarations concernant le modèle de programmation par échange de message.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual void computeMinMaxSum(char val, char &min_val, char &max_val, char &sum_val, Int32 &min_rank, Int32 &max_rank)=0
Calcule en une opération la somme, le min, le max d'une valeur.
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 ARCANE_DEPRECATED_120 void * mpiCommunicator()
Adresse du communicateur MPI associé à ce gestionnaire.
Definition Parallel.cc:50
virtual void * getMPICommunicator()=0
Adresse du communicateur MPI associé à ce gestionnaire.
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
Implémentation d'un tampon pour la sérialisation.
Vue modifiable d'un tableau d'un type T.
void fill(const T &o) noexcept
Remplit le tableau avec la valeur o.
void allocateBuffer() override
Alloue la mémoire du sérialiseur.
void reserve(eDataType dt, Int64 n) override
Réserve de la mémoire pour n objets de type dt.
void put(Span< const Real > values) override
Ajoute le tableau values.
void setMode(eMode new_mode) override
Positionne le fonctionnement actuel.
Int32 getInt32() override
Récupère un entier naturel.
void putInt32(Int32 value) override
Ajoute l'entier value.
void get(RealArrayView values) override
Récupère le tableau values.
Vue constante d'un tableau de type T.
constexpr Integer length() const noexcept
Nombre d'éléments du tableau.
Interface du gestionnaire de traces.
Chaîne de caractères unicode.
TraceMessage info() const
Flot pour un message d'information.
ARCCORE_HOST_DEVICE Real2 min(Real2 a, Real2 b)
Retourne le minimum de deux Real2.
Definition MathUtils.h:336
void namedBarrier(IParallelMng *pm, const String &name)
Effectue une barrière nommée de nom name.
Definition Parallel.cc:59
void dumpDateAndMemoryUsage(IParallelMng *pm, ITraceMng *tm)
Écrit dans tm la date et la mémoire consommée.
Definition Parallel.cc:162
void filterCommonStrings(IParallelMng *pm, ConstArrayView< String > input_strings, Array< String > &common_strings)
Filtre les chaînes de caractères communes à tous les rangs de pm.
Definition Parallel.cc:93
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Integer arcaneCheckArraySize(unsigned long long size)
Vérifie que size peut être converti dans un 'Integer' pour servir de taille à un tableau....
@ DT_Int32
Donnée de type entier 32 bits.
Definition DataTypes.h:43