14#include "arcane/materials/IMeshMaterialSynchronizeBuffer.h"
16#include "arcane/utils/UniqueArray.h"
17#include "arcane/utils/PlatformUtils.h"
29class MultiBufferMeshMaterialSynchronizeBuffer
37 : m_send_buffer(allocator)
38 , m_receive_buffer(allocator)
46 m_send_buffer.clear();
47 m_receive_buffer.clear();
49 Int32 m_send_size = 0;
50 Int32 m_receive_size = 0;
57 explicit MultiBufferMeshMaterialSynchronizeBuffer(
IMemoryAllocator* allocator)
58 : m_default_buffer_info(allocator)
66 m_buffer_infos.resize(nb_rank,m_default_buffer_info);
67 for (
auto& x : m_buffer_infos)
72 return m_buffer_infos[index].m_send_buffer;
76 m_buffer_infos[index].m_send_size = new_size;
80 return m_buffer_infos[index].m_receive_buffer;
84 m_buffer_infos[index].m_receive_size = new_size;
89 for (
auto& x : m_buffer_infos) {
90 x.m_send_buffer.resize(x.m_send_size);
91 x.m_receive_buffer.resize(x.m_receive_size);
92 m_total_size += x.m_send_size + x.m_receive_size;
100 Int64 m_total_size = 0;
101 BufferInfo m_default_buffer_info;
108class OneBufferMeshMaterialSynchronizeBuffer
125 return full_buffer.
subspan(m_send_index,m_send_size);
129 return full_buffer.
subspan(m_receive_index,m_receive_size);
132 Int32 m_send_size = 0;
133 Int32 m_receive_size = 0;
134 Int64 m_send_index = 0;
135 Int64 m_receive_index = 0;
140 explicit OneBufferMeshMaterialSynchronizeBuffer(
IMemoryAllocator* allocator)
141 : m_buffer(allocator){}
148 m_buffer_infos.resize(nb_rank);
149 for (
auto& x : m_buffer_infos)
154 return m_buffer_infos[index].sendBuffer(m_buffer);
158 m_buffer_infos[index].m_send_size = new_size;
162 return m_buffer_infos[index].receiveBuffer(m_buffer);
166 m_buffer_infos[index].m_receive_size = new_size;
170 Int64 total_send_size = 0;
171 Int64 total_receive_size = 0;
172 for (
auto& x : m_buffer_infos) {
173 total_send_size += x.m_send_size;
174 total_receive_size += x.m_receive_size;
176 m_buffer.resize(total_send_size+total_receive_size);
177 Int64 send_index = 0;
178 Int64 receive_index = total_send_size;
179 for (
auto& x : m_buffer_infos) {
180 x.m_send_index = send_index;
181 x.m_receive_index = receive_index;
182 send_index += x.m_send_size;
183 receive_index += x.m_receive_size;
201makeMultiBufferMeshMaterialSynchronizeBufferRef(
eMemoryRessource memory_ressource)
208extern "C++" ARCANE_MATERIALS_EXPORT Ref<IMeshMaterialSynchronizeBuffer>
209makeMultiBufferMeshMaterialSynchronizeBufferRef()
211 return makeMultiBufferMeshMaterialSynchronizeBufferRef(eMemoryRessource::Host);
214extern "C++" ARCANE_MATERIALS_EXPORT Ref<IMeshMaterialSynchronizeBuffer>
215makeOneBufferMeshMaterialSynchronizeBufferRef(
eMemoryRessource memory_ressource)
218 auto* v =
new OneBufferMeshMaterialSynchronizeBuffer(a);
Fonctions de gestion mémoire et des allocateurs.
Interface d'un allocateur pour la mémoire.
Interface des buffers pour la synchronisation de variables matériaux.
void allocate() override
Alloue la mémoire pour les buffers.
void setReceiveBufferSize(Int32 index, Int32 new_size) override
Positionne le nombre d'éléments pour le i-ème buffer de réception.
Span< Byte > sendBuffer(Int32 index) override
Buffer d'envoi pour le i-ème buffer.
Int32 nbRank() const override
Nombre de rangs.
void setNbRank(Int32 nb_rank) override
Positionne le nombre de rangs. Cela invalide les buffers d'envoi et de réception.
Int64 totalSize() const override
Taille totale allouée pour les buffers.
void setSendBufferSize(Int32 index, Int32 new_size) override
Positionne le nombre d'éléments pour le i-ème buffer d'envoi.
Span< Byte > receiveBuffer(Int32 index) override
Buffer d'envoi pour le i-\ème buffer.
Span< Byte > receiveBuffer(Int32 index) override
Buffer d'envoi pour le i-\ème buffer.
Int64 totalSize() const override
Taille totale allouée pour les buffers.
void allocate() override
Alloue la mémoire pour les buffers.
Span< Byte > sendBuffer(Int32 index) override
Buffer d'envoi pour le i-ème buffer.
void setReceiveBufferSize(Int32 index, Int32 new_size) override
Positionne le nombre d'éléments pour le i-ème buffer de réception.
void setNbRank(Int32 nb_rank) override
Positionne le nombre de rangs. Cela invalide les buffers d'envoi et de réception.
Int32 nbRank() const override
Nombre de rangs.
void setSendBufferSize(Int32 index, Int32 new_size) override
Positionne le nombre d'éléments pour le i-ème buffer d'envoi.
Référence à une instance.
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.
Vecteur 1D de données avec sémantique par valeur (style STL).
Active toujours les traces dans les parties Arcane concernant les matériaux.
IMemoryAllocator * getAllocator(eMemoryResource mem_resource)
Allocateur par défaut pour la ressource mem_resource.
std::int64_t Int64
Type entier signé sur 64 bits.
MATERIALS_BEGIN_NAMESPACE class ARCANE_MATERIALS_EXPORT(64) SimdMatVarIndex
Indexeur SIMD sur un composant.
Arcane::eMemoryResource eMemoryRessource
Typedef pour la version Arcane historique (avec 2's')
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
std::int32_t Int32
Type entier signé sur 32 bits.