Arcane  v3.16.8.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
SharedMemoryMachineMemoryWindowBaseInternalCreator.cc
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/* SharedMemoryMachineMemoryWindowBaseInternalCreator.cc (C) 2000-2025 */
9/* */
10/* Classe permettant de créer des objets de type */
11/* SharedMemoryMachineMemoryWindowBaseInternal. Une instance de cet objet */
12/* doit être partagée par tous les threads. */
13/*---------------------------------------------------------------------------*/
14
15#include "arcane/parallel/thread/internal/SharedMemoryMachineMemoryWindowBaseInternalCreator.h"
16
17#include "arcane/parallel/thread/internal/SharedMemoryMachineMemoryWindowBaseInternal.h"
18#include "arcane/parallel/thread/internal/SharedMemoryDynamicMachineMemoryWindowBaseInternal.h"
19#include "arccore/concurrency/IThreadBarrier.h"
20
21/*---------------------------------------------------------------------------*/
22/*---------------------------------------------------------------------------*/
23
25{
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30SharedMemoryMachineMemoryWindowBaseInternalCreator::
31SharedMemoryMachineMemoryWindowBaseInternalCreator(Int32 nb_rank, IThreadBarrier* barrier)
32: m_nb_rank(nb_rank)
33, m_barrier(barrier)
34{
35 m_ranks.resize(m_nb_rank);
36 for (Int32 i = 0; i < m_nb_rank; ++i) {
37 m_ranks[i] = i;
38 }
39}
40
41/*---------------------------------------------------------------------------*/
42/*---------------------------------------------------------------------------*/
43
44SharedMemoryMachineMemoryWindowBaseInternal* SharedMemoryMachineMemoryWindowBaseInternalCreator::
45createWindow(Int32 my_rank, Int64 sizeof_segment, Int32 sizeof_type)
46{
47 if (my_rank == 0) {
48 m_sizeof_segments = makeRef(new UniqueArray<Int64>(m_nb_rank));
49 m_sum_sizeof_segments = makeRef(new UniqueArray<Int64>(m_nb_rank));
50 }
51 m_barrier->wait();
52
53 (*m_sizeof_segments.get())[my_rank] = sizeof_segment;
54 m_barrier->wait();
55
56 if (my_rank == 0) {
57 m_sizeof_window = 0;
58 for (Int32 i = 0; i < m_nb_rank; ++i) {
59 (*m_sum_sizeof_segments.get())[i] = m_sizeof_window;
60 m_sizeof_window += (*m_sizeof_segments.get())[i];
61 }
62 m_window = makeRef(new UniqueArray<std::byte>(m_sizeof_window));
63 }
64 m_barrier->wait();
65
66 auto* window_obj = new SharedMemoryMachineMemoryWindowBaseInternal(my_rank, m_nb_rank, m_ranks, sizeof_type, m_window, m_sizeof_segments, m_sum_sizeof_segments, m_sizeof_window, m_barrier);
67 m_barrier->wait();
68
69 // Ces tableaux doivent être delete par SharedMemoryMachineMemoryWindowBaseInternal.
70 if (my_rank == 0) {
71 m_sizeof_segments.reset();
72 m_sum_sizeof_segments.reset();
73 m_window.reset();
74 m_sizeof_window = 0;
75 }
76
77 return window_obj;
78}
79
80/*---------------------------------------------------------------------------*/
81/*---------------------------------------------------------------------------*/
82
83SharedMemoryDynamicMachineMemoryWindowBaseInternal* SharedMemoryMachineMemoryWindowBaseInternalCreator::
84createDynamicWindow(Int32 my_rank, Int64 sizeof_segment, Int32 sizeof_type)
85{
86 if (my_rank == 0) {
87 m_windows = makeRef(new UniqueArray<UniqueArray<std::byte>>(m_nb_rank));
88 m_target_segments = makeRef(new UniqueArray<Int32>(m_nb_rank));
89 }
90 m_barrier->wait();
91
92 (*m_windows.get())[my_rank].resize(sizeof_segment);
93 (*m_target_segments.get())[my_rank] = -1;
94
95 auto* window_obj = new SharedMemoryDynamicMachineMemoryWindowBaseInternal(my_rank, m_ranks, sizeof_type, m_windows, m_target_segments, m_barrier);
96 m_barrier->wait();
97
98 // Ces tableaux doivent être delete par SharedMemoryDynamicMachineMemoryWindowBaseInternal.
99 if (my_rank == 0) {
100 m_windows.reset();
101 m_target_segments.reset();
102 }
103
104 return window_obj;
105}
106
107/*---------------------------------------------------------------------------*/
108/*---------------------------------------------------------------------------*/
109
110} // namespace Arcane::MessagePassing
111
112/*---------------------------------------------------------------------------*/
113/*---------------------------------------------------------------------------*/
Déclarations des types et méthodes utilisés par les mécanismes d'échange de messages.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
std::int32_t Int32
Type entier signé sur 32 bits.