Arcane  v3.15.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,
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,
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
102: public IBufferCopier
103{
104 public:
105
107 : m_table(table)
108 {}
109
110 void copyFromBufferAsync(Int32ConstArrayView indexes,
111 ConstMemoryView buffer,
113 {
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 {
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.
bool isNull() const
Indique si la RunQueue est nulle.
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.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:149
void barrier() override
Bloque tant que les copies ne sont pas terminées.
Vue constante d'un tableau de type T.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-