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/parallel/IStat.h"
30#include "arcane/core/internal/SerializeMessage.h"
31#include "arcane/core/internal/ParallelMngInternal.h"
32#include "arcane/core/internal/DynamicMachineMemoryWindowMemoryAllocator.h"
34#include "arcane/parallel/mpi/MpiParallelMng.h"
35#include "arcane/parallel/mpi/MpiParallelDispatch.h"
36#include "arcane/parallel/mpi/MpiTimerMng.h"
37#include "arcane/parallel/mpi/MpiSerializeMessage.h"
38#include "arcane/parallel/mpi/MpiParallelNonBlockingCollective.h"
39#include "arcane/parallel/mpi/MpiDatatype.h"
40#include "arcane/parallel/mpi/IVariableSynchronizerMpiCommunicator.h"
42#include "arcane/impl/ParallelReplication.h"
43#include "arcane/impl/SequentialParallelMng.h"
44#include "arcane/impl/internal/ParallelMngUtilsFactoryBase.h"
45#include "arcane/impl/internal/VariableSynchronizer.h"
47#include "arccore/message_passing_mpi/MpiMessagePassingMng.h"
48#include "arccore/message_passing_mpi/internal/MpiSerializeDispatcher.h"
49#include "arccore/message_passing_mpi/internal/MpiRequestList.h"
50#include "arccore/message_passing_mpi/internal/MpiAdapter.h"
51#include "arccore/message_passing_mpi/internal/MpiLock.h"
52#include "arccore/message_passing_mpi/internal/MpiMachineMemoryWindowBaseInternalCreator.h"
53#include "arccore/message_passing_mpi/internal/MpiMachineMemoryWindowBaseInternal.h"
54#include "arccore/message_passing_mpi/internal/MpiDynamicMachineMemoryWindowBaseInternal.h"
55#include "arccore/message_passing/Dispatchers.h"
57#include "arccore/message_passing/internal/SerializeMessageList.h"
59#include "arcane_packages.h"
69using namespace Arcane::MessagePassing::Mpi;
78#if defined(ARCANE_HAS_MPI_NEIGHBOR)
81arcaneCreateMpiNeighborVariableSynchronizerFactory(
MpiParallelMng* mpi_pm,
89arcaneCreateMpiDirectSendrecvVariableSynchronizerFactory(
MpiParallelMng* mpi_pm);
91arcaneCreateMpiLegacyVariableSynchronizerFactory(
MpiParallelMng* mpi_pm);
92#if defined(ARCANE_HAS_PACKAGE_NCCL)
94arcaneCreateNCCLVariableSynchronizerFactory(
IParallelMng* mpi_pm);
100MpiParallelMngBuildInfo::
101MpiParallelMngBuildInfo(MPI_Comm comm, MPI_Comm machine_comm)
110, mpi_machine_comm(machine_comm)
111, is_mpi_comm_owned(true)
114 ::MPI_Comm_rank(comm,&comm_rank);
115 ::MPI_Comm_size(comm,&comm_nb_rank);
118 MP::Mpi::MpiMessagePassingMng::BuildInfo bi(comm_rank,comm_nb_rank,m_dispatchers_ref.get(),mpi_comm);
131class VariableSynchronizerMpiCommunicator
136 : m_mpi_parallel_mng(pm){}
137 ~VariableSynchronizerMpiCommunicator()
override
139 _checkFreeCommunicator();
143 return m_topology_communicator;
148 const Int32 nb_message = comm_ranks.
size();
155 for(
Integer i=0; i<nb_message; ++i ){
156 destinations[i] = comm_ranks[i];
159 _checkFreeCommunicator();
161 int r = MPI_Dist_graph_create_adjacent(old_comm, nb_message, destinations.
data(), MPI_UNWEIGHTED,
162 nb_message, destinations.
data(), MPI_UNWEIGHTED,
163 MPI_INFO_NULL, 0, &m_topology_communicator);
174 MPI_Dist_graph_neighbors_count(m_topology_communicator,&indegree,&outdegree,&weighted);
176 if (indegree!=nb_message)
177 ARCANE_FATAL(
"Bad value '{0}' for 'indegree' (expected={1})",indegree,nb_message);
178 if (outdegree!=nb_message)
179 ARCANE_FATAL(
"Bad value '{0}' for 'outdegree' (expected={1})",outdegree,nb_message);
184 MPI_Dist_graph_neighbors(m_topology_communicator,indegree,srcs.
data(),MPI_UNWEIGHTED,outdegree,dsts.
data(),MPI_UNWEIGHTED);
186 for(
int k=0; k<outdegree; ++k){
188 if (x!=comm_ranks[k])
189 ARCANE_FATAL(
"Invalid destination rank order k={0} v={1} expected={2}",k,x,comm_ranks[k]);
192 for(
int k=0; k<indegree; ++k ){
194 if (x!=comm_ranks[k])
195 ARCANE_FATAL(
"Invalid source rank order k={0} v={1} expected={2}",k,x,comm_ranks[k]);
203 MPI_Comm m_topology_communicator = MPI_COMM_NULL;
207 void _checkFreeCommunicator()
209 if (m_topology_communicator!=MPI_COMM_NULL)
210 MPI_Comm_free(&m_topology_communicator);
211 m_topology_communicator = MPI_COMM_NULL;
223class MpiVariableSynchronizer
224:
public VariableSynchronizer
230 : VariableSynchronizer(pm,group,implementation_factory)
231 , m_topology_info(topology_info)
239 if (m_topology_info.get())
240 m_topology_info->compute(
this);
249class MpiParallelMngUtilsFactory
253 MpiParallelMngUtilsFactory()
254 : m_synchronizer_version(2)
257 m_synchronizer_version = 1;
259 m_synchronizer_version = 2;
261 m_synchronizer_version = 3;
263 m_synchronizer_version = 4;
266 Int32 block_size = 0;
267 if (!builtInGetValue(block_size,v))
268 m_synchronize_block_size = block_size;
269 m_synchronize_block_size = std::clamp(m_synchronize_block_size,0,1000000000);
273 Int32 nb_sequence = 0;
274 if (!builtInGetValue(nb_sequence,v))
275 m_synchronize_nb_sequence = nb_sequence;
276 m_synchronize_nb_sequence = std::clamp(m_synchronize_nb_sequence,1,1024*1024);
280 m_synchronizer_version = 5;
282 m_synchronizer_version = 6;
288 return _createSynchronizer(pm,family->
allItems());
293 return _createSynchronizer(pm,group);
307 if (m_synchronizer_version == 2){
309 tm->
info() <<
"Using MpiSynchronizer V2";
310 generic_factory = arcaneCreateMpiVariableSynchronizerFactory(mpi_pm);
312 else if (m_synchronizer_version == 3 ){
314 tm->
info() <<
"Using MpiSynchronizer V3";
315 generic_factory = arcaneCreateMpiDirectSendrecvVariableSynchronizerFactory(mpi_pm);
317 else if (m_synchronizer_version == 4){
319 tm->
info() <<
"Using MpiSynchronizer V4 block_size=" << m_synchronize_block_size
320 <<
" nb_sequence=" << m_synchronize_nb_sequence;
321 generic_factory = arcaneCreateMpiBlockVariableSynchronizerFactory(mpi_pm,m_synchronize_block_size,m_synchronize_nb_sequence);
323 else if (m_synchronizer_version == 5){
325 tm->
info() <<
"Using MpiSynchronizer V5";
326 topology_info = createRef<VariableSynchronizerMpiCommunicator>(mpi_pm);
327#if defined(ARCANE_HAS_MPI_NEIGHBOR)
328 generic_factory = arcaneCreateMpiNeighborVariableSynchronizerFactory(mpi_pm,topology_info);
330 throw NotSupportedException(A_FUNCINFO,
"Synchronize implementation V5 is not supported with this version of MPI");
333#if defined(ARCANE_HAS_PACKAGE_NCCL)
334 else if (m_synchronizer_version == 6){
336 tm->
info() <<
"Using NCCLSynchronizer";
337 generic_factory = arcaneCreateNCCLVariableSynchronizerFactory(mpi_pm);
342 tm->
info() <<
"Using MpiSynchronizer V1";
343 generic_factory = arcaneCreateMpiLegacyVariableSynchronizerFactory(mpi_pm);
345 if (!generic_factory.
get())
347 return createRef<MpiVariableSynchronizer>(pm,group,generic_factory,topology_info);
352 Integer m_synchronizer_version = 1;
353 Int32 m_synchronize_block_size = 32000;
354 Int32 m_synchronize_nb_sequence = 1;
364:
public ParallelMngInternal
368 explicit Impl(MpiParallelMng* pm)
369 : ParallelMngInternal(pm)
374 ~Impl()
override =
default;
380 return makeRef(m_parallel_mng->adapter()->windowCreator(m_parallel_mng->machineCommunicator())->createWindow(sizeof_segment, sizeof_type));
385 return makeRef(m_parallel_mng->adapter()->windowCreator(m_parallel_mng->machineCommunicator())->createDynamicWindow(sizeof_segment, sizeof_type));
390 return m_alloc.get();
408, m_trace(bi.trace_mng)
409, m_thread_mng(bi.thread_mng)
410, m_world_parallel_mng(bi.world_parallel_mng)
411, m_timer_mng(bi.timer_mng)
413, m_is_parallel(bi.is_parallel)
414, m_comm_rank(bi.commRank())
415, m_comm_size(bi.commSize())
417, m_communicator(bi.mpiComm())
418, m_machine_communicator(bi.mpiMachineComm())
419, m_is_communicator_owned(bi.is_mpi_comm_owned)
420, m_mpi_lock(bi.mpi_lock)
421, m_non_blocking_collective(nullptr)
423, m_parallel_mng_internal(new Impl(this))
425 if (!m_world_parallel_mng){
426 m_trace->debug()<<
"[MpiParallelMng] No m_world_parallel_mng found, reverting to ourselves!";
427 m_world_parallel_mng =
this;
437 delete m_parallel_mng_internal;
438 delete m_non_blocking_collective;
439 m_sequential_parallel_mng.reset();
440 if (m_is_communicator_owned){
441 MpiLock::Section ls(m_mpi_lock);
442 MPI_Comm_free(&m_communicator);
443 MPI_Comm_free(&m_machine_communicator);
445 delete m_replication;
447 if (m_is_timer_owned)
450 delete m_datatype_list;
465 DispatchCreator(ITraceMng* tm,IMessagePassingMng* mpm,MpiAdapter* adapter,MpiDatatypeList* datatype_list)
466 : m_tm(tm), m_mpm(mpm), m_adapter(adapter), m_datatype_list(datatype_list){}
468 template<
typename DataType> MpiParallelDispatchT<DataType>*
471 MpiDatatype* dt = m_datatype_list->datatype(DataType());
472 return new MpiParallelDispatchT<DataType>(m_tm,m_mpm,m_adapter,dt);
476 IMessagePassingMng* m_mpm;
477 MpiAdapter* m_adapter;
478 MpiDatatypeList* m_datatype_list;
484class ControlDispatcherDecorator
485:
public ParallelMngDispatcher::DefaultControlDispatcher
489 ControlDispatcherDecorator(IParallelMng* pm, MpiAdapter* adapter)
490 : ParallelMngDispatcher::DefaultControlDispatcher(pm), m_adapter(adapter) {}
492 IMessagePassingMng* commSplit(
bool keep)
override
494 return m_adapter->commSplit(keep);
496 MP::IProfiler* profiler()
const override {
return m_adapter->profiler(); }
497 void setProfiler(MP::IProfiler* p)
override { m_adapter->setProfiler(p); }
500 MpiAdapter* m_adapter;
513 m_is_timer_owned =
true;
522 m_sequential_parallel_mng = arcaneCreateSequentialParallelMngRef(bi);
527 bool is_ordered_reduce =
false;
529 is_ordered_reduce =
true;
534 MpiAdapter* adapter =
new MpiAdapter(m_trace,m_stat->toArccoreStat(),m_communicator,m_mpi_lock);
536 auto mpm = _messagePassingMng();
539 auto* control_dispatcher =
new ControlDispatcherDecorator(
this,m_adapter);
540 _setControlDispatcher(control_dispatcher);
544 m_mpi_serialize_dispatcher = serialize_dispatcher;
545 _setSerializeDispatcher(serialize_dispatcher);
547 DispatchCreator creator(m_trace,mpm,m_adapter,m_datatype_list);
548 this->createDispatchers(creator);
550 m_io_mng = arcaneCreateIOMng(
this);
553 m_non_blocking_collective->build();
555 m_trace->info() <<
"Using mpi with locks.";
569 m_trace->warning() <<
"MpiParallelMng already initialized";
573 m_trace->info() <<
"Initialisation de MpiParallelMng";
574 m_sequential_parallel_mng->initialize();
590 m_mpi_serialize_dispatcher->legacySendSerializer(s,{
MessageRank(rank),mpi_tag,Blocking});
599 return m_utils_factory->createSendSerializeMessage(
this, rank)._release();
611 return m_mpi_serialize_dispatcher->legacySendSerializer(s,{
MessageRank(rank),mpi_tag,NonBlocking});
621 m_mpi_serialize_dispatcher->broadcastSerializer(values,
MessageRank(rank));
633 m_mpi_serialize_dispatcher->legacyReceiveSerializer(values,
MessageRank(rank),mpi_tag);
642 return m_utils_factory->createReceiveSerializeMessage(
this, rank)._release();
651 return m_adapter->probeMessage(message);
660 return m_adapter->legacyProbeMessage(message);
688 m_adapter->freeRequest(requests[i]);
695_checkFinishedSubRequests()
697 m_mpi_serialize_dispatcher->checkFinishedSubRequests();
704sequentialParallelMngRef()
706 return m_sequential_parallel_mng;
712 return m_sequential_parallel_mng.get();
722 m_stat->print(m_trace);
732 m_adapter->barrier();
741 m_adapter->waitAllRequests(requests);
742 _checkFinishedSubRequests();
751 return _waitSomeRequests(requests,
false);
760 return _waitSomeRequests(requests,
true);
772 m_adapter->waitSomeRequests(requests, done_indexes, is_non_blocking);
773 for (
int i = 0 ; i < requests.
size() ; i++) {
783ISerializeMessageList* MpiParallelMng::
784_createSerializeMessageList()
795 return m_utils_factory->createGetVariablesValuesOperation(
this)._release();
804 return m_utils_factory->createTransferValuesOperation(
this)._release();
813 return m_utils_factory->createExchanger(
this)._release();
822 return m_utils_factory->createSynchronizer(
this,family)._release();
831 return m_utils_factory->createSynchronizer(
this,group)._release();
840 return m_utils_factory->createTopology(
this)._release();
849 return m_replication;
858 delete m_replication;
866_createSubParallelMng(MPI_Comm sub_communicator)
869 if (sub_communicator==MPI_COMM_NULL)
873 MPI_Comm_rank(sub_communicator,&sub_rank);
875 MPI_Comm sub_machine_communicator = MPI_COMM_NULL;
876 MPI_Comm_split_type(sub_communicator, MPI_COMM_TYPE_SHARED, sub_rank, MPI_INFO_NULL, &sub_machine_communicator);
881 bi.timer_mng = m_timer_mng;
882 bi.thread_mng = m_thread_mng;
883 bi.trace_mng = m_trace;
884 bi.world_parallel_mng = m_world_parallel_mng;
885 bi.mpi_lock = m_mpi_lock;
896_createSubParallelMngRef(Int32 color, Int32 key)
899 color = MPI_UNDEFINED;
900 MPI_Comm sub_communicator = MPI_COMM_NULL;
901 MPI_Comm_split(m_communicator, color, key, &sub_communicator);
902 IParallelMng* sub_pm = _createSubParallelMng(sub_communicator);
909IParallelMng* MpiParallelMng::
912 MPI_Group mpi_group = MPI_GROUP_NULL;
913 MPI_Comm_group(m_communicator, &mpi_group);
915 UniqueArray<int> mpi_kept_ranks(nb_sub_rank);
916 for (
Integer i = 0; i < nb_sub_rank; ++i)
917 mpi_kept_ranks[i] = (
int)kept_ranks[i];
919 MPI_Group final_group = MPI_GROUP_NULL;
920 MPI_Group_incl(mpi_group, nb_sub_rank, mpi_kept_ranks.data(), &final_group);
921 MPI_Comm sub_communicator = MPI_COMM_NULL;
923 MPI_Comm_create(m_communicator, final_group, &sub_communicator);
924 MPI_Group_free(&final_group);
925 return _createSubParallelMng(sub_communicator);
938:
public MpiRequestList
940 using Base = MpiRequestList;
942 explicit RequestList(MpiParallelMng* pm)
943 : Base(pm->m_adapter), m_parallel_mng(pm){}
948 m_parallel_mng->_checkFinishedSubRequests();
951 MpiParallelMng* m_parallel_mng;
969 return m_utils_factory;
976_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.
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.
Interface d'un allocateur pour la mémoire.
É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.
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.
Ref< IDynamicMachineMemoryWindowBaseInternal > createDynamicMachineMemoryWindowBase(Int64 sizeof_segment, Int32 sizeof_type) override
Méthode permettant de créer une fenêtre mémoire dynamique sur le noeud.
Ref< IMachineMemoryWindowBaseInternal > createMachineMemoryWindowBase(Int64 sizeof_segment, Int32 sizeof_type) override
Méthode permettant de créer une fenêtre mémoire sur le noeud.
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 -*-
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.