Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Whitespaces!
[simgrid.git] / src / smpi / bindings / smpi_pmpi_win.cpp
1 /* Copyright (c) 2007-2021. The SimGrid Team. All rights reserved.          */
2
3 /* This program is free software; you can redistribute it and/or modify it
4  * under the terms of the license (GNU LGPL) which comes with this package. */
5
6 #include "private.hpp"
7 #include "smpi_coll.hpp"
8 #include "smpi_comm.hpp"
9 #include "smpi_datatype_derived.hpp"
10 #include "smpi_op.hpp"
11 #include "smpi_win.hpp"
12 #include "src/smpi/include/smpi_actor.hpp"
13
14 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(smpi_pmpi);
15
16 #define CHECK_RMA\
17   CHECK_BUFFER(1, origin_addr, origin_count)\
18   CHECK_COUNT(2, origin_count)\
19   CHECK_TYPE(3, origin_datatype)\
20   CHECK_PROC(4, target_rank)\
21   CHECK_NEGATIVE(4, MPI_ERR_RANK, target_rank)\
22   CHECK_COUNT(6, target_count)\
23   CHECK_TYPE(7, target_datatype)
24
25 #define CHECK_TARGET_DISP(num)\
26   if(win->dynamic()==0)\
27     CHECK_NEGATIVE((num), MPI_ERR_RMA_RANGE, target_disp)
28
29 /* PMPI User level calls */
30
31 int PMPI_Win_create( void *base, MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm, MPI_Win *win){
32   int retval = 0;
33   CHECK_COMM(5)
34   CHECK_NEGATIVE(2, MPI_ERR_OTHER, size)
35   CHECK_NEGATIVE(3, MPI_ERR_OTHER, disp_unit)
36   smpi_bench_end();
37   if (base == nullptr && size != 0){
38     retval= MPI_ERR_OTHER;
39   }else{
40     *win = new simgrid::smpi::Win( base, size, disp_unit, info, comm);
41     retval = MPI_SUCCESS;
42   }
43   smpi_bench_begin();
44   return retval;
45 }
46
47 int PMPI_Win_allocate( MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm, void *base, MPI_Win *win){
48   CHECK_COMM(5)
49   CHECK_NEGATIVE(2, MPI_ERR_OTHER, size)
50   CHECK_NEGATIVE(3, MPI_ERR_OTHER, disp_unit)
51   void* ptr = xbt_malloc(size);
52   smpi_bench_end();
53   *static_cast<void**>(base) = ptr;
54   *win = new simgrid::smpi::Win( ptr, size, disp_unit, info, comm,1);
55   smpi_bench_begin();
56   return MPI_SUCCESS;
57 }
58
59 int PMPI_Win_allocate_shared( MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm, void *base, MPI_Win *win){
60   CHECK_COMM(5)
61   CHECK_NEGATIVE(2, MPI_ERR_OTHER, size)
62   CHECK_NEGATIVE(3, MPI_ERR_OTHER, disp_unit)
63   void* ptr = nullptr;
64   int rank = comm->rank();
65   if(rank==0){
66      ptr = xbt_malloc(size*comm->size());
67   }
68   smpi_bench_end();
69   simgrid::smpi::colls::bcast(&ptr, sizeof(void*), MPI_BYTE, 0, comm);
70   simgrid::smpi::colls::barrier(comm);
71   *static_cast<void**>(base) = (char*)ptr+rank*size;
72   *win = new simgrid::smpi::Win( ptr, size, disp_unit, info, comm,rank==0);
73   smpi_bench_begin();
74   return MPI_SUCCESS;
75 }
76
77 int PMPI_Win_create_dynamic( MPI_Info info, MPI_Comm comm, MPI_Win *win){
78   CHECK_COMM(2)
79   smpi_bench_end();
80   *win = new simgrid::smpi::Win(info, comm);
81   smpi_bench_begin();
82   return MPI_SUCCESS;
83 }
84
85 int PMPI_Win_attach(MPI_Win win, void *base, MPI_Aint size){
86   CHECK_WIN(1, win)
87   CHECK_NEGATIVE(3, MPI_ERR_OTHER, size)
88   if (base == nullptr && size != 0)
89     return MPI_ERR_OTHER;
90   smpi_bench_end();
91   int retval = win->attach(base, size);
92   smpi_bench_begin();
93   return retval;
94 }
95
96 int PMPI_Win_detach(MPI_Win win, const void* base)
97 {
98   CHECK_WIN(1, win)
99   CHECK_NULL(2, MPI_ERR_OTHER, base)
100   smpi_bench_end();
101   int retval = win->detach(base);
102   smpi_bench_begin();
103   return retval;
104 }
105
106 int PMPI_Win_free( MPI_Win* win){
107   CHECK_NULL(1, MPI_ERR_WIN, win)
108   CHECK_WIN(1, (*win))
109   smpi_bench_end();
110   delete *win;
111   smpi_bench_begin();
112   return MPI_SUCCESS;
113 }
114
115 int PMPI_Win_set_name(MPI_Win  win, const char * name)
116 {
117   CHECK_WIN(1, win)
118   CHECK_NULL(2, MPI_ERR_ARG, name)
119   win->set_name(name);
120   return MPI_SUCCESS;
121 }
122
123 int PMPI_Win_get_name(MPI_Win  win, char * name, int* len)
124 {
125   CHECK_WIN(1, win)
126   CHECK_NULL(2, MPI_ERR_ARG, name)
127   win->get_name(name, len);
128   return MPI_SUCCESS;
129 }
130
131 int PMPI_Win_get_info(MPI_Win  win, MPI_Info* info)
132 {
133   CHECK_WIN(1, win)
134   CHECK_NULL(2, MPI_ERR_ARG, info)
135   *info = win->info();
136   return MPI_SUCCESS;
137 }
138
139 int PMPI_Win_set_info(MPI_Win  win, MPI_Info info)
140 {
141   CHECK_WIN(1, win)
142   win->set_info(info);
143   return MPI_SUCCESS;
144 }
145
146 int PMPI_Win_get_group(MPI_Win  win, MPI_Group * group){
147   CHECK_WIN(1, win)
148   win->get_group(group);
149   (*group)->ref();
150   return MPI_SUCCESS;
151 }
152
153 int PMPI_Win_fence( int assert,  MPI_Win win){
154   CHECK_WIN(2, win)
155   smpi_bench_end();
156   int my_proc_id = simgrid::s4u::this_actor::get_pid();
157   TRACE_smpi_comm_in(my_proc_id, __func__, new simgrid::instr::NoOpTIData("Win_fence"));
158   int retval = win->fence(assert);
159   TRACE_smpi_comm_out(my_proc_id);
160   smpi_bench_begin();
161   return retval;
162 }
163
164 int PMPI_Get( void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank,
165               MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Win win){
166   CHECK_RMA
167   CHECK_WIN(8, win)
168   CHECK_TARGET_DISP(5)
169
170   int retval = 0;
171   smpi_bench_end();
172
173   int my_proc_id = simgrid::s4u::this_actor::get_pid();
174   MPI_Group group;
175   win->get_group(&group);
176   TRACE_smpi_comm_in(my_proc_id, __func__,
177                      new simgrid::instr::Pt2PtTIData("Get", target_rank, origin_datatype->is_replayable()
178                                                                              ? origin_count
179                                                                              : origin_count * origin_datatype->size(),
180                                                      simgrid::smpi::Datatype::encode(origin_datatype)));
181    retval = win->get( origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count,
182                          target_datatype);
183   TRACE_smpi_comm_out(my_proc_id);
184  
185   smpi_bench_begin();
186   return retval;
187 }
188
189 int PMPI_Rget( void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank,
190               MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Win win, MPI_Request* request){
191   if(target_rank==MPI_PROC_NULL)
192     *request = MPI_REQUEST_NULL;
193   CHECK_RMA
194   CHECK_WIN(8, win)
195   CHECK_TARGET_DISP(5)
196   CHECK_NULL(9, MPI_ERR_ARG, request)
197
198   int retval = 0;
199   smpi_bench_end();
200
201   int my_proc_id = simgrid::s4u::this_actor::get_pid();
202   MPI_Group group;
203   win->get_group(&group);
204   TRACE_smpi_comm_in(my_proc_id, __func__,
205                      new simgrid::instr::Pt2PtTIData(
206                          "Rget", target_rank,
207                          origin_datatype->is_replayable() ? origin_count : origin_count * origin_datatype->size(),
208                          simgrid::smpi::Datatype::encode(origin_datatype)));
209
210   retval = win->get( origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count,
211                          target_datatype, request);
212
213   TRACE_smpi_comm_out(my_proc_id);
214
215   smpi_bench_begin();
216   return retval;
217 }
218
219 int PMPI_Put(const void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank,
220               MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Win win){
221   CHECK_RMA
222   CHECK_WIN(8, win)
223   CHECK_TARGET_DISP(5)
224
225   int retval = 0;
226   smpi_bench_end();
227
228   int my_proc_id = simgrid::s4u::this_actor::get_pid();
229   MPI_Group group;
230   win->get_group(&group);
231   int dst_traced = group->actor(target_rank)->get_pid();
232   TRACE_smpi_comm_in(my_proc_id, __func__,
233                      new simgrid::instr::Pt2PtTIData("Put", target_rank, origin_datatype->is_replayable()
234                                                                              ? origin_count
235                                                                              : origin_count * origin_datatype->size(),
236                                                      simgrid::smpi::Datatype::encode(origin_datatype)));
237   TRACE_smpi_send(my_proc_id, my_proc_id, dst_traced, SMPI_RMA_TAG, origin_count * origin_datatype->size());
238
239   retval = win->put( origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count,
240                          target_datatype);
241
242   TRACE_smpi_comm_out(my_proc_id);
243
244   smpi_bench_begin();
245   return retval;
246 }
247
248 int PMPI_Rput(const void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank,
249               MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Win win, MPI_Request* request){
250   if(target_rank==MPI_PROC_NULL)
251     *request = MPI_REQUEST_NULL;
252   CHECK_RMA
253   CHECK_WIN(8, win)
254   CHECK_TARGET_DISP(5)
255   CHECK_NULL(9, MPI_ERR_ARG, request)
256   int retval = 0;
257   smpi_bench_end();
258
259   int my_proc_id = simgrid::s4u::this_actor::get_pid();
260   MPI_Group group;
261   win->get_group(&group);
262   int dst_traced = group->actor(target_rank)->get_pid();
263   TRACE_smpi_comm_in(my_proc_id, __func__,
264                      new simgrid::instr::Pt2PtTIData(
265                          "Rput", target_rank,
266                          origin_datatype->is_replayable() ? origin_count : origin_count * origin_datatype->size(),
267                          simgrid::smpi::Datatype::encode(origin_datatype)));
268   TRACE_smpi_send(my_proc_id, my_proc_id, dst_traced, SMPI_RMA_TAG, origin_count * origin_datatype->size());
269
270   retval = win->put( origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count,
271                          target_datatype, request);
272
273   TRACE_smpi_comm_out(my_proc_id);
274
275   smpi_bench_begin();
276   return retval;
277 }
278
279 int PMPI_Accumulate(const void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank,
280               MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Op op, MPI_Win win){
281   CHECK_RMA
282   CHECK_OP(8)
283   CHECK_WIN(9, win)
284   CHECK_TARGET_DISP(5)
285
286   int retval = 0;
287
288   smpi_bench_end();
289   int my_proc_id = simgrid::s4u::this_actor::get_pid();
290   MPI_Group group;
291   win->get_group(&group);
292   TRACE_smpi_comm_in(my_proc_id, __func__,
293                      new simgrid::instr::Pt2PtTIData(
294                          "Accumulate", target_rank,
295                          origin_datatype->is_replayable() ? origin_count : origin_count * origin_datatype->size(),
296                          simgrid::smpi::Datatype::encode(origin_datatype)));
297   retval = win->accumulate( origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count,
298                                 target_datatype, op);
299
300   TRACE_smpi_comm_out(my_proc_id);
301
302   smpi_bench_begin();
303   return retval;
304 }
305
306 int PMPI_Raccumulate(const void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank,
307               MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Op op, MPI_Win win, MPI_Request* request){
308   if(target_rank==MPI_PROC_NULL)
309     *request = MPI_REQUEST_NULL;
310   CHECK_RMA
311   CHECK_OP(8)
312   CHECK_WIN(9, win)
313   CHECK_TARGET_DISP(5)
314   CHECK_NULL(10, MPI_ERR_ARG, request)
315
316   int retval = 0;
317
318   smpi_bench_end();
319
320   int my_proc_id = simgrid::s4u::this_actor::get_pid();
321   MPI_Group group;
322   win->get_group(&group);
323   TRACE_smpi_comm_in(my_proc_id, __func__,
324                      new simgrid::instr::Pt2PtTIData(
325                          "Raccumulate", target_rank,
326                          origin_datatype->is_replayable() ? origin_count : origin_count * origin_datatype->size(),
327                          simgrid::smpi::Datatype::encode(origin_datatype)));
328
329   retval = win->accumulate( origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count,
330                                 target_datatype, op, request);
331
332   TRACE_smpi_comm_out(my_proc_id);
333
334   smpi_bench_begin();
335   return retval;
336 }
337
338 int PMPI_Get_accumulate(const void *origin_addr, int origin_count, MPI_Datatype origin_datatype, void *result_addr,
339 int result_count, MPI_Datatype result_datatype, int target_rank, MPI_Aint target_disp, int target_count,
340 MPI_Datatype target_datatype, MPI_Op op, MPI_Win win){
341   if (op != MPI_NO_OP)
342     CHECK_BUFFER(1, origin_addr, origin_count)
343   CHECK_COUNT(2, origin_count)
344   if(origin_count>0)
345     CHECK_TYPE(3, origin_datatype)
346   CHECK_BUFFER(4, result_addr, result_count)
347   CHECK_COUNT(5, result_count)
348   CHECK_TYPE(6, result_datatype)
349   CHECK_PROC(7, target_rank)
350   CHECK_NEGATIVE(7, MPI_ERR_RANK, target_rank)
351   CHECK_COUNT(9, target_count)
352   CHECK_TYPE(10, target_datatype)
353   CHECK_OP(11)
354   CHECK_WIN(12, win)
355   CHECK_TARGET_DISP(8)
356
357   int retval = 0;
358   smpi_bench_end();
359
360   int my_proc_id = simgrid::s4u::this_actor::get_pid();
361   MPI_Group group;
362   win->get_group(&group);
363   TRACE_smpi_comm_in(my_proc_id, __func__,
364                      new simgrid::instr::Pt2PtTIData(
365                          "Get_accumulate", target_rank,
366                          target_datatype->is_replayable() ? target_count : target_count * target_datatype->size(),
367                          simgrid::smpi::Datatype::encode(target_datatype)));
368
369   retval = win->get_accumulate( origin_addr, origin_count, origin_datatype, result_addr,
370                                 result_count, result_datatype, target_rank, target_disp,
371                                 target_count, target_datatype, op);
372
373   TRACE_smpi_comm_out(my_proc_id);
374
375   smpi_bench_begin();
376   return retval;
377 }
378
379
380 int PMPI_Rget_accumulate(const void *origin_addr, int origin_count, MPI_Datatype origin_datatype, void *result_addr,
381 int result_count, MPI_Datatype result_datatype, int target_rank, MPI_Aint target_disp, int target_count,
382 MPI_Datatype target_datatype, MPI_Op op, MPI_Win win, MPI_Request* request){
383   if(target_rank==MPI_PROC_NULL)
384     *request = MPI_REQUEST_NULL;
385   CHECK_BUFFER(1, origin_addr, origin_count)
386   CHECK_COUNT(2, origin_count)
387   CHECK_TYPE(3, origin_datatype)
388   CHECK_BUFFER(4, result_addr, result_count)
389   CHECK_COUNT(5, result_count)
390   CHECK_TYPE(6, result_datatype)
391   CHECK_PROC(7, target_rank)
392   CHECK_NEGATIVE(7, MPI_ERR_RANK, target_rank)
393   CHECK_COUNT(9, target_count)
394   CHECK_TYPE(10, target_datatype)
395   CHECK_OP(11)
396   CHECK_WIN(12, win)
397   CHECK_TARGET_DISP(8)
398   CHECK_NULL(10, MPI_ERR_ARG, request)
399   int retval = 0;
400   smpi_bench_end();
401
402   int my_proc_id = simgrid::s4u::this_actor::get_pid();
403   MPI_Group group;
404   win->get_group(&group);
405   TRACE_smpi_comm_in(my_proc_id, __func__,
406                      new simgrid::instr::Pt2PtTIData(
407                          "Rget_accumulate", target_rank,
408                          target_datatype->is_replayable() ? target_count : target_count * target_datatype->size(),
409                          simgrid::smpi::Datatype::encode(target_datatype)));
410
411   retval = win->get_accumulate( origin_addr, origin_count, origin_datatype, result_addr,
412                                 result_count, result_datatype, target_rank, target_disp,
413                                 target_count, target_datatype, op, request);
414
415   TRACE_smpi_comm_out(my_proc_id);
416
417   smpi_bench_begin();
418   return retval;
419 }
420
421 int PMPI_Fetch_and_op(const void *origin_addr, void *result_addr, MPI_Datatype dtype, int target_rank, MPI_Aint target_disp, MPI_Op op, MPI_Win win){
422   return PMPI_Get_accumulate(origin_addr, origin_addr==nullptr?0:1, dtype, result_addr, 1, dtype, target_rank, target_disp, 1, dtype, op, win);
423 }
424
425 int PMPI_Compare_and_swap(const void* origin_addr, void* compare_addr, void* result_addr, MPI_Datatype datatype,
426                           int target_rank, MPI_Aint target_disp, MPI_Win win)
427 {
428   CHECK_NULL(1, MPI_ERR_BUFFER, origin_addr)
429   CHECK_NULL(2, MPI_ERR_BUFFER, compare_addr)
430   CHECK_NULL(3, MPI_ERR_BUFFER, result_addr)
431   CHECK_TYPE(4, datatype)
432   CHECK_PROC(5, target_rank)
433   CHECK_NEGATIVE(5, MPI_ERR_RANK, target_rank)
434   CHECK_WIN(6, win)
435   CHECK_TARGET_DISP(6)
436
437   int retval = 0;
438
439   smpi_bench_end();
440
441   int my_proc_id = simgrid::s4u::this_actor::get_pid();
442   MPI_Group group;
443   win->get_group(&group);
444   TRACE_smpi_comm_in(my_proc_id, __func__,
445                      new simgrid::instr::Pt2PtTIData("Compare_and_swap", target_rank,
446                                                      datatype->is_replayable() ? 1 : datatype->size(),
447                                                      simgrid::smpi::Datatype::encode(datatype)));
448
449   retval = win->compare_and_swap(origin_addr, compare_addr, result_addr, datatype, target_rank, target_disp);
450
451   TRACE_smpi_comm_out(my_proc_id);
452
453   smpi_bench_begin();
454   return retval;
455 }
456
457 int PMPI_Win_post(MPI_Group group, int assert, MPI_Win win){
458   CHECK_GROUP(1, group)
459   CHECK_WIN(2, win)
460   smpi_bench_end();
461   int my_proc_id = simgrid::s4u::this_actor::get_pid();
462   TRACE_smpi_comm_in(my_proc_id, __func__, new simgrid::instr::NoOpTIData("Win_post"));
463   int retval = win->post(group,assert);
464   TRACE_smpi_comm_out(my_proc_id);
465   smpi_bench_begin();
466   return retval;
467 }
468
469 int PMPI_Win_start(MPI_Group group, int assert, MPI_Win win){
470   CHECK_GROUP(1, group)
471   CHECK_WIN(2, win)
472   smpi_bench_end();
473   int my_proc_id = simgrid::s4u::this_actor::get_pid();
474   TRACE_smpi_comm_in(my_proc_id, __func__, new simgrid::instr::NoOpTIData("Win_start"));
475   int retval = win->start(group,assert);
476   TRACE_smpi_comm_out(my_proc_id);
477   smpi_bench_begin();
478   return retval;
479 }
480
481 int PMPI_Win_complete(MPI_Win win){
482   CHECK_WIN(1, win)
483   smpi_bench_end();
484   int my_proc_id = simgrid::s4u::this_actor::get_pid();
485   TRACE_smpi_comm_in(my_proc_id, __func__, new simgrid::instr::NoOpTIData("Win_complete"));
486   int retval = win->complete();
487   TRACE_smpi_comm_out(my_proc_id);
488   smpi_bench_begin();
489   return retval;
490 }
491
492 int PMPI_Win_wait(MPI_Win win){
493   CHECK_WIN(1, win)
494   smpi_bench_end();
495   int my_proc_id = simgrid::s4u::this_actor::get_pid();
496   TRACE_smpi_comm_in(my_proc_id, __func__, new simgrid::instr::NoOpTIData("Win_wait"));
497   int retval = win->wait();
498   TRACE_smpi_comm_out(my_proc_id);
499   smpi_bench_begin();
500   return retval;
501 }
502
503 int PMPI_Win_lock(int lock_type, int rank, int assert, MPI_Win win){
504   CHECK_PROC(2, rank)
505   CHECK_WIN(4, win)
506   int retval = 0;
507   smpi_bench_end();
508   if (lock_type != MPI_LOCK_EXCLUSIVE &&
509       lock_type != MPI_LOCK_SHARED) {
510     retval = MPI_ERR_LOCKTYPE;
511   } else {
512     int my_proc_id = simgrid::s4u::this_actor::get_pid();
513     TRACE_smpi_comm_in(my_proc_id, __func__, new simgrid::instr::NoOpTIData("Win_lock"));
514     retval = win->lock(lock_type,rank,assert);
515     TRACE_smpi_comm_out(my_proc_id);
516   }
517   smpi_bench_begin();
518   return retval;
519 }
520
521 int PMPI_Win_unlock(int rank, MPI_Win win){
522   CHECK_PROC(1, rank)
523   CHECK_WIN(2, win)
524   smpi_bench_end();
525   int my_proc_id = simgrid::s4u::this_actor::get_pid();
526   TRACE_smpi_comm_in(my_proc_id, __func__, new simgrid::instr::NoOpTIData("Win_unlock"));
527   int retval = win->unlock(rank);
528   TRACE_smpi_comm_out(my_proc_id);
529   smpi_bench_begin();
530   return retval;
531 }
532
533 int PMPI_Win_lock_all(int assert, MPI_Win win){
534   CHECK_WIN(2, win)
535   smpi_bench_end();
536   int my_proc_id = simgrid::s4u::this_actor::get_pid();
537   TRACE_smpi_comm_in(my_proc_id, __func__, new simgrid::instr::NoOpTIData("Win_lock_all"));
538   int retval = win->lock_all(assert);
539   TRACE_smpi_comm_out(my_proc_id);
540   smpi_bench_begin();
541   return retval;
542 }
543
544 int PMPI_Win_unlock_all(MPI_Win win){
545   CHECK_WIN(1, win)
546   smpi_bench_end();
547   int my_proc_id = simgrid::s4u::this_actor::get_pid();
548   TRACE_smpi_comm_in(my_proc_id, __func__, new simgrid::instr::NoOpTIData("Win_unlock_all"));
549   int retval = win->unlock_all();
550   TRACE_smpi_comm_out(my_proc_id);
551   smpi_bench_begin();
552   return retval;
553 }
554
555 int PMPI_Win_flush(int rank, MPI_Win win){
556   CHECK_PROC(1, rank)
557   CHECK_WIN(2, win)
558   smpi_bench_end();
559   int my_proc_id = simgrid::s4u::this_actor::get_pid();
560   TRACE_smpi_comm_in(my_proc_id, __func__, new simgrid::instr::NoOpTIData("Win_flush"));
561   int retval = win->flush(rank);
562   TRACE_smpi_comm_out(my_proc_id);
563   smpi_bench_begin();
564   return retval;
565 }
566
567 int PMPI_Win_flush_local(int rank, MPI_Win win){
568   CHECK_PROC(1, rank)
569   CHECK_WIN(2, win)  smpi_bench_end();
570   int my_proc_id = simgrid::s4u::this_actor::get_pid();
571   TRACE_smpi_comm_in(my_proc_id, __func__, new simgrid::instr::NoOpTIData("Win_flush_local"));
572   int retval = win->flush_local(rank);
573   TRACE_smpi_comm_out(my_proc_id);
574   smpi_bench_begin();
575   return retval;
576 }
577
578 int PMPI_Win_flush_all(MPI_Win win){
579   CHECK_WIN(1, win)
580   smpi_bench_end();
581   int my_proc_id = simgrid::s4u::this_actor::get_pid();
582   TRACE_smpi_comm_in(my_proc_id, __func__, new simgrid::instr::NoOpTIData("Win_flush_all"));
583   int retval = win->flush_all();
584   TRACE_smpi_comm_out(my_proc_id);
585   smpi_bench_begin();
586   return retval;
587 }
588
589 int PMPI_Win_flush_local_all(MPI_Win win){
590   CHECK_WIN(1, win)
591   smpi_bench_end();
592   int my_proc_id = simgrid::s4u::this_actor::get_pid();
593   TRACE_smpi_comm_in(my_proc_id, __func__, new simgrid::instr::NoOpTIData("Win_flush_local_all"));
594   int retval = win->flush_local_all();
595   TRACE_smpi_comm_out(my_proc_id);
596   smpi_bench_begin();
597   return retval;
598 }
599
600 int PMPI_Win_shared_query (MPI_Win win, int rank, MPI_Aint* size, int* disp_unit, void* baseptr)
601 {
602   CHECK_WIN(1, win)
603   return win->shared_query(rank, size, disp_unit, baseptr);
604 }
605
606 int PMPI_Win_get_attr (MPI_Win win, int keyval, void *attribute_val, int* flag)
607 {
608   static MPI_Aint size;
609   static MPI_Aint disp_unit;
610   CHECK_WIN(1, win)
611   switch (keyval) {
612     case MPI_WIN_BASE:
613       *static_cast<void**>(attribute_val) = win->base();
614       *flag                               = 1;
615       return MPI_SUCCESS;
616     case MPI_WIN_SIZE:
617       size                                    = win->size();
618       *static_cast<MPI_Aint**>(attribute_val) = &size;
619       *flag                                   = 1;
620       return MPI_SUCCESS;
621     case MPI_WIN_DISP_UNIT:
622       disp_unit                               = win->disp_unit();
623       *static_cast<MPI_Aint**>(attribute_val) = &disp_unit;
624       *flag                                   = 1;
625       return MPI_SUCCESS;
626     default:
627      return win->attr_get<simgrid::smpi::Win>(keyval, attribute_val, flag);
628   }
629 }
630
631 int PMPI_Win_set_attr (MPI_Win win, int type_keyval, void *attribute_val)
632 {
633   CHECK_WIN(1, win)
634   return win->attr_put<simgrid::smpi::Win>(type_keyval, attribute_val);
635 }
636
637 int PMPI_Win_delete_attr (MPI_Win win, int type_keyval)
638 {
639   CHECK_WIN(1, win)
640   return win->attr_delete<simgrid::smpi::Win>(type_keyval);
641 }
642
643 int PMPI_Win_create_keyval(MPI_Win_copy_attr_function* copy_fn, MPI_Win_delete_attr_function* delete_fn, int* keyval,
644                             void* extra_state)
645 {
646   smpi_copy_fn _copy_fn={nullptr, nullptr,copy_fn,nullptr, nullptr,nullptr};
647   smpi_delete_fn _delete_fn={nullptr, nullptr,delete_fn,nullptr, nullptr,nullptr};
648   return simgrid::smpi::Keyval::keyval_create<simgrid::smpi::Win>(_copy_fn, _delete_fn, keyval, extra_state);
649 }
650
651 int PMPI_Win_free_keyval(int* keyval) {
652   return simgrid::smpi::Keyval::keyval_free<simgrid::smpi::Win>(keyval);
653 }
654
655 MPI_Win PMPI_Win_f2c(MPI_Fint win){
656   if(win==-1)
657     return MPI_WIN_NULL;
658   return simgrid::smpi::Win::f2c(win);
659 }
660
661 MPI_Fint PMPI_Win_c2f(MPI_Win win){
662   if(win==MPI_WIN_NULL)
663     return -1;
664   return win->c2f();
665 }
666
667 int PMPI_Win_create_errhandler(MPI_Win_errhandler_function* function, MPI_Errhandler* errhandler){
668   *errhandler=new simgrid::smpi::Errhandler(function);
669   return MPI_SUCCESS;
670 }
671
672 int PMPI_Win_get_errhandler(MPI_Win win, MPI_Errhandler* errhandler){
673   CHECK_WIN(1, win)
674   if (errhandler==nullptr){
675     return MPI_ERR_ARG;
676   }
677   *errhandler=win->errhandler();
678   return MPI_SUCCESS;
679 }
680
681 int PMPI_Win_set_errhandler(MPI_Win win, MPI_Errhandler errhandler){
682   CHECK_WIN(1, win)
683   if (errhandler==nullptr){
684     return MPI_ERR_ARG;
685   }
686   win->set_errhandler(errhandler);
687   return MPI_SUCCESS;
688 }
689
690 int PMPI_Win_call_errhandler(MPI_Win win,int errorcode){
691   CHECK_WIN(1, win)
692   MPI_Errhandler err = win->errhandler();
693   err->call(win, errorcode);
694   simgrid::smpi::Errhandler::unref(err);
695   return MPI_SUCCESS;
696 }