1
1
// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2
2
// -----------------------------------------------------------------------------
3
- // Copyright 2000-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
3
+ // Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4
4
// See the top-level COPYRIGHT file for details.
5
5
// SPDX-License-Identifier: Apache-2.0
6
6
// -----------------------------------------------------------------------------
7
7
/* ---------------------------------------------------------------------------*/
8
- /* ItemsOwnerBuilder.cc (C) 2000-2024 */
8
+ /* ItemsOwnerBuilder.cc (C) 2000-2025 */
9
9
/* */
10
10
/* Classe pour calculer les propriétaires des entités. */
11
11
/* ---------------------------------------------------------------------------*/
@@ -68,13 +68,26 @@ class ItemsOwnerBuilderImpl
68
68
: public TraceAccessor
69
69
{
70
70
class ItemOwnerInfoSortTraits ;
71
+
72
+ /* !
73
+ * \brief Informations sur une entité partagée.
74
+ *
75
+ * On conserve dans l'instance le uniqueId() du premier noeud
76
+ * de l'entité et on s'en sert comme clé primaire pour le tri.
77
+ * En général, les noeuds dont le uniqueId() est proche sont dans le même
78
+ * sous-domaine. Comme on se sert de cette valeur comme clé primaire
79
+ * du tri, cela permet de garantir une certaine cohérence topologique
80
+ * des entités distribuées et ainsi éviter de faire un all-to-all qui
81
+ * concerne un grand nombre de rangs.
82
+ */
71
83
class ItemOwnerInfo
72
84
{
73
85
public:
74
86
75
87
ItemOwnerInfo () = default ;
76
- ItemOwnerInfo (Int64 item_uid, Int64 cell_uid, Int32 sender_rank, Int32 cell_owner)
88
+ ItemOwnerInfo (Int64 item_uid, Int64 first_node_uid, Int64 cell_uid, Int32 sender_rank, Int32 cell_owner)
77
89
: m_item_uid(item_uid)
90
+ , m_first_node_uid(first_node_uid)
78
91
, m_cell_uid(cell_uid)
79
92
, m_item_sender_rank(sender_rank)
80
93
, m_cell_owner(cell_owner)
@@ -83,9 +96,15 @@ class ItemsOwnerBuilderImpl
83
96
84
97
public:
85
98
99
+ // ! uniqueId() de l'entité
86
100
Int64 m_item_uid = NULL_ITEM_UNIQUE_ID;
101
+ // ! uniqueId() du premier noeud de l'entité
102
+ Int64 m_first_node_uid = NULL_ITEM_UNIQUE_ID;
103
+ // ! uniqueId() de la maille à laquelle l'entité appartient
87
104
Int64 m_cell_uid = NULL_ITEM_UNIQUE_ID;
105
+ // ! rang de celui qui a créé cette instance
88
106
Int32 m_item_sender_rank = A_NULL_RANK;
107
+ // ! Propriétaire de la maille connectée à cette entité
89
108
Int32 m_cell_owner = A_NULL_RANK;
90
109
};
91
110
@@ -121,6 +140,11 @@ class ItemsOwnerBuilderImpl::ItemOwnerInfoSortTraits
121
140
122
141
static bool compareLess (const ItemOwnerInfo& k1, const ItemOwnerInfo& k2)
123
142
{
143
+ if (k1.m_first_node_uid < k2.m_first_node_uid )
144
+ return true ;
145
+ if (k1.m_first_node_uid > k2.m_first_node_uid )
146
+ return false ;
147
+
124
148
if (k1.m_item_uid < k2.m_item_uid )
125
149
return true ;
126
150
if (k1.m_item_uid > k2.m_item_uid )
@@ -156,7 +180,7 @@ class ItemsOwnerBuilderImpl::ItemOwnerInfoSortTraits
156
180
}
157
181
static ItemOwnerInfo maxValue ()
158
182
{
159
- return ItemOwnerInfo (INT64_MAX, INT64_MAX, INT32_MAX, INT32_MAX);
183
+ return ItemOwnerInfo (INT64_MAX, INT64_MAX, INT64_MAX, INT32_MAX, INT32_MAX);
160
184
}
161
185
static bool isValid (const ItemOwnerInfo& fsi)
162
186
{
@@ -217,7 +241,7 @@ computeFacesOwner()
217
241
for (Cell cell : face.cells ()) {
218
242
if (verbose_level >= 2 )
219
243
info () << " ADD lid=" << lid << " uid=" << face_uid << " cell_uid=" << cell.uniqueId () << " owner=" << cell.owner ();
220
- m_items_owner_info.add (ItemOwnerInfo (face_uid, cell.uniqueId (), my_rank, cell.owner ()));
244
+ m_items_owner_info.add (ItemOwnerInfo (face_uid, face. node ( 0 ). uniqueId (), cell.uniqueId (), my_rank, cell.owner ()));
221
245
}
222
246
}
223
247
@@ -249,7 +273,8 @@ _sortInfos()
249
273
info () << " END_ALL_ITEM_OWNER_SORTER time=" << (Real)(sort_end_time - sort_begin_time);
250
274
if (verbose_level >= 2 )
251
275
for (const ItemOwnerInfo& x : m_items_owner_info) {
252
- info () << " Sorted item_uid=" << x.m_item_uid << " cell_uid=" << x.m_cell_uid << " owner=" << x.m_cell_owner ;
276
+ info () << " Sorted first_node_uid=" << x.m_first_node_uid << " item_uid="
277
+ << x.m_item_uid << " cell_uid=" << x.m_cell_uid << " owner=" << x.m_cell_owner ;
253
278
}
254
279
}
255
280
@@ -338,7 +363,7 @@ _processSortedInfos(ItemInternalMap& items_map)
338
363
}
339
364
340
365
auto exchanger{ ParallelMngUtils::createExchangerRef (pm) };
341
-
366
+ info () << " NbResendRanks= " << resend_items_owner_info_map. size ();
342
367
for (const auto & [key, value] : resend_items_owner_info_map) {
343
368
if (verbose_level >= 1 )
344
369
info () << " RESEND_INFO to_rank=" << key << " nb=" << value.size ();
0 commit comments