Arcane  v3.15.0.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
DataSynchronizeBuffer.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 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.cc (C) 2000-2024 */
9/* */
10/* Implémentation d'un buffer générique pour la synchronisation de donnéess. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/impl/internal/DataSynchronizeBuffer.h"
15
16#include "arcane/utils/FatalErrorException.h"
17#include "arcane/utils/internal/MemoryBuffer.h"
18
19#include "arcane/impl/DataSynchronizeInfo.h"
20#include "arcane/impl/internal/IBufferCopier.h"
21
22#include "arcane/accelerator/core/Runner.h"
23
24/*---------------------------------------------------------------------------*/
25/*---------------------------------------------------------------------------*/
26
27namespace Arcane
28{
29
30/*---------------------------------------------------------------------------*/
31/*---------------------------------------------------------------------------*/
32
35{
36 Int32 nb_rank = nbRank();
37 for (Int32 i = 0; i < nb_rank; ++i)
39 barrier();
40}
41
42/*---------------------------------------------------------------------------*/
43/*---------------------------------------------------------------------------*/
44
47{
48 Int32 nb_rank = nbRank();
49 for (Int32 i = 0; i < nb_rank; ++i)
51 barrier();
52}
53
54/*---------------------------------------------------------------------------*/
55/*---------------------------------------------------------------------------*/
56
57/*---------------------------------------------------------------------------*/
58/*---------------------------------------------------------------------------*/
59
61barrier()
62{
63 m_queue.barrier();
64}
65
66/*---------------------------------------------------------------------------*/
67/*---------------------------------------------------------------------------*/
68
70displacement(Int32 index) const
71{
72 return m_buffer_info->bufferDisplacement(index) * m_datatype_size;
73}
74
75/*---------------------------------------------------------------------------*/
76/*---------------------------------------------------------------------------*/
77
79localBuffer(Int32 index)
80{
81 Int64 displacement = m_buffer_info->bufferDisplacement(index);
82 Int32 local_size = m_buffer_info->nbItem(index);
83 return m_memory_view.subView(displacement, local_size);
84}
85
86/*---------------------------------------------------------------------------*/
87/*---------------------------------------------------------------------------*/
88
90localIds(Int32 index) const
91{
92 return m_buffer_info->localIds(index);
93}
94
95/*---------------------------------------------------------------------------*/
96/*---------------------------------------------------------------------------*/
97
98/*---------------------------------------------------------------------------*/
99/*---------------------------------------------------------------------------*/
100
101DataSynchronizeBufferBase::
102DataSynchronizeBufferBase(DataSynchronizeInfo* sync_info, Ref<IBufferCopier> copier)
103: m_sync_info(sync_info)
104, m_buffer_copier(copier)
105{
106}
107
108/*---------------------------------------------------------------------------*/
109/*---------------------------------------------------------------------------*/
110
112targetRank(Int32 index) const
113{
114 return m_sync_info->targetRank(index);
115}
116
117/*---------------------------------------------------------------------------*/
118/*---------------------------------------------------------------------------*/
119
121barrier()
122{
123 m_buffer_copier->barrier();
124}
125
126/*---------------------------------------------------------------------------*/
127/*---------------------------------------------------------------------------*/
134{
135 m_nb_rank = m_sync_info->size();
136
137 m_ghost_buffer_info.m_datatype_size = datatype_size;
138 m_ghost_buffer_info.m_buffer_info = &m_sync_info->receiveInfo();
139 m_share_buffer_info.m_datatype_size = datatype_size;
140 m_share_buffer_info.m_buffer_info = &m_sync_info->sendInfo();
142 m_compare_sync_buffer_info.m_buffer_info = &m_sync_info->receiveInfo();
143
145}
146
147/*---------------------------------------------------------------------------*/
148/*---------------------------------------------------------------------------*/
158{
159 Int64 total_ghost_buffer = m_sync_info->receiveInfo().totalNbItem();
160 Int64 total_share_buffer = m_sync_info->sendInfo().totalNbItem();
161
164 if (m_is_compare_sync_values)
167
170
172 auto s1 = buffer_span.subspan(0, share_offset);
173 m_ghost_buffer_info.m_memory_view = makeMutableMemoryView(s1.data(), full_dim2_size, total_ghost_buffer);
175 m_share_buffer_info.m_memory_view = makeMutableMemoryView(s2.data(), full_dim2_size, total_share_buffer);
176 if (m_is_compare_sync_values) {
178 m_compare_sync_buffer_info.m_memory_view = makeMutableMemoryView(s3.data(), full_dim2_size, total_ghost_buffer);
179 }
180}
181
182/*---------------------------------------------------------------------------*/
183/*---------------------------------------------------------------------------*/
184
185/*---------------------------------------------------------------------------*/
186/*---------------------------------------------------------------------------*/
187
189copyReceiveAsync(Int32 index)
190{
191 m_ghost_buffer_info.checkValid();
192
193 MutableMemoryView var_values = dataView();
195 ConstMemoryView local_buffer = m_ghost_buffer_info.localBuffer(index);
196
197 m_buffer_copier->copyFromBufferAsync(indexes, local_buffer, var_values);
198}
199
200/*---------------------------------------------------------------------------*/
201/*---------------------------------------------------------------------------*/
202
204copySendAsync(Int32 index)
205{
206 m_share_buffer_info.checkValid();
207
208 ConstMemoryView var_values = dataView();
211 m_buffer_copier->copyToBufferAsync(indexes, local_buffer, var_values);
212}
213
214/*---------------------------------------------------------------------------*/
215/*---------------------------------------------------------------------------*/
216
219{
220 m_is_compare_sync_values = is_compare_sync;
222 if (!is_compare_sync)
223 return;
224 // Recopie dans le buffer de vérification les valeurs actuelles des mailles
225 // fantômes.
226 MutableMemoryView var_values = dataView();
227 Int32 nb_rank = nbRank();
228 for (Int32 i = 0; i < nb_rank; ++i) {
231 m_buffer_copier->copyToBufferAsync(indexes, local_buffer, var_values);
232 }
233 // Normalement pas besoin de faire une barrière car ensuite il y aura les
234 // envois sur la même \a queue et ensuite une barrière.
235}
236
237/*---------------------------------------------------------------------------*/
238/*---------------------------------------------------------------------------*/
249{
250 if (!m_is_compare_sync_values)
251 return {};
256 Int64 reference_size = reference_bytes.size();
257 Int64 receive_size = receive_bytes.size();
259 ARCANE_FATAL("Incoherent buffer size ref={0} receive={1}", reference_size, receive_size);
260 // TODO: gérer le cas où la mémoire est sur le device
261
263 bool is_same = std::memcmp(reference_bytes.data(), receive_bytes.data(), reference_size) == 0;
265 return result;
266}
267
268/*---------------------------------------------------------------------------*/
269/*---------------------------------------------------------------------------*/
270
271/*---------------------------------------------------------------------------*/
272/*---------------------------------------------------------------------------*/
273
279
280/*---------------------------------------------------------------------------*/
281/*---------------------------------------------------------------------------*/
282
284copyReceiveAsync(Int32 index)
285{
286 IBufferCopier* copier = m_buffer_copier.get();
287 m_ghost_buffer_info.checkValid();
288
289 Int64 data_offset = 0;
292 const Int64 nb_element = indexes.size();
293 for (MutableMemoryView var_values : m_data_views) {
294 Int32 datatype_size = var_values.datatypeSize();
297 ConstMemoryView local_buffer = makeConstMemoryView(sub_local_buffer_bytes.data(), datatype_size, nb_element);
298 if (current_size_in_bytes != 0)
299 copier->copyFromBufferAsync(indexes, local_buffer, var_values);
301 }
302}
303
304/*---------------------------------------------------------------------------*/
305/*---------------------------------------------------------------------------*/
306
308copySendAsync(Int32 index)
309{
310 IBufferCopier* copier = m_buffer_copier.get();
311 m_ghost_buffer_info.checkValid();
312
313 Int64 data_offset = 0;
316 const Int64 nb_element = indexes.size();
317 for (ConstMemoryView var_values : m_data_views) {
318 Int32 datatype_size = var_values.datatypeSize();
322 if (current_size_in_bytes != 0)
323 copier->copyToBufferAsync(indexes, local_buffer, var_values);
325 }
326}
327
328/*---------------------------------------------------------------------------*/
329/*---------------------------------------------------------------------------*/
330
331} // namespace Arcane
332
333/*---------------------------------------------------------------------------*/
334/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
void barrier() const
Bloque tant que toutes les commandes associées à la file ne sont pas terminées.
Definition RunQueue.cc:159
ConstArrayView< Int32 > localIds(Int32 index) const
Numéros locaux des entités pour le rang index.
MutableMemoryView globalBuffer()
Buffer global.
Int64 displacement(Int32 index) const
Déplacement dans globalBuffer() pour le index-ème rang.
MutableMemoryView localBuffer(Int32 index)
Buffer pour le index-ème rang.
void barrier() final
Attend que les copies (copySendAsync() et copyReceiveAsync()) soient terminées.
Int32 targetRank(Int32 index) const final
Rang cible du index-ème rang.
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...
BufferInfo m_share_buffer_info
Buffer pour toutes les données des entités partagées qui serviront en envoi.
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.
Int64 totalNbItem() const
Nombre total d'éléments.
Int64 bufferDisplacement(Int32 index) const
Déplacement dans le buffer du rang index.
Informations nécessaires pour synchroniser les entités sur un groupe.
Int32 targetRank(Int32 index) const
Rang de la index-ème cible.
const DataSynchronizeBufferInfoList & receiveInfo() const
Informations de réception (fantômes)
const DataSynchronizeBufferInfoList & sendInfo() const
Informations d'envoi (partagées)
Informations sur le résultat d'une synchronisation.
void barrier() override
Bloque tant que les copies ne sont pas terminées.
Interface pour copier des éléments entre deux zones avec indexation.
virtual void barrier()=0
Attend que les copies (copySendAsync() et copyReceiveAsync()) soient terminées.
virtual void copyAllSend()
Recopie dans le buffer d'envoi toute les données.
virtual void copyAllReceive()
Recopie toutes les données depuis le buffer de réception.
virtual void copyReceiveAsync(Int32 index)=0
Recopie dans les données depuis le buffer de réception du index-ème rang.
virtual void copySendAsync(Int32 index)=0
Recopie dans le buffer d'envoi les données du index-ème rang.
virtual Int32 nbRank() const =0
Nombre de rangs.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:149
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.
void copySendAsync(Int32 index) final
Recopie dans le buffer d'envoi les données du index-ème rang.
DataSynchronizeResult finalizeSynchronize()
Termine la synchronisation.
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.
void prepareSynchronize(Int32 datatype_size, bool is_compare_sync) override
Prépare la synchronisation.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
@ Different
Valeurs différentes avant et après la synchronisation.
@ Same
Même valeurs avant et après la synchronisation.