Skip to content

Commit cc00e61

Browse files
Merge pull request #1991 from arcaneframework/dev/gg-use-first-node-to-sort-in-itemownerbuilder
Use uniqueId() of first node to sort items in ItemsOwnerBuilder
2 parents 04878b3 + 9a579d4 commit cc00e61

File tree

1 file changed

+32
-7
lines changed

1 file changed

+32
-7
lines changed

arcane/src/arcane/mesh/ItemsOwnerBuilder.cc

+32-7
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-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
3+
// Copyright 2000-2025 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-
/* ItemsOwnerBuilder.cc (C) 2000-2024 */
8+
/* ItemsOwnerBuilder.cc (C) 2000-2025 */
99
/* */
1010
/* Classe pour calculer les propriétaires des entités. */
1111
/*---------------------------------------------------------------------------*/
@@ -68,13 +68,26 @@ class ItemsOwnerBuilderImpl
6868
: public TraceAccessor
6969
{
7070
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+
*/
7183
class ItemOwnerInfo
7284
{
7385
public:
7486

7587
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)
7789
: m_item_uid(item_uid)
90+
, m_first_node_uid(first_node_uid)
7891
, m_cell_uid(cell_uid)
7992
, m_item_sender_rank(sender_rank)
8093
, m_cell_owner(cell_owner)
@@ -83,9 +96,15 @@ class ItemsOwnerBuilderImpl
8396

8497
public:
8598

99+
//! uniqueId() de l'entité
86100
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
87104
Int64 m_cell_uid = NULL_ITEM_UNIQUE_ID;
105+
//! rang de celui qui a créé cette instance
88106
Int32 m_item_sender_rank = A_NULL_RANK;
107+
//! Propriétaire de la maille connectée à cette entité
89108
Int32 m_cell_owner = A_NULL_RANK;
90109
};
91110

@@ -121,6 +140,11 @@ class ItemsOwnerBuilderImpl::ItemOwnerInfoSortTraits
121140

122141
static bool compareLess(const ItemOwnerInfo& k1, const ItemOwnerInfo& k2)
123142
{
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+
124148
if (k1.m_item_uid < k2.m_item_uid)
125149
return true;
126150
if (k1.m_item_uid > k2.m_item_uid)
@@ -156,7 +180,7 @@ class ItemsOwnerBuilderImpl::ItemOwnerInfoSortTraits
156180
}
157181
static ItemOwnerInfo maxValue()
158182
{
159-
return ItemOwnerInfo(INT64_MAX, INT64_MAX, INT32_MAX, INT32_MAX);
183+
return ItemOwnerInfo(INT64_MAX, INT64_MAX, INT64_MAX, INT32_MAX, INT32_MAX);
160184
}
161185
static bool isValid(const ItemOwnerInfo& fsi)
162186
{
@@ -217,7 +241,7 @@ computeFacesOwner()
217241
for (Cell cell : face.cells()) {
218242
if (verbose_level >= 2)
219243
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()));
221245
}
222246
}
223247

@@ -249,7 +273,8 @@ _sortInfos()
249273
info() << "END_ALL_ITEM_OWNER_SORTER time=" << (Real)(sort_end_time - sort_begin_time);
250274
if (verbose_level >= 2)
251275
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;
253278
}
254279
}
255280

@@ -338,7 +363,7 @@ _processSortedInfos(ItemInternalMap& items_map)
338363
}
339364

340365
auto exchanger{ ParallelMngUtils::createExchangerRef(pm) };
341-
366+
info() << "NbResendRanks=" << resend_items_owner_info_map.size();
342367
for (const auto& [key, value] : resend_items_owner_info_map) {
343368
if (verbose_level >= 1)
344369
info() << "RESEND_INFO to_rank=" << key << " nb=" << value.size();

0 commit comments

Comments
 (0)