Arcane  v4.1.1.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
IBufferCopier.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 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/* IBufferCopier.h (C) 2000-2025 */
9/* */
10/* Interface pour la copie de buffer. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13#ifndef ARCANE_IMPL_IBUFFERCOPIER_H
14#define ARCANE_IMPL_IBUFFERCOPIER_H
15/*---------------------------------------------------------------------------*/
16/*---------------------------------------------------------------------------*/
17
18#include "arcane/utils/MemoryView.h"
20
21#include "arcane/core/GroupIndexTable.h"
22#include "arcane/accelerator/core/RunQueue.h"
23
24/*---------------------------------------------------------------------------*/
25/*---------------------------------------------------------------------------*/
26
27namespace Arcane
28{
29
30/*---------------------------------------------------------------------------*/
31/*---------------------------------------------------------------------------*/
41{
42 public:
43
44 virtual ~IBufferCopier() = default;
45
46 public:
47
48 virtual void copyFromBufferAsync(ConstArrayView<Int32> indexes,
49 ConstMemoryView buffer,
50 MutableMemoryView var_value) = 0;
51
52 virtual void copyToBufferAsync(ConstArrayView<Int32> indexes,
53 MutableMemoryView buffer,
54 ConstMemoryView var_value) = 0;
55
57 virtual void barrier() = 0;
58
59 public:
60
61 virtual void setRunQueue(const RunQueue& queue) = 0;
62};
63
64/*---------------------------------------------------------------------------*/
65/*---------------------------------------------------------------------------*/
66
67/*---------------------------------------------------------------------------*/
68/*---------------------------------------------------------------------------*/
69
71: public IBufferCopier
72{
73 public:
74
75 void copyFromBufferAsync(ConstArrayView<Int32> indexes,
76 ConstMemoryView buffer,
77 MutableMemoryView var_value) override
78 {
79 RunQueue* q = (m_queue.isNull()) ? nullptr : &m_queue;
80 MemoryUtils::copyWithIndexedSource(var_value, buffer, indexes, q);
81 }
82
83 void copyToBufferAsync(ConstArrayView<Int32> indexes,
84 MutableMemoryView buffer,
85 ConstMemoryView var_value) override
86 {
87 RunQueue* q = (m_queue.isNull()) ? nullptr : &m_queue;
88 MemoryUtils::copyWithIndexedDestination(buffer, var_value, indexes, q);
89 }
90
91 void barrier() override;
92 void setRunQueue(const RunQueue& queue) override { m_queue = queue; }
93
94 private:
95
96 RunQueue m_queue;
97};
98
99/*---------------------------------------------------------------------------*/
100/*---------------------------------------------------------------------------*/
101
102class TableBufferCopier
103: public IBufferCopier
104{
105 public:
106
107 explicit TableBufferCopier(GroupIndexTable* table)
108 : m_table(table)
109 {}
110
111 void copyFromBufferAsync(ConstArrayView<Int32> indexes,
112 ConstMemoryView buffer,
113 MutableMemoryView var_value) override
114 {
116 _buildFinalIndexes(final_indexes, indexes);
117 m_base_copier.copyFromBufferAsync(final_indexes, buffer, var_value);
118 }
119
120 void copyToBufferAsync(ConstArrayView<Int32> indexes,
121 MutableMemoryView buffer,
122 ConstMemoryView var_value) override
123 {
125 _buildFinalIndexes(final_indexes, indexes);
126 m_base_copier.copyToBufferAsync(final_indexes, buffer, var_value);
127 }
128 void barrier() override { m_base_copier.barrier(); }
129
130 void setRunQueue(const RunQueue& queue) override { m_base_copier.setRunQueue(queue); }
131
132 private:
133
134 GroupIndexTable* m_table = nullptr;
135 DirectBufferCopier m_base_copier;
136
137 private:
138
139 void _buildFinalIndexes(Array<Int32>& final_indexes, ConstArrayView<Int32> orig_indexes)
140 {
141 // TODO: faire cette allocation qu'une seule fois et la conserver.
142 // Regarder pour allouer sur le device si on est sur GPU (dans ce cas il
143 // faudrait lancer le code suivant aussi sur le device)
144 GroupIndexTable& table = *m_table;
145 Int32 n = orig_indexes.size();
146 final_indexes.resize(n);
147 for (Int32 i = 0; i < n; ++i)
148 final_indexes[i] = table[orig_indexes[i]];
149 }
150};
151
152/*---------------------------------------------------------------------------*/
153/*---------------------------------------------------------------------------*/
154
155} // End namespace Arcane
156
157/*---------------------------------------------------------------------------*/
158/*---------------------------------------------------------------------------*/
159
160#endif
Fonctions de gestion mémoire et des allocateurs.
Vue constante d'un tableau de type T.
Vue constante sur une zone mémoire contigue contenant des éléments de taille fixe.
void barrier() override
Bloque tant que les copies ne sont pas terminées.
Classe de base d'une table de hachage entre les items d'un groupe et leurs positions dans la table.
Interface pour copier des éléments entre deux zones avec indexation.
virtual void barrier()=0
Bloque tant que les copies ne sont pas terminées.
Vue modifiable sur une zone mémoire contigue contenant des éléments de taille fixe.
void barrier() override
Bloque tant que les copies ne sont pas terminées.
Vecteur 1D de données avec sémantique par valeur (style STL).
ARCCORE_COMMON_EXPORT void copyWithIndexedDestination(MutableMemoryView destination, ConstMemoryView source, SmallSpan< const Int32 > indexes, RunQueue *run_queue=nullptr)
Copie mémoire avec indirection.
ARCCORE_COMMON_EXPORT IMemoryAllocator * getDefaultDataAllocator()
Allocateur par défaut pour les données.
ARCCORE_COMMON_EXPORT void copyWithIndexedSource(MutableMemoryView destination, ConstMemoryView source, SmallSpan< const Int32 > indexes, RunQueue *run_queue=nullptr)
Copie sur l'hôte des données avec indirection.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-