12#ifndef ARCCORE_COMMON_INTERNAL_SPECIFICMEMORYCOPYLIST_H
13#define ARCCORE_COMMON_INTERNAL_SPECIFICMEMORYCOPYLIST_H
17#include "arccore/base/String.h"
18#include "arccore/base/ArrayExtentsValue.h"
19#include "arccore/base/FatalErrorException.h"
20#include "arccore/common/CommonGlobal.h"
36class ARCCORE_COMMON_EXPORT IndexedMemoryCopyArgs
48 , m_destination(destination)
57 const RunQueue* m_queue =
nullptr;
76 , m_const_multi_memory(multi_memory)
77 , m_destination_buffer(destination)
87 , m_multi_memory(multi_memory)
88 , m_source_buffer(source)
121 virtual Int32 datatypeSize()
const = 0;
152template <
typename Traits>
153class SpecificMemoryCopyList
158 using InterfaceType =
typename Traits::InterfaceType;
159 template <
typename DataType,
typename Extent>
using SpecificType =
typename Traits::template SpecificType<DataType, Extent>;
160 using RefType =
typename Traits::RefType;
164 static constexpr Int32 NB_COPIER = 128;
168 SpecificMemoryCopyList()
170 m_copier.fill(
nullptr);
173 ~SpecificMemoryCopyList()
182 template <
typename CopierType>
185 auto* copier =
new CopierType();
186 m_copier[copier->datatypeSize()] = copier;
194 std::cout <<
"SpecificMemory::nb_specialized=" << m_nb_specialized
195 <<
" nb_generic=" << m_nb_generic <<
"\n";
201 for (
Int32 i = 0; i < NB_COPIER; ++i) {
202 auto* x = m_copier[i];
203 if (x && (x->datatypeSize() != i))
204 ARCCORE_FATAL(
"Incoherent datatype size v={0} expected={1}", x->datatypeSize(), i);
210 RefType _copier(
Int32 v)
215 InterfaceType* x =
nullptr;
219 if (x->datatypeSize() != v)
220 ARCCORE_FATAL(
"Incoherent datatype size v={0} expected={1}", x->datatypeSize(), v);
225 return RefType(x, v);
230 void copyTo(
Int32 datatype_size,
const IndexedMemoryCopyArgs& args)
override
232 auto c = _copier(datatype_size);
235 void copyTo(
Int32 datatype_size,
const IndexedMultiMemoryCopyArgs& args)
override
237 auto c = _copier(datatype_size);
240 void copyFrom(
Int32 datatype_size,
const IndexedMemoryCopyArgs& args)
override
242 auto c = _copier(datatype_size);
245 void copyFrom(
Int32 datatype_size,
const IndexedMultiMemoryCopyArgs& args)
override
247 auto c = _copier(datatype_size);
250 void fill(
Int32 datatype_size,
const IndexedMemoryCopyArgs& args)
override
252 auto c = _copier(datatype_size);
255 void fill(
Int32 datatype_size,
const IndexedMultiMemoryCopyArgs& args)
override
257 auto c = _copier(datatype_size);
263 std::array<InterfaceType*, NB_COPIER> m_copier;
264 std::atomic<Int32> m_nb_specialized = 0;
265 std::atomic<Int32> m_nb_generic = 0;
273template <
typename DataType,
typename Extent>
277 static Int32 typeSize() {
return static_cast<Int32>(
sizeof(DataType)); }
281 Int32 datatypeSize()
const override {
return m_extent.v * typeSize(); }
291 return {
reinterpret_cast<const DataType*
>(a.data()), a.size() / typeSize() };
295 return {
reinterpret_cast<DataType*
>(a.data()), a.size() / typeSize() };
307template <
typename Traits>
308class SpecificMemoryCopyRef
310 template <
typename DataType,
typename Extent>
using SpecificType =
typename Traits::template SpecificType<DataType, Extent>;
315 : m_specialized_copier(specialized_copier)
316 , m_used_copier(specialized_copier)
318 m_generic_copier.m_extent.v = datatype_size;
320 m_used_copier = &m_generic_copier;
325 m_used_copier->copyFrom(args);
330 m_used_copier->copyTo(args);
335 m_used_copier->fill(args);
340 m_used_copier->copyFrom(args);
345 m_used_copier->copyTo(args);
350 m_used_copier->fill(args);
356 SpecificType<std::byte, ExtentValue<DynExtent>> m_generic_copier;
394 return accelerator_global_copy_list;
#define ARCCORE_FATAL(...)
Macro envoyant une exception FatalErrorException.
File d'exécution pour un accélérateur.
Vue d'un tableau d'éléments de type T.
Vue d'un tableau d'éléments de type T.
Classe singleton contenant l'instance à utiliser pour les copies.
static ISpecificMemoryCopyList * getDefault(const RunQueue *queue)
Retourne l'instance par défaut pour la file queue.
static void setAcceleratorInstance(ISpecificMemoryCopyList *ptr)
Positionne l'instance par défaut pour les copies lorsqu'un runtime accélérateur est activé
Interface d'une liste d'instances de ISpecificMemoryCopy spécialisées.
Interface d'un copieur mémoire spécialisé pour une taille de donnée.
Arguments pour une copie de certains indices entre deux zones mémoire.
Arguments pour une copie de certains indices vers/depuis une zone mémoire multiple.
IndexedMultiMemoryCopyArgs(SmallSpan< const Int32 > indexes, SmallSpan< Span< std::byte > > multi_memory, Span< const std::byte > source, RunQueue *run_queue)
Constructor pour copyFrom.
IndexedMultiMemoryCopyArgs(SmallSpan< const Int32 > indexes, SmallSpan< const Span< const std::byte > > multi_memory, Span< std::byte > destination, RunQueue *run_queue)
Constructeur pour copyTo.
std::vector< ISpecificMemoryCopy * > m_dynamic_copier_list
Liste des copieurs qu'il faudra supprimer via 'delete'.
void addCopier()
Ajoute un copieur spécifique.
std::int32_t Int32
Type entier signé sur 32 bits.