Arcane  v4.1.1.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
SharedMemoryParallelMng.h
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/* SharedMemoryParallelMng.h (C) 2000-2025 */
9/* */
10/* Implémentation des messages en mode mémoire partagé. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_PARALLEL_THREAD_SHAREDMEMORYPARALLELMNG_H
13#define ARCANE_PARALLEL_THREAD_SHAREDMEMORYPARALLELMNG_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/ParallelMngDispatcher.h"
18
19#include "arcane/utils/TraceInfo.h"
20#include "arcane/utils/NotImplementedException.h"
21#include "arcane/utils/Ref.h"
22#include "arccore/base/ReferenceCounter.h"
23
24/*---------------------------------------------------------------------------*/
25/*---------------------------------------------------------------------------*/
26
27namespace Arcane
28{
29class SerializeBuffer;
31}
32
34{
38
39/*---------------------------------------------------------------------------*/
40/*---------------------------------------------------------------------------*/
44struct ARCANE_THREAD_EXPORT SharedMemoryParallelMngBuildInfo
45{
46 public:
47 SharedMemoryParallelMngBuildInfo()
48 : rank(-1)
49 , nb_rank(0)
50 , trace_mng(nullptr)
51 , thread_mng(nullptr)
52 , message_queue(nullptr)
53 , thread_barrier(nullptr)
54 , all_dispatchers(nullptr)
55 , window_creator(nullptr)
56 {}
57
58 public:
59 Int32 rank;
60 Int32 nb_rank;
61 ITraceMng* trace_mng;
62 IThreadMng* thread_mng;
63 Ref<IParallelMng> sequential_parallel_mng;
64 IParallelMng* world_parallel_mng = nullptr;
65 ISharedMemoryMessageQueue* message_queue = nullptr;
66 IThreadBarrier* thread_barrier = nullptr;
67 SharedMemoryAllDispatcher* all_dispatchers = nullptr;
68 IParallelMngContainerFactory* sub_builder_factory = nullptr;
70 MP::Communicator communicator;
72};
73
74/*---------------------------------------------------------------------------*/
75/*---------------------------------------------------------------------------*/
79class ARCANE_THREAD_EXPORT SharedMemoryParallelMng
80: public ParallelMngDispatcher
81{
82 public:
83 class RequestList;
84 class Impl;
85
86 public:
87
88 explicit SharedMemoryParallelMng(const SharedMemoryParallelMngBuildInfo& build_info);
89 ~SharedMemoryParallelMng() override;
90
91 bool isParallel() const override { return m_is_parallel; }
92 Int32 commRank() const override { return m_rank; }
93 Int32 commSize() const override { return m_nb_rank; }
94 void* getMPICommunicator() override { return m_mpi_communicator.communicatorAddress(); }
95 MP::Communicator communicator() const override { return m_mpi_communicator; }
96 MP::Communicator machineCommunicator() const override { return m_mpi_communicator; }
97 bool isThreadImplementation() const override { return true; }
98 bool isHybridImplementation() const override { return false; }
99 ITraceMng* traceMng() const override { return m_trace.get(); }
100 IThreadMng* threadMng() const override { return m_thread_mng; }
101 void initialize() override;
102 bool isMasterIO() const override { return commRank()==0; }
103 Integer masterIORank() const override { return 0; }
104 IIOMng* ioMng() const override { return m_io_mng; }
105 IParallelMng* worldParallelMng() const override { return m_world_parallel_mng; }
106 ITimerMng* timerMng() const override { return m_timer_mng; }
107
108 IParallelMng* sequentialParallelMng() override;
109 Ref<IParallelMng> sequentialParallelMngRef() override;
110 void sendSerializer(ISerializer* values,Int32 rank) override;
111 Request sendSerializer(ISerializer* values,Int32 rank,ByteArray& bytes) override;
112 ISerializeMessage* createSendSerializer(Int32 rank) override;
113
114 void recvSerializer(ISerializer* values,Int32 rank) override;
115 ISerializeMessage* createReceiveSerializer(Int32 rank) override;
116
117 void freeRequests(ArrayView<Parallel::Request> requests) override;
118
119 void broadcastSerializer(ISerializer* values,Int32 rank) override;
120 MessageId probe(const PointToPointMessageInfo& message) override;
121 MessageSourceInfo legacyProbe(const PointToPointMessageInfo& message) override;
122 Request sendSerializer(const ISerializer* values,const PointToPointMessageInfo& message) override;
123 Request receiveSerializer(ISerializer* values,const PointToPointMessageInfo& message) override;
124
125 void printStats() override;
126 void barrier() override;
127 void waitAllRequests(ArrayView<Request> requests) override;
128
129 ARCANE_DEPRECATED_260 Real reduceRank(eReduceType rt,Real v,Int32* rank)
130 {
131 Real rv = reduce(rt,v);
132 if (rank)
133 *rank = 0;
134 return rv;
135 }
136
138
139 void build() override;
140
141 IParallelMngInternal* _internalApi() override { return m_parallel_mng_internal; }
142
143 public:
144
145 IThreadBarrier* getThreadBarrier()
146 {
147 return m_thread_barrier;
148 }
149
150 public:
151
153 PointToPointMessageInfo buildMessage(Int32 dest,MP::eBlockingType is_blocking);
155
156 protected:
157
163 IVariableSynchronizer* createSynchronizer(const ItemGroup& group) override;
164 Parallel::IStat* stat() override { return m_stat; }
165 IParallelReplication* replication() const override;
166 void setReplication(IParallelReplication* v) override;
167 Ref<Parallel::IRequestList> createRequestListRef() override;
168 Ref<IParallelMng> createSubParallelMngRef(Int32ConstArrayView kept_ranks) override;
169 Ref<IParallelMngUtilsFactory> _internalUtilsFactory() const override;
170
171 protected:
172
173 ISerializeMessageList* _createSerializeMessageList() override;
174 IParallelMng* _createSubParallelMng(Int32ConstArrayView kept_ranks) override;
175 bool _isAcceleratorAware() const override { return true; }
176
177 private:
178
180 IThreadMng* m_thread_mng;
181 Ref<IParallelMng> m_sequential_parallel_mng;
182 ITimerMng* m_timer_mng;
183 IParallelReplication* m_replication;
184 IParallelMng* m_world_parallel_mng;
185 IIOMng* m_io_mng;
186 ISharedMemoryMessageQueue* m_message_queue;
187 bool m_is_parallel;
191 Parallel::IStat* m_stat;
192 IThreadBarrier* m_thread_barrier;
193 SharedMemoryAllDispatcher* m_all_dispatchers;
194 IParallelMngContainerFactory* m_sub_builder_factory;
195 Ref<IParallelMngContainer> m_parent_container_ref;
196 MP::Communicator m_mpi_communicator;
197 Ref<IParallelMngUtilsFactory> m_utils_factory;
198 IParallelMngInternal* m_parallel_mng_internal = nullptr;
199};
200
201/*---------------------------------------------------------------------------*/
202/*---------------------------------------------------------------------------*/
203
204} // End namespace Arcane::MessagePassing
205
206/*---------------------------------------------------------------------------*/
207/*---------------------------------------------------------------------------*/
208
209#endif
Vue modifiable d'un tableau d'un type T.
Opérations pour accéder aux valeurs de variables d'un autre sous-domaine.
Interface du gestionnaire des entrées sorties.
Definition IIOMng.h:36
Interface d'une famille d'entités.
Definition IItemFamily.h:84
Échange d'informations entre processeurs.
Interface d'une fabrique de conteneur de 'IParallelMng'.
Partie interne de IParallelMng.
Interface du gestionnaire de parallélisme pour un sous-domaine.
Interface des opérations parallèles collectives non bloquantes.
Informations sur la réplication des sous-domaines en parallèle.
Informations sur la topologie d'allocation des coeurs de calcul.
Interface d'un gestionnaire de thread.
Definition IThreadMng.h:30
Interface d'un gestionnaire de timer.
Definition ITimerMng.h:49
Interface du gestionnaire de traces.
Envoie de valeurs sur différents processeurs.
Interface d'un service de synchronisation de variable.
Groupe d'entités de maillage.
Definition ItemGroup.h:49
Interface d'un message de sérialisation entre IMessagePassingMng.
Interface d'une file de messages avec les threads.
Informations sur la source d'un message.
Informations pour envoyer/recevoir un message point à point.
Requête d'un message.
Definition Request.h:77
Implémentation de IRequestList pour SharedMemoryParallelMng.
IParallelTopology * createTopology() override
Créé une instance contenant les infos sur la topologie des rangs de ce gestionnnaire.
IGetVariablesValuesParallelOperation * createGetVariablesValuesOperation() override
Retourne une opération pour récupérer les valeurs d'une variable sur les entités d'un autre sous-doma...
bool isThreadImplementation() const override
Indique si l'implémentation utilise les threads.
bool isMasterIO() const override
true si l'instance est un gestionnaire maître des entrées/sorties.
Integer masterIORank() const override
Rang de l'instance gérant les entrées/sorties (pour laquelle isMasterIO() est vrai)
IParallelNonBlockingCollective * nonBlockingCollective() const override
Interface des opérations collectives non blocantes.
PointToPointMessageInfo buildMessage(Int32 dest, MP::eBlockingType is_blocking)
Construit un message avec pour destinataire dest.
IParallelMng * worldParallelMng() const override
Gestionnaire de parallélisme sur l'ensemble des ressources allouées.
Parallel::IStat * stat() override
Gestionnaire des statistiques.
IParallelMngInternal * _internalApi() override
API interne à Arcane.
IVariableSynchronizer * createSynchronizer(IItemFamily *family) override
Retourne une interface pour synchroniser des variables sur le groupe de la famille family.
MP::Communicator communicator() const override
Communicateur MPI associé à ce gestionnaire.
IIOMng * ioMng() const override
Gestionnaire des entrées/sorties.
ITraceMng * traceMng() const override
Gestionnaire de traces.
bool isParallel() const override
Retourne true si l'exécution est parallèle.
bool isHybridImplementation() const override
Indique si l'implémentation utilise le mode hybride.
Int32 commSize() const override
Nombre d'instance dans le communicateur.
MP::Communicator machineCommunicator() const override
Communicateur MPI issus du communicateur communicator() réunissant tous les processus du noeud de cal...
Int32 commRank() const override
Rang de cette instance dans le communicateur.
IParallelExchanger * createExchanger() override
Retourne une interface pour transférer des messages entre processeurs.
IThreadMng * threadMng() const override
Gestionnaire de threads.
void * getMPICommunicator() override
Adresse du communicateur MPI associé à ce gestionnaire.
ITransferValuesParallelOperation * createTransferValuesOperation() override
Retourne une opération pour transférer des valeurs entre sous-domaine.
ITimerMng * timerMng() const override
Gestionnaire de timers.
Statistiques sur le parallélisme.
Référence à une instance.
Encapsulation d'un pointeur avec compteur de référence.
Implémentation d'un tampon pour la sérialisation.
Déclarations des types et méthodes utilisés par les mécanismes d'échange de messages.
eReduceType
Types des réductions supportées.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.
Array< Byte > ByteArray
Tableau dynamique à une dimension de caractères.
Definition UtilsTypes.h:137
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:498
double Real
Type représentant un réel.
std::int32_t Int32
Type entier signé sur 32 bits.
Infos pour construire un SharedMemoryParallelMng.