Skip to content

Commit 9916478

Browse files
authoredFeb 14, 2024··
Merge pull request #1181 from arcaneframework/dev/gg-use-one-container-for-all-componentiteminternal
Use only one container for all ComponentItemInternal
2 parents dc78d8a + a364e18 commit 9916478

File tree

3 files changed

+49
-45
lines changed

3 files changed

+49
-45
lines changed
 

‎arcane/src/arcane/materials/ComponentItemInternalData.cc

+39-35
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
22
//-----------------------------------------------------------------------------
3-
// Copyright 2000-2023 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
3+
// Copyright 2000-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
44
// See the top-level COPYRIGHT file for details.
55
// SPDX-License-Identifier: Apache-2.0
66
//-----------------------------------------------------------------------------
77
/*---------------------------------------------------------------------------*/
8-
/* ComponentItemInternalData.cc (C) 2000-2023 */
8+
/* ComponentItemInternalData.cc (C) 2000-2024 */
99
/* */
1010
/* Gestion des listes de 'ComponentItemInternal'. */
1111
/*---------------------------------------------------------------------------*/
@@ -33,8 +33,7 @@ ComponentItemInternalData::
3333
ComponentItemInternalData(MeshMaterialMng* mmg)
3434
: TraceAccessor(mmg->traceMng())
3535
, m_material_mng(mmg)
36-
, m_all_env_items_internal(MemoryUtils::getAllocatorForMostlyReadOnlyData())
37-
, m_env_items_internal(MemoryUtils::getAllocatorForMostlyReadOnlyData())
36+
, m_component_item_internal_storage(MemoryUtils::getAllocatorForMostlyReadOnlyData())
3837
, m_shared_infos(MemoryUtils::getAllocatorForMostlyReadOnlyData())
3938
{
4039
// Il y a une instance pour les MatCell, les EnvCell et les AllEnvCell
@@ -51,19 +50,18 @@ endCreate()
5150
{
5251
const Int32 nb_env = m_material_mng->environments().size();
5352
m_mat_items_internal.clear();
54-
m_mat_items_internal.reserve(nb_env);
55-
auto allocator = MemoryUtils::getAllocatorForMostlyReadOnlyData();
56-
for (Int32 i = 0; i < nb_env; ++i)
57-
m_mat_items_internal.add(UniqueArray<ComponentItemInternal>(allocator));
53+
m_mat_items_internal.resize(nb_env);
5854

5955
_initSharedInfos();
6056
}
6157

6258
/*---------------------------------------------------------------------------*/
6359
/*---------------------------------------------------------------------------*/
64-
60+
/*!
61+
* \brief Réinitialise les ComponentItemInternal.
62+
*/
6563
void ComponentItemInternalData::
66-
_resetEnvItemsInternal()
64+
_resetItemsInternal()
6765
{
6866
ComponentItemSharedInfo* all_env_shared_info = allEnvSharedInfo();
6967
for (ComponentItemInternal& x : m_all_env_items_internal)
@@ -72,21 +70,13 @@ _resetEnvItemsInternal()
7270
ComponentItemSharedInfo* env_shared_info = envSharedInfo();
7371
for (ComponentItemInternal& x : m_env_items_internal)
7472
x._reset(env_shared_info);
75-
}
76-
77-
/*---------------------------------------------------------------------------*/
78-
/*---------------------------------------------------------------------------*/
7973

80-
void ComponentItemInternalData::
81-
_resizeAndResetMatCellForEnvironment(Int32 env_index, Int32 size)
82-
{
83-
m_mat_items_internal[env_index].resize(size);
84-
85-
ArrayView<ComponentItemInternal> mat_items_internal = matItemsInternal(env_index);
86-
ComponentItemSharedInfo* mat_shared_info = matSharedInfo();
87-
for (Integer i = 0; i < size; ++i) {
88-
ComponentItemInternal& ref_ii = mat_items_internal[i];
89-
ref_ii._reset(mat_shared_info);
74+
for (const MeshEnvironment* env : m_material_mng->trueEnvironments()) {
75+
ArrayView<ComponentItemInternal> mat_items_internal = matItemsInternal(env->id());
76+
ComponentItemSharedInfo* mat_shared_info = matSharedInfo();
77+
for (ComponentItemInternal& x : mat_items_internal) {
78+
x._reset(mat_shared_info);
79+
}
9080
}
9181
}
9282

@@ -96,19 +86,33 @@ _resizeAndResetMatCellForEnvironment(Int32 env_index, Int32 size)
9686
void ComponentItemInternalData::
9787
resizeComponentItemInternals(Int32 max_local_id, Int32 total_env_cell)
9888
{
99-
m_all_env_items_internal.resize(max_local_id);
100-
m_env_items_internal.resize(total_env_cell);
101-
102-
// Redimensionne les 'ComponentItemInternal' pour les matériaux des milieux.
103-
// Il faut être certain que le nombre de matériaux par milieu a bien été calculé
104-
// (par exemple par un appel à computeNbMatPerCell()).
105-
for (const MeshEnvironment* env : m_material_mng->trueEnvironments()) {
106-
Integer total_nb_cell_mat = env->totalNbCellMat();
107-
_resizeAndResetMatCellForEnvironment(env->id(), total_nb_cell_mat);
89+
// Calcule le nombre total de ComponentItemInternal dont on a besoin
90+
// Les 'ComponentItemInternal' seront rangés dans 'm_component_item_internal_storage'
91+
// dans l'ordre suivant: AllEnvCell, EnvCell et chaque MatCell
92+
// TODO: Réserver de la place entre les vues pour ne pas être obligé de tout réallouer
93+
// dès qu'un des nombre d'élément change.
94+
Int32 total_nb_internal = 0;
95+
total_nb_internal += max_local_id; // Pour les AllEnvCell
96+
total_nb_internal += total_env_cell; // Pour les EnvCell
97+
for (const MeshEnvironment* env : m_material_mng->trueEnvironments())
98+
total_nb_internal += env->totalNbCellMat();
99+
100+
// Redimensionne le conteneur. Il ne faut plus le modifier ensuite
101+
m_component_item_internal_storage.resize(total_nb_internal);
102+
103+
// Maintenant récupère les vues sur chaque partie de 'm_component_item_internal_storage'
104+
{
105+
m_all_env_items_internal = m_component_item_internal_storage.subView(0, max_local_id);
106+
m_env_items_internal = m_component_item_internal_storage.subView(max_local_id, total_env_cell);
107+
Int32 index_in_container = max_local_id + total_env_cell;
108+
for (const MeshEnvironment* env : m_material_mng->trueEnvironments()) {
109+
Int32 nb_cell_mat = env->totalNbCellMat();
110+
m_mat_items_internal[env->id()] = m_component_item_internal_storage.subView(index_in_container, nb_cell_mat);
111+
index_in_container += nb_cell_mat;
112+
}
108113
}
109114

110-
// Initialise à des valeurs invalides pour détecter les erreurs.
111-
_resetEnvItemsInternal();
115+
_resetItemsInternal();
112116
}
113117

114118
/*---------------------------------------------------------------------------*/

‎arcane/src/arcane/materials/internal/ComponentItemInternalData.h

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
22
//-----------------------------------------------------------------------------
3-
// Copyright 2000-2023 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
3+
// Copyright 2000-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
44
// See the top-level COPYRIGHT file for details.
55
// SPDX-License-Identifier: Apache-2.0
66
//-----------------------------------------------------------------------------
77
/*---------------------------------------------------------------------------*/
8-
/* ComponentItemInternalData.h (C) 2000-2023 */
8+
/* ComponentItemInternalData.h (C) 2000-2024 */
99
/* */
1010
/* Gestion des listes de 'ComponentItemInternal'. */
1111
/*---------------------------------------------------------------------------*/
@@ -87,30 +87,30 @@ class ComponentItemInternalData
8787

8888
MeshMaterialMng* m_material_mng = nullptr;
8989

90+
UniqueArray<ComponentItemInternal> m_component_item_internal_storage;
9091
/*!
9192
* \brief Liste des ComponentItemInternal pour les AllEnvcell.
9293
*
9394
* Les éléments de ce tableau peuvent être indexés directement avec
9495
* le localId() de la maille.
9596
*/
96-
UniqueArray<ComponentItemInternal> m_all_env_items_internal;
97+
ArrayView<ComponentItemInternal> m_all_env_items_internal;
9798

9899
//! Liste des ComponentItemInternal pour chaque milieu
99-
UniqueArray<ComponentItemInternal> m_env_items_internal;
100+
ArrayView<ComponentItemInternal> m_env_items_internal;
100101

101102
//! Liste des ComponentItemInternal pour les matériaux de chaque milieu
102-
UniqueArray<UniqueArray<ComponentItemInternal>> m_mat_items_internal;
103+
UniqueArray<ArrayView<ComponentItemInternal>> m_mat_items_internal;
103104

104105
//! Liste des informations partagées
105106
UniqueArray<ComponentItemSharedInfo> m_shared_infos;
106107

107108
private:
108109

109110
void _initSharedInfos();
110-
//! Redimensionne le nombre de mailles matériaux du \a env_index- ème milieu.
111-
void _resizeAndResetMatCellForEnvironment(Int32 env_index, Int32 size);
111+
void _resetMatItemsInternal(Int32 env_index);
112112
//! Réinitialise les ComponentItemInternal associés aux EnvCell et AllEnvCell
113-
void _resetEnvItemsInternal();
113+
void _resetItemsInternal();
114114
};
115115

116116
/*---------------------------------------------------------------------------*/

‎arcane/src/arcane/tests/accelerator/MeshMaterialAcceleratorUnitTest.cc

+2-2
Original file line numberDiff line numberDiff line change
@@ -590,10 +590,9 @@ _executeTest4(Integer nb_z)
590590
MaterialVariableCellReal& b_ref(m_mat_b_ref);
591591
MaterialVariableCellReal& c_ref(m_mat_c_ref);
592592

593-
CellToAllEnvCellConverter allenvcell_converter(m_mm_mng);
594-
595593
// Ref CPU
596594
for (Integer z=0, iz=nb_z; z<iz; ++z) {
595+
CellToAllEnvCellConverter allenvcell_converter(m_mm_mng);
597596
ENUMERATE_CELL(icell, allCells()) {
598597
Cell cell = * icell;
599598
AllEnvCell all_env_cell = allenvcell_converter[cell];
@@ -691,6 +690,7 @@ _executeTest4(Integer nb_z)
691690
// Another round to test numerical pbs
692691
// Ref CPU
693692
for (Integer z=0, iz=nb_z; z<iz; ++z) {
693+
CellToAllEnvCellConverter allenvcell_converter(m_mm_mng);
694694
ENUMERATE_CELL(icell, allCells()) {
695695
Cell cell = * icell;
696696
AllEnvCell all_env_cell = allenvcell_converter[cell];

0 commit comments

Comments
 (0)
Please sign in to comment.