Arcane  v3.16.0.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-2025 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-2025 */
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#include "arcane/utils/Math.h"
22
23#include "arcane/core/IParallelMng.h"
24#include "arcane/core/IParallelMng.h"
25#include "arcane/core/IParallelTopology.h"
26#include "arcane/core/IParallelReplication.h"
27#include "arcane/core/SerializeBuffer.h"
28
29#include <iostream>
30#include <map>
31#include <set>
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
41/*---------------------------------------------------------------------------*/
42/*---------------------------------------------------------------------------*/
43
44namespace Arcane
45{
46
47/*---------------------------------------------------------------------------*/
48/*---------------------------------------------------------------------------*/
49
52{
53 return getMPICommunicator();
54}
55
56/*---------------------------------------------------------------------------*/
57/*---------------------------------------------------------------------------*/
58
59extern "C++" void MessagePassing::
60namedBarrier(IParallelMng* pm,const String& name)
61{
62 // Copie les 1024 premiers caractères de name dans un tableau de Int32
63 // et fait une réduction 'max' sur ce tableau. Si la réduction est différente
64 // de notre valeur c'est qu'un des rang n'a pas la bonne barrière.
66
67 const int nsize = 256;
68 Int32 sbuf[nsize];
69 Int32 max_sbuf[nsize];
70 Int32ArrayView buf(nsize,sbuf);
71 Int32ArrayView max_buf(nsize,max_sbuf);
72 ByteArrayView buf_as_bytes(nsize*sizeof(Int32),(Byte*)sbuf);
73 buf.fill(0);
75 ByteConstArrayView name_as_bytes(len,(const Byte*)name.localstr());
76 Integer name_len = math::min(buf_as_bytes.size(),name_as_bytes.size());
77 buf_as_bytes.copy(name_as_bytes.subView(0,name_len));
78 buf[nsize-1] = 0;
79 max_buf.copy(buf);
80 pm->reduce(Parallel::ReduceMax,max_buf);
81
82 if (max_buf!=buf){
83 max_buf[nsize-1] = 0;
84 String max_string((const char*)max_buf.unguardedBasePointer());
85 ARCANE_FATAL("Bad namedBarrier expected='{0}' found='{1}'",
86 name,max_string);
87 }
88}
89
90/*---------------------------------------------------------------------------*/
91/*---------------------------------------------------------------------------*/
92
93extern "C++" void MessagePassing::
95 Array<String>& common_strings)
96{
97 const Int32 nb_string = input_strings.size();
98
99 // Créé un buffer pour sérialiser les noms des variables dont on dispose
100 SerializeBuffer send_buf;
101 send_buf.setMode(ISerializer::ModeReserve);
102 send_buf.reserve(DT_Int32,1);
103 for( Integer i=0; i<nb_string; ++i ){
104 send_buf.reserve(input_strings[i]);
105 }
106
107 send_buf.allocateBuffer();
109 send_buf.putInt32(nb_string);
110 for( Integer i=0; i<nb_string; ++i ){
111 send_buf.put(input_strings[i]);
112 }
113
114 // Récupère les infos des autres PE.
115 SerializeBuffer recv_buf;
116 pm->allGather(&send_buf,&recv_buf);
117
118 std::map<String,Int32> string_occurences;
119
120 Int32 nb_rank = pm->commSize();
122 for( Integer i=0; i<nb_rank; ++i ){
123 Int32 nb_string_rank = recv_buf.getInt32();
124 for( Integer z=0; z<nb_string_rank; ++z ){
125 String x;
126 recv_buf.get(x);
127 auto vo = string_occurences.find(x);
128 if (vo==string_occurences.end())
129 string_occurences.insert(std::make_pair(x,1));
130 else
131 vo->second = vo->second + 1;
132 }
133 }
134
135 // Parcours la liste des chaînes de caractète et range dans \a out_strings
136 // celles qui sont disponibles sur tous les rangs de \a pm
137 std::set<String> common_set;
138 {
139 auto end_iter = string_occurences.end();
140 for( Integer i=0; i<nb_string; ++i ){
141 String str = input_strings[i];
142 auto i_str = string_occurences.find(str);
143 if (i_str==end_iter)
144 // Ne devrait pas arriver
145 continue;
146 if (i_str->second!=nb_rank)
147 continue;
148 common_set.insert(str);
149 }
150 }
151
152 // Créé la liste finale en itérant sur \a common_set
153 // qui est trié alphabétiquement.
154 common_strings.clear();
155 for( const String& s : common_set )
156 common_strings.add(s);
157}
158
159/*---------------------------------------------------------------------------*/
160/*---------------------------------------------------------------------------*/
161
164{
167
168 Real mem_used = platform::getMemoryUsed();
169 Real mem_sum = 0.0;
170 Real mem_min = 0.0;
171 Real mem_max = 0.0;
172 Int32 mem_min_rank = 0;
173 Int32 mem_max_rank = 0;
174 pm->computeMinMaxSum(mem_used, mem_min, mem_max, mem_sum, mem_min_rank, mem_max_rank);
175 tm->info() << "Date: " << platform::getCurrentDateTime() << " MEM=" << (Int64)(mem_used / 1e6)
176 << " MAX_MEM=" << (Int64)(mem_max / 1e6)
177 << " MIN_MEM=" << (Int64)(mem_min / 1e6)
178 << " AVG_MEM=" << (Int64)(mem_sum / 1e6) / pm->commSize()
179 << " MIN_RANK=" << mem_min_rank << " MAX_RANK=" << mem_max_rank;
180}
181
182/*---------------------------------------------------------------------------*/
183/*---------------------------------------------------------------------------*/
184
185} // End namespace Arcane
186
187/*---------------------------------------------------------------------------*/
188/*---------------------------------------------------------------------------*/
#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.
void copy(const U &copy_array)
Recopie le tableau copy_array dans l'instance.
void fill(const T &o) noexcept
Remplit le tableau avec la valeur o.
constexpr pointer unguardedBasePointer() noexcept
Pointeur sur le début de la vue.
constexpr Integer size() const noexcept
Retourne la taille du tableau.
Tableau d'items de types quelconques.
void clear()
Supprime les éléments du tableau.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
void put(Span< const Real > values) override
Ajoute le tableau values.
void reserve(eBasicDataType dt, Int64 n) override
Réserve de la mémoire pour n objets de type dt.
void putInt32(Int32 value) override
Ajoute l'entier value.
void allocateBuffer() override
Alloue la mémoire du sérialiseur.
void get(ArrayView< Real > values) override
Récupère le tableau values.
Int32 getInt32() override
Récupère un entier naturel.
void setMode(eMode new_mode) override
Positionne le fonctionnement actuel.
Vue constante d'un tableau de type T.
constexpr ConstArrayView< T > subView(Integer abegin, Integer asize) const noexcept
Sous-vue (constante) à partir de l'élément abegin et contenant asize éléments.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
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:51
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.
@ ModePut
Le sérialiseur attend des reserve()
Interface du gestionnaire de traces.
virtual TraceMessage info()=0
Flot pour un message d'information.
Implémentation d'un tampon pour la sérialisation.
Chaîne de caractères unicode.
Int64 length() const
Retourne la longueur de la chaîne.
Definition String.cc:338
const char * localstr() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
Definition String.cc:227
__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:60
void dumpDateAndMemoryUsage(IParallelMng *pm, ITraceMng *tm)
Écrit dans tm la date et la mémoire consommée.
Definition Parallel.cc:163
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:94
@ ReduceMax
Maximum des valeurs.
ARCCORE_BASE_EXPORT String getCurrentDateTime()
Date et l'heure courante sous la forme ISO 8601.
ARCCORE_BASE_EXPORT double getMemoryUsed()
Mémoire utilisée em octets.
-*- 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....
ArrayView< Byte > ByteArrayView
Equivalent C d'un tableau à une dimension de caractères.
Definition UtilsTypes.h:534
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
ArrayView< Int32 > Int32ArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:540
double Real
Type représentant un réel.
ConstArrayView< Byte > ByteConstArrayView
Equivalent C d'un tableau à une dimension de caractères.
Definition UtilsTypes.h:563
unsigned char Byte
Type d'un octet.
Definition BaseTypes.h:43
@ DT_Int32
Donnée de type entier 32 bits.
Definition DataTypes.h:43
std::int32_t Int32
Type entier signé sur 32 bits.