1
1
// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2
2
// -----------------------------------------------------------------------------
3
- // Copyright 2000-2022 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
3
+ // Copyright 2000-2024 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
- /* ParallelDataReader.cc (C) 2000-2022 */
8
+ /* ParallelDataReader.cc (C) 2000-2024 */
9
9
/* */
10
10
/* Lecteur de IData en parallèle. */
11
11
/* ---------------------------------------------------------------------------*/
15
15
16
16
#include " arcane/utils/ScopedPtr.h"
17
17
#include " arcane/utils/FatalErrorException.h"
18
-
19
- #include " arcane/IParallelMng.h"
20
- #include " arcane/IParallelExchanger.h"
21
- #include " arcane/ISerializer.h"
22
- #include " arcane/ISerializeMessage.h"
23
- #include " arcane/SerializeBuffer.h"
24
- #include " arcane/IData.h"
25
- #include " arcane/parallel/BitonicSortT.H"
26
- #include " arcane/ParallelMngUtils.h"
18
+ #include " arcane/utils/FixedArray.h"
19
+ #include " arcane/utils/CheckedConvert.h"
20
+
21
+ #include " arcane/core/IParallelMng.h"
22
+ #include " arcane/core/IParallelExchanger.h"
23
+ #include " arcane/core/ISerializer.h"
24
+ #include " arcane/core/ISerializeMessage.h"
25
+ #include " arcane/core/SerializeBuffer.h"
26
+ #include " arcane/core/IData.h"
27
+ #include " arcane/core/parallel/BitonicSortT.H"
28
+ #include " arcane/core/ParallelMngUtils.h"
27
29
28
30
/* ---------------------------------------------------------------------------*/
29
31
/* ---------------------------------------------------------------------------*/
30
32
31
33
namespace Arcane
32
34
{
33
35
34
- /* ---------------------------------------------------------------------------*/
35
- /* ---------------------------------------------------------------------------*/
36
- // Dichotomie
37
- // Les xx doivent etre croissants
38
- template <typename T>
39
- class Bissection
40
- {
41
- public:
42
- static Integer locate (ConstArrayView<T> xx, T x)
43
- {
44
- Integer n = xx.size ();
45
- if (x<xx[0 ] || x>xx[n-1 ])
46
- return (-1 );
47
- if (x==xx[0 ])
48
- return 0 ;
49
- if (x==xx[n-1 ])
50
- return (n-1 );
51
- Integer jl = 0 ;
52
- Integer ju = n;
53
- while (ju-jl > 1 ) {
54
- Integer jm = (ju+jl) >> 1 ;
55
- if (x >= xx[jm])
56
- jl = jm;
57
- else
58
- ju = jm;
59
- }
60
- return jl;
61
- }
62
- };
63
-
64
36
/* ---------------------------------------------------------------------------*/
65
37
/* ---------------------------------------------------------------------------*/
66
38
/* !
@@ -84,34 +56,39 @@ class ParallelDataReader::Impl
84
56
: public TraceAccessor
85
57
{
86
58
public:
87
- Impl (IParallelMng* pm);
59
+
60
+ explicit Impl (IParallelMng* pm);
61
+
88
62
public:
89
63
90
64
Int64Array& writtenUniqueIds () { return m_written_unique_ids; }
91
65
Int64Array& wantedUniqueIds () { return m_wanted_unique_ids; }
92
66
93
67
private:
94
68
95
- IParallelMng* m_parallel_mng;
69
+ IParallelMng* m_parallel_mng = nullptr ;
96
70
97
71
Int32UniqueArray m_data_to_send_ranks;
98
72
// TODO ne pas utiliser un tableau dimensionné au commSize()
99
- UniqueArray< SharedArray<Int32> > m_data_to_send_local_indexes;
100
- UniqueArray< SharedArray<Int32> > m_data_to_recv_indexes;
73
+ UniqueArray<SharedArray<Int32>> m_data_to_send_local_indexes;
74
+ UniqueArray<SharedArray<Int32>> m_data_to_recv_indexes;
101
75
Int64UniqueArray m_written_unique_ids;
102
76
Int64UniqueArray m_wanted_unique_ids;
103
77
Int32UniqueArray m_local_send_indexes;
104
78
105
79
public:
106
80
107
- public:
108
81
void sort ();
82
+
109
83
public:
110
- void getSortedValues (IData* written_data,IData* data);
84
+
85
+ void getSortedValues (IData* written_data, IData* data);
86
+
111
87
private:
88
+
112
89
void _searchUniqueIdIndexes (Int64ConstArrayView recv_uids,
113
90
Int64ConstArrayView written_unique_ids,
114
- Int32Array& indexes);
91
+ Int32Array& indexes) const ;
115
92
};
116
93
117
94
/* ---------------------------------------------------------------------------*/
@@ -132,20 +109,23 @@ ParallelDataReader::
132
109
delete m_p;
133
110
}
134
111
135
- Int64Array& ParallelDataReader::writtenUniqueIds ()
112
+ Array<Int64>& ParallelDataReader::
113
+ writtenUniqueIds ()
136
114
{
137
115
return m_p->writtenUniqueIds ();
138
116
}
139
- Int64Array & ParallelDataReader::
117
+ Array<Int64> & ParallelDataReader::
140
118
wantedUniqueIds ()
141
119
{
142
120
return m_p->wantedUniqueIds ();
143
121
}
144
- void ParallelDataReader::sort ()
122
+ void ParallelDataReader::
123
+ sort ()
145
124
{
146
125
return m_p->sort ();
147
126
}
148
- void ParallelDataReader::getSortedValues (IData* written_data,IData* data)
127
+ void ParallelDataReader::
128
+ getSortedValues (IData* written_data, IData* data)
149
129
{
150
130
m_p->getSortedValues (written_data,data);
151
131
}
@@ -166,14 +146,14 @@ Impl(IParallelMng* pm)
166
146
void ParallelDataReader::Impl::
167
147
sort ()
168
148
{
169
- Integer nb_wanted_uid = m_wanted_unique_ids.size ();
170
-
171
- Integer nb_rank = m_parallel_mng->commSize ();
172
- Integer my_rank = m_parallel_mng->commRank ();
149
+ Int32 nb_wanted_uid = m_wanted_unique_ids.size ();
150
+
151
+ Int32 nb_rank = m_parallel_mng->commSize ();
152
+ Int32 my_rank = m_parallel_mng->commRank ();
173
153
174
154
Int64UniqueArray global_min_max_uid (nb_rank*2 );
175
155
{
176
- Int64 min_max_written_uid[ 2 ] ;
156
+ FixedArray< Int64, 2 > min_max_written_uid ;
177
157
min_max_written_uid[0 ] = NULL_ITEM_UNIQUE_ID;
178
158
min_max_written_uid[1 ] = NULL_ITEM_UNIQUE_ID;
179
159
Integer nb_written_uid = m_written_unique_ids.size ();
@@ -184,18 +164,15 @@ sort()
184
164
min_max_written_uid[0 ] = m_written_unique_ids[0 ];
185
165
min_max_written_uid[1 ] = m_written_unique_ids[nb_written_uid-1 ];
186
166
}
187
- m_parallel_mng->allGather (Int64ConstArrayView ( 2 , min_max_written_uid), global_min_max_uid);
167
+ m_parallel_mng->allGather (min_max_written_uid. view (), global_min_max_uid);
188
168
}
189
169
for ( Integer irank=0 ; irank<nb_rank; ++irank )
190
170
info (5 ) << " MIN_MAX_UIDS p=" << irank << " min=" << global_min_max_uid[irank*2 ]
191
171
<< " max=" << global_min_max_uid[(irank*2 )+1 ];
192
172
193
173
m_data_to_recv_indexes.resize (nb_rank);
194
- // Int32UniqueArray senders_rank(nb_rank);
195
- // senders_rank.fill(-1);
196
174
{
197
175
UniqueArray< SharedArray<Int64> > uids_list (nb_rank);
198
- // Integer current_sender = 0;
199
176
auto exchanger { ParallelMngUtils::createExchangerRef (m_parallel_mng) };
200
177
for ( Integer i=0 ; i<nb_wanted_uid; ++i ){
201
178
Int64 uid = m_wanted_unique_ids[i];
@@ -214,8 +191,6 @@ sort()
214
191
if (rank!=my_rank){
215
192
if (uids_list[rank].empty ()){
216
193
exchanger->addSender (rank);
217
- // senders_rank[rank] = current_sender;
218
- // uids_list.add(Int64UniqueArray());
219
194
}
220
195
uids_list[rank].add (uid);
221
196
}
@@ -231,17 +206,10 @@ sort()
231
206
ISerializeMessage* send_msg = exchanger->messageToSend (i);
232
207
Int32 dest_rank = senders[i];
233
208
ISerializer* serializer = send_msg->serializer ();
234
- // Integer nb_to_send = uids_list[dest_rank].size();
235
- // indexes_to_recv[i] = own_indexes_list[dest_rank]; //indexes_list[dest_rank];
236
- // ranks_to_recv[i] = dest_rank;
237
209
serializer->setMode (ISerializer::ModeReserve);
238
- // serializer->reserveInteger(1);
239
- // serializer->reserve(DT_Int32,nb_to_send);
240
210
serializer->reserveArray (uids_list[dest_rank]);
241
211
serializer->allocateBuffer ();
242
212
serializer->setMode (ISerializer::ModePut);
243
- // serializer->putInteger(nb_to_send);
244
- // serializer->put(indexes_list[dest_rank]);
245
213
serializer->putArray (uids_list[dest_rank]);
246
214
#if 0
247
215
for( Integer z=0; z<nb_to_send; ++z ){
@@ -268,15 +236,6 @@ sort()
268
236
Int64UniqueArray recv_uids;
269
237
serializer->getArray (recv_uids);
270
238
Int64 nb_to_recv = recv_uids.largeSize ();
271
- // Int32ArrayView own_group_local_ids = own_group.internal()->itemsLocalId();
272
- // info() << " RECEIVE FROM A: NB_TO_RECEIVE " << nb_to_recv << " S2=" << own_group_local_ids.size();
273
- // for( Integer z=0; z<nb_to_recv; ++z ){
274
- // Integer index = recv_indexes[z];
275
- // info() << " RECV Z=" << z << " RANK=" << orig_rank << " index=" << index
276
- // << " index2=" << own_group_local_ids[index];
277
- // recv_indexes[z] = own_group_local_ids[index];
278
- // }
279
- // info() << "READ END RECEIVE FROM A: NB_TO_RECEIVE " << nb_to_recv;
280
239
281
240
m_data_to_send_local_indexes[i].resize (nb_to_recv);
282
241
_searchUniqueIdIndexes (recv_uids,m_written_unique_ids,m_data_to_send_local_indexes[i]);
@@ -285,7 +244,6 @@ sort()
285
244
286
245
// Traite les données qui sont déjà présentes sur ce processeur.
287
246
{
288
- Integer my_rank = m_parallel_mng->commRank ();
289
247
Int32Array& local_recv_indexes = m_data_to_recv_indexes[my_rank];
290
248
Integer nb_local_index = local_recv_indexes.size ();
291
249
if (nb_local_index>0 ){
@@ -334,17 +292,9 @@ getSortedValues(IData* written_data,IData* data)
334
292
// Traite les données qui sont déjà présente sur ce processeur.
335
293
{
336
294
Integer my_rank = m_parallel_mng->commRank ();
337
- Int32Array& local_recv_indexes = m_data_to_recv_indexes[my_rank];
295
+ ConstArrayView<Int32> local_recv_indexes = m_data_to_recv_indexes[my_rank];
338
296
Integer nb_local_index = local_recv_indexes.size ();
339
297
if (nb_local_index>0 ){
340
- // Int32UniqueArray local_send_indexes(nb_local_index);
341
- // Int64UniqueArray uids(nb_local_index);
342
-
343
- // for( Integer i=0; i<nb_local_index; ++i ){
344
- // uids[i] = m_wanted_unique_ids[local_recv_indexes[i]];
345
- // }
346
- // _searchUniqueIdIndexes(uids,m_written_unique_ids,local_send_indexes);
347
-
348
298
// info() << "SERIALIZE RESERVE";
349
299
SerializeBuffer sbuf;
350
300
sbuf.setMode (ISerializer::ModeReserve);
@@ -379,20 +329,21 @@ getSortedValues(IData* written_data,IData* data)
379
329
void ParallelDataReader::Impl::
380
330
_searchUniqueIdIndexes (Int64ConstArrayView recv_uids,
381
331
Int64ConstArrayView written_unique_ids,
382
- Int32Array & indexes)
332
+ Array<Int32> & indexes) const
383
333
{
384
334
Integer nb_to_recv = recv_uids.size ();
385
335
Integer nb_written_uid = written_unique_ids.size ();
386
336
387
337
for ( Integer irecv=0 ; irecv<nb_to_recv; ++irecv ){
388
- // Integer my_index = -1;
389
338
Int64 my_uid = recv_uids[irecv];
390
- // Comme les writtent_unique_ids sont triés, on peut utiliser une dichotomie
391
- Integer my_index = Bissection<Int64>::locate (written_unique_ids,my_uid);
392
- // info() << "MY_INDEX=" << my_index << " my_uid=" << my_uid;
393
- if (my_index==(-1 ))
394
- ARCANE_FATAL (" Can not find uid uid={0} (index={1})" ,my_uid,my_index);
395
- // info() << "MY_INDEX2=" << my_index << " my_uid=" << my_uid;
339
+ // Comme les written_unique_ids sont triés, on peut utiliser une dichotomie
340
+ auto iter_end = written_unique_ids.end ();
341
+ auto iter_begin = written_unique_ids.begin ();
342
+ auto x2 = std::lower_bound (iter_begin, iter_end, my_uid);
343
+ if (x2 == iter_end)
344
+ ARCANE_FATAL (" Can not find uid uid={0} (with binary_search)" , my_uid);
345
+ Int32 my_index = CheckedConvert::toInt32 (x2 - iter_begin);
346
+
396
347
// Teste si la dichotomie est correcte
397
348
if (written_unique_ids[my_index]!=my_uid)
398
349
ARCANE_FATAL (" INTERNAL: bad index for bissection "
0 commit comments