14#include "arcane/materials/internal/MeshMaterialVariableSynchronizer.h"
16#include "arcane/utils/PlatformUtils.h"
18#include "arcane/utils/ValueConvert.h"
20#include "arcane/core/IMesh.h"
21#include "arcane/core/IVariableSynchronizer.h"
22#include "arcane/core/ItemGroup.h"
23#include "arcane/core/IParallelMng.h"
24#include "arcane/core/IItemFamily.h"
25#include "arcane/core/internal/IParallelMngInternal.h"
27#include "arcane/materials/IMeshMaterialMng.h"
28#include "arcane/materials/MatItemEnumerator.h"
29#include "arcane/materials/IMeshMaterialSynchronizeBuffer.h"
30#include "arcane/core/materials/internal/IMeshMaterialMngInternal.h"
32#include "arcane/accelerator/core/RunQueue.h"
33#include "arcane/accelerator/Scan.h"
44MeshMaterialVariableSynchronizer::
46 IVariableSynchronizer* var_syncer,
48: TraceAccessor(material_mng->traceMng())
49, m_material_mng(material_mng)
50, m_variable_synchronizer(var_syncer)
54 if (
auto v = Convert::Type<Int32>::tryParseFromEnvironment(
"ARCANE_MATERIALSYNCHRONIZER_ACCELERATOR_MODE",
true))
55 m_use_accelerator_mode = v.value();
68 return m_variable_synchronizer;
75sharedItems(
Int32 index)
77 return m_shared_items[index];
84ghostItems(
Int32 index)
86 return m_ghost_items[index];
95void MeshMaterialVariableSynchronizer::
107 if (view.
size() == 0)
111 if (m_use_accelerator_mode == 1)
112 use_accelerator =
true;
113 if (m_use_accelerator_mode == 0)
114 use_accelerator =
false;
128void MeshMaterialVariableSynchronizer::
136 items.
add(env_cell._varIndex());
138 for (
MatCell mat_cell : env_cell.subMatItems()) {
139 items.
add(mat_cell._varIndex());
155void MeshMaterialVariableSynchronizer::
164 indexes.
resize(nb_item + 1);
167 Accelerator::ScannerSumOperator<Int32> op;
169 auto getter = [=] ARCCORE_HOST_DEVICE(
Int32 index) ->
Int32 {
170 if (index == nb_item)
177 n += env_cell.nbSubItem();
188 auto setter = [=] ARCCORE_HOST_DEVICE(
Int32 index,
Int32 value) {
189 out_indexes[index] = value;
190 if (index == nb_item)
191 in_host_total_storage[0] = value;
193 scanner.applyWithIndexExclusive(nb_item + 1, 0, getter, setter, op);
194 Int32 total = host_total_storage[0];
204 auto [index] = iter();
206 Int32 pos = in_indexes[index];
208 out_mat_var_indexes[pos] = env_cell._varIndex();
211 for (
MatCell mat_cell : env_cell.subMatItems()) {
212 out_mat_var_indexes[pos] = mat_cell._varIndex();
219 out_mat_var_indexes[pos] =
MatVarIndex(0, view.localId(index));
227void MeshMaterialVariableSynchronizer::
230 Int64 ts = m_material_mng->timestamp();
231 if (m_timestamp != ts)
239void MeshMaterialVariableSynchronizer::
257 m_common_buffer->setNbRank(nb_rank);
259 m_shared_items.resize(nb_rank);
260 m_ghost_items.resize(nb_rank);
262 RunQueue queue = m_material_mng->_internalApi()->runQueue();
269 for (
Int32 i = 0; i < nb_rank; ++i) {
277 for (
Integer i = 0; i < nb_rank; ++i) {
285 info(4) <<
"SIZE SHARED FOR rank=" << ranks[i] <<
" n=" << items.
size();
294 info(4) <<
"SIZE GHOST FOR rank=" << ranks[i] <<
" n=" << items.
size();
302void MeshMaterialVariableSynchronizer::
305 IParallelMng* pm = m_variable_synchronizer->parallelMng();
307 m_buffer_memory_ressource = eMemoryRessource::Device;
308 info() <<
"MeshMaterialVariableSynchronizer: Using device memory for buffer";
310 m_common_buffer = impl::makeOneBufferMeshMaterialSynchronizeBufferRef(m_buffer_memory_ressource);
Fonctions de gestion mémoire et des allocateurs.
#define RUNCOMMAND_LOOP1(iter_name, x1,...)
Boucle sur accélérateur avec arguments supplémentaires pour les réductions.
Integer size() const
Nombre d'éléments du vecteur.
Algorithmes de scan exclusif ou inclusif sur accélérateurs.
File d'exécution pour un accélérateur.
MemoryAllocationOptions allocationOptions() const
Options d'allocation associée à cette file.
bool isAcceleratorPolicy() const
Indique si l'instance est associée à un accélérateur.
Tableau d'items de types quelconques.
void clear()
Supprime les éléments du tableau.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Interface d'une famille d'entités.
virtual ItemGroup allItems() const =0
Groupe de toutes les entités.
virtual ItemVectorView view(Int32ConstArrayView local_ids)=0
Vue sur les entités.
virtual bool isAcceleratorAware() const =0
Indique si l'implémentation gère les accélérateurs.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual IParallelMngInternal * _internalApi()=0
API interne à Arcane.
virtual bool isParallel() const =0
Retourne true si l'exécution est parallèle.
Interface d'un service de synchronisation de variable.
virtual Int32ConstArrayView ghostItems(Int32 index)=0
Liste des ids locaux des entités fantômes avec un sous-domaine.
virtual Int32ConstArrayView communicatingRanks()=0
Rangs des sous-domaines avec lesquels on communique.
virtual const ItemGroup & itemGroup()=0
Groupe d'entité servant à la synchronisation.
virtual IParallelMng * parallelMng()=0
Gestionnaire parallèle associé
virtual Int32ConstArrayView sharedItems(Int32 index)=0
Liste des ids locaux des entités partagées avec un sous-domaine.
Groupe d'entités de maillage.
IItemFamily * itemFamily() const
Famille d'entité à laquelle appartient ce groupe (0 pour le group nul)
Vue sur une liste de mailles avec infos sur les milieux.
constexpr __host__ __device__ Integer size() const
Nombre d'éléments.
Maille arcane avec info matériaux et milieux.
__host__ __device__ CellEnvCellEnumerator subEnvItems() const
Enumérateur sur les mailles milieux de cette maille.
Maille arcane d'un milieu.
Interface du gestionnaire des matériaux et des milieux d'un maillage.
Représente un matériau d'une maille multi-matériau.
Représente un index sur les variables matériaux et milieux.
void _fillCellsAccelerator(Array< MatVarIndex > &items, AllEnvCellVectorView view, RunQueue &queue)
Remplit items avec la liste de tous les MatVarIndex des mailles de view.
void _fillCells(Array< MatVarIndex > &items, AllEnvCellVectorView view, RunQueue &queue)
Remplit items avec la liste de tous les MatVarIndex des mailles de view.
void recompute() override
Recalcule les infos de synchronisation.
void _fillCellsSequential(Array< MatVarIndex > &items, AllEnvCellVectorView view)
Remplit items avec la liste de tous les MatVarIndex des mailles de view.
Options pour configurer les allocations.
Tableaux multi-dimensionnels pour les types numériques accessibles sur accélérateurs.
Vue d'un tableau d'éléments de type T.
Vue d'un tableau d'éléments de type T.
TraceMessage info() const
Flot pour un message d'information.
Vecteur 1D de données avec sémantique par valeur (style STL).
ItemVectorViewT< Cell > CellVectorView
Vue sur un vecteur de mailles.
RunCommand makeCommand(const RunQueue &run_queue)
Créé une commande associée à la file run_queue.
Active toujours les traces dans les parties Arcane concernant les matériaux.
MatVarSpace
Espace de définition d'une variable matériau.
@ MaterialAndEnvironment
Variable ayant des valeurs sur les milieux et matériaux.
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.
std::int32_t Int32
Type entier signé sur 32 bits.