Arcane  v3.16.0.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
BlockIndexList.h
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/* BlockIndexList.h (C) 2000-2023 */
9/* */
10/* Classe gérant un tableau d'indices sous la forme d'une liste de blocs. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_BLOCKINDEXLIST_H
13#define ARCANE_BLOCKINDEXLIST_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/TraceAccessor.h"
18#include "arcane/utils/UniqueArray.h"
19
20#include "arcane/ArcaneTypes.h"
21
22/*---------------------------------------------------------------------------*/
23/*---------------------------------------------------------------------------*/
24
25namespace Arcane
26{
27
28/*---------------------------------------------------------------------------*/
29/*---------------------------------------------------------------------------*/
30/*!
31 * \internal
32 * \brief Bloc contenant une une liste d'indices avec un offset.
33 * \warning Experimental API
34 */
35class ARCANE_CORE_EXPORT BlockIndex
36{
37 friend class BlockIndexList;
38
39 public:
40
41 static constexpr Int16 MAX_BLOCK_SIZE = 512;
42
43 private:
44
45 BlockIndex(const Int32* ptr, Int32 value_offset, Int16 size)
46 : m_block_start(ptr)
47 , m_value_offset(value_offset)
48 , m_size(size)
49 {}
50
51 public:
52
53 //! i-ème valeur du bloc
55 {
56 ARCANE_CHECK_AT(i, m_size);
57 return m_block_start[i] + m_value_offset;
58 }
59
60 //! Taille du bloc
61 Int16 size() const { return m_size; }
62
63 //! Offset des valeurs du bloc.
64 Int32 valueOffset() const { return m_value_offset; }
65
66 private:
67
68 const Int32* m_block_start = nullptr;
69 Int32 m_value_offset = 0;
70 Int16 m_size = 0;
71};
72
73/*---------------------------------------------------------------------------*/
74/*---------------------------------------------------------------------------*/
75/*!
76 * \internal
77 * \brief Classe gérant un tableau sous la forme d'une liste de blocs.
78 * \warning Experimental API
79 */
80class ARCANE_CORE_EXPORT BlockIndexList
81{
82 friend class BlockIndexListBuilder;
83
84 // TODO: pouvoir choisir un allocateur avec support accélérateur.
85
86 public:
87
88 Int32 nbBlock() const { return m_nb_block; }
89 Real memoryRatio() const;
90 void reset();
91 BlockIndex block(Int32 i) const
92 {
93 Int32 index = m_blocks_index_and_offset[i * 2];
94 Int32 offset = m_blocks_index_and_offset[(i * 2) + 1];
95 Int16 size = ((i + 1) != m_nb_block) ? m_block_size : m_last_block_size;
96 return BlockIndex(m_indexes.span().ptrAt(index), offset, size);
97 }
98 void fillArray(Array<Int32>& v);
99
100 private:
101
102 //! Liste des indexes
103 UniqueArray<Int32> m_indexes;
104 // Index dans 'm_indexes' et offset de chaque bloc
105 UniqueArray<Int32> m_blocks_index_and_offset;
106 //! Taille d'origine du tableau d'indices
107 Int32 m_original_size = 0;
108 //! Nombre de blocs (m_original_size/m_block_size arrondi au supérieur)
109 Int32 m_nb_block = 0;
110 //! Taille d'un bloc.
111 Int16 m_block_size = 0;
112 //! Taille du dernier bloc.
113 Int16 m_last_block_size = 0;
114
115 private:
116
117 void _setBlockIndexAndOffset(Int32 block, Int32 index, Int32 offset);
118 void _setNbBlock(Int32 nb_block);
119 Int32 _currentIndexPosition() const;
120 void _addBlockInfo(const Int32* data, Int16 size);
121 Int32 _computeNbContigusBlock() const;
122};
123
124/*---------------------------------------------------------------------------*/
125/*---------------------------------------------------------------------------*/
126/*!
127 * \internal
128 * \brief Classe permettant de construire un BlockIndexList.
129 * \warning Experimental API
130 */
131class ARCANE_CORE_EXPORT BlockIndexListBuilder
132: public TraceAccessor
133{
134 public:
135
136 BlockIndexListBuilder(ITraceMng* tm);
137
138 public:
139
140 void setVerbose(bool v) { m_is_verbose = v; }
141
142 /*!
143 * \brief Positionne la taille de bloc sous la forme d'une puissance de 2.
144 *
145 * La taille d'un bloc sera égal à 2 ^ \a v.
146 * Si \a v==0, la taille du bloc est de 1, si \a v==1, la taille est de 2,
147 * si \a v==2 la taille est de 4, si \a v==3 la taille est de 8 et ainsi de suite.
148 */
150
151 public:
152
153 void build(BlockIndexList& block_index_list, SmallSpan<const Int32> indexes, const String& name);
154
155 private:
156
157 bool m_is_verbose = false;
158 Int16 m_block_size = 32;
159
160 private:
161
162 void _throwInvalidBlockSize [[noreturn]] (Int32 block_size);
163};
164
165/*---------------------------------------------------------------------------*/
166/*---------------------------------------------------------------------------*/
167
168} // namespace Arcane
169
170/*---------------------------------------------------------------------------*/
171/*---------------------------------------------------------------------------*/
172
173#endif
Classe de base des vecteurs 1D de données.
void setBlockSizeAsPowerOfTwo(Int32 v)
Positionne la taille de bloc sous la forme d'une puissance de 2.
Int32 valueOffset() const
Offset des valeurs du bloc.
Int16 size() const
Taille du bloc.
Int32 operator[](Int32 i) const
i-ème valeur du bloc
Interface du gestionnaire de traces.
Vue d'un tableau d'éléments de type T.
Definition Span.h:673
Chaîne de caractères unicode.
TraceAccessor(ITraceMng *m)
Construit un accesseur via le gestionnaire de trace m.
Vecteur 1D de données avec sémantique par valeur (style STL).
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
std::int16_t Int16
Type entier signé sur 16 bits.
double Real
Type représentant un réel.
std::int32_t Int32
Type entier signé sur 32 bits.