Arcane  v3.16.0.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-2024 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-2024 */
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"
19
20#include "arcane/core/GroupIndexTable.h"
21#include "arcane/accelerator/core/RunQueue.h"
22
23/*---------------------------------------------------------------------------*/
24/*---------------------------------------------------------------------------*/
25
26namespace Arcane
27{
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
40{
41 public:
42
43 virtual ~IBufferCopier() = default;
44
45 public:
46
47 virtual void copyFromBufferAsync(Int32ConstArrayView indexes,
48 ConstMemoryView buffer,
49 MutableMemoryView var_value) = 0;
50
51 virtual void copyToBufferAsync(Int32ConstArrayView indexes,
52 MutableMemoryView buffer,
53 ConstMemoryView var_value) = 0;
54
56 virtual void barrier() = 0;
57
58 public:
59
60 virtual void setRunQueue(const RunQueue& queue) = 0;
61};
62
63/*---------------------------------------------------------------------------*/
64/*---------------------------------------------------------------------------*/
65
66/*---------------------------------------------------------------------------*/
67/*---------------------------------------------------------------------------*/
68
70: public IBufferCopier
71{
72 public:
73
74 void copyFromBufferAsync(Int32ConstArrayView indexes,
75 ConstMemoryView buffer,
76 MutableMemoryView var_value) override
77 {
78 RunQueue* q = (m_queue.isNull()) ? nullptr : &m_queue;
79 buffer.copyToIndexes(var_value, indexes, q);
80 }
81
82 void copyToBufferAsync(Int32ConstArrayView indexes,
83 MutableMemoryView buffer,
84 ConstMemoryView var_value) override
85 {
86 RunQueue* q = (m_queue.isNull()) ? nullptr : &m_queue;
87 buffer.copyFromIndexes(var_value, indexes, q);
88 }
89
90 void barrier() override;
91 void setRunQueue(const RunQueue& queue) override { m_queue = queue; }
92
93 private:
94
95 RunQueue m_queue;
96};
97
98/*---------------------------------------------------------------------------*/
99/*---------------------------------------------------------------------------*/
100
101class TableBufferCopier
102: public IBufferCopier
103{
104 public:
105
106 TableBufferCopier(GroupIndexTable* table)
107 : m_table(table)
108 {}
109
110 void copyFromBufferAsync(Int32ConstArrayView indexes,
111 ConstMemoryView buffer,
112 MutableMemoryView var_value) override
113 {
114 UniqueArray<Int32> final_indexes;
115 _buildFinalIndexes(final_indexes, indexes);
116 m_base_copier.copyFromBufferAsync(final_indexes, buffer, var_value);
117 }
118
119 void copyToBufferAsync(Int32ConstArrayView indexes,
120 MutableMemoryView buffer,
121 ConstMemoryView var_value) override
122 {
123 UniqueArray<Int32> final_indexes;
124 _buildFinalIndexes(final_indexes, indexes);
125 m_base_copier.copyToBufferAsync(final_indexes, buffer, var_value);
126 }
127 void barrier() override { m_base_copier.barrier(); }
128
129 void setRunQueue(const RunQueue& queue) override { m_base_copier.setRunQueue(queue); }
130
131 private:
132
133 GroupIndexTable* m_table;
134 DirectBufferCopier m_base_copier;
135
136 private:
137
138 void _buildFinalIndexes(Array<Int32>& final_indexes, ConstArrayView<Int32> orig_indexes)
139 {
140 // TODO: faire cette allocation qu'une seule fois et la conserver.
141 GroupIndexTable& table = *m_table;
142 Int32 n = orig_indexes.size();
143 final_indexes.resize(n);
144 for (Int32 i = 0; i < n; ++i)
145 final_indexes[i] = table[orig_indexes[i]];
146 }
147};
148
149/*---------------------------------------------------------------------------*/
150/*---------------------------------------------------------------------------*/
151
152} // End namespace Arcane
153
154/*---------------------------------------------------------------------------*/
155/*---------------------------------------------------------------------------*/
156
157#endif
File d'exécution pour un accélérateur.
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.
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).
-*- 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