Arcane  v3.16.0.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
DataSynchronizeBuffer.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2023 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/* DataSynchronizeBuffer.h (C) 2000-2023 */
9/* */
10/* Implémentation d'un buffer générique pour la synchronisation de donnéess. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13#ifndef ARCANE_IMPL_DATASYNCHRONIZEBUFFER_H
14#define ARCANE_IMPL_DATASYNCHRONIZEBUFFER_H
15/*---------------------------------------------------------------------------*/
16/*---------------------------------------------------------------------------*/
17
18#include "arcane/utils/MemoryView.h"
19#include "arcane/utils/Array.h"
20#include "arcane/utils/SmallArray.h"
21#include "arcane/utils/TraceAccessor.h"
22
23#include "arcane/impl/IDataSynchronizeBuffer.h"
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27namespace Arcane
28{
29class IBufferCopier;
33class MemoryBuffer;
34
35/*---------------------------------------------------------------------------*/
36/*---------------------------------------------------------------------------*/
41class ARCANE_IMPL_EXPORT DataSynchronizeBufferBase
43{
45 {
46 friend DataSynchronizeBufferBase;
47
48 public:
49
51 MutableMemoryView globalBuffer() { return m_memory_view; }
52
54 MutableMemoryView localBuffer(Int32 index);
55
57 Int64 displacement(Int32 index) const;
58
60 Int64 totalSize() const { return m_memory_view.bytes().size(); }
61
63 ConstArrayView<Int32> localIds(Int32 index) const;
64
65 void checkValid() const
66 {
67 ARCANE_CHECK_POINTER(m_buffer_info);
68 }
69
70 private:
71
72 MutableMemoryView m_memory_view;
73 Int32 m_datatype_size = 0;
74 const DataSynchronizeBufferInfoList* m_buffer_info = nullptr;
75 };
76
77 public:
78
79 Int32 nbRank() const final { return m_nb_rank; }
80 Int32 targetRank(Int32 index) const final;
81 bool hasGlobalBuffer() const final { return true; }
82
83 MutableMemoryView receiveBuffer(Int32 index) final { return m_ghost_buffer_info.localBuffer(index); }
84 MutableMemoryView sendBuffer(Int32 index) final { return m_share_buffer_info.localBuffer(index); }
85
86 Int64 receiveDisplacement(Int32 index) const final { return m_ghost_buffer_info.displacement(index); }
87 Int64 sendDisplacement(Int32 index) const final { return m_share_buffer_info.displacement(index); }
88
89 MutableMemoryView globalReceiveBuffer() final { return m_ghost_buffer_info.globalBuffer(); }
90 MutableMemoryView globalSendBuffer() final { return m_share_buffer_info.globalBuffer(); }
91
92 Int64 totalReceiveSize() const final { return m_ghost_buffer_info.totalSize(); }
93 Int64 totalSendSize() const final { return m_share_buffer_info.totalSize(); }
94
95 void barrier() final;
96
97 public:
98
100
101 public:
102
104 bool isCompareSynchronizedValues() const { return m_is_compare_sync_values; }
105
106 void setSynchronizeBuffer(Ref<MemoryBuffer> v)
107 {
108 m_memory = v;
109 }
110
122 virtual void prepareSynchronize(Int32 datatype_size, bool is_compare_sync) = 0;
123
124 protected:
125
126 void _allocateBuffers(Int32 datatype_size);
128 void _compute(Int32 datatype_size);
129
130 protected:
131
132 DataSynchronizeInfo* m_sync_info = nullptr;
139
140 protected:
141
142 Int32 m_nb_rank = 0;
143 bool m_is_compare_sync_values = false;
144
147
148 Ref<IBufferCopier> m_buffer_copier;
149};
150
151/*---------------------------------------------------------------------------*/
152/*---------------------------------------------------------------------------*/
156class ARCANE_IMPL_EXPORT SingleDataSynchronizeBuffer
157: public DataSynchronizeBufferBase
158{
159 public:
160
161 SingleDataSynchronizeBuffer(DataSynchronizeInfo* sync_info, Ref<IBufferCopier> copier)
162 : DataSynchronizeBufferBase(sync_info, copier)
163 {}
164
165 public:
166
167 void copyReceiveAsync(Int32 index) final;
168 void copySendAsync(Int32 index) final;
169
170 public:
171
172 void setDataView(MutableMemoryView v) { m_data_view = v; }
174 MutableMemoryView dataView() { return m_data_view; }
175 void prepareSynchronize(Int32 datatype_size, bool is_compare_sync) override;
176
180 DataSynchronizeResult finalizeSynchronize();
181
182 private:
183
185 MutableMemoryView m_data_view;
186};
187
188/*---------------------------------------------------------------------------*/
189/*---------------------------------------------------------------------------*/
193class ARCANE_IMPL_EXPORT MultiDataSynchronizeBuffer
194: public TraceAccessor
195, public DataSynchronizeBufferBase
196{
197
198 public:
199
200 MultiDataSynchronizeBuffer(ITraceMng* tm, DataSynchronizeInfo* sync_info,
201 Ref<IBufferCopier> copier)
202 : TraceAccessor(tm)
203 , DataSynchronizeBufferBase(sync_info, copier)
204 {}
205
206 public:
207
208 void copyReceiveAsync(Int32 index) final;
209 void copySendAsync(Int32 index) final;
210
211 public:
212
213 void setNbData(Int32 nb_data)
214 {
215 m_data_views.resize(nb_data);
216 }
217 void setDataView(Int32 index, MutableMemoryView v) { m_data_views[index] = v; }
218
219 void prepareSynchronize(Int32 datatype_size, bool is_compare_sync) override;
220
221 private:
222
225};
226
227/*---------------------------------------------------------------------------*/
228/*---------------------------------------------------------------------------*/
229
230} // namespace Arcane
231
232/*---------------------------------------------------------------------------*/
233/*---------------------------------------------------------------------------*/
234
235#endif
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
Vue constante d'un tableau de type T.
Int64 totalSize() const
Taille totale en octet du buffer global.
MutableMemoryView globalBuffer()
Buffer global.
Classe de base de l'implémentation de IDataSynchronizeBuffer.
Int64 receiveDisplacement(Int32 index) const final
Déplacement (en octets) depuis le début de receiveBuffer() pour le index-ème rang.
virtual void prepareSynchronize(Int32 datatype_size, bool is_compare_sync)=0
Prépare la synchronisation.
bool isCompareSynchronizedValues() const
Indique si on compare les valeurs avant/après la synchronisation.
void _compute(Int32 datatype_size)
Calcule les informations pour la synchronisation.
BufferInfo m_compare_sync_buffer_info
Buffer pour tester si la synchronisation a modifié les valeurs des mailles fantômes.
Int32 nbRank() const final
Nombre de rangs.
void _allocateBuffers(Int32 datatype_size)
Calcul et alloue les tampons nécessaires aux envois et réceptions pour les synchronisations des varia...
Int64 sendDisplacement(Int32 index) const final
Déplacement (en octets) depuis le début de sendBuffer() pour le index-ème rang.
BufferInfo m_share_buffer_info
Buffer pour toutes les données des entités partagées qui serviront en envoi.
MutableMemoryView globalReceiveBuffer() final
Buffer de réception.
Int64 totalSendSize() const final
Taille totale à envoyer en octet.
MutableMemoryView globalSendBuffer() final
Buffer d'envoi.
MutableMemoryView receiveBuffer(Int32 index) final
Buffer de réception pour le index-ème rang.
Int64 totalReceiveSize() const final
Taille totale à recevoir en octet.
BufferInfo m_ghost_buffer_info
Buffer pour toutes les données des entités fantômes qui serviront en réception.
Ref< MemoryBuffer > m_memory
Buffer contenant les données concaténées en envoi et réception.
MutableMemoryView sendBuffer(Int32 index) final
Buffer d'envoi pour le index-ème rang.
bool hasGlobalBuffer() const final
Indique si les buffers sont globaux.
Informations pour les message d'envoi (share) ou de réception (ghost)
Informations nécessaires pour synchroniser les entités sur un groupe.
Informations sur le résultat d'une synchronisation.
Interface pour copier des éléments entre deux zones avec indexation.
Buffer générique pour la synchronisation de données.
Interface du gestionnaire de traces.
Gestion d'un buffer mémoire.
void prepareSynchronize(Int32 datatype_size, bool is_compare_sync) override
Prépare la synchronisation.
void copyReceiveAsync(Int32 index) final
Recopie dans les données depuis le buffer de réception du index-ème rang.
SmallArray< MutableMemoryView > m_data_views
Vue sur les données de la variable.
void copySendAsync(Int32 index) final
Recopie dans le buffer d'envoi les données du index-ème rang.
Référence à une instance.
MutableMemoryView m_data_view
Vue sur les données de la variable.
void copyReceiveAsync(Int32 index) final
Recopie dans les données depuis le buffer de réception du index-ème rang.
void copySendAsync(Int32 index) final
Recopie dans le buffer d'envoi les données du index-ème rang.
MutableMemoryView dataView()
Zone mémoire contenant les valeurs de la donnée à synchroniser.
Tableau 1D de données avec buffer pré-alloué sur la pile.
Definition SmallArray.h:89
TraceAccessor(ITraceMng *m)
Construit un accesseur via le gestionnaire de trace m.
-*- 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.