Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ComponentSimd.h
Aller à la documentation de ce fichier.
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 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/* ComponentSimd.h (C) 2000-2017 */
9/* */
10/* Support de la vectorisation pour les matériaux et milieux. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_MATERIALS_COMPONENTSIMD_H
13#define ARCANE_MATERIALS_COMPONENTSIMD_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16/*!
17 * \file ComponentSimd.h
18 *
19 * Ce fichier contient les différents types pour gérer la
20 * vectorisation sur les composants (matériaux et milieux).
21 */
22
23#include "arcane/ArcaneTypes.h"
24#include "arcane/SimdItem.h"
25
26#include "arcane/materials/MatItem.h"
27#include "arcane/materials/MatItemEnumerator.h"
28#include "arcane/materials/ComponentPartItemVectorView.h"
29
30/*---------------------------------------------------------------------------*/
31/*---------------------------------------------------------------------------*/
32
33#ifdef __INTEL_COMPILER
34# define A_ALIGNED_64 __attribute__((align_value(64)))
35#else
36# define A_ALIGNED_64
37#endif
38
39/*---------------------------------------------------------------------------*/
40/*---------------------------------------------------------------------------*/
41
42ARCANE_BEGIN_NAMESPACE
43MATERIALS_BEGIN_NAMESPACE
44
45/*---------------------------------------------------------------------------*/
46/*---------------------------------------------------------------------------*/
47/*!
48 * \brief Indexeur SIMD sur un composant.
49 */
50class ARCANE_MATERIALS_EXPORT ARCANE_ALIGNAS(64) SimdMatVarIndex
51{
52 public:
53 typedef SimdEnumeratorBase::SimdIndexType SimdIndexType;
54 public:
55
56 SimdMatVarIndex(Int32 array_index,SimdIndexType value_index)
57 : m_value_index(value_index), m_array_index(array_index)
58 {
59 }
60 SimdMatVarIndex(){}
61
62 public:
63
64 //! Retourne l'indice du tableau de valeur dans la liste des variables.
65 Int32 arrayIndex() const { return m_array_index; }
66
67 //! Retourne l'indice dans le tableau de valeur
68 const SimdIndexType& valueIndex() const { return m_value_index; }
69
70 private:
71
72 SimdIndexType m_value_index;
73 Int32 m_array_index;
74};
75
76/*---------------------------------------------------------------------------*/
77/*---------------------------------------------------------------------------*/
78/*!
79 * \brief Enumérateur SIMD sur une sous-partie (pure ou partielle) d'un
80 * sous-ensemble des mailles d'un composant (matériau ou milieu)
81 */
82class ARCANE_MATERIALS_EXPORT ComponentPartSimdCellEnumerator
83: public SimdEnumeratorBase
84{
85 protected:
86 ComponentPartSimdCellEnumerator(IMeshComponent* component,Int32 component_part_index,
87 Int32ConstArrayView item_indexes)
88 : SimdEnumeratorBase(item_indexes), m_component_part_index(component_part_index), m_component(component)
89 {
90 }
91 public:
93 {
94 return ComponentPartSimdCellEnumerator(v.component(),v.componentPartIndex(),v.valueIndexes());
95 }
96 public:
97
98 SimdMatVarIndex _varIndex() const { return SimdMatVarIndex(m_component_part_index,*_currentSimdIndex()); }
99
100 operator SimdMatVarIndex() const
101 {
102 return _varIndex();
103 }
104
105 protected:
106 Integer m_component_part_index;
107 IMeshComponent* m_component;
108};
109
110/*---------------------------------------------------------------------------*/
111/*---------------------------------------------------------------------------*/
112
113#define ENUMERATE_SIMD_COMPONENTCELL(iname,env) \
114 A_ENUMERATE_COMPONENTCELL(ComponentPartSimdCellEnumerator,iname,env)
115
116/*---------------------------------------------------------------------------*/
117/*---------------------------------------------------------------------------*/
118
119template<typename Lambda> void
120simple_simd_env_loop(ComponentPartItemVectorView pure_items,
121 ComponentPartItemVectorView impure_items,
122 const Lambda& lambda)
123{
125 lambda(mvi);
126 }
127 ENUMERATE_SIMD_COMPONENTCELL(mvi,impure_items){
128 lambda(mvi);
129 }
130}
131
132/*---------------------------------------------------------------------------*/
133/*---------------------------------------------------------------------------*/
134
135class ARCANE_MATERIALS_EXPORT LoopFunctorEnvPartSimdCell
136{
137 public:
138 typedef const SimdMatVarIndex& IterType;
139 public:
141 ComponentPartItemVectorView impure_items)
142 : m_pure_items(pure_items), m_impure_items(impure_items){}
143 public:
144 static LoopFunctorEnvPartSimdCell create(const EnvCellVector& env);
146 public:
147 template<typename Lambda>
148 void operator<<(Lambda&& lambda)
149 {
150 simple_simd_env_loop(m_pure_items,m_impure_items,lambda);
151 }
152 private:
153 ComponentPartItemVectorView m_pure_items;
154 ComponentPartItemVectorView m_impure_items;
155};
156
157/*---------------------------------------------------------------------------*/
158/*---------------------------------------------------------------------------*/
159/*!
160 * \brief Macro pour itérer sur les entités d'un composant via une
161 * fonction lambda du C++11.
162 *
163 * Les arguments sont les mêmes que pour la macro ENUMERATE_COMPONENTITEM().
164 *
165 * Le code après la macro correspond au corps de la fonction lambda du C++11.
166 * Il doit donc être compris entre deux accolades '{' '}' et se
167 * terminer par un point-virgule ';'. Par exemple:
168 *
169 \code
170 * ENUMERATE_COMPONENTITEM_LAMBDA(){
171 * };
172 \endcode
173 *
174 * \note Même si le code est similaire à celui d'une boucle, il s'agit d'une
175 * fonction lambda du C++11 et donc il n'est pas possible d'utiliser des
176 * mots clés comme 'break' ou 'continue'. Si on souhaite arrêtre une itération
177 * il faut utiliser le mot clé 'return'.
178 */
179#define ENUMERATE_COMPONENTITEM_LAMBDA(iter_type,iter,container)\
180 Arcane::Materials:: LoopFunctor ## iter_type :: create ( (container) ) << [=]( Arcane::Materials:: LoopFunctor ## iter_type :: IterType iter)
181
182/*---------------------------------------------------------------------------*/
183/*---------------------------------------------------------------------------*/
184/*!
185 * \brief Classe de base des vues sur les variables.
186 */
188{
189 public:
190 MatVariableViewBase(IMeshMaterialVariable* var) : m_variable(var)
191 {
192 }
193 public:
194 IMeshMaterialVariable* variable() const { return m_variable; }
195 private:
196 IMeshMaterialVariable* m_variable;
197};
198
199/*---------------------------------------------------------------------------*/
200/*---------------------------------------------------------------------------*/
201/*!
202 * \brief Vue en lecture sur une variable scalaire du maillage.
203 */
204template<typename ItemType,typename DataType>
206: public MatVariableViewBase
207{
208 private:
209
211 typedef A_ALIGNED_64 DataType* DataTypeAlignedPtr;
212
213 public:
214
216 : MatVariableViewBase(var), m_value(v), m_value0(v[0].unguardedBasePointer()){}
217
218 //! Opérateur d'accès vectoriel avec indirection.
219 typename SimdTypeTraits<DataType>::SimdType
220 operator[](const SimdMatVarIndex& mvi) const
221 {
222 typedef typename SimdTypeTraits<DataType>::SimdType SimdType;
223 return SimdType(m_value[mvi.arrayIndex()].data(),mvi.valueIndex());
224 }
225
226 //! Opérateur d'accès pour l'entité \a item
227 DataType operator[](ItemIndexType mvi) const
228 {
229 return this->m_value[mvi.arrayIndex()][mvi.valueIndex()];
230 }
231
232 //! Opérateur d'accès pour l'entité \a item
234 {
235 return this->m_value[lid.localId().arrayIndex()][lid.localId().valueIndex()];
236 }
237
238 //! Opérateur d'accès pour l'entité \a item
239 DataType operator[](PureMatVarIndex pmvi) const
240 {
241 return this->m_value0[pmvi.valueIndex()];
242 }
243
244 //! Opérateur d'accès pour l'entité \a item
245 DataType value(ItemIndexType mvi) const
246 {
247 return this->m_value[mvi.arrayIndex()][mvi.valueIndex()];
248 }
249
250 DataType value0(PureMatVarIndex idx) const
251 {
252 return this->m_value0[idx.valueIndex()];
253 }
254
255 //! Valeur partielle de la variable pour l'itérateur \a mc
257 {
258 return this->operator[](mc._varIndex());
259 }
260
261 //! Valeur partielle de la variable pour l'itérateur \a mc
262 DataType operator[](EnvCellEnumerator mc) const
263 {
264 return this->operator[](mc._varIndex());
265 }
266
267 private:
268 ArrayView<DataType>* m_value;
269 DataTypeAlignedPtr m_value0;
270};
271
272/*---------------------------------------------------------------------------*/
273/*---------------------------------------------------------------------------*/
274/*!
275 * \brief Vue en lecture sur une variable scalaire du maillage.
276 */
277template<typename ItemType,typename DataType>
279: public MatVariableViewBase
280{
281 private:
282
284 typedef A_ALIGNED_64 DataType* DataTypeAlignedPtr;
285
286 public:
287
289 : MatVariableViewBase(var), m_value(v), m_value0(v[0].unguardedBasePointer()){}
290
291 //! Opérateur d'accès vectoriel avec indirection.
292 SimdSetter<DataType> operator[](const SimdMatVarIndex& mvi) const
293 {
294 return SimdSetter<DataType>(m_value[mvi.arrayIndex()].data(),mvi.valueIndex());
295 }
296
297 //! Opérateur d'accès pour l'entité \a item
298 DataType& operator[](ItemIndexType mvi) const
299 {
300 return this->m_value[mvi.arrayIndex()][mvi.valueIndex()];
301 }
302
303 //! Opérateur d'accès pour l'entité \a item
304 DataType& operator[](ComponentItemLocalId lid) const
305 {
306 return this->m_value[lid.localId().arrayIndex()][lid.localId().valueIndex()];
307 }
308
309 DataType& operator[](PureMatVarIndex pmvi) const
310 {
311 return this->m_value0[pmvi.valueIndex()];
312 }
313
314 //! Opérateur d'accès pour l'entité \a item
315 DataType& value(ItemIndexType mvi) const
316 {
317 return this->m_value[mvi.arrayIndex()][mvi.valueIndex()];
318 }
319
320 DataType& value0(PureMatVarIndex idx) const
321 {
322 return this->m_value0[idx.valueIndex()];
323 }
324
325 //! Valeur partielle de la variable pour l'itérateur \a mc
327 {
328 return this->operator[](mc._varIndex());
329 }
330
331 //! Valeur partielle de la variable pour l'itérateur \a mc
332 DataType& operator[](EnvCellEnumerator mc) const
333 {
334 return this->operator[](mc._varIndex());
335 }
336
337 private:
338 ArrayView<DataType>* m_value;
339 DataTypeAlignedPtr m_value0;
340};
341
342/*---------------------------------------------------------------------------*/
343/*---------------------------------------------------------------------------*/
344/*!
345 * \brief Vue en lecture.
346 */
347template<typename DataType>
348MatItemVariableScalarInViewT<Cell,DataType>
353
354/*---------------------------------------------------------------------------*/
355/*---------------------------------------------------------------------------*/
356/*!
357 * \brief Vue en écriture
358 */
359template<typename DataType>
360MatItemVariableScalarOutViewT<Cell,DataType>
365
366/*---------------------------------------------------------------------------*/
367/*---------------------------------------------------------------------------*/
368
369MATERIALS_END_NAMESPACE
370ARCANE_END_NAMESPACE
371
372/*---------------------------------------------------------------------------*/
373/*---------------------------------------------------------------------------*/
374
375#endif
#define ARCANE_ALIGNAS(value)
Macro pour garantir l'alignement d'une classe sur value octets.
Vue en lecture sur une variable scalaire du maillage. TODO: Faut-il rajouter la gestion des SIMD comm...
Vue en écriture sur une variable scalaire du maillage. TODO: Faut il rajouter la gestion des types SI...
Classe de base des vues sur les variables matériaux.
Enumérateur SIMD sur une sous-partie (pure ou partielle) d'un sous-ensemble des mailles d'un composan...
Vectorisation des entiers en utilisant une émulation.
Definition SimdEMUL.h:35
DataType operator[](ItemIndexType mvi) const
Opérateur d'accès pour l'entité item.
DataType value(ItemIndexType mvi) const
Opérateur d'accès pour l'entité item.
DataType operator[](EnvCellEnumerator mc) const
Valeur partielle de la variable pour l'itérateur mc.
DataType operator[](PureMatVarIndex pmvi) const
Opérateur d'accès pour l'entité item.
DataType operator[](ComponentItemLocalId lid) const
Opérateur d'accès pour l'entité item.
SimdTypeTraits< DataType >::SimdType operator[](const SimdMatVarIndex &mvi) const
Opérateur d'accès vectoriel avec indirection.
DataType operator[](CellComponentCellEnumerator mc) const
Valeur partielle de la variable pour l'itérateur mc.
DataType & value(ItemIndexType mvi) const
Opérateur d'accès pour l'entité item.
DataType & operator[](EnvCellEnumerator mc) const
Valeur partielle de la variable pour l'itérateur mc.
DataType & operator[](ItemIndexType mvi) const
Opérateur d'accès pour l'entité item.
DataType & operator[](CellComponentCellEnumerator mc) const
Valeur partielle de la variable pour l'itérateur mc.
DataType & operator[](ComponentItemLocalId lid) const
Opérateur d'accès pour l'entité item.
SimdSetter< DataType > operator[](const SimdMatVarIndex &mvi) const
Opérateur d'accès vectoriel avec indirection.
Enumérateur sur les constituants d'une maille.
Variable scalaire sur les mailles d'un matériau du maillage. Pour l'instant, cette classe n'est insta...
Index d'un Item matériaux dans une variable.
Vue sur une partie pure ou partielles des entités d'un composant.
Int32ConstArrayView valueIndexes() const
Liste des valueIndex() de la partie.
Enumérateur sur les mailles d'un milieu.
Vecteur sur les entités d'un milieu.
Interface d'un composant (matériau ou milieu) d'un maillage.
Interface d'une variable matériau d'un maillage.
Représente un index sur les variables matériaux et milieux.
constexpr __host__ __device__ Int32 arrayIndex() const
Retourne l'indice du tableau de valeur dans la liste des variables.
constexpr __host__ __device__ Int32 valueIndex() const
Retourne l'indice dans le tableau de valeur.
IMeshMaterialVariable * materialVariable() const
Variable matériau associée.
Index d'un Item matériaux pure dans une variable.
Classe de base des énumérateurs vectoriels avec indirection.
Definition Simd.h:380
Vue modifiable d'un tableau d'un type T.
Vue constante d'un tableau de type T.
#define ENUMERATE_COMPONENTITEM(enumerator_class_name, iname,...)
Macro générique pour itérer sur les entités d'un matériau ou d'un milieu.
auto viewOut(MeshVariableScalarRefT< ItemType, DataType > &var)
Vue en écriture.
auto viewIn(const MeshVariableScalarRefT< ItemType, DataType > &var)
Vue en lecture.
std::ostream & operator<<(std::ostream &ostr, eItemKind item_kind)
Opérateur de sortie sur un flot.