14#include "arcane/utils/Collection.h"
15#include "arcane/utils/Enumerator.h"
16#include "arcane/utils/ScopedPtr.h"
17#include "arcane/utils/PlatformUtils.h"
18#include "arcane/utils/TimeoutException.h"
19#include "arcane/utils/NotImplementedException.h"
20#include "arcane/utils/ArgumentException.h"
21#include "arcane/utils/ITraceMng.h"
22#include "arcane/utils/ValueConvert.h"
23#include "arcane/utils/Exception.h"
24#include "arcane/utils/HPReal.h"
26#include "arcane/core/IIOMng.h"
27#include "arcane/core/Timer.h"
28#include "arcane/core/IItemFamily.h"
29#include "arcane/core/IParallelTopology.h"
30#include "arcane/core/parallel/IStat.h"
31#include "arcane/core/internal/SerializeMessage.h"
32#include "arcane/core/internal/ParallelMngInternal.h"
33#include "arcane/core/internal/MachineShMemWinMemoryAllocator.h"
35#include "arcane/parallel/mpi/MpiParallelMng.h"
36#include "arcane/parallel/mpi/MpiParallelDispatch.h"
37#include "arcane/parallel/mpi/MpiTimerMng.h"
38#include "arcane/parallel/mpi/MpiSerializeMessage.h"
39#include "arcane/parallel/mpi/MpiParallelNonBlockingCollective.h"
40#include "arcane/parallel/mpi/MpiDatatype.h"
41#include "arcane/parallel/mpi/IVariableSynchronizerMpiCommunicator.h"
43#include "arcane/impl/ParallelReplication.h"
44#include "arcane/impl/SequentialParallelMng.h"
45#include "arcane/impl/internal/ParallelMngUtilsFactoryBase.h"
46#include "arcane/impl/internal/VariableSynchronizer.h"
48#include "arccore/message_passing_mpi/MpiMessagePassingMng.h"
49#include "arccore/message_passing_mpi/internal/MpiSerializeDispatcher.h"
50#include "arccore/message_passing_mpi/internal/MpiRequestList.h"
51#include "arccore/message_passing_mpi/internal/MpiAdapter.h"
52#include "arccore/message_passing_mpi/internal/MpiLock.h"
53#include "arccore/message_passing_mpi/internal/MpiMachineShMemWinBaseInternalCreator.h"
54#include "arccore/message_passing_mpi/internal/MpiContigMachineShMemWinBaseInternal.h"
55#include "arccore/message_passing_mpi/internal/MpiMachineShMemWinBaseInternal.h"
56#include "arccore/message_passing/Dispatchers.h"
58#include "arccore/message_passing/internal/SerializeMessageList.h"
60#include "arcane_packages.h"
70using namespace Arcane::MessagePassing::Mpi;
79#if defined(ARCANE_HAS_MPI_NEIGHBOR)
82arcaneCreateMpiNeighborVariableSynchronizerFactory(
MpiParallelMng* mpi_pm,
90arcaneCreateMpiDirectSendrecvVariableSynchronizerFactory(
MpiParallelMng* mpi_pm);
92arcaneCreateMpiLegacyVariableSynchronizerFactory(
MpiParallelMng* mpi_pm);
93#if defined(ARCANE_HAS_PACKAGE_NCCL)
95arcaneCreateNCCLVariableSynchronizerFactory(
IParallelMng* mpi_pm);
101MpiParallelMngBuildInfo::
102MpiParallelMngBuildInfo(MPI_Comm comm, MPI_Comm machine_comm)
111, mpi_machine_comm(machine_comm)
112, is_mpi_comm_owned(true)
115 ::MPI_Comm_rank(comm,&comm_rank);
116 ::MPI_Comm_size(comm,&comm_nb_rank);
119 MP::Mpi::MpiMessagePassingMng::BuildInfo bi(comm_rank,comm_nb_rank,m_dispatchers_ref.get(),mpi_comm);
132class VariableSynchronizerMpiCommunicator
137 : m_mpi_parallel_mng(pm){}
138 ~VariableSynchronizerMpiCommunicator()
override
140 _checkFreeCommunicator();
144 return m_topology_communicator;
149 const Int32 nb_message = comm_ranks.
size();
156 for(
Integer i=0; i<nb_message; ++i ){
157 destinations[i] = comm_ranks[i];
160 _checkFreeCommunicator();
162 int r = MPI_Dist_graph_create_adjacent(old_comm, nb_message, destinations.
data(), MPI_UNWEIGHTED,
163 nb_message, destinations.
data(), MPI_UNWEIGHTED,
164 MPI_INFO_NULL, 0, &m_topology_communicator);
175 MPI_Dist_graph_neighbors_count(m_topology_communicator,&indegree,&outdegree,&weighted);
177 if (indegree!=nb_message)
178 ARCANE_FATAL(
"Bad value '{0}' for 'indegree' (expected={1})",indegree,nb_message);
179 if (outdegree!=nb_message)
180 ARCANE_FATAL(
"Bad value '{0}' for 'outdegree' (expected={1})",outdegree,nb_message);
185 MPI_Dist_graph_neighbors(m_topology_communicator,indegree,srcs.
data(),MPI_UNWEIGHTED,outdegree,dsts.
data(),MPI_UNWEIGHTED);
187 for(
int k=0; k<outdegree; ++k){
189 if (x!=comm_ranks[k])
190 ARCANE_FATAL(
"Invalid destination rank order k={0} v={1} expected={2}",k,x,comm_ranks[k]);
193 for(
int k=0; k<indegree; ++k ){
195 if (x!=comm_ranks[k])
196 ARCANE_FATAL(
"Invalid source rank order k={0} v={1} expected={2}",k,x,comm_ranks[k]);
204 MPI_Comm m_topology_communicator = MPI_COMM_NULL;
208 void _checkFreeCommunicator()
210 if (m_topology_communicator!=MPI_COMM_NULL)
211 MPI_Comm_free(&m_topology_communicator);
212 m_topology_communicator = MPI_COMM_NULL;
224class MpiVariableSynchronizer
225:
public VariableSynchronizer
231 : VariableSynchronizer(pm,group,implementation_factory)
232 , m_topology_info(topology_info)
240 if (m_topology_info.get())
241 m_topology_info->compute(
this);
250class MpiParallelMngUtilsFactory
254 MpiParallelMngUtilsFactory()
255 : m_synchronizer_version(2)
258 m_synchronizer_version = 1;
260 m_synchronizer_version = 2;
262 m_synchronizer_version = 3;
264 m_synchronizer_version = 4;
267 Int32 block_size = 0;
268 if (!builtInGetValue(block_size,v))
269 m_synchronize_block_size = block_size;
270 m_synchronize_block_size = std::clamp(m_synchronize_block_size,0,1000000000);
274 Int32 nb_sequence = 0;
275 if (!builtInGetValue(nb_sequence,v))
276 m_synchronize_nb_sequence = nb_sequence;
277 m_synchronize_nb_sequence = std::clamp(m_synchronize_nb_sequence,1,1024*1024);
281 m_synchronizer_version = 5;
283 m_synchronizer_version = 6;
289 return _createSynchronizer(pm,family->
allItems());
294 return _createSynchronizer(pm,group);
308 if (m_synchronizer_version == 2){
310 tm->
info() <<
"Using MpiSynchronizer V2";
311 generic_factory = arcaneCreateMpiVariableSynchronizerFactory(mpi_pm);
313 else if (m_synchronizer_version == 3 ){
315 tm->
info() <<
"Using MpiSynchronizer V3";
316 generic_factory = arcaneCreateMpiDirectSendrecvVariableSynchronizerFactory(mpi_pm);
318 else if (m_synchronizer_version == 4){
320 tm->
info() <<
"Using MpiSynchronizer V4 block_size=" << m_synchronize_block_size
321 <<
" nb_sequence=" << m_synchronize_nb_sequence;
322 generic_factory = arcaneCreateMpiBlockVariableSynchronizerFactory(mpi_pm,m_synchronize_block_size,m_synchronize_nb_sequence);
324 else if (m_synchronizer_version == 5){
326 tm->
info() <<
"Using MpiSynchronizer V5";
327 topology_info = createRef<VariableSynchronizerMpiCommunicator>(mpi_pm);
328#if defined(ARCANE_HAS_MPI_NEIGHBOR)
329 generic_factory = arcaneCreateMpiNeighborVariableSynchronizerFactory(mpi_pm,topology_info);
331 throw NotSupportedException(A_FUNCINFO,
"Synchronize implementation V5 is not supported with this version of MPI");
334#if defined(ARCANE_HAS_PACKAGE_NCCL)
335 else if (m_synchronizer_version == 6){
337 tm->
info() <<
"Using NCCLSynchronizer";
338 generic_factory = arcaneCreateNCCLVariableSynchronizerFactory(mpi_pm);
343 tm->
info() <<
"Using MpiSynchronizer V1";
344 generic_factory = arcaneCreateMpiLegacyVariableSynchronizerFactory(mpi_pm);
346 if (!generic_factory.
get())
348 return createRef<MpiVariableSynchronizer>(pm,group,generic_factory,topology_info);
353 Integer m_synchronizer_version = 1;
354 Int32 m_synchronize_block_size = 32000;
355 Int32 m_synchronize_nb_sequence = 1;
365:
public ParallelMngInternal
369 explicit Impl(MpiParallelMng* pm)
370 : ParallelMngInternal(pm)
375 ~Impl()
override =
default;
384 m_parallel_mng->traceMng()->info() <<
"initializeWindowCreator() MPI";
385 m_parallel_mng->adapter()->initializeWindowCreator(m_parallel_mng->machineCommunicator());
390 if (m_shmem_available == 1) {
394 if (m_shmem_available == 0) {
396 if (topo->machineRanks().size() == m_parallel_mng->adapter()->windowCreator()->machineRanks().size()) {
397 m_shmem_available = 1;
401 m_shmem_available = 2;
410 return makeRef(m_parallel_mng->adapter()->windowCreator()->createWindow(sizeof_segment, sizeof_type));
415 return makeRef(m_parallel_mng->adapter()->windowCreator()->createDynamicWindow(sizeof_segment, sizeof_type));
425 return m_parallel_mng->adapter()->windowCreator()->machineRanks();
430 m_parallel_mng->adapter()->windowCreator()->machineBarrier();
435 MpiParallelMng* m_parallel_mng;
441 Int8 m_shmem_available = 0;
453, m_trace(bi.trace_mng)
454, m_thread_mng(bi.thread_mng)
455, m_world_parallel_mng(bi.world_parallel_mng)
456, m_timer_mng(bi.timer_mng)
458, m_is_parallel(bi.is_parallel)
459, m_comm_rank(bi.commRank())
460, m_comm_size(bi.commSize())
462, m_communicator(bi.mpiComm())
463, m_machine_communicator(bi.mpiMachineComm())
464, m_is_communicator_owned(bi.is_mpi_comm_owned)
465, m_mpi_lock(bi.mpi_lock)
466, m_non_blocking_collective(nullptr)
468, m_parallel_mng_internal(new Impl(this))
470 if (!m_world_parallel_mng){
471 m_trace->debug()<<
"[MpiParallelMng] No m_world_parallel_mng found, reverting to ourselves!";
472 m_world_parallel_mng =
this;
482 delete m_parallel_mng_internal;
483 delete m_non_blocking_collective;
484 m_sequential_parallel_mng.reset();
485 if (m_is_communicator_owned){
486 MpiLock::Section ls(m_mpi_lock);
487 MPI_Comm_free(&m_communicator);
488 MPI_Comm_free(&m_machine_communicator);
490 delete m_replication;
492 if (m_is_timer_owned)
495 delete m_datatype_list;
510 DispatchCreator(ITraceMng* tm,IMessagePassingMng* mpm,MpiAdapter* adapter,MpiDatatypeList* datatype_list)
511 : m_tm(tm), m_mpm(mpm), m_adapter(adapter), m_datatype_list(datatype_list){}
513 template<
typename DataType> MpiParallelDispatchT<DataType>*
516 MpiDatatype* dt = m_datatype_list->datatype(DataType());
517 return new MpiParallelDispatchT<DataType>(m_tm,m_mpm,m_adapter,dt);
521 IMessagePassingMng* m_mpm;
522 MpiAdapter* m_adapter;
523 MpiDatatypeList* m_datatype_list;
529class ControlDispatcherDecorator
530:
public ParallelMngDispatcher::DefaultControlDispatcher
534 ControlDispatcherDecorator(IParallelMng* pm, MpiAdapter* adapter)
535 : ParallelMngDispatcher::DefaultControlDispatcher(pm), m_adapter(adapter) {}
537 IMessagePassingMng* commSplit(
bool keep)
override
539 return m_adapter->commSplit(keep);
541 MP::IProfiler* profiler()
const override {
return m_adapter->profiler(); }
542 void setProfiler(MP::IProfiler* p)
override { m_adapter->setProfiler(p); }
545 MpiAdapter* m_adapter;
558 m_is_timer_owned =
true;
567 m_sequential_parallel_mng = arcaneCreateSequentialParallelMngRef(bi);
572 bool is_ordered_reduce =
false;
574 is_ordered_reduce =
true;
579 MpiAdapter* adapter =
new MpiAdapter(m_trace,m_stat->toArccoreStat(),m_communicator,m_mpi_lock);
581 auto mpm = _messagePassingMng();
584 auto* control_dispatcher =
new ControlDispatcherDecorator(
this,m_adapter);
585 _setControlDispatcher(control_dispatcher);
589 m_mpi_serialize_dispatcher = serialize_dispatcher;
590 _setSerializeDispatcher(serialize_dispatcher);
592 DispatchCreator creator(m_trace,mpm,m_adapter,m_datatype_list);
593 this->createDispatchers(creator);
595 m_io_mng = arcaneCreateIOMng(
this);
598 m_non_blocking_collective->build();
600 m_trace->info() <<
"Using mpi with locks.";
602 m_parallel_mng_internal->initializeWindowCreator();
616 m_trace->warning() <<
"MpiParallelMng already initialized";
620 m_trace->info() <<
"Initialisation de MpiParallelMng";
621 m_sequential_parallel_mng->initialize();
637 m_mpi_serialize_dispatcher->legacySendSerializer(s,{
MessageRank(rank),mpi_tag,Blocking});
646 return m_utils_factory->createSendSerializeMessage(
this, rank)._release();
658 return m_mpi_serialize_dispatcher->legacySendSerializer(s,{
MessageRank(rank),mpi_tag,NonBlocking});
668 m_mpi_serialize_dispatcher->broadcastSerializer(values,
MessageRank(rank));
680 m_mpi_serialize_dispatcher->legacyReceiveSerializer(values,
MessageRank(rank),mpi_tag);
689 return m_utils_factory->createReceiveSerializeMessage(
this, rank)._release();
698 return m_adapter->probeMessage(message);
707 return m_adapter->legacyProbeMessage(message);
735 m_adapter->freeRequest(requests[i]);
742_checkFinishedSubRequests()
744 m_mpi_serialize_dispatcher->checkFinishedSubRequests();
751sequentialParallelMngRef()
753 return m_sequential_parallel_mng;
759 return m_sequential_parallel_mng.get();
769 m_stat->print(m_trace);
779 m_adapter->barrier();
788 m_adapter->waitAllRequests(requests);
789 _checkFinishedSubRequests();
798 return _waitSomeRequests(requests,
false);
807 return _waitSomeRequests(requests,
true);
819 m_adapter->waitSomeRequests(requests, done_indexes, is_non_blocking);
820 for (
int i = 0 ; i < requests.
size() ; i++) {
830ISerializeMessageList* MpiParallelMng::
831_createSerializeMessageList()
842 return m_utils_factory->createGetVariablesValuesOperation(
this)._release();
851 return m_utils_factory->createTransferValuesOperation(
this)._release();
860 return m_utils_factory->createExchanger(
this)._release();
869 return m_utils_factory->createSynchronizer(
this,family)._release();
878 return m_utils_factory->createSynchronizer(
this,group)._release();
887 return m_utils_factory->createTopology(
this)._release();
896 return m_replication;
905 delete m_replication;
913_createSubParallelMng(MPI_Comm sub_communicator)
916 if (sub_communicator==MPI_COMM_NULL)
920 MPI_Comm_rank(sub_communicator,&sub_rank);
922 MPI_Comm sub_machine_communicator = MPI_COMM_NULL;
923 MPI_Comm_split_type(sub_communicator, MPI_COMM_TYPE_SHARED, sub_rank, MPI_INFO_NULL, &sub_machine_communicator);
928 bi.timer_mng = m_timer_mng;
929 bi.thread_mng = m_thread_mng;
930 bi.trace_mng = m_trace;
931 bi.world_parallel_mng = m_world_parallel_mng;
932 bi.mpi_lock = m_mpi_lock;
943_createSubParallelMngRef(Int32 color, Int32 key)
946 color = MPI_UNDEFINED;
947 MPI_Comm sub_communicator = MPI_COMM_NULL;
948 MPI_Comm_split(m_communicator, color, key, &sub_communicator);
949 IParallelMng* sub_pm = _createSubParallelMng(sub_communicator);
956IParallelMng* MpiParallelMng::
959 MPI_Group mpi_group = MPI_GROUP_NULL;
960 MPI_Comm_group(m_communicator, &mpi_group);
962 UniqueArray<int> mpi_kept_ranks(nb_sub_rank);
963 for (
Integer i = 0; i < nb_sub_rank; ++i)
964 mpi_kept_ranks[i] = (
int)kept_ranks[i];
966 MPI_Group final_group = MPI_GROUP_NULL;
967 MPI_Group_incl(mpi_group, nb_sub_rank, mpi_kept_ranks.data(), &final_group);
968 MPI_Comm sub_communicator = MPI_COMM_NULL;
970 MPI_Comm_create(m_communicator, final_group, &sub_communicator);
971 MPI_Group_free(&final_group);
972 return _createSubParallelMng(sub_communicator);
985:
public MpiRequestList
987 using Base = MpiRequestList;
989 explicit RequestList(MpiParallelMng* pm)
990 : Base(pm->m_adapter), m_parallel_mng(pm){}
995 m_parallel_mng->_checkFinishedSubRequests();
998 MpiParallelMng* m_parallel_mng;
1016 return m_utils_factory;
1022bool MpiParallelMng::
1023_isAcceleratorAware()
const
#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.
Liste des fonctions d'échange de message.
Vue modifiable d'un tableau d'un type T.
constexpr Integer size() const noexcept
Retourne la taille du tableau.
const T * data() const
Accès à la racine du tableau hors toute protection.
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.
Opérations pour accéder aux valeurs de variables d'un autre sous-domaine.
Interface du gestionnaire des entrées sorties.
Interface d'une famille d'entités.
virtual ItemGroup allItems() const =0
Groupe de toutes les entités.
Échange d'informations entre processeurs.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual ITraceMng * traceMng() const =0
Gestionnaire de traces.
virtual void build()=0
Construit l'instance.
Informations sur la réplication des sous-domaines en parallèle.
Informations sur la topologie d'allocation des coeurs de calcul.
Interface d'un sérialiseur.
Interface du gestionnaire de traces.
virtual void flush()=0
Flush tous les flots.
virtual TraceMessage info()=0
Flot pour un message d'information.
Envoie de valeurs sur différents processeurs.
Interface d'un communicateur MPI spécifique pour les synchronisations.
Interface d'un service de synchronisation de variable.
Groupe d'entités de maillage.
eItemKind itemKind() const
Genre du groupe. Il s'agit du genre de ses éléments.
bool isAllItems() const
Indique si le groupe est celui de toutes les entités.
Options pour configurer les allocations.
Interface d'un message de sérialisation entre IMessagePassingMng.
Informations sur la source d'un message.
void _wait(eWaitType wait_type) override
Effectue l'attente ou le test.
Request receiveSerializer(ISerializer *s, const PointToPointMessageInfo &message) override
Message de réception.
Request sendSerializer(const ISerializer *s, const PointToPointMessageInfo &message) override
Message d'envoi.
Informations pour envoyer/recevoir un message point à point.
Message de sérialisation utilisant un BasicSerializer.
static MessageTag defaultTag()
Tag par défaut pour les messages de sérialisation.
Gère les MPI_Datatype associées aux types Arcane.
Ref< IVariableSynchronizer > createSynchronizer(IParallelMng *pm, IItemFamily *family) override
Retourne une interface pour synchroniser des variables sur le groupe de la famille family.
Ref< IVariableSynchronizer > createSynchronizer(IParallelMng *pm, const ItemGroup &group) override
Retourne une interface pour synchroniser des variables sur le groupe group.
void initializeWindowCreator() override
Méthode permettant d'initialiser le windowCreator spécifique à l'implémentation.
Ref< IContigMachineShMemWinBaseInternal > createContigMachineShMemWinBase(Int64 sizeof_segment, Int32 sizeof_type) override
Méthode permettant de créer une fenêtre mémoire sur le noeud.
Ref< IMachineShMemWinBaseInternal > createMachineShMemWinBase(Int64 sizeof_segment, Int32 sizeof_type) override
Méthode permettant de créer une fenêtre mémoire dynamique sur le noeud.
bool isMachineShMemWinAvailable() override
Méthode permettant de savoir si le mode mémoire partagée est supporté.
ConstArrayView< Int32 > machineRanks() override
Méthode permettant de récupérer les rangs des sous-domaines du noeud de calcul.
void machineBarrier() override
Méthode permettant de faire une barrière pour les sous-domaines du noeud de calcul.
Int32 masterParallelIORank() const override
Int32 nbSendersToMasterParallelIO() const override
MemoryAllocationOptions machineShMemWinMemoryAllocator() override
Méthode permettant de récupérer un allocateur en mémoire partagée.
Spécialisation de MpiRequestList pour MpiParallelMng.
void _wait(Parallel::eWaitType wait_type) override
Effectue l'attente ou le test.
Gestionnaire du parallélisme utilisant MPI.
IParallelMng * worldParallelMng() const override
Gestionnaire de parallélisme sur l'ensemble des ressources allouées.
MessageSourceInfo legacyProbe(const PointToPointMessageInfo &message) override
Sonde si des messages sont disponibles.
void barrier() override
Effectue une barière.
UniqueArray< Integer > waitSomeRequests(ArrayView< Request > requests) override
Bloque en attendant qu'une des requêtes rvalues soit terminée.
void waitAllRequests(ArrayView< Request > requests) override
Bloque en attendant que les requêtes rvalues soient terminées.
MessageId probe(const PointToPointMessageInfo &message) override
Sonde si des messages sont disponibles.
void build() override
Construit l'instance.
void printStats() override
Affiche des statistiques liées à ce gestionnaire du parallélisme.
bool m_is_initialized
true si déjà initialisé
IParallelMng * sequentialParallelMng() override
Retourne un gestionnaire de parallélisme séquentiel.
IThreadMng * threadMng() const override
Gestionnaire de threads.
ITimerMng * timerMng() const override
Gestionnaire de timers.
void initialize() override
Initialise le gestionnaire du parallélisme.
IVariableSynchronizer * createSynchronizer(IItemFamily *family) override
Retourne une interface pour synchroniser des variables sur le groupe de la famille family.
ISerializeMessage * createSendSerializer(Int32 rank) override
Créé un message non bloquant pour envoyer des données sérialisées au rang rank.
bool isParallel() const override
Retourne true si l'exécution est parallèle.
Ref< IParallelMngUtilsFactory > _internalUtilsFactory() const override
Fabrique des fonctions utilitaires.
ITraceMng * traceMng() const override
Gestionnaire de traces.
IParallelTopology * createTopology() override
Créé une instance contenant les infos sur la topologie des rangs de ce gestionnnaire.
Communicator communicator() const override
Communicateur MPI associé à ce gestionnaire.
IParallelExchanger * createExchanger() override
Retourne une interface pour transférer des messages entre processeurs.
IParallelReplication * replication() const override
Informations sur la réplication.
void setReplication(IParallelReplication *v) override
Positionne les Informations sur la réplication.
Ref< Parallel::IRequestList > createRequestListRef() override
Créé une liste de requêtes pour ce gestionnaire.
ITransferValuesParallelOperation * createTransferValuesOperation() override
Retourne une opération pour transférer des valeurs entre sous-domaine.
UniqueArray< Integer > testSomeRequests(ArrayView< Request > requests) override
Test si une des requêtes rvalues est terminée.
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...
ISerializeMessage * createReceiveSerializer(Int32 rank) override
Créé un message non bloquant pour recevoir des données sérialisées du rang rank.
void freeRequests(ArrayView< Parallel::Request > requests) override
Libère les requêtes.
Gestionnaire du parallélisme utilisant MPI.
Gestionnaire de timer utisant la bibliothèque MPI.
void compute() override
Recalcule les infos de synchronisation.
Redirige la gestion des messages des sous-domaines suivant le type de l'argument.
IMessagePassingMng * messagePassingMng() const override
Gestionnaire de message de Arccore associé
ITimeMetricCollector * timeMetricCollector() const override
Collecteur Arccore des statistiques temporelles (peut être nul)
ITimeStats * timeStats() const override
Gestionnaire de statistiques associé (peut être nul)
Classe de base d'une fabrique pour les fonctions utilitaires de IParallelMng.
Informations sur la réplication des sous-domaines en parallèle.
Référence à une instance.
InstanceType * get() const
Instance associée ou nullptr si aucune.
Chaîne de caractères unicode.
bool null() const
Retourne true si la chaîne est nulle.
Positionne la phase de l'action en cours d'exécution.
Positionne une classe de message.
Vecteur 1D de données avec sémantique par valeur (style STL).
MPI_Comm communicator() const override
Récupère le communicateur spécifique de la topologie.
void compute(VariableSynchronizer *var_syncer) override
Calcul le communicateur spécifique.
Interface d'un service de synchronisation de variable.
void compute() override
Création de la liste des éléments de synchronisation.
Int32ConstArrayView communicatingRanks() override
Rangs des sous-domaines avec lesquels on communique.
Déclarations des types et méthodes utilisés par les mécanismes d'échange de messages.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
std::int8_t Int8
Type entier signé sur 8 bits.
Ref< TrueType > createRef(Args &&... args)
Créé une instance de type TrueType avec les arguments Args et retourne une référence dessus.
ARCANE_MPI_EXPORT bool arcaneIsAcceleratorAwareMPI()
Indique si le runtime actuel de MPI a le support des accélérateurs.
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
Array< Byte > ByteArray
Tableau dynamique à une dimension de caractères.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
@ IK_Cell
Entité de maillage de genre maille.
void arcaneCallFunctionAndTerminateIfThrow(std::function< void()> function)
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
std::int32_t Int32
Type entier signé sur 32 bits.
Infos pour construire un MpiParallelMng.
Infos pour construire un SequentialParallelMng.