18
18
#include " arcane/core/IParallelMng.h"
19
19
#include " arcane/core/ISerializer.h"
20
20
#include " arcane/core/IItemFamily.h"
21
- #include " arcane/core/internal/SerializeMessage .h"
21
+ #include " arcane/core/ISerializeMessage .h"
22
22
23
23
#include " arcane/impl/GetVariablesValuesParallelOperation.h"
24
24
25
+ #include " arccore/message_passing/ISerializeMessageList.h"
26
+
25
27
#include < map>
26
28
27
29
/* ---------------------------------------------------------------------------*/
28
30
/* ---------------------------------------------------------------------------*/
29
31
30
32
namespace Arcane
31
33
{
34
+ using namespace MessagePassing ;
32
35
33
36
/* ---------------------------------------------------------------------------*/
34
37
/* ---------------------------------------------------------------------------*/
@@ -106,7 +109,8 @@ getVariableValues(VariableItemReal& variable,
106
109
107
110
UniqueArray<Int32> total_sub_domain_nb_to_send;
108
111
pm->allGatherVariable (sub_domain_nb_to_send, total_sub_domain_nb_to_send);
109
- UniqueArray<ISerializeMessage*> messages;
112
+ UniqueArray<Ref<ISerializeMessage>> messages;
113
+ Ref<ISerializeMessageList> message_list (pm->createSerializeMessageListRef ());
110
114
for (Integer i = 0 , is = total_sub_domain_nb_to_send.size (); i < is; i += 3 ) {
111
115
Int32 rank_send = total_sub_domain_nb_to_send[i];
112
116
Int32 rank_recv = total_sub_domain_nb_to_send[i + 1 ];
@@ -116,14 +120,14 @@ getVariableValues(VariableItemReal& variable,
116
120
// << " N= " << nb_exchange;
117
121
if (rank_send == rank_recv)
118
122
continue ;
119
- SerializeMessage* sm = nullptr ;
123
+ Ref<ISerializeMessage> sm;
120
124
if (rank_recv == my_rank) {
121
125
// trace->info() << " ADD RECV MESSAGE recv=" << rank_recv << " send=" << rank_send;
122
- sm = new SerializeMessage (rank_recv, rank_send, ISerializeMessage::MT_Recv );
126
+ sm = message_list-> createAndAddMessage ( MessageRank ( rank_send), ePointToPointMessageType::MsgReceive );
123
127
}
124
128
else if (rank_send == my_rank) {
125
129
// trace->info() << " ADD SEND MESSAGE recv=" << rank_recv << " send=" << rank_send;
126
- sm = new SerializeMessage (rank_send, rank_recv, ISerializeMessage::MT_Send );
130
+ sm = message_list-> createAndAddMessage ( MessageRank ( rank_recv), ePointToPointMessageType::MsgSend );
127
131
ISerializer* s = sm->serializer ();
128
132
s->setMode (ISerializer::ModeReserve);
129
133
auto xiter = sub_domain_list.find (rank_recv);
@@ -138,24 +142,24 @@ getVariableValues(VariableItemReal& variable,
138
142
s->putInt64 (nb);
139
143
s->putSpan (z_unique_ids);
140
144
}
141
- if (sm)
145
+ if (sm. get () )
142
146
messages.add (sm);
143
147
}
144
148
145
- pm-> processMessages (messages );
149
+ message_list-> waitMessages (eWaitType::WaitAll );
146
150
147
151
UniqueArray<Int64> tmp_unique_ids;
148
152
UniqueArray<Int32> tmp_local_ids;
149
153
UniqueArray<Real> tmp_values;
150
154
151
- UniqueArray<ISerializeMessage* > values_messages;
155
+ UniqueArray<Ref< ISerializeMessage> > values_messages;
152
156
ItemInfoListView items_internal (item_family);
153
- for (ISerializeMessage* sm : messages) {
154
- ISerializeMessage* new_sm = nullptr ;
157
+ for (Ref< ISerializeMessage> sm : messages) {
158
+ Ref< ISerializeMessage> new_sm;
155
159
if (sm->isSend ()) {
156
160
// Pour recevoir les valeurs
157
161
// trace->info() << " ADD RECV2 MESSAGE recv=" << my_rank << " send=" << sm->destSubDomain();
158
- new_sm = new SerializeMessage (my_rank, sm->destination ().value (), ISerializeMessage::MT_Recv );
162
+ new_sm = message_list-> createAndAddMessage ( MessageRank ( sm->destination ().value ()), ePointToPointMessageType::MsgReceive );
159
163
}
160
164
else {
161
165
ISerializer* s = sm->serializer ();
@@ -172,7 +176,7 @@ getVariableValues(VariableItemReal& variable,
172
176
}
173
177
174
178
// trace->info() << " ADD SEND2 MESSAGE recv=" << my_rank << " send=" << sm->destSubDomain();
175
- new_sm = new SerializeMessage (my_rank, sm->destination ().value (), ISerializeMessage::MT_Send );
179
+ new_sm = message_list-> createAndAddMessage ( MessageRank ( sm->destination ().value ()), ePointToPointMessageType::MsgSend );
176
180
ISerializer* s2 = new_sm->serializer ();
177
181
s2->setMode (ISerializer::ModeReserve);
178
182
s2->reserveInt64 (1 );
@@ -186,11 +190,11 @@ getVariableValues(VariableItemReal& variable,
186
190
}
187
191
188
192
// Supprime les messages qui ne sont plus utilisés
189
- _deleteMessages ( messages);
193
+ messages. clear ( );
190
194
191
- pm-> processMessages (values_messages );
195
+ message_list-> waitMessages (eWaitType::WaitAll );
192
196
193
- for (ISerializeMessage* sm : values_messages) {
197
+ for (Ref< ISerializeMessage> sm : values_messages) {
194
198
if (sm->isSend ()) {
195
199
}
196
200
else {
@@ -222,7 +226,8 @@ getVariableValues(VariableItemReal& variable,
222
226
}
223
227
224
228
// Supprime les messages qui ne sont plus utilisés
225
- _deleteMessages (values_messages);
229
+ values_messages.clear ();
230
+ // _deleteMessages(values_messages);
226
231
227
232
#if 0
228
233
{
@@ -308,17 +313,6 @@ getVariableValues(VariableItemReal& variable, Int64ConstArrayView unique_ids,
308
313
/* ---------------------------------------------------------------------------*/
309
314
/* ---------------------------------------------------------------------------*/
310
315
311
- void GetVariablesValuesParallelOperation::
312
- _deleteMessages (Array<ISerializeMessage*>& messages)
313
- {
314
- for (ISerializeMessage* sm : messages)
315
- delete sm;
316
- messages.clear ();
317
- }
318
-
319
- /* ---------------------------------------------------------------------------*/
320
- /* ---------------------------------------------------------------------------*/
321
-
322
316
template <class Type > void GetVariablesValuesParallelOperation::
323
317
_getVariableValues (ItemVariableScalarRefT<Type>& variable,
324
318
Int64ConstArrayView unique_ids,
@@ -330,7 +324,7 @@ _getVariableValues(ItemVariableScalarRefT<Type>& variable,
330
324
IItemFamily* item_family = group.itemFamily ();
331
325
332
326
// Pour éviter un bug MPI sur certaines machines,
333
- // si la liste est vide, on créé une liste temporaire
327
+ // si la liste est vide, on crée une liste temporaire
334
328
UniqueArray<Int64> dummy_unique_ids;
335
329
UniqueArray<Real> dummy_values;
336
330
if (unique_ids.empty ()) {
0 commit comments