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/internal/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)
107, mpi_machine_comm(machine_comm)
108, is_mpi_comm_owned(true)
110 ::MPI_Comm_rank(comm, &comm_rank);
111 ::MPI_Comm_size(comm, &comm_nb_rank);
122class VariableSynchronizerMpiCommunicator
128 : m_mpi_parallel_mng(pm)
130 ~VariableSynchronizerMpiCommunicator()
override
132 _checkFreeCommunicator();
136 return m_topology_communicator;
141 const Int32 nb_message = comm_ranks.
size();
148 for (
Integer i = 0; i < nb_message; ++i) {
149 destinations[i] = comm_ranks[i];
152 _checkFreeCommunicator();
154 int r = MPI_Dist_graph_create_adjacent(old_comm, nb_message, destinations.
data(), MPI_UNWEIGHTED,
155 nb_message, destinations.
data(), MPI_UNWEIGHTED,
156 MPI_INFO_NULL, 0, &m_topology_communicator);
158 if (r != MPI_SUCCESS)
159 ARCANE_FATAL(
"Error '{0}' in MPI_Dist_graph_create", r);
167 MPI_Dist_graph_neighbors_count(m_topology_communicator, &indegree, &outdegree, &weighted);
169 if (indegree != nb_message)
170 ARCANE_FATAL(
"Bad value '{0}' for 'indegree' (expected={1})", indegree, nb_message);
171 if (outdegree != nb_message)
172 ARCANE_FATAL(
"Bad value '{0}' for 'outdegree' (expected={1})", outdegree, nb_message);
177 MPI_Dist_graph_neighbors(m_topology_communicator, indegree, srcs.
data(), MPI_UNWEIGHTED, outdegree, dsts.
data(), MPI_UNWEIGHTED);
179 for (
int k = 0; k < outdegree; ++k) {
181 if (x != comm_ranks[k])
182 ARCANE_FATAL(
"Invalid destination rank order k={0} v={1} expected={2}", k, x, comm_ranks[k]);
185 for (
int k = 0; k < indegree; ++k) {
187 if (x != comm_ranks[k])
188 ARCANE_FATAL(
"Invalid source rank order k={0} v={1} expected={2}", k, x, comm_ranks[k]);
196 MPI_Comm m_topology_communicator = MPI_COMM_NULL;
200 void _checkFreeCommunicator()
202 if (m_topology_communicator != MPI_COMM_NULL)
203 MPI_Comm_free(&m_topology_communicator);
204 m_topology_communicator = MPI_COMM_NULL;
216class MpiVariableSynchronizer
217:
public VariableSynchronizer
224 : VariableSynchronizer(pm, group, implementation_factory)
225 , m_topology_info(topology_info)
235 if (m_topology_info.get())
236 m_topology_info->compute(
this);
247class MpiParallelMngUtilsFactory
252 MpiParallelMngUtilsFactory()
253 : m_synchronizer_version(2)
256 m_synchronizer_version = 1;
258 m_synchronizer_version = 2;
260 m_synchronizer_version = 3;
262 m_synchronizer_version = 4;
265 Int32 block_size = 0;
266 if (!builtInGetValue(block_size, v))
267 m_synchronize_block_size = block_size;
268 m_synchronize_block_size = std::clamp(m_synchronize_block_size, 0, 1000000000);
272 Int32 nb_sequence = 0;
273 if (!builtInGetValue(nb_sequence, v))
274 m_synchronize_nb_sequence = nb_sequence;
275 m_synchronize_nb_sequence = std::clamp(m_synchronize_nb_sequence, 1, 1024 * 1024);
279 m_synchronizer_version = 5;
281 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;
383 m_parallel_mng->traceMng()->info() <<
"initializeWindowCreator() MPI";
384 m_parallel_mng->adapter()->initializeWindowCreator(m_parallel_mng->machineCommunicator());
389 if (m_shmem_available == 1) {
393 if (m_shmem_available == 0) {
395 if (topo->machineRanks().size() == m_parallel_mng->adapter()->windowCreator()->machineRanks().size()) {
396 m_shmem_available = 1;
400 m_shmem_available = 2;
409 return makeRef(m_parallel_mng->adapter()->windowCreator()->createWindow(sizeof_segment, sizeof_type));
414 return makeRef(m_parallel_mng->adapter()->windowCreator()->createDynamicWindow(sizeof_segment, sizeof_type));
424 return m_parallel_mng->adapter()->windowCreator()->machineRanks();
429 m_parallel_mng->adapter()->windowCreator()->machineBarrier();
434 MpiParallelMng* m_parallel_mng;
440 Int8 m_shmem_available = 0;
452, m_trace(bi.trace_mng)
453, m_thread_mng(bi.thread_mng)
454, m_world_parallel_mng(bi.world_parallel_mng)
455, m_timer_mng(bi.timer_mng)
457, m_is_parallel(bi.is_parallel)
458, m_comm_rank(bi.commRank())
459, m_comm_size(bi.commSize())
461, m_communicator(bi.mpiComm())
462, m_machine_communicator(bi.mpiMachineComm())
463, m_is_communicator_owned(bi.is_mpi_comm_owned)
464, m_mpi_lock(bi.mpi_lock)
465, m_non_blocking_collective(nullptr)
467, m_parallel_mng_internal(new Impl(this))
469 if (!m_world_parallel_mng) {
470 m_trace->debug() <<
"[MpiParallelMng] No m_world_parallel_mng found, reverting to ourselves!";
471 m_world_parallel_mng =
this;
481 delete m_parallel_mng_internal;
482 delete m_non_blocking_collective;
483 m_sequential_parallel_mng.reset();
484 if (m_is_communicator_owned) {
485 MpiLock::Section ls(m_mpi_lock);
486 MPI_Comm_free(&m_communicator);
487 MPI_Comm_free(&m_machine_communicator);
489 delete m_replication;
491 if (m_is_timer_owned)
494 delete m_datatype_list;
506 class DispatchCreator
510 DispatchCreator(ITraceMng* tm, IMessagePassingMng* mpm, MpiAdapter* adapter, MpiDatatypeList* datatype_list)
514 , m_datatype_list(datatype_list)
519 template <
typename DataType> MpiParallelDispatchT<DataType>*
522 MpiDatatype* dt = m_datatype_list->datatype(DataType());
523 return new MpiParallelDispatchT<DataType>(m_tm, m_mpm, m_adapter, dt);
527 IMessagePassingMng* m_mpm;
528 MpiAdapter* m_adapter;
529 MpiDatatypeList* m_datatype_list;
535 class ControlDispatcherDecorator
536 :
public ParallelMngDispatcher::DefaultControlDispatcher
540 ControlDispatcherDecorator(IParallelMng* pm, MpiAdapter* adapter)
541 : ParallelMngDispatcher::DefaultControlDispatcher(pm)
545 IMessagePassingMng* commSplit(
bool keep)
override
547 return m_adapter->commSplit(keep);
549 MP::IProfiler* profiler()
const override {
return m_adapter->profiler(); }
550 void setProfiler(MP::IProfiler* p)
override { m_adapter->setProfiler(p); }
554 MpiAdapter* m_adapter;
567 m_is_timer_owned =
true;
576 m_sequential_parallel_mng = arcaneCreateSequentialParallelMngRef(bi);
581 bool is_ordered_reduce =
false;
583 is_ordered_reduce =
true;
588 MpiAdapter* adapter =
new MpiAdapter(m_trace, m_stat->toArccoreStat(), m_communicator, m_mpi_lock);
590 auto mpm = _messagePassingMng();
593 auto* control_dispatcher =
new ControlDispatcherDecorator(
this, m_adapter);
594 _setControlDispatcher(control_dispatcher);
598 m_mpi_serialize_dispatcher = serialize_dispatcher;
599 _setSerializeDispatcher(serialize_dispatcher);
601 DispatchCreator creator(m_trace, mpm, m_adapter, m_datatype_list);
602 this->createDispatchers(creator);
604 m_io_mng = arcaneCreateIOMng(
this);
607 m_non_blocking_collective->build();
609 m_trace->info() <<
"Using mpi with locks.";
611 m_parallel_mng_internal->initializeWindowCreator();
625 m_trace->warning() <<
"MpiParallelMng already initialized";
630 m_trace->info() <<
"Initialisation de MpiParallelMng";
631 m_sequential_parallel_mng->initialize();
647 m_mpi_serialize_dispatcher->legacySendSerializer(s, {
MessageRank(rank), mpi_tag, Blocking });
656 return m_utils_factory->createSendSerializeMessage(
this, rank)._release();
668 return m_mpi_serialize_dispatcher->legacySendSerializer(s, {
MessageRank(rank), mpi_tag, NonBlocking });
678 m_mpi_serialize_dispatcher->broadcastSerializer(values,
MessageRank(rank));
690 m_mpi_serialize_dispatcher->legacyReceiveSerializer(values,
MessageRank(rank), mpi_tag);
699 return m_utils_factory->createReceiveSerializeMessage(
this, rank)._release();
708 return m_adapter->probeMessage(message);
717 return m_adapter->legacyProbeMessage(message);
744 for (
Integer i = 0, is = requests.
size(); i < is; ++i)
745 m_adapter->freeRequest(requests[i]);
752_checkFinishedSubRequests()
754 m_mpi_serialize_dispatcher->checkFinishedSubRequests();
761sequentialParallelMngRef()
763 return m_sequential_parallel_mng;
769 return m_sequential_parallel_mng.get();
779 m_stat->print(m_trace);
789 m_adapter->barrier();
798 m_adapter->waitAllRequests(requests);
799 _checkFinishedSubRequests();
808 return _waitSomeRequests(requests,
false);
817 return _waitSomeRequests(requests,
true);
829 m_adapter->waitSomeRequests(requests, done_indexes, is_non_blocking);
830 for (
int i = 0; i < requests.
size(); i++) {
840ISerializeMessageList* MpiParallelMng::
841_createSerializeMessageList()
852 return m_utils_factory->createGetVariablesValuesOperation(
this)._release();
861 return m_utils_factory->createTransferValuesOperation(
this)._release();
870 return m_utils_factory->createExchanger(
this)._release();
879 return m_utils_factory->createSynchronizer(
this, family)._release();
888 return m_utils_factory->createSynchronizer(
this, group)._release();
897 return m_utils_factory->createTopology(
this)._release();
906 return m_replication;
915 delete m_replication;
923_createSubParallelMng(MPI_Comm sub_communicator)
926 if (sub_communicator == MPI_COMM_NULL)
930 MPI_Comm_rank(sub_communicator, &sub_rank);
932 MPI_Comm sub_machine_communicator = MPI_COMM_NULL;
933 MPI_Comm_split_type(sub_communicator, MPI_COMM_TYPE_SHARED, sub_rank, MPI_INFO_NULL, &sub_machine_communicator);
938 bi.timer_mng = m_timer_mng;
939 bi.thread_mng = m_thread_mng;
940 bi.trace_mng = m_trace;
941 bi.world_parallel_mng = m_world_parallel_mng;
942 bi.mpi_lock = m_mpi_lock;
953_createSubParallelMngRef(Int32 color, Int32 key)
956 color = MPI_UNDEFINED;
957 MPI_Comm sub_communicator = MPI_COMM_NULL;
958 MPI_Comm_split(m_communicator, color, key, &sub_communicator);
959 IParallelMng* sub_pm = _createSubParallelMng(sub_communicator);
966IParallelMng* MpiParallelMng::
969 MPI_Group mpi_group = MPI_GROUP_NULL;
970 MPI_Comm_group(m_communicator, &mpi_group);
972 UniqueArray<int> mpi_kept_ranks(nb_sub_rank);
973 for (
Integer i = 0; i < nb_sub_rank; ++i)
974 mpi_kept_ranks[i] = (
int)kept_ranks[i];
976 MPI_Group final_group = MPI_GROUP_NULL;
977 MPI_Group_incl(mpi_group, nb_sub_rank, mpi_kept_ranks.data(), &final_group);
978 MPI_Comm sub_communicator = MPI_COMM_NULL;
980 MPI_Comm_create(m_communicator, final_group, &sub_communicator);
981 MPI_Group_free(&final_group);
982 return _createSubParallelMng(sub_communicator);
996:
public MpiRequestList
998 using Base = MpiRequestList;
1002 explicit RequestList(MpiParallelMng* pm)
1003 : Base(pm->m_adapter)
1004 , m_parallel_mng(pm)
1012 m_parallel_mng->_checkFinishedSubRequests();
1017 MpiParallelMng* m_parallel_mng;
1035 return m_utils_factory;
1041bool MpiParallelMng::
1042_isAcceleratorAware()
const
#define ARCANE_CHECK_POINTER(ptr)
Macro returning the pointer ptr if it is not null or throwing an exception if it is null.
#define ARCANE_FATAL(...)
Macro throwing a FatalErrorException.
Brief list of message exchange functions.
Modifiable view of an array of type T.
constexpr Integer size() const noexcept
Returns the size of the array.
void add(ConstReferenceType val)
Adds element val to the end of the array.
const T * data() const
Access to the root of the array without any protection.
Constant view of an array of type T.
constexpr Integer size() const noexcept
Number of elements in the array.
Operations to access variable values from another subdomain.
Interface of the input/output manager.
Interface of an entity family.
virtual ItemGroup allItems() const =0
Group of all entities.
Information exchange between processors.
Interface of the parallelism manager for a subdomain.
virtual ITraceMng * traceMng() const =0
Trace manager.
virtual void build()=0
Constructs the instance.
Brief information on parallel subdomain replication.
Information on the computing core allocation topology.
virtual void flush()=0
Flushes all streams.
virtual TraceMessage info()=0
Stream for an information message.
Sends values across different processors.
Interface of a specific MPI communicator for synchronizations.
Interface of a variable synchronization service.
eItemKind itemKind() const
Group kind. This is the kind of its elements.
bool isAllItems() const
Indicates if the group is that of all entities.
Options to configure allocations.
Communicator for message exchange.
Interface for a serialization message between IMessagePassingMng.
Information about the source of a message.
void _wait(eWaitType wait_type) override
Performs the wait or test.
Request receiveSerializer(ISerializer *s, const PointToPointMessageInfo &message) override
Receiving message.
Request sendSerializer(const ISerializer *s, const PointToPointMessageInfo &message) override
Sending message.
Information for sending/receiving a point-to-point message.
Serializing message using a BasicSerializer.
static MessageTag defaultTag()
Default tag for serialization messages.
Manages the MPI_Datatypes associated with Arcane types.
Ref< IVariableSynchronizer > createSynchronizer(IParallelMng *pm, IItemFamily *family) override
Returns an interface to synchronize variables on the group of the family family.
Ref< IVariableSynchronizer > createSynchronizer(IParallelMng *pm, const ItemGroup &group) override
Returns an interface to synchronize variables on the group group.
void initializeWindowCreator() override
Method allowing the initialization of the windowCreator specific to the implementation.
Ref< IContigMachineShMemWinBaseInternal > createContigMachineShMemWinBase(Int64 sizeof_segment, Int32 sizeof_type) override
Method allowing the creation of a memory window on the node.
Ref< IMachineShMemWinBaseInternal > createMachineShMemWinBase(Int64 sizeof_segment, Int32 sizeof_type) override
Method allowing the creation of a dynamic memory window on the node.
bool isMachineShMemWinAvailable() override
Method allowing to know if shared memory mode is supported.
ConstArrayView< Int32 > machineRanks() override
Method allowing retrieval of the ranks of the sub-domains of the computing node.
void machineBarrier() override
Method allowing a barrier for the sub-domains of the computing node.
Int32 masterParallelIORank() const override
Int32 nbSendersToMasterParallelIO() const override
MemoryAllocationOptions machineShMemWinMemoryAllocator() override
Method allowing retrieval of a shared memory allocator.
Specialization of MpiRequestList for MpiParallelMng.
void _wait(Parallel::eWaitType wait_type) override
Performs the wait or test.
Parallelism manager using MPI.
IParallelMng * worldParallelMng() const override
Parallelism manager over all allocated resources.
MessageSourceInfo legacyProbe(const PointToPointMessageInfo &message) override
Probes if messages are available.
void barrier() override
Performs a barrier.
UniqueArray< Integer > waitSomeRequests(ArrayView< Request > requests) override
Blocks while waiting for one of the rvalues requests to complete.
void waitAllRequests(ArrayView< Request > requests) override
Blocks while waiting for the rvalues requests to complete.
MessageId probe(const PointToPointMessageInfo &message) override
Probes if messages are available.
void build() override
Constructs the instance.
void printStats() override
Prints statistics related to this parallelism manager.
bool m_is_initialized
true if already initialized
IParallelMng * sequentialParallelMng() override
Returns a sequential parallelism manager.
IThreadMng * threadMng() const override
Thread manager.
ITimerMng * timerMng() const override
Timer manager.
void initialize() override
Initializes the parallelism manager.
IVariableSynchronizer * createSynchronizer(IItemFamily *family) override
Returns an interface for synchronizing variables on the group of the family.
ISerializeMessage * createSendSerializer(Int32 rank) override
Creates a non-blocking message to send serialized data to rank rank.
bool isParallel() const override
Returns true if the execution is parallel.
Ref< IParallelMngUtilsFactory > _internalUtilsFactory() const override
Factory for utility functions.
ITraceMng * traceMng() const override
Trace manager.
IParallelTopology * createTopology() override
Creates an instance containing information about the rank topology of this manager.
Communicator communicator() const override
MPI communicator associated with this instance.
IParallelExchanger * createExchanger() override
Returns an interface for transferring messages between processors.
IParallelReplication * replication() const override
Replication information.
void setReplication(IParallelReplication *v) override
Sets the Replication Information.
Ref< Parallel::IRequestList > createRequestListRef() override
Creates a request list for this manager.
ITransferValuesParallelOperation * createTransferValuesOperation() override
Returns an operation to transfer values between subdomains.
UniqueArray< Integer > testSomeRequests(ArrayView< Request > requests) override
Tests if one of the rvalues requests is complete.
IGetVariablesValuesParallelOperation * createGetVariablesValuesOperation() override
Returns an operation to retrieve the values of a variable on the entities of another subdomain.
ISerializeMessage * createReceiveSerializer(Int32 rank) override
Creates a non-blocking message to receive serialized data from rank rank.
void freeRequests(ArrayView< Parallel::Request > requests) override
Frees the requests.
Parallelism manager using MPI.
Timer manager using the MPI library.
void compute() override
Recalculates the synchronization information.
Redirects the message management of sub-domains according to the argument type.
IMessagePassingMng * messagePassingMng() const override
Associated Arccore message passing manager.
ITimeMetricCollector * timeMetricCollector() const override
Interface for collecting execution times (can be null).
ITimeStats * timeStats() const override
Associated statistics manager (can be null).
Base class of a factory for IParallelMng utility functions.
Brief information on parallel subdomain replication.
InstanceType * get() const
Associated instance or nullptr if none.
Reference to an instance.
Unicode character string.
bool null() const
Returns true if the string is null.
Positions the phase of the currently executing action.
1D data vector with value semantics (STL style).
MPI_Comm communicator() const override
Retrieves the specific communicator from the topology.
void compute(VariableSynchronizer *var_syncer) override
Calculates the specific communicator.
Interface of a variable synchronization service.
void compute() override
Creation of the list of synchronization elements.
Int32ConstArrayView communicatingRanks() override
Ranks of subdomains with which communication occurs.
Declarations of types and methods used by message exchange mechanisms.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
std::int8_t Int8
Signed integer type of 8 bits.
Ref< TrueType > createRef(Args &&... args)
Creates an instance of type TrueType with arguments Args and returns a reference to it.
ARCANE_MPI_EXPORT bool arcaneIsAcceleratorAwareMPI()
Indicates if the current MPI runtime supports accelerators.
std::int64_t Int64
Signed integer type of 64 bits.
Int32 Integer
Type representing an integer.
Array< Byte > ByteArray
Dynamic one-dimensional array of characters.
ConstArrayView< Int32 > Int32ConstArrayView
C equivalent of a 1D array of 32-bit integers.
@ IK_Cell
Cell mesh entity.
void arcaneCallFunctionAndTerminateIfThrow(std::function< void()> function)
Calls the function function and calls std::terminate() if an exception occurs.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Creates a reference on a pointer.
std::int32_t Int32
Signed integer type of 32 bits.
Info to construct an MpiParallelMng.
Information to construct a SequentialParallelMng.