14#include "arcane/materials/MeshMaterialVariableSynchronizerList.h"
16#include "arcane/utils/ITraceMng.h"
17#include "arcane/utils/NotSupportedException.h"
18#include "arcane/utils/ValueConvert.h"
19#include "arcane/utils/FatalErrorException.h"
21#include "arcane/core/IParallelMng.h"
22#include "arcane/core/IVariableSynchronizer.h"
23#include "arcane/core/internal/IParallelMngInternal.h"
24#include "arcane/core/materials/IMeshMaterialMng.h"
25#include "arcane/core/materials/internal/IMeshMaterialVariableInternal.h"
26#include "arcane/core/materials/internal/IMeshMaterialMngInternal.h"
28#include "arcane/materials/MeshMaterialVariable.h"
29#include "arcane/materials/IMeshMaterialSynchronizeBuffer.h"
30#include "arcane/materials/IMeshMaterialVariableSynchronizer.h"
32#include "arcane/accelerator/core/RunQueue.h"
41namespace MP = Arccore::MessagePassing;
53 bool use_generic_version =
false;
54 Int32 sync_version = 0;
56 Int64 message_total_size = 0;
58 MP::MessageTag message_tag;
69 : m_material_mng(material_mng)
74 m_use_generic_version = (v.value() == 0);
82 Int64 m_total_size = 0;
83 bool m_use_generic_version =
true;
87 bool m_is_in_sync =
false;
93MeshMaterialVariableSynchronizerList::
95: m_p(new
Impl(material_mng))
102MeshMaterialVariableSynchronizerList::
103~MeshMaterialVariableSynchronizerList()
114 return m_p->m_total_size;
126 Int32 v = m_p->m_material_mng->synchronizeVariableVersion();
127 bool is_blocking = (v == 8);
129 _beginSynchronize(is_blocking);
130 _endSynchronize(is_blocking);
139 Int32 v = m_p->m_material_mng->synchronizeVariableVersion();
141 ARCANE_FATAL(
"beginSynchronize() is only valid for synchronize version 7 (v={0})", v);
142 _beginSynchronize(
false);
151 _endSynchronize(
false);
157void MeshMaterialVariableSynchronizerList::
158_beginSynchronize(
bool is_blocking)
160 if (m_p->m_is_in_sync)
162 m_p->m_is_in_sync =
true;
164 m_p->m_total_size = 0;
168 m_p->m_mat_env_sync_info = SyncInfo();
169 m_p->m_env_only_sync_info = SyncInfo();
172 SyncInfo& sync_info = m_p->m_mat_env_sync_info;
173 _fillSyncInfo(sync_info);
175 sync_info.variables = m_p->m_mat_env_vars;
176 sync_info.message_tag = MP::MessageTag(569);
177 if (!sync_info.variables.empty()) {
178 _beginSynchronizeMultiple(sync_info);
180 _endSynchronizeMultiple2(sync_info);
184 SyncInfo& sync_info = m_p->m_env_only_sync_info;
185 _fillSyncInfo(sync_info);
187 sync_info.variables = m_p->m_env_only_vars;
188 sync_info.message_tag = MP::MessageTag(585);
189 if (!sync_info.variables.empty()) {
190 _beginSynchronizeMultiple(sync_info);
192 _endSynchronizeMultiple2(sync_info);
200void MeshMaterialVariableSynchronizerList::
201_endSynchronize(
bool is_blocking)
203 if (!m_p->m_is_in_sync)
204 ARCANE_FATAL(
"beginSynchronize() has to be called before endSynchronize()");
207 SyncInfo& sync_info = m_p->m_mat_env_sync_info;
208 if (!sync_info.variables.empty() && !is_blocking)
209 _endSynchronizeMultiple2(sync_info);
210 m_p->m_total_size += sync_info.message_total_size;
213 SyncInfo& sync_info = m_p->m_env_only_sync_info;
214 if (!sync_info.variables.empty() && !is_blocking)
215 _endSynchronizeMultiple2(sync_info);
216 m_p->m_total_size += sync_info.message_total_size;
219 m_p->m_is_in_sync =
false;
230 m_p->m_mat_env_vars.add(var);
232 m_p->m_env_only_vars.add(var);
235 var->
name(), (
int)mvs);
241void MeshMaterialVariableSynchronizerList::
242_fillSyncInfo(SyncInfo& sync_info)
244 sync_info.use_generic_version = m_p->m_use_generic_version;
251void MeshMaterialVariableSynchronizerList::
252_beginSynchronizeMultiple(SyncInfo& sync_info)
256 const Int32 sync_version = sync_info.sync_version;
258 if (sync_version == 8) {
262 else if (sync_version == 7) {
264 sync_info.buf_list = impl::makeOneBufferMeshMaterialSynchronizeBufferRef(mem);
268 sync_info.buf_list = impl::makeMultiBufferMeshMaterialSynchronizeBufferRef(mem);
270 if (sync_version < 8) {
273 sync_info.buf_list->setNbRank(nb_rank);
276 _beginSynchronizeMultiple2(sync_info);
282void MeshMaterialVariableSynchronizerList::
283_beginSynchronizeMultiple2(
SyncInfo& sync_info)
285 ConstArrayView<MeshMaterialVariable*> vars = sync_info.variables;
286 IMeshMaterialSynchronizeBuffer* buf_list = sync_info.buf_list.get();
287 IMeshMaterialVariableSynchronizer* mmvs = sync_info.mat_synchronizer;
303 if (!pm->isParallel())
305 const bool use_new_version = sync_info.use_generic_version;
306 RunQueue queue = pm->_internalApi()->queue();
308 mmvs->checkRecompute();
310 ITraceMng* tm = pm->traceMng();
312 tm->info(4) <<
"MAT_SYNCHRONIZE version=" << sync_info.sync_version <<
" multiple n="
313 << nb_var <<
" is_generic?=" << use_new_version;
315 sync_info.data_sizes.resize(nb_var);
317 for (
Integer i = 0; i < nb_var; ++i) {
318 sync_info.data_sizes[i] = vars[i]->dataTypeSize();
319 all_datatype_size += sync_info.data_sizes[i];
320 tm->info(4) <<
"MAT_SYNCHRONIZE name=" << vars[i]->name()
321 <<
" size=" << sync_info.data_sizes[i];
328 for (
Integer i = 0; i < nb_rank; ++i) {
329 ConstArrayView<MatVarIndex> ghost_matcells(mmvs->ghostItems(i));
330 Integer total_ghost = ghost_matcells.size();
331 buf_list->setReceiveBufferSize(i, total_ghost * all_datatype_size);
332 ConstArrayView<MatVarIndex> shared_matcells(mmvs->sharedItems(i));
333 Integer total_shared = shared_matcells.size();
334 buf_list->setSendBufferSize(i, total_shared * all_datatype_size);
336 buf_list->allocate();
339 for (
Integer i = 0; i < nb_rank; ++i) {
340 Int32 rank = ranks[i];
341 MP::PointToPointMessageInfo msg_info(MP::MessageRank(rank), sync_info.message_tag, MP::eBlockingType::NonBlocking);
342 sync_info.requests.add(
mpReceive(mpm, buf_list->receiveBuffer(i), msg_info));
346 for (
Integer i = 0; i < nb_rank; ++i) {
347 ConstArrayView<MatVarIndex> shared_matcells(mmvs->sharedItems(i));
348 Integer total_shared = shared_matcells.size();
351 for (
Integer z = 0; z < nb_var; ++z) {
352 Integer my_data_size = sync_info.data_sizes[z];
353 auto sub_view = values.subView(offset, total_shared * my_data_size);
354 if (use_new_version) {
355 auto* ptr =
reinterpret_cast<std::byte*
>(sub_view.data());
356 vars[z]->_internalApi()->copyToBuffer(shared_matcells, { ptr, sub_view.size() }, &queue);
359 vars[z]->copyToBuffer(shared_matcells, sub_view);
360 offset += total_shared * my_data_size;
368 for (
Integer i = 0; i < nb_rank; ++i) {
369 Int32 rank = ranks[i];
370 MP::PointToPointMessageInfo msg_info(MP::MessageRank(rank), sync_info.message_tag, MP::eBlockingType::NonBlocking);
371 sync_info.requests.add(
mpSend(mpm, buf_list->sendBuffer(i), msg_info));
378void MeshMaterialVariableSynchronizerList::
379_endSynchronizeMultiple2(
SyncInfo& sync_info)
381 ConstArrayView<MeshMaterialVariable*> vars = sync_info.variables;
382 IMeshMaterialVariableSynchronizer* mmvs = sync_info.mat_synchronizer;
383 IVariableSynchronizer* var_syncer = mmvs->variableSynchronizer();
384 IParallelMng* pm = var_syncer->parallelMng();
386 if (!pm->isParallel())
388 const bool use_new_version = sync_info.use_generic_version;
389 RunQueue queue = pm->_internalApi()->queue();
390 IMeshMaterialSynchronizeBuffer* buf_list = sync_info.buf_list.get();
396 pm->waitAllRequests(sync_info.requests);
399 for (
Integer i = 0; i < nb_rank; ++i) {
400 ConstArrayView<MatVarIndex> ghost_matcells(mmvs->ghostItems(i));
401 Integer total_ghost = ghost_matcells.size();
405 for (
Integer z = 0; z < nb_var; ++z) {
406 Integer my_data_size = sync_info.data_sizes[z];
407 auto sub_view = values.subView(offset, total_ghost * my_data_size);
408 if (use_new_version) {
409 auto* ptr =
reinterpret_cast<const std::byte*
>(sub_view.data());
410 vars[z]->_internalApi()->copyFromBuffer(ghost_matcells, { ptr, sub_view.size() }, &queue);
413 vars[z]->copyFromBuffer(ghost_matcells, sub_view);
414 offset += total_ghost * my_data_size;
417 sync_info.message_total_size += buf_list->totalSize();
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Liste des fonctions d'échange de message.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Classe template pour convertir un type.
virtual IMessagePassingMng * messagePassingMng() const =0
Gestionnaire de message de Arccore associé
virtual Int32ConstArrayView communicatingRanks()=0
Rangs des sous-domaines avec lesquels on communique.
virtual IParallelMng * parallelMng()=0
Gestionnaire parallèle associé
virtual IMeshMaterialVariableSynchronizer * allCellsEnvOnlySynchronizer()=0
Synchronizeur pour les variables uniquement milieux sur toutes les mailles.
virtual IMeshMaterialVariableSynchronizer * allCellsMatEnvSynchronizer()=0
Synchronizeur pour les variables matériaux et milieux sur toutes les mailles.
Interface du gestionnaire des matériaux et des milieux d'un maillage.
virtual Integer synchronizeVariableVersion() const =0
Version de l'implémentation pour la synchronisation des variables matériaux.
virtual IMeshMaterialMngInternal * _internalApi() const =0
API interne à Arcane.
Interface du synchroniseur de variables matériaux.
virtual IVariableSynchronizer * variableSynchronizer()=0
Synchroniseur des variables classiques associé.
virtual eMemoryRessource bufferMemoryRessource() const =0
Ressource mémoire à utiliser pour les buffers de communication.
virtual Ref< IMeshMaterialSynchronizeBuffer > commonBuffer()=0
Buffer commun pour les messages.
Int64 totalMessageSize() const
Après appel à apply(), contient la taille des messages envoyés.
void beginSynchronize()
Commence une synchronisation non bloquante.
void apply()
Effectue la synchronisation.
void add(MeshMaterialVariable *var)
Ajoute la variable var à la liste des variables à synchroniser.
void endSynchronize()
Bloque tant que la synchronisation en cours n'est pas terminé.
Classe de base des variables matériaux.
String name() const override
Nom de la variable.
MatVarSpace space() const override
Espace de définition de la variable (matériau+milieu ou milieu uniquement)
Exception lorsqu'une opération n'est pas supportée.
Référence à une instance.
Vecteur 1D de données avec sémantique par valeur (style STL).
Active toujours les traces dans les parties Arcane concernant les matériaux.
MatVarSpace
Espace de définition d'une variable matériau.
@ Environment
Variable ayant des valeurs uniquement sur les milieux.
@ MaterialAndEnvironment
Variable ayant des valeurs sur les milieux et matériaux.
Request mpReceive(IMessagePassingMng *pm, ISerializer *values, const PointToPointMessageInfo &message)
Message de réception utilisant un ISerializer.
Request mpSend(IMessagePassingMng *pm, const ISerializer *values, const PointToPointMessageInfo &message)
Message d'envoi utilisant un ISerializer.
ArrayView< Byte > ByteArrayView
Equivalent C d'un tableau à une dimension de caractères.
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Arcane::eMemoryResource eMemoryRessource
Typedef pour la version Arcane historique (avec 2's')
ConstArrayView< Byte > ByteConstArrayView
Equivalent C d'un tableau à une dimension de caractères.
std::int32_t Int32
Type entier signé sur 32 bits.
Espace de nommage contenant les types et déclarations qui gèrent le mécanisme de parallélisme par éch...