14#include "arcane/impl/internal/DataSynchronizeBuffer.h"
16#include "arcane/utils/FatalErrorException.h"
17#include "arcane/utils/internal/MemoryBuffer.h"
19#include "arcane/impl/DataSynchronizeInfo.h"
20#include "arcane/impl/internal/IBufferCopier.h"
22#include "arcane/accelerator/core/Runner.h"
37 for (
Int32 i = 0; i < nb_rank; ++i)
49 for (
Int32 i = 0; i < nb_rank; ++i)
72 return m_buffer_info->bufferDisplacement(index) * m_datatype_size;
82 Int32 local_size = m_buffer_info->nbItem(index);
92 return m_buffer_info->localIds(index);
101DataSynchronizeBufferBase::
103: m_sync_info(sync_info)
104, m_buffer_copier(copier)
114 return m_sync_info->targetRank(index);
123 m_buffer_copier->barrier();
135 m_nb_rank = m_sync_info->size();
159 Int64 total_ghost_buffer = m_sync_info->receiveInfo().totalNbItem();
160 Int64 total_share_buffer = m_sync_info->sendInfo().totalNbItem();
162 Int32 full_dim2_size = datatype_size;
163 Int64 total_size = total_ghost_buffer + total_share_buffer;
164 if (m_is_compare_sync_values)
165 total_size += total_ghost_buffer;
166 m_memory->resize(total_size * full_dim2_size);
168 Int64 share_offset = total_ghost_buffer * full_dim2_size;
169 Int64 check_sync_offset = share_offset + total_share_buffer * full_dim2_size;
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);
174 auto s2 = buffer_span.
subspan(share_offset, total_share_buffer * full_dim2_size);
175 m_share_buffer_info.m_memory_view = makeMutableMemoryView(s2.data(), full_dim2_size, total_share_buffer);
176 if (m_is_compare_sync_values) {
177 auto s3 = buffer_span.
subspan(check_sync_offset, total_ghost_buffer * full_dim2_size);
193 MutableMemoryView var_values =
dataView();
197 m_buffer_copier->copyFromBufferAsync(indexes, local_buffer, var_values);
208 ConstMemoryView var_values =
dataView();
211 m_buffer_copier->copyToBufferAsync(indexes, local_buffer, var_values);
220 m_is_compare_sync_values = is_compare_sync;
222 if (!is_compare_sync)
226 MutableMemoryView var_values =
dataView();
228 for (
Int32 i = 0; i < nb_rank; ++i) {
231 m_buffer_copier->copyToBufferAsync(indexes, local_buffer, var_values);
250 if (!m_is_compare_sync_values)
256 Int64 reference_size = reference_bytes.
size();
257 Int64 receive_size = receive_bytes.
size();
258 if (reference_size != receive_size)
259 ARCANE_FATAL(
"Incoherent buffer size ref={0} receive={1}", reference_size, receive_size);
263 bool is_same = std::memcmp(reference_bytes.
data(), receive_bytes.
data(), reference_size) == 0;
289 Int64 data_offset = 0;
294 Int32 datatype_size = var_values.datatypeSize();
295 Int64 current_size_in_bytes = nb_element * datatype_size;
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);
300 data_offset += current_size_in_bytes;
313 Int64 data_offset = 0;
318 Int32 datatype_size = var_values.datatypeSize();
319 Int64 current_size_in_bytes = nb_element * datatype_size;
321 MutableMemoryView local_buffer = makeMutableMemoryView(sub_local_buffer_bytes.
data(), datatype_size, nb_element);
322 if (current_size_in_bytes != 0)
323 copier->copyToBufferAsync(indexes, local_buffer, var_values);
324 data_offset += current_size_in_bytes;
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
ConstArrayView< Int32 > localIds(Int32 index) const
Numéros locaux des entités pour le rang index.
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.
Informations nécessaires pour synchroniser les entités sur un groupe.
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.
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.
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.
MutableMemoryView dataView()
Zone mémoire contenant les valeurs de la donnée à synchroniser.
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
constexpr __host__ __device__ pointer data() const noexcept
Pointeur sur le début de la vue.
Vue d'un tableau d'éléments de type T.
constexpr __host__ __device__ Span< T, DynExtent > subSpan(Int64 abegin, Int64 asize) const
Sous-vue à partir de l'élément abegin et contenant asize éléments.
constexpr __host__ __device__ Span< T, DynExtent > subspan(Int64 abegin, Int64 asize) const
Sous-vue à partir de l'élément abegin et contenant asize éléments.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
std::int64_t Int64
Type entier signé sur 64 bits.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
@ Different
Valeurs différentes avant et après la synchronisation.
@ Same
Même valeurs avant et après la synchronisation.
std::int32_t Int32
Type entier signé sur 32 bits.