12#ifndef ARCANE_SIMDITEM_H
13#define ARCANE_SIMDITEM_H
23#ifndef ARCANE_SIMD_BENCH
24#include "arcane/ItemEnumerator.h"
41template<
typename ItemType>
74 typedef SimdInfo::SimdInt32IndexType SimdIndexType;
82 ARCANE_DEPRECATED_REASON(
"Y2022: Use another constructor")
83 SimdItemBase(const ItemInternalPtr* items, const SimdIndexType* ids)
89 : m_simd_local_ids(*ids), m_shared_info(shared_info) { }
94 ARCANE_DEPRECATED_REASON(
"Y2022: Use method SimdItem::item() instead")
97 ARCANE_DEPRECATED_REASON(
"Y2022: Use method SimdItem::operator[]() instead")
98 ItemInternal* operator[](
Integer si)
const {
return m_shared_info->m_items_internal[localId(si)]; }
101 const SimdIndexType& ARCANE_RESTRICT
simdLocalIds()
const {
return m_simd_local_ids; }
111 SimdIndexType m_simd_local_ids;
118class SimdItemDirectBase
126 ARCANE_DEPRECATED_REASON(
"Y2022: Use another constructor")
127 SimdItemDirectBase(
const ItemInternalPtr* items,
Int32 base_local_id,
Integer nb_valid)
128 : m_base_local_id(base_local_id), m_nb_valid(nb_valid),
129 m_shared_info(ItemInternalCompatibility::_getSharedInfo(items,nb_valid)) { }
134 : m_base_local_id(base_local_id), m_nb_valid(nb_valid), m_shared_info(shared_info) {}
137 SimdItemDirectBase(
Int32 base_local_id,
Integer nb_valid,
const ItemInternalPtr* items)
138 : m_base_local_id(base_local_id), m_nb_valid(nb_valid),
139 m_shared_info(ItemInternalCompatibility::_getSharedInfo(items,nb_valid)) { }
151 Int32 m_base_local_id;
164template<
typename ItemType>
168 typedef SimdInfo::SimdInt32IndexType SimdIndexType;
170 SimdItemIndexT(
const SimdIndexType& ARCANE_RESTRICT local_ids)
171 : m_local_ids(local_ids){}
172 SimdItemIndexT(
const SimdIndexType* ARCANE_RESTRICT local_ids)
173 : m_local_ids(*local_ids){}
176 const SimdIndexType& ARCANE_RESTRICT
simdLocalIds()
const {
return m_local_ids; }
178 const SimdIndexType& ARCANE_RESTRICT m_local_ids;
186template<
typename ItemType>
187class SimdItemDirectIndexT
190 SimdItemDirectIndexT(
Int32 base_local_id)
191 : m_base_local_id(base_local_id){}
193 inline Int32 baseLocalId()
const {
return m_base_local_id; }
195 Int32 m_base_local_id;
209 ARCANE_DEPRECATED_REASON(
"Y2022: Use another constructor")
210 SimdItem(
const ItemInternalPtr* items,
const SimdInfo::SimdInt32IndexType* ids)
211 :
SimdItemBase(ItemInternalCompatibility::_getSharedInfo(items,1),ids) { }
215 SimdItem(
ItemSharedInfo* shared_info,
const SimdInfo::SimdInt32IndexType* ids)
233template<
typename ItemType>
246 ARCANE_DEPRECATED_REASON(
"Y2022: Use another constructor")
247 SimdItemT(
const ItemInternalPtr* items,
const SimdInfo::SimdInt32IndexType* ids)
248 : SimdItem(items,ids) { }
253 SimdItemT(
ItemSharedInfo* shared_info,
const SimdInfo::SimdInt32IndexType* ids)
254 : SimdItem(shared_info,ids) { }
261 return ItemType(
localId(si),m_shared_info);
267 return ItemType(
localId(si),m_shared_info);
282template<
typename ItemType>
284:
public SimdItemDirectBase
294 ARCANE_DEPRECATED_REASON(
"Y2022: Use another constructor")
295 SimdItemDirectT(
const ItemInternalPtr* items,
Int32 base_local_id,
Integer nb_valid)
296 : SimdItemDirectBase(base_local_id,nb_valid,items) {}
301 : SimdItemDirectBase(shared_info,base_local_id,nb_valid) {}
318template<
typename DataType>
321 typedef typename SimdTypeTraits<DataType>::SimdType SimdType;
323 SimdSetter(DataType* ARCANE_RESTRICT _data,
324 const SimdInfo::SimdInt32IndexType& ARCANE_RESTRICT _indexes)
325 : idx(_indexes), m_data(_data)
329 void operator=(
const SimdType& vr)
333 void operator=(
const DataType& v)
339 const SimdInfo::SimdInt32IndexType& ARCANE_RESTRICT idx;
340 DataType* ARCANE_RESTRICT m_data;
349template<
typename DataType>
350class SimdDirectSetter
352 typedef typename SimdTypeTraits<DataType>::SimdType SimdType;
354 SimdDirectSetter(DataType* ARCANE_RESTRICT _data)
357 void operator=(
const SimdType& vr)
362 DataType* ARCANE_RESTRICT m_data;
374class ARCANE_CORE_EXPORT SimdItemEnumeratorBase
375:
public SimdEnumeratorBase
383 typedef SimdInfo::SimdInt32IndexType SimdIndexType;
393 SimdItemEnumeratorBase() =
default;
397 : SimdEnumeratorBase(view.
localIds()), m_shared_info(view.m_shared_info) {}
400 : SimdEnumeratorBase(rhs.m_view.m_local_ids,rhs.
count()), m_shared_info(rhs.m_item.m_shared_info) {}
403 SimdItemEnumeratorBase(
const ItemInternalPtr* items,
const Int32* local_ids,
Integer n)
404 : SimdEnumeratorBase(local_ids,n), m_shared_info(ItemInternalCompatibility::_getSharedInfo(items,n)) { }
406 SimdItemEnumeratorBase(
const ItemInternalArrayView& items,
const Int32ConstArrayView& local_ids)
407 : SimdEnumeratorBase(local_ids), m_shared_info(ItemInternalCompatibility::_getSharedInfo(items.data(),local_ids.size())) { }
413 const ItemInternalPtr*
unguardedItems()
const {
return m_shared_info->m_items_internal.data(); }
426template<
typename ItemType>
427class SimdItemEnumeratorT
428:
public SimdItemEnumeratorBase
438 SimdItemEnumeratorT()
439 : SimdItemEnumeratorBase(){}
441 : SimdItemEnumeratorBase(rhs){}
443 : SimdItemEnumeratorBase(rhs){}
445 : SimdItemEnumeratorBase(rhs) {}
448 SimdItemEnumeratorT(
const ItemInternalPtr* items,
const Int32* local_ids,
Integer n)
449 : SimdItemEnumeratorBase(items,local_ids,n){}
451 SimdItemEnumeratorT(
const ItemInternalArrayView& items,
const Int32ConstArrayView& local_ids)
452 : SimdItemEnumeratorBase(items,local_ids) {}
456 SimdItemType operator*()
const
458 return SimdItemType(m_shared_info,_currentSimdIndex());
471#ifndef ARCANE_SIMD_BENCH
484#ifndef ARCANE_SIMD_BENCH
521template <
typename ItemType>
528 return g._simdEnumerator();
534 return g.enumerator();
540 template <
typename T>
543 return g.enumerator();
550#define ENUMERATE_SIMD_(type, iname, view) \
551 for (A_TRACE_ITEM_ENUMERATOR(SimdItemEnumeratorT<type>) iname(::Arcane::SimdItemEnumeratorContainerTraits<type>::getSimdEnumerator(view) A_TRACE_ENUMERATOR_WHERE); iname.hasNext(); ++iname)
554#define ENUMERATE_SIMD_GENERIC(type, iname, view) \
555 ENUMERATE_SIMD_(type,iname,view)
561#define ENUMERATE_SIMD_NODE(name, group) ENUMERATE_SIMD_(::Arcane::Node, name, group)
567#define ENUMERATE_SIMD_EDGE(name, group) ENUMERATE_SIMD_(::Arcane::Edge, name, group)
573#define ENUMERATE_SIMD_FACE(name, group) ENUMERATE_SIMD_(::Arcane::Face, name, group)
579#define ENUMERATE_SIMD_CELL(name, group) ENUMERATE_SIMD_(::Arcane::Cell, name, group)
585#define ENUMERATE_SIMD_PARTICLE(name, group) ENUMERATE_SIMD_(::Arcane::Particle, name, group)
Référence à un groupe d'un genre donné.
Int32ConstArrayView localIds() const
Tableau des numéros locaux des entités.
Vue sur un tableau typé d'entités.
Classe de base d'un élément de maillage.
Integer nbValid() const
Nombre de valeurs valides pour l'itérateur courant.
Classe gérant un vecteur SIMD d'entité.
const Int32 *ARCANE_RESTRICT localIds() const
Liste des numéros locaux des entités de l'instance.
const SimdIndexType &ARCANE_RESTRICT simdLocalIds() const
Liste des numéros locaux des entités de l'instance.
Int32 localId(Int32 index) const
Numéro local de l'entité d'indice index.
ItemInternal * item(Integer si) const
Partie interne (pour usage interne uniquement)
SimdItemBase(const ItemInternalPtr *items, const SimdIndexType *ids)
Construit une instance.
Int32 baseLocalId() const
Liste des numéros locaux des entités de l'instance.
Integer nbValid() const
Nombre d'entités valides de l'instance.
Index vectoriel sans indirection pour un type d'entité
Gère un vecteur d'entité ItemType.
Index vectoriel avec indirection pour un type d'entité. TODO: stocker les index dans un registre vect...
const SimdIndexType &ARCANE_RESTRICT simdLocalIds() const
Liste des numéros locaux des entités de l'instance.
Gère un vecteur d'entité ItemType.
ItemType operator[](Integer si) const
Retourne la si-ième entité de l'instance.
ItemType item(Integer si) const
Retourne la si-ième entité de l'instance.
Item item(Int32 si) const
inline si-ième entité de l'instance
Item operator[](Int32 si) const
inline si-ième entité de l'instance
SimdItemT< Edge > SimdEdge
Vecteur SIMD de Edge.
SimdItemT< Cell > SimdCell
Vecteur SIMD de Cell.
SimdItemT< Face > SimdFace
Vecteur SIMD de Face.
SimdItemT< Particle > SimdParticle
Vecteur SIMD de Particle.
SimdItemT< Node > SimdNode
Vecteur SIMD de Node.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
std::int32_t Int32
Type entier signé sur 32 bits.