Arcane  4.1.11.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
MachineShMemWinVariableBase.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 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/* MachineShMemWinVariableBase.cc (C) 2000-2026 */
9/* */
10/* Classes de bases permettant d'exploiter l'objet MachineShMemWinVariable */
11/* pointé de la zone mémoire des variables en mémoire partagée. */
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/core/internal/MachineShMemWinVariableBase.h"
15
16#include "arcane/utils/FatalErrorException.h"
17#include "arcane/utils/ITraceMng.h"
18#include "arcane/utils/ArrayShape.h"
19
20#include "arcane/core/ContigMachineShMemWin.h"
21#include "arcane/core/IMesh.h"
22#include "arcane/core/ISubDomain.h"
23#include "arcane/core/MeshHandle.h"
24#include "arcane/core/IData.h"
25#include "arcane/core/IParallelMng.h"
26#include "arcane/core/IVariable.h"
27
28#include "arcane/core/internal/MachineShMemWinMemoryAllocator.h"
29#include "arcane/core/internal/IDataInternal.h"
30#include "arcane/core/internal/IParallelMngInternal.h"
31
32#include "arccore/common/AllocatedMemoryInfo.h"
33#include "arccore/base/MemoryView.h"
34
35/*---------------------------------------------------------------------------*/
36/*---------------------------------------------------------------------------*/
37
38namespace Arcane
39{
40
41/*---------------------------------------------------------------------------*/
42/*---------------------------------------------------------------------------*/
43
46: m_var(var)
47{
48 if (!(m_var->property() & IVariable::PInShMem)) {
49 ARCANE_FATAL("The variable has not PInShMem property");
50 }
51 if (m_var->meshHandle().hasMesh()) {
52 m_pm = m_var->meshHandle().mesh()->parallelMng();
53 }
54 else {
55 m_pm = m_var->subDomain()->parallelMng();
56 }
57 m_machine_ranks = m_pm->_internalApi()->machineRanks();
58 m_sizeof_var.reserve(m_machine_ranks.size());
59}
60
61/*---------------------------------------------------------------------------*/
62/*---------------------------------------------------------------------------*/
63
65machineRanks() const
66{
67 return m_machine_ranks;
68}
69
70/*---------------------------------------------------------------------------*/
71/*---------------------------------------------------------------------------*/
72
74barrier() const
75{
76 return m_pm->_internalApi()->machineBarrier();
77}
78
79/*---------------------------------------------------------------------------*/
80/*---------------------------------------------------------------------------*/
81
83segmentView(Int32 rank) const
84{
85 const AllocatedMemoryInfo data(m_var->data()->_commonInternal()->numericData()->memoryView().data());
86#ifdef ARCANE_CHECK
87 if (data.baseAddress() == nullptr) {
88 ARCANE_FATAL("Variable not initialised yet. Call var.resize() method before.");
89 }
90#endif
91 return MachineShMemWinMemoryAllocator::segmentView(data, rank).subSpan(0, m_sizeof_var.at(rank));
92}
93
94/*---------------------------------------------------------------------------*/
95/*---------------------------------------------------------------------------*/
96
98updateVariable(Int64 nb_elem_dim1, Int64 sizeof_elem)
99{
100 ContigMachineShMemWin<Int64> all_size(m_pm, 1);
101
102 all_size.segmentView()[0] = nb_elem_dim1 * sizeof_elem;
103 all_size.barrier();
104
105 for (Int32 machine_rank = 0; const Int64 size : all_size.windowConstView()) {
106 m_sizeof_var[m_machine_ranks[machine_rank]] = size;
107 machine_rank++;
108 }
109}
110
111/*---------------------------------------------------------------------------*/
112/*---------------------------------------------------------------------------*/
113
114/*---------------------------------------------------------------------------*/
115/*---------------------------------------------------------------------------*/
116
120{
121 m_nb_elem_dim1.reserve(m_machine_ranks.size());
122 m_nb_elem_dim2.reserve(m_machine_ranks.size());
123}
124
125/*---------------------------------------------------------------------------*/
126/*---------------------------------------------------------------------------*/
127
129updateVariable(Int64 nb_elem_dim1, Int64 nb_elem_dim2, Int64 sizeof_elem)
130{
131 ContigMachineShMemWin<Int64> all_nb_elem(m_pm, 2);
132
133 all_nb_elem.segmentView()[0] = nb_elem_dim1;
134 all_nb_elem.segmentView()[1] = nb_elem_dim2;
135
136 all_nb_elem.barrier();
137
138 Int64 sizeof_elem2 = sizeof_elem * sizeof_elem;
139
140 for (Int32 machine_rank = 0; const Int32 world_rank : m_machine_ranks) {
141 const Int32 pos = machine_rank * 2;
142 const Int64 nb_elem_dim1_i = all_nb_elem.windowConstView()[pos];
143 const Int64 nb_elem_dim2_i = all_nb_elem.windowConstView()[pos + 1];
144
145 m_nb_elem_dim1[world_rank] = nb_elem_dim1_i;
146 m_nb_elem_dim2[world_rank] = nb_elem_dim2_i;
147 m_sizeof_var[world_rank] = nb_elem_dim1_i * nb_elem_dim2_i * sizeof_elem2;
148 machine_rank++;
149 }
150}
151
152/*---------------------------------------------------------------------------*/
153/*---------------------------------------------------------------------------*/
154
155/*---------------------------------------------------------------------------*/
156/*---------------------------------------------------------------------------*/
157
161{
162 m_nb_elem_dim1.reserve(m_machine_ranks.size());
163}
164
165/*---------------------------------------------------------------------------*/
166/*---------------------------------------------------------------------------*/
167
169updateVariable(Int64 nb_elem_dim1, Int32 nb_elem_dim2, Int64 sizeof_elem)
170{
171 ContigMachineShMemWin<Int64> all_nb_elem(m_pm, 1);
172
173 all_nb_elem.segmentView()[0] = nb_elem_dim1;
174
175 all_nb_elem.barrier();
176
177 Int64 mult = nb_elem_dim2 * sizeof_elem * sizeof_elem;
178
179 for (Int32 machine_rank = 0; const auto nb_elem : all_nb_elem.windowConstView()) {
180 const Int32 world_rank = m_machine_ranks[machine_rank];
181 m_nb_elem_dim1[world_rank] = nb_elem;
182 m_sizeof_var[world_rank] = nb_elem * mult;
183 machine_rank++;
184 }
185}
186
187/*---------------------------------------------------------------------------*/
188/*---------------------------------------------------------------------------*/
189
190ArrayShape MachineShMemWinVariableMDBase::
191arrayShape() const
192{
193 return m_var->data()->shape();
194}
195
196/*---------------------------------------------------------------------------*/
197/*---------------------------------------------------------------------------*/
198
199} // End namespace Arcane
200
201/*---------------------------------------------------------------------------*/
202/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Informations sur une zone mémoire allouée.
void * baseAddress() const
Adresse du début de la zone allouée.
Forme d'un tableau.
Definition ArrayShape.h:40
Vue constante d'un tableau de type T.
Classe permettant de créer une fenêtre mémoire partagée entre les sous-domaines d'un même noeud....
void barrier() const
Méthode permettant d'attendre que tous les processus/threads du noeud appellent cette méthode pour co...
Span< Type > segmentView()
Méthode permettant d'obtenir une vue sur notre segment de fenêtre mémoire.
Span< const Type > windowConstView() const
Méthode permettant d'obtenir une vue constante sur toute la fenêtre mémoire.
virtual ArrayShape shape() const =0
Forme du tableau pour une donnée 1D ou 2D.
Interface d'une variable.
Definition IVariable.h:39
@ PInShMem
Indique que la variable doit être alloué en mémoire partagée.
Definition IVariable.h:158
virtual IData * data()=0
Données associées à la variable.
MachineShMemWinVariable2DBase(IVariable *var)
Constructeur.
void updateVariable(Int64 nb_elem_dim1, Int64 nb_elem_dim2, Int64 sizeof_elem)
Span< std::byte > segmentView(Int32 rank) const
Méthode permettant d'obtenir une vue sur le segment d'un autre sous-domaine du noeud.
MachineShMemWinVariableBase(IVariable *var)
Constructeur.
void barrier() const
Méthode permettant d'attendre que tous les processus/threads du noeud appellent cette méthode pour co...
ConstArrayView< Int32 > machineRanks() const
Méthode permettant d'obtenir les rangs qui possèdent un segment dans la fenêtre.
void updateVariable(Int64 nb_elem_dim1, Int64 sizeof_elem)
void updateVariable(Int64 nb_elem_dim1, Int32 nb_elem_dim2, Int64 sizeof_elem)
MachineShMemWinVariableMDBase(IVariable *var)
Constructeur.
Vue d'un tableau d'éléments de type T.
Definition Span.h:633
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
std::int64_t Int64
Type entier signé sur 64 bits.
std::int32_t Int32
Type entier signé sur 32 bits.