Arcane  v3.14.10.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-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.cc (C) 2000-2023 */
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 if (m_queue)
64 m_queue->barrier();
65}
66
67/*---------------------------------------------------------------------------*/
68/*---------------------------------------------------------------------------*/
69
71displacement(Int32 index) const
72{
73 return m_buffer_info->bufferDisplacement(index) * m_datatype_size;
74}
75
76/*---------------------------------------------------------------------------*/
77/*---------------------------------------------------------------------------*/
78
80localBuffer(Int32 index)
81{
82 Int64 displacement = m_buffer_info->bufferDisplacement(index);
83 Int32 local_size = m_buffer_info->nbItem(index);
84 return m_memory_view.subView(displacement, local_size);
85}
86
87/*---------------------------------------------------------------------------*/
88/*---------------------------------------------------------------------------*/
89
91localIds(Int32 index) const
92{
93 return m_buffer_info->localIds(index);
94}
95
96/*---------------------------------------------------------------------------*/
97/*---------------------------------------------------------------------------*/
98
99/*---------------------------------------------------------------------------*/
100/*---------------------------------------------------------------------------*/
101
102DataSynchronizeBufferBase::
103DataSynchronizeBufferBase(DataSynchronizeInfo* sync_info, Ref<IBufferCopier> copier)
104: m_sync_info(sync_info)
105, m_buffer_copier(copier)
106{
107}
108
109/*---------------------------------------------------------------------------*/
110/*---------------------------------------------------------------------------*/
111
113targetRank(Int32 index) const
114{
115 return m_sync_info->targetRank(index);
116}
117
118/*---------------------------------------------------------------------------*/
119/*---------------------------------------------------------------------------*/
120
122barrier()
123{
124 m_buffer_copier->barrier();
125}
126
127/*---------------------------------------------------------------------------*/
128/*---------------------------------------------------------------------------*/
135{
136 m_nb_rank = m_sync_info->size();
137
138 m_ghost_buffer_info.m_datatype_size = datatype_size;
139 m_ghost_buffer_info.m_buffer_info = &m_sync_info->receiveInfo();
140 m_share_buffer_info.m_datatype_size = datatype_size;
141 m_share_buffer_info.m_buffer_info = &m_sync_info->sendInfo();
143 m_compare_sync_buffer_info.m_buffer_info = &m_sync_info->receiveInfo();
144
146}
147
148/*---------------------------------------------------------------------------*/
149/*---------------------------------------------------------------------------*/
159{
160 Int64 total_ghost_buffer = m_sync_info->receiveInfo().totalNbItem();
161 Int64 total_share_buffer = m_sync_info->sendInfo().totalNbItem();
162
165 if (m_is_compare_sync_values)
168
171
173 auto s1 = buffer_span.subspan(0, share_offset);
174 m_ghost_buffer_info.m_memory_view = makeMutableMemoryView(s1.data(), full_dim2_size, total_ghost_buffer);
176 m_share_buffer_info.m_memory_view = makeMutableMemoryView(s2.data(), full_dim2_size, total_share_buffer);
177 if (m_is_compare_sync_values) {
179 m_compare_sync_buffer_info.m_memory_view = makeMutableMemoryView(s3.data(), full_dim2_size, total_ghost_buffer);
180 }
181}
182
183/*---------------------------------------------------------------------------*/
184/*---------------------------------------------------------------------------*/
185
186/*---------------------------------------------------------------------------*/
187/*---------------------------------------------------------------------------*/
188
190copyReceiveAsync(Int32 index)
191{
192 m_ghost_buffer_info.checkValid();
193
194 MutableMemoryView var_values = dataView();
196 ConstMemoryView local_buffer = m_ghost_buffer_info.localBuffer(index);
197
198 m_buffer_copier->copyFromBufferAsync(indexes, local_buffer, var_values);
199}
200
201/*---------------------------------------------------------------------------*/
202/*---------------------------------------------------------------------------*/
203
205copySendAsync(Int32 index)
206{
207 m_share_buffer_info.checkValid();
208
209 ConstMemoryView var_values = dataView();
212 m_buffer_copier->copyToBufferAsync(indexes, local_buffer, var_values);
213}
214
215/*---------------------------------------------------------------------------*/
216/*---------------------------------------------------------------------------*/
217
220{
221 m_is_compare_sync_values = is_compare_sync;
223 if (!is_compare_sync)
224 return;
225 // Recopie dans le buffer de vérification les valeurs actuelles des mailles
226 // fantômes.
227 MutableMemoryView var_values = dataView();
228 Int32 nb_rank = nbRank();
229 for (Int32 i = 0; i < nb_rank; ++i) {
232 m_buffer_copier->copyToBufferAsync(indexes, local_buffer, var_values);
233 }
234 // Normalement pas besoin de faire une barrière car ensuite il y aura les
235 // envois sur la même \a queue et ensuite une barrière.
236}
237
238/*---------------------------------------------------------------------------*/
239/*---------------------------------------------------------------------------*/
250{
251 if (!m_is_compare_sync_values)
252 return {};
257 Int64 reference_size = reference_bytes.size();
258 Int64 receive_size = receive_bytes.size();
260 ARCANE_FATAL("Incoherent buffer size ref={0} receive={1}", reference_size, receive_size);
261 // TODO: gérer le cas où la mémoire est sur le device
262
264 bool is_same = std::memcmp(reference_bytes.data(), receive_bytes.data(), reference_size) == 0;
266 return result;
267}
268
269/*---------------------------------------------------------------------------*/
270/*---------------------------------------------------------------------------*/
271
272/*---------------------------------------------------------------------------*/
273/*---------------------------------------------------------------------------*/
274
280
281/*---------------------------------------------------------------------------*/
282/*---------------------------------------------------------------------------*/
283
285copyReceiveAsync(Int32 index)
286{
287 IBufferCopier* copier = m_buffer_copier.get();
288 m_ghost_buffer_info.checkValid();
289
290 Int64 data_offset = 0;
293 const Int64 nb_element = indexes.size();
294 for (MutableMemoryView var_values : m_data_views) {
295 Int32 datatype_size = var_values.datatypeSize();
298 ConstMemoryView local_buffer = makeConstMemoryView(sub_local_buffer_bytes.data(), datatype_size, nb_element);
299 if (current_size_in_bytes != 0)
300 copier->copyFromBufferAsync(indexes, local_buffer, var_values);
302 }
303}
304
305/*---------------------------------------------------------------------------*/
306/*---------------------------------------------------------------------------*/
307
309copySendAsync(Int32 index)
310{
311 IBufferCopier* copier = m_buffer_copier.get();
312 m_ghost_buffer_info.checkValid();
313
314 Int64 data_offset = 0;
317 const Int64 nb_element = indexes.size();
318 for (ConstMemoryView var_values : m_data_views) {
319 Int32 datatype_size = var_values.datatypeSize();
323 if (current_size_in_bytes != 0)
324 copier->copyToBufferAsync(indexes, local_buffer, var_values);
326 }
327}
328
329/*---------------------------------------------------------------------------*/
330/*---------------------------------------------------------------------------*/
331
332} // namespace Arcane
333
334/*---------------------------------------------------------------------------*/
335/*---------------------------------------------------------------------------*/
#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:158
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:120
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.