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"
23#include "arcane/utils/FixedArray.h"
24#include "arccore/trace/ITraceMng.h"
40 constexpr Int64 ALIGNEMENT_SIZE = 64;
43 Int64 modulo = original_size % ALIGNEMENT_SIZE;
44 Int64 new_size = original_size;
46 new_size += (ALIGNEMENT_SIZE - modulo);
47 if ((new_size % ALIGNEMENT_SIZE) != 0)
51 void _checkAlignment(
const void* address)
53 auto a =
reinterpret_cast<intptr_t
>(address);
54 intptr_t max_align =
alignof(std::max_align_t);
55 intptr_t modulo = a % max_align;
57 ARCANE_FATAL(
"Address '{0}' is not aligned (align={1}, modulo={2})", address, max_align, modulo);
68 for (
Int32 i = 0; i < nb_rank; ++i)
80 for (
Int32 i = 0; i < nb_rank; ++i)
147 const Int32 nb_item = m_buffer_info->nbItem(rank_index);
157 return m_buffer_info->localIds(index);
174 m_buffer_info = buffer_info;
176 const Int32 nb_data = datatype_sizes.
size();
177 const Int32 nb_rank = buffer_info->nbRank();
183 Int64 data_offset = 0;
185 for (
Int32 i = 0; i < nb_rank; ++i) {
187 Int64 local_buf_nb_byte = 0;
188 for (
Int32 d = 0; d < nb_data; ++d) {
192 const Int64 nb_byte = _applyPadding(nb_item * datatype_sizes[d]);
194 local_buf_nb_byte += nb_byte;
195 data_offset += nb_byte;
208DataSynchronizeBufferBase::
210: m_sync_info(sync_info)
211, m_buffer_copier(copier)
221 return m_sync_info->targetRank(index);
230 m_buffer_copier->barrier();
242 m_nb_rank = m_sync_info->size();
268 Int64 total_compare_buffer = 0;
269 if (m_is_compare_sync_values)
272 Int64 total_size = total_ghost_buffer + total_share_buffer + total_compare_buffer;
275 Int64 share_offset = total_ghost_buffer;
276 Int64 check_sync_offset = share_offset + total_share_buffer;
279 auto s1 = buffer_span.
subspan(0, share_offset);
281 auto s2 = buffer_span.
subspan(share_offset, total_share_buffer);
283 if (m_is_compare_sync_values) {
284 auto s3 = buffer_span.
subspan(check_sync_offset, total_ghost_buffer);
304 m_buffer_copier->copyFromBufferAsync(indexes, local_buffer, var_values);
318 m_buffer_copier->copyToBufferAsync(indexes, local_buffer, var_values);
327 m_is_compare_sync_values = is_compare_sync;
331 if (is_compare_sync) {
336 for (
Int32 i = 0; i < nb_rank; ++i) {
339 m_buffer_copier->copyToBufferAsync(indexes, local_buffer, var_values);
359 if (!m_is_compare_sync_values)
365 Int64 reference_size = reference_bytes.
size();
366 Int64 receive_size = receive_bytes.
size();
367 if (reference_size != receive_size)
368 ARCANE_FATAL(
"Incoherent buffer size ref={0} receive={1}", reference_size, receive_size);
372 bool is_same = std::memcmp(reference_bytes.
data(), receive_bytes.
data(), reference_size) == 0;
402 Int32 data_index = 0;
405 _checkAlignment(local_buffer.
data());
407 copier->copyFromBufferAsync(local_ids, local_buffer, var_values);
422 Int32 data_index = 0;
425 _checkAlignment(local_buffer.
data());
427 copier->copyToBufferAsync(local_ids, local_buffer, var_values);
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
#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.
Vue constante sur une zone mémoire contigue contenant des éléments de taille fixe.
constexpr SpanType bytes() const
Vue sous forme d'octets.
constexpr const std::byte * data() const
Pointeur sur la zone mémoire.
Int64 localBufferSize(Int32 rank_index) const
Taille (en octet) du buffer local pour le rang rank_index.
Int64 displacement(Int32 rank_index) const
Déplacement dans globalBuffer() pour le index-ème rang.
ConstArrayView< Int32 > localIds(Int32 index) const
Numéros locaux des entités pour le rang index.
Int64 m_total_size
Taille total (en octet) du buffer.
SmallArray< Int64 > m_local_buffer_size
Taille (en octet) de chaque buffer local.
MutableMemoryView m_memory_view
Vue sur la zone mémoire du buffer.
MutableMemoryView localBuffer(Int32 rank_index) const
Buffer pour le index-ème rang.
ConstArrayView< Int32 > m_datatype_sizes
Taille (en octet) du type de chaque donnée.
UniqueArray2< Int64 > m_displacements
Offset (en octet) dans globalBuffer() de chaque donnée.
MutableMemoryView dataLocalBuffer(Int32 rank_index, Int32 data_index) const
Buffer pour le index-ème rang et la data_index-ème donnée.
void setGlobalBuffer(MutableMemoryView v)
Positionne le buffer global.
void initialize(ConstArrayView< Int32 > datatype_sizes, const DataSynchronizeBufferInfoList *buffer_info)
Initialise les informations du buffer.
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 _allocateBuffers()
Calcul et alloue les tampons nécessaires aux envois et réceptions pour les synchronisations des varia...
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.
BufferInfo m_share_buffer_info
Buffer pour toutes les données des entités partagées qui serviront en envoi.
void _compute(ConstArrayView< Int32 > datatype_sizes)
Calcule les informations pour la synchronisation.
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 pour les messages d'envoi (share) ou de réception (ghost)
Int32 nbItem(Int32 index) const
Nombre d'entités pour le rang index.
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.
SmallArray< Int32 > m_datatype_sizes
Tableau contenant les tailles des types de donnée.
void prepareSynchronize(bool is_compare_sync) override
void copyReceiveAsync(Int32 rank_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 rank_index) final
Recopie dans le buffer d'envoi les données du index-ème rang.
Vue modifiable sur une zone mémoire contigue contenant des éléments de taille fixe.
constexpr Int32 datatypeSize() const
Taille du type de donnée associé (1 par défaut)
constexpr std::byte * data() const
Pointeur sur la zone mémoire.
constexpr SpanType bytes() const
Vue sous forme d'octets.
Référence à une instance.
DataSynchronizeResult finalizeSynchronize()
Termine la synchronisation.
void prepareSynchronize(bool is_compare_sync) override
Prépare la synchronisation.
FixedArray< Int32, 1 > m_datatype_sizes
Tableau contenant les tailles des types de donnée.
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.
constexpr __host__ __device__ bool empty() const noexcept
Retourne true si le tableau est vide (dimension nulle)
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.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
MutableMemoryView makeMutableMemoryView(void *ptr, Int32 datatype_size, Int64 nb_element)
Créé une vue mémoire modifiable.
std::int64_t Int64
Type entier signé sur 64 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.