Arcane  v3.16.8.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
MpiDynamicMultiMachineMemoryWindowBaseInternal.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* MpiDynamicMultiMachineMemoryWindowBaseInternal.h (C) 2000-2025 */
9/* */
10/* Classe permettant de créer des fenêtres mémoires pour un noeud de calcul. */
11/* Les segments de ces fenêtres ne sont pas contigües en mémoire et peuvent */
12/* être redimensionnées. Un processus peut posséder plusieurs segments. */
13/*---------------------------------------------------------------------------*/
14
15#ifndef ARCCORE_MESSAGEPASSINGMPI_INTERNAL_MPIDYNAMICMULTIMACHINEMEMORYWINDOWBASEINTERNAL_H
16#define ARCCORE_MESSAGEPASSINGMPI_INTERNAL_MPIDYNAMICMULTIMACHINEMEMORYWINDOWBASEINTERNAL_H
17
18/*---------------------------------------------------------------------------*/
19/*---------------------------------------------------------------------------*/
20
21#include "arccore/collections/Array.h"
22
23#include "arccore/message_passing_mpi/MessagePassingMpiGlobal.h"
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27
28namespace Arcane::MessagePassing::Mpi
29{
30
44class ARCCORE_MESSAGEPASSINGMPI_EXPORT MpiDynamicMultiMachineMemoryWindowBaseInternal
45{
46
47 public:
48
49 explicit MpiDynamicMultiMachineMemoryWindowBaseInternal(SmallSpan<Int64> sizeof_segments, Int32 nb_segments_per_proc, Int32 sizeof_type, const MPI_Comm& comm_machine, Int32 comm_machine_rank, Int32 comm_machine_size, ConstArrayView<Int32> machine_ranks);
50
52
53 public:
54
62 Int32 sizeofOneElem() const;
63
73
78 void barrier() const;
79
89
100 Span<std::byte> segmentView(Int32 rank, Int32 num_seg);
101
111
123
140 void requestAdd(Int32 num_seg, Span<const std::byte> elem);
141
147 void executeAdd();
148
170 void requestAddToAnotherSegment(Int32 thread, Int32 rank, Int32 num_seg, Span<const std::byte> elem);
171
179
208 void requestReserve(Int32 num_seg, Int64 new_capacity);
209
215 void executeReserve();
216
239 void requestResize(Int32 num_seg, Int64 new_size);
240
246 void executeResize();
247
254 void executeShrink();
255
256 private:
257
258 void _requestRealloc(Int32 owner_pos_segment, Int64 new_capacity) const;
259 void _requestRealloc(Int32 owner_pos_segment) const;
260 void _executeRealloc();
261 void _realloc();
262
263 Int32 _worldToMachine(Int32 world) const;
264 Int32 _machineToWorld(Int32 machine) const;
265
266 private:
267
268 UniqueArray<MPI_Win> m_all_mpi_win;
269 // Tableau avec les vues sur les segments. La taille des vues correspond à tout
270 // l'espace mémoire réservé.
271 UniqueArray<Span<std::byte>> m_reserved_part_span;
272
273 MPI_Win m_win_need_resize;
274 Span<Int64> m_need_resize;
275
276 MPI_Win m_win_actual_sizeof;
277 Span<Int64> m_sizeof_used_part;
278
279 MPI_Win m_win_target_segments;
280 Span<Int32> m_target_segments;
281
282 MPI_Comm m_comm_machine;
283 Int32 m_comm_machine_size = 0;
284 Int32 m_comm_machine_rank = 0;
285
286 Int32 m_sizeof_type = 0;
287 Int32 m_nb_segments_per_proc = 0;
288
289 ConstArrayView<Int32> m_machine_ranks;
290
291 UniqueArray<Span<const std::byte>> m_add_requests;
292 bool m_add_requested = false;
293
294 UniqueArray<Int64> m_resize_requests;
295 bool m_resize_requested = false;
296};
297
298/*---------------------------------------------------------------------------*/
299/*---------------------------------------------------------------------------*/
300
301} // namespace Arcane::MessagePassing::Mpi
302
303/*---------------------------------------------------------------------------*/
304/*---------------------------------------------------------------------------*/
305
306#endif
Vue constante d'un tableau de type T.
void executeResize()
Méthode permettant d'exécuter les requêtes de redimensionnement.
Span< const std::byte > segmentConstView(Int32 num_seg) const
Méthode permettant d'obtenir une vue sur l'un de nos segments.
Int32 sizeofOneElem() const
Méthode permettant d'obtenir la taille d'un élement de la fenêtre.
void requestReserve(Int32 num_seg, Int64 new_capacity)
Méthode permettant de demander la réservation d'espace mémoire pour un de nos segments.
ConstArrayView< Int32 > machineRanks() const
Méthode permettant d'obtenir les rangs qui possèdent un segment dans la fenêtre.
void requestResize(Int32 num_seg, Int64 new_size)
Méthode permettant de demander le redimensionnement d'un de nos segments.
void requestAdd(Int32 num_seg, Span< const std::byte > elem)
Méthode permettant de demander l'ajout d'éléments dans l'un de nos segments.
void executeShrink()
Méthode permettant de réduire l'espace mémoire réservé pour les segments au minimum nécessaire.
void executeAddToAnotherSegment()
Méthode permettant d'exécuter les requêtes d'ajout dans les segments d'autres processus.
void requestAddToAnotherSegment(Int32 thread, Int32 rank, Int32 num_seg, Span< const std::byte > elem)
Méthode permettant de demander l'ajout d'éléments dans un des segments de la fenêtre.
MpiDynamicMultiMachineMemoryWindowBaseInternal(SmallSpan< Int64 > sizeof_segments, Int32 nb_segments_per_proc, Int32 sizeof_type, const MPI_Comm &comm_machine, Int32 comm_machine_rank, Int32 comm_machine_size, ConstArrayView< Int32 > machine_ranks)
Le sizeof_segments ne doit pas être conservé !
Span< std::byte > segmentView(Int32 num_seg)
Méthode permettant d'obtenir une vue sur l'un de nos segments.
void barrier() const
Méthode permettant d'attendre que tous les processus du noeud appellent cette méthode pour continuer ...
Vue d'un tableau d'éléments de type T.
Definition Span.h:673
Vue d'un tableau d'éléments de type T.
Definition Span.h:513
Vecteur 1D de données avec sémantique par valeur (style STL).
std::int64_t Int64
Type entier signé sur 64 bits.
std::int32_t Int32
Type entier signé sur 32 bits.