Arcane  v3.16.7.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(Int32ConstArrayView indexes,
49 ConstMemoryView buffer,
50 MutableMemoryView var_value) = 0;
51
52 virtual void copyToBufferAsync(Int32ConstArrayView 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(Int32ConstArrayView 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(Int32ConstArrayView 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 TableBufferCopier(GroupIndexTable* table)
108 : m_table(table)
109 {}
110
111 void copyFromBufferAsync(Int32ConstArrayView indexes,
112 ConstMemoryView buffer,
113 MutableMemoryView var_value) override
114 {
115 UniqueArray<Int32> final_indexes;
116 _buildFinalIndexes(final_indexes, indexes);
117 m_base_copier.copyFromBufferAsync(final_indexes, buffer, var_value);
118 }
119
120 void copyToBufferAsync(Int32ConstArrayView indexes,
121 MutableMemoryView buffer,
122 ConstMemoryView var_value) override
123 {
124 UniqueArray<Int32> final_indexes;
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;
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 GroupIndexTable& table = *m_table;
143 Int32 n = orig_indexes.size();
144 final_indexes.resize(n);
145 for (Int32 i = 0; i < n; ++i)
146 final_indexes[i] = table[orig_indexes[i]];
147 }
148};
149
150/*---------------------------------------------------------------------------*/
151/*---------------------------------------------------------------------------*/
152
153} // End namespace Arcane
154
155/*---------------------------------------------------------------------------*/
156/*---------------------------------------------------------------------------*/
157
158#endif
Fonctions de gestion mémoire et des allocateurs.
File d'exécution pour un accélérateur.
Vue constante sur une zone mémoire contigue contenant des éléments de taille fixe.
Definition MemoryView.h:38
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.
Definition MemoryView.h:156
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).
void copyWithIndexedDestination(MutableMemoryView destination, ConstMemoryView source, SmallSpan< const Int32 > indexes, RunQueue *run_queue=nullptr)
Copie mémoire avec indirection.
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 -*-
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:569