Arcane  v3.15.3.0
Documentation utilisateur
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/*---------------------------------------------------------------------------*/
34/*!
35 * \file Parallel.h
36 *
37 * \brief Fichier contenant les déclarations concernant le modèle de
38 * programmation par échange de message.
39 */
40/*---------------------------------------------------------------------------*/
41/*---------------------------------------------------------------------------*/
42
43namespace Arcane
44{
45
46/*---------------------------------------------------------------------------*/
47/*---------------------------------------------------------------------------*/
48
51{
52 return getMPICommunicator();
53}
54
55/*---------------------------------------------------------------------------*/
56/*---------------------------------------------------------------------------*/
57
58extern "C++" void MessagePassing::
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
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.
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 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.
Vue modifiable d'un tableau d'un type T.
void fill(const T &o) noexcept
Remplit le tableau avec la valeur o.
Vue constante d'un tableau de type T.
Interface du gestionnaire de traces.
Référence à une instance.
InstanceType * get() const
Instance associée ou nullptr si aucune.
Chaîne de caractères unicode.
const char * localstr() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
Definition String.cc:227
Int64 length() const
Retourne la longueur de la chaîne.
Definition String.cc:338
__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