diff --git a/arcane/src/arcane/core/Parallel.cc b/arcane/src/arcane/core/Parallel.cc index 628baecee3..f331cf2483 100644 --- a/arcane/src/arcane/core/Parallel.cc +++ b/arcane/src/arcane/core/Parallel.cc @@ -1,11 +1,11 @@ // -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*- //----------------------------------------------------------------------------- -// Copyright 2000-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com) +// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com) // See the top-level COPYRIGHT file for details. // SPDX-License-Identifier: Apache-2.0 //----------------------------------------------------------------------------- /*---------------------------------------------------------------------------*/ -/* Parallel.cc (C) 2000-2024 */ +/* Parallel.cc (C) 2000-2025 */ /* */ /* Espace de nom des types gérant le parallélisme. */ /*---------------------------------------------------------------------------*/ @@ -18,6 +18,7 @@ #include "arcane/utils/FatalErrorException.h" #include "arcane/utils/PlatformUtils.h" #include "arcane/utils/ITraceMng.h" +#include "arcane/utils/Math.h" #include "arcane/core/IParallelMng.h" #include "arcane/core/IParallelMng.h" diff --git a/arcane/src/arcane/core/ParallelMngUtils.cc b/arcane/src/arcane/core/ParallelMngUtils.cc index 0a5162a1bd..fa831f3b75 100644 --- a/arcane/src/arcane/core/ParallelMngUtils.cc +++ b/arcane/src/arcane/core/ParallelMngUtils.cc @@ -1,11 +1,11 @@ // -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*- //----------------------------------------------------------------------------- -// Copyright 2000-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com) +// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com) // See the top-level COPYRIGHT file for details. // SPDX-License-Identifier: Apache-2.0 //----------------------------------------------------------------------------- /*---------------------------------------------------------------------------*/ -/* ParallelMngUtils.cc (C) 2000-2024 */ +/* ParallelMngUtils.cc (C) 2000-2025 */ /* */ /* Fonctions utilitaires associées aux 'IParallelMng'. */ /*---------------------------------------------------------------------------*/ @@ -14,7 +14,7 @@ #include "arcane/core/ParallelMngUtils.h" #include "arcane/core/IParallelMng.h" -#include "arcane/core/IParallelMngUtilsFactory.h" +#include "arcane/core/internal/IParallelMngUtilsFactory.h" #include "arcane/core/internal/IParallelMngInternal.h" /*---------------------------------------------------------------------------*/ @@ -81,12 +81,29 @@ class ParallelMngUtilsAccessor auto f = pm->_internalUtilsFactory(); return f->createTopology(pm); } + static Ref createSubParallelMngRef(IParallelMng* pm, Int32 color, Int32 key) { ARCANE_CHECK_POINTER(pm); return pm->_internalApi()->createSubParallelMngRef(color, key); } + + static Ref + createSendSerializeMessageRef(IParallelMng* pm, Int32 rank) + { + ARCANE_CHECK_POINTER(pm); + auto f = pm->_internalUtilsFactory(); + return f->createSendSerializeMessage(pm, rank); + } + + static Ref + createReceiveSerializeMessageRef(IParallelMng* pm, Int32 rank) + { + ARCANE_CHECK_POINTER(pm); + auto f = pm->_internalUtilsFactory(); + return f->createReceiveSerializeMessage(pm, rank); + } }; /*---------------------------------------------------------------------------*/ diff --git a/arcane/src/arcane/core/ParallelMngUtils.h b/arcane/src/arcane/core/ParallelMngUtils.h index c75d12e488..d18a6f5111 100644 --- a/arcane/src/arcane/core/ParallelMngUtils.h +++ b/arcane/src/arcane/core/ParallelMngUtils.h @@ -1,11 +1,11 @@ // -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*- //----------------------------------------------------------------------------- -// Copyright 2000-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com) +// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com) // See the top-level COPYRIGHT file for details. // SPDX-License-Identifier: Apache-2.0 //----------------------------------------------------------------------------- /*---------------------------------------------------------------------------*/ -/* ParallelMngUtils.h (C) 2000-2024 */ +/* ParallelMngUtils.h (C) 2000-2025 */ /* */ /* Fonctions utilitaires associées aux 'IParallelMng'. */ /*---------------------------------------------------------------------------*/ @@ -80,6 +80,22 @@ createTopologyRef(IParallelMng* pm); extern "C++" ARCANE_CORE_EXPORT Ref createSubParallelMngRef(IParallelMng* pm, Int32 color, Int32 key); +/*! + * \brief Créé un message de sérialisation non bloquant en envoi au rang \a rank. + * + * Le message est traité uniquement lors de l'appel à IParallelMng::processMessages(). + */ +extern "C++" ARCANE_CORE_EXPORT Ref +createSendSerializeMessageRef(IParallelMng* pm, Int32 rank); + +/*! + * \brief Créé un message de sérialisation non bloquant en réception du rang \a rank. + * + * Le message est traité uniquement lors de l'appel à IParallelMng::processMessages(). + */ +extern "C++" ARCANE_CORE_EXPORT Ref +createReceiveSerializeMessageRef(IParallelMng* pm, Int32 rank); + /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ diff --git a/arcane/src/arcane/core/IParallelMngUtilsFactory.h b/arcane/src/arcane/core/internal/IParallelMngUtilsFactory.h similarity index 69% rename from arcane/src/arcane/core/IParallelMngUtilsFactory.h rename to arcane/src/arcane/core/internal/IParallelMngUtilsFactory.h index 0ab3b5f6f9..53dcb3be3b 100644 --- a/arcane/src/arcane/core/IParallelMngUtilsFactory.h +++ b/arcane/src/arcane/core/internal/IParallelMngUtilsFactory.h @@ -1,32 +1,26 @@ // -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*- //----------------------------------------------------------------------------- -// Copyright 2000-2022 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com) +// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com) // See the top-level COPYRIGHT file for details. // SPDX-License-Identifier: Apache-2.0 //----------------------------------------------------------------------------- /*---------------------------------------------------------------------------*/ -/* IParallelMngUtilsFactory.h (C) 2000-2021 */ +/* IParallelMngUtilsFactory.h (C) 2000-2025 */ /* */ /* Interface d'une fabrique pour les fonctions utilitaires de IParallelMng. */ /*---------------------------------------------------------------------------*/ -#ifndef ARCANE_IPARALLELMNGUTILSFACTORY_H -#define ARCANE_IPARALLELMNGUTILSFACTORY_H +#ifndef ARCANE_CORE_INTERNAL_IPARALLELMNGUTILSFACTORY_H +#define ARCANE_CORE_INTERNAL_IPARALLELMNGUTILSFACTORY_H /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ #include "arcane/utils/Ref.h" -#include "arcane/Parallel.h" +#include "arcane/core/Parallel.h" /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ -namespace Arcane -{ -class IItemFamily; -class ItemGroup; -} - namespace Arcane { /*---------------------------------------------------------------------------*/ @@ -38,7 +32,9 @@ namespace Arcane class ARCANE_CORE_EXPORT IParallelMngUtilsFactory { public: + virtual ~IParallelMngUtilsFactory() = default; + public: /*! @@ -46,29 +42,29 @@ class ARCANE_CORE_EXPORT IParallelMngUtilsFactory * sur les entités d'un autre sous-domaine. */ virtual Ref - createGetVariablesValuesOperation(IParallelMng* pm) =0; + createGetVariablesValuesOperation(IParallelMng* pm) = 0; //! Retourne une opération pour transférer des valeurs entre rangs. virtual Ref - createTransferValuesOperation(IParallelMng* pm) =0; + createTransferValuesOperation(IParallelMng* pm) = 0; //! Retourne une interface pour transférer des messages entre rangs virtual Ref - createExchanger(IParallelMng* pm) =0; + createExchanger(IParallelMng* pm) = 0; /*! * \brief Retourne une interface pour synchroniser des * variables sur le groupe de la famille \a family */ virtual Ref - createSynchronizer(IParallelMng* pm,IItemFamily* family) =0; + createSynchronizer(IParallelMng* pm, IItemFamily* family) = 0; /*! * \brief Retourne une interface pour synchroniser des * variables sur le groupe \a group. */ virtual Ref - createSynchronizer(IParallelMng* pm,const ItemGroup& group) =0; + createSynchronizer(IParallelMng* pm, const ItemGroup& group) = 0; /*! * \brief Créé une instance contenant les infos sur la topologie des rangs de ce gestionnnaire. @@ -76,13 +72,29 @@ class ARCANE_CORE_EXPORT IParallelMngUtilsFactory * Cette opération est collective. */ virtual Ref - createTopology(IParallelMng* pm) =0; + createTopology(IParallelMng* pm) = 0; + + /*! + * \brief Créé un message de sérialisation non bloquant en envoi au rang \a rank. + * + * Le message est traité uniquement lors de l'appel à IParallelMng::processMessages(). + */ + virtual Ref + createSendSerializeMessage(IParallelMng* pm, Int32 rank) = 0; + + /*! + * \brief Créé un message de sérialisation non bloquant en réception du rang \a rank. + * + * Le message est traité uniquement lors de l'appel à IParallelMng::processMessages(). + */ + virtual Ref + createReceiveSerializeMessage(IParallelMng* pm, Int32 rank) = 0; }; /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ -} // End namespace Arcane::impl +} // namespace Arcane /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ diff --git a/arcane/src/arcane/core/srcs.cmake b/arcane/src/arcane/core/srcs.cmake index b387dce9de..e6be7e0310 100644 --- a/arcane/src/arcane/core/srcs.cmake +++ b/arcane/src/arcane/core/srcs.cmake @@ -68,6 +68,7 @@ set(ARCANE_INTERNAL_SOURCES internal/IParallelMngInternal.h internal/IItemFamilyInternal.h internal/IMeshInternal.h + internal/IParallelMngUtilsFactory.h internal/IVariableInternal.h internal/IMeshModifierInternal.h internal/ItemGroupImplInternal.h @@ -243,7 +244,6 @@ set(ARCANE_ORIGINAL_SOURCES IParallelDispatch.h IParallelExchanger.h IParallelMng.h - IParallelMngUtilsFactory.h IParallelNonBlockingCollective.h IParallelNonBlockingCollectiveDispatch.h IParallelReplication.h diff --git a/arcane/src/arcane/impl/ParallelMngUtilsFactoryBase.cc b/arcane/src/arcane/impl/ParallelMngUtilsFactoryBase.cc index 1a88fadebd..18ae1c3b7d 100644 --- a/arcane/src/arcane/impl/ParallelMngUtilsFactoryBase.cc +++ b/arcane/src/arcane/impl/ParallelMngUtilsFactoryBase.cc @@ -1,18 +1,18 @@ // -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*- //----------------------------------------------------------------------------- -// Copyright 2000-2023 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com) +// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com) // See the top-level COPYRIGHT file for details. // SPDX-License-Identifier: Apache-2.0 //----------------------------------------------------------------------------- /*---------------------------------------------------------------------------*/ -/* ParallelMngUtilsFactoryBase.cc (C) 2000-2023 */ +/* ParallelMngUtilsFactoryBase.cc (C) 2000-2025 */ /* */ /* Classe de base d'une fabrique pour les fonctions utilitaires de */ /* IParallelMng. */ /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ -#include "arcane/impl/ParallelMngUtilsFactoryBase.h" +#include "arcane/impl/internal/ParallelMngUtilsFactoryBase.h" #include "arcane/utils/Real2.h" #include "arcane/utils/Real3.h" @@ -25,9 +25,9 @@ #include "arcane/impl/ParallelTopology.h" #include "arcane/impl/internal/VariableSynchronizer.h" -#include "arcane/DataTypeDispatchingDataVisitor.h" - -#include "arcane/IItemFamily.h" +#include "arcane/core/DataTypeDispatchingDataVisitor.h" +#include "arcane/core/IItemFamily.h" +#include "arcane/core/internal/SerializeMessage.h" /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ @@ -96,6 +96,28 @@ createSynchronizer(IParallelMng* pm,const ItemGroup& group) /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ +Ref ParallelMngUtilsFactoryBase:: +createSendSerializeMessage(IParallelMng* pm, Int32 rank) +{ + Int32 my_rank = pm->commRank(); + auto x = new SerializeMessage(my_rank, rank, ISerializeMessage::MT_Send); + return makeRef(x); +} + +/*---------------------------------------------------------------------------*/ +/*---------------------------------------------------------------------------*/ + +Ref ParallelMngUtilsFactoryBase:: +createReceiveSerializeMessage(IParallelMng* pm, Int32 rank) +{ + Int32 my_rank = pm->commRank(); + auto x = new SerializeMessage(my_rank, rank, ISerializeMessage::MT_Recv); + return makeRef(x); +} + +/*---------------------------------------------------------------------------*/ +/*---------------------------------------------------------------------------*/ + } // End namespace Arcane /*---------------------------------------------------------------------------*/ diff --git a/arcane/src/arcane/impl/SequentialParallelMng.cc b/arcane/src/arcane/impl/SequentialParallelMng.cc index 686c3c048d..f7dd478855 100644 --- a/arcane/src/arcane/impl/SequentialParallelMng.cc +++ b/arcane/src/arcane/impl/SequentialParallelMng.cc @@ -50,7 +50,7 @@ #include "arcane/impl/ParallelReplication.h" #include "arcane/impl/SequentialParallelSuperMng.h" #include "arcane/impl/SequentialParallelMng.h" -#include "arcane/impl/ParallelMngUtilsFactoryBase.h" +#include "arcane/impl/internal/ParallelMngUtilsFactoryBase.h" #include "arcane/impl/internal/VariableSynchronizer.h" #include "arccore/message_passing/RequestListBase.h" diff --git a/arcane/src/arcane/impl/ParallelMngUtilsFactoryBase.h b/arcane/src/arcane/impl/internal/ParallelMngUtilsFactoryBase.h similarity index 84% rename from arcane/src/arcane/impl/ParallelMngUtilsFactoryBase.h rename to arcane/src/arcane/impl/internal/ParallelMngUtilsFactoryBase.h index 1face895ed..2a70de6c6d 100644 --- a/arcane/src/arcane/impl/ParallelMngUtilsFactoryBase.h +++ b/arcane/src/arcane/impl/internal/ParallelMngUtilsFactoryBase.h @@ -1,21 +1,21 @@ // -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*- //----------------------------------------------------------------------------- -// Copyright 2000-2022 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com) +// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com) // See the top-level COPYRIGHT file for details. // SPDX-License-Identifier: Apache-2.0 //----------------------------------------------------------------------------- /*---------------------------------------------------------------------------*/ -/* ParallelMngUtilsFactoryBase.h (C) 2000-2021 */ +/* ParallelMngUtilsFactoryBase.h (C) 2000-2025 */ /* */ /* Classe de base d'une fabrique pour les fonctions utilitaires de */ /* IParallelMng. */ /*---------------------------------------------------------------------------*/ -#ifndef ARCANE_IMPL_PARALLELMNGUTILSFACTORY_H -#define ARCANE_IMPL_PARALLELMNGUTILSFACTORY_H +#ifndef ARCANE_IMPL_INTERNAL_PARALLELMNGUTILSFACTORY_H +#define ARCANE_IMPL_INTERNAL_PARALLELMNGUTILSFACTORY_H /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ -#include "arcane/IParallelMngUtilsFactory.h" +#include "arcane/core/internal/IParallelMngUtilsFactory.h" /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ @@ -39,6 +39,8 @@ class ARCANE_IMPL_EXPORT ParallelMngUtilsFactoryBase Ref createSynchronizer(IParallelMng* pm,IItemFamily* family) override; Ref createSynchronizer(IParallelMng* pm,const ItemGroup& group) override; Ref createTopology(IParallelMng* pm) override; + Ref createSendSerializeMessage(IParallelMng* pm, Int32 rank) override; + Ref createReceiveSerializeMessage(IParallelMng* pm, Int32 rank) override; }; /*---------------------------------------------------------------------------*/ diff --git a/arcane/src/arcane/impl/srcs.cmake b/arcane/src/arcane/impl/srcs.cmake index e2988f23ef..e8008e9cb7 100644 --- a/arcane/src/arcane/impl/srcs.cmake +++ b/arcane/src/arcane/impl/srcs.cmake @@ -65,7 +65,6 @@ set( ARCANE_SOURCES ParallelExchanger.cc ParallelExchanger.h ParallelMngUtilsFactoryBase.cc - ParallelMngUtilsFactoryBase.h ParallelReplication.cc ParallelReplication.h ParallelTopology.cc @@ -152,6 +151,7 @@ set( ARCANE_SOURCES internal/MeshFactoryMng.cc internal/MeshMng.h internal/MeshMng.cc + internal/ParallelMngUtilsFactoryBase.h internal/ThreadBindingMng.h internal/ThreadBindingMng.cc internal/VariableMng.h diff --git a/arcane/src/arcane/parallel/mpi/MpiParallelMng.cc b/arcane/src/arcane/parallel/mpi/MpiParallelMng.cc index a4742b826e..520efe18ed 100644 --- a/arcane/src/arcane/parallel/mpi/MpiParallelMng.cc +++ b/arcane/src/arcane/parallel/mpi/MpiParallelMng.cc @@ -39,7 +39,7 @@ #include "arcane/impl/ParallelReplication.h" #include "arcane/impl/SequentialParallelMng.h" -#include "arcane/impl/ParallelMngUtilsFactoryBase.h" +#include "arcane/impl/internal/ParallelMngUtilsFactoryBase.h" #include "arcane/impl/internal/VariableSynchronizer.h" #include "arccore/message_passing_mpi/MpiMessagePassingMng.h" @@ -537,8 +537,7 @@ sendSerializer(ISerializer* s,Int32 rank) ISerializeMessage* MpiParallelMng:: createSendSerializer(Int32 rank) { - auto x = new SerializeMessage(m_comm_rank,rank,ISerializeMessage::MT_Send); - return x; + return m_utils_factory->createSendSerializeMessage(this, rank)._release(); } /*---------------------------------------------------------------------------*/ @@ -581,8 +580,7 @@ recvSerializer(ISerializer* values,Int32 rank) ISerializeMessage* MpiParallelMng:: createReceiveSerializer(Int32 rank) { - auto x = new SerializeMessage(m_comm_rank,rank,ISerializeMessage::MT_Recv); - return x; + return m_utils_factory->createReceiveSerializeMessage(this, rank)._release(); } /*---------------------------------------------------------------------------*/ diff --git a/arcane/src/arcane/parallel/mpithread/HybridParallelMng.cc b/arcane/src/arcane/parallel/mpithread/HybridParallelMng.cc index 47a6c43058..29c41b9631 100644 --- a/arcane/src/arcane/parallel/mpithread/HybridParallelMng.cc +++ b/arcane/src/arcane/parallel/mpithread/HybridParallelMng.cc @@ -36,7 +36,7 @@ #include "arcane/impl/TimerMng.h" #include "arcane/impl/ParallelReplication.h" #include "arcane/impl/SequentialParallelMng.h" -#include "arcane/impl/ParallelMngUtilsFactoryBase.h" +#include "arcane/impl/internal/ParallelMngUtilsFactoryBase.h" #include "arccore/message_passing/Messages.h" #include "arccore/message_passing/RequestListBase.h" @@ -346,7 +346,7 @@ sendSerializer(ISerializer* s,Int32 rank,ByteArray& bytes) -> Request ISerializeMessage* HybridParallelMng:: createSendSerializer(Int32 rank) { - return new SerializeMessage(m_global_rank,rank,ISerializeMessage::MT_Send); + return m_utils_factory->createSendSerializeMessage(this, rank)._release(); } /*---------------------------------------------------------------------------*/ @@ -399,7 +399,7 @@ recvSerializer(ISerializer* s,Int32 rank) ISerializeMessage* HybridParallelMng:: createReceiveSerializer(Int32 rank) { - return new SerializeMessage(m_global_rank,rank,ISerializeMessage::MT_Recv); + return m_utils_factory->createReceiveSerializeMessage(this, rank)._release(); } /*---------------------------------------------------------------------------*/ diff --git a/arcane/src/arcane/parallel/thread/SharedMemoryParallelMng.cc b/arcane/src/arcane/parallel/thread/SharedMemoryParallelMng.cc index 6500b16537..da6ebf0b82 100644 --- a/arcane/src/arcane/parallel/thread/SharedMemoryParallelMng.cc +++ b/arcane/src/arcane/parallel/thread/SharedMemoryParallelMng.cc @@ -35,7 +35,7 @@ #include "arcane/impl/TimerMng.h" #include "arcane/impl/ParallelReplication.h" -#include "arcane/impl/ParallelMngUtilsFactoryBase.h" +#include "arcane/impl/internal/ParallelMngUtilsFactoryBase.h" #include "arccore/message_passing/RequestListBase.h" #include "arccore/message_passing/SerializeMessageList.h" @@ -241,7 +241,7 @@ sendSerializer(ISerializer* values,Int32 rank,ByteArray& bytes) ISerializeMessage* SharedMemoryParallelMng:: createSendSerializer(Int32 rank) { - return new SerializeMessage(m_rank,rank,ISerializeMessage::MT_Send); + return m_utils_factory->createSendSerializeMessage(this, rank)._release(); } /*---------------------------------------------------------------------------*/ @@ -283,7 +283,7 @@ recvSerializer(ISerializer* values,Int32 rank) ISerializeMessage* SharedMemoryParallelMng:: createReceiveSerializer(Int32 rank) { - return new SerializeMessage(m_rank,rank,ISerializeMessage::MT_Recv); + return m_utils_factory->createReceiveSerializeMessage(this, rank)._release(); } /*---------------------------------------------------------------------------*/