Arcane  v3.14.10.0
Documentation développeur
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/*---------------------------------------------------------------------------*/
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/*---------------------------------------------------------------------------*/
50class ARCANE_MATERIALS_EXPORT ARCANE_ALIGNAS(64) SimdMatVarIndex
51{
52 public:
54 public:
55
57 : m_value_index(value_index), m_array_index(array_index)
58 {
59 }
61
62 public:
63
65 Int32 arrayIndex() const { return m_array_index; }
66
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/*---------------------------------------------------------------------------*/
82class ARCANE_MATERIALS_EXPORT ComponentPartSimdCellEnumerator
83: public SimdEnumeratorBase
84{
85 protected:
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,
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:
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/*---------------------------------------------------------------------------*/
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/*---------------------------------------------------------------------------*/
188{
189 public:
191 {
192 }
193 public:
194 IMeshMaterialVariable* variable() const { return m_variable; }
195 private:
196 IMeshMaterialVariable* m_variable;
197};
198
199/*---------------------------------------------------------------------------*/
200/*---------------------------------------------------------------------------*/
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
221 {
222 typedef typename SimdTypeTraits<DataType>::SimdType SimdType;
223 return SimdType(m_value[mvi.arrayIndex()].data(),mvi.valueIndex());
224 }
225
228 {
229 return this->m_value[mvi.arrayIndex()][mvi.valueIndex()];
230 }
231
234 {
235 return this->m_value[lid.localId().arrayIndex()][lid.localId().valueIndex()];
236 }
237
240 {
241 return this->m_value0[pmvi.valueIndex()];
242 }
243
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
257 {
258 return this->operator[](mc._varIndex());
259 }
260
263 {
264 return this->operator[](mc._varIndex());
265 }
266
267 private:
268 ArrayView<DataType>* m_value;
269 DataTypeAlignedPtr m_value0;
270};
271
272/*---------------------------------------------------------------------------*/
273/*---------------------------------------------------------------------------*/
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
293 {
294 return SimdSetter<DataType>(m_value[mvi.arrayIndex()].data(),mvi.valueIndex());
295 }
296
298 DataType& operator[](ItemIndexType mvi) const
299 {
300 return this->m_value[mvi.arrayIndex()][mvi.valueIndex()];
301 }
302
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
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
327 {
328 return this->operator[](mc._varIndex());
329 }
330
333 {
334 return this->operator[](mc._varIndex());
335 }
336
337 private:
338 ArrayView<DataType>* m_value;
339 DataTypeAlignedPtr m_value0;
340};
341
342/*---------------------------------------------------------------------------*/
343/*---------------------------------------------------------------------------*/
347template<typename DataType>
348MatItemVariableScalarInViewT<Cell,DataType>
350{
351 return MatItemVariableScalarInViewT<Cell,DataType>(var.materialVariable(),var._internalValue());
352}
353
354/*---------------------------------------------------------------------------*/
355/*---------------------------------------------------------------------------*/
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
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
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.
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.
Index d'un Item matériaux pure dans une variable.
Classe de base des énumérateurs vectoriels avec indirection.
Definition Simd.h:380
Indexeur SIMD sur un composant.
Int32 arrayIndex() const
Retourne l'indice du tableau de valeur dans la liste des variables.
const SimdIndexType & valueIndex() const
Retourne l'indice dans le tableau de valeur.
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 viewIn(RunCommand &cmd, const CellMaterialVariableScalarRef< DataType > &var)
Vue en lecture pour les variables materiaux scalaire.
auto viewOut(RunCommand &cmd, CellMaterialVariableScalarRef< DataType > &var)
Vue en écriture pour les variables materiaux scalaire.