Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Test of an MPI_Ibarrier implementation.
[simgrid.git] / include / smpi / smpi.h
index 8128abf..0568399 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2018. The SimGrid Team. All rights reserved.          */
+/* Copyright (c) 2007-2019. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
@@ -6,11 +6,13 @@
 #ifndef SMPI_H
 #define SMPI_H
 
-#include <unistd.h>
-#include <sys/time.h>
 #include <simgrid/forward.h>
 #include <smpi/forward.hpp>
+#include <xbt/function_types.h>
+
 #include <stddef.h>
+#include <sys/time.h>
+#include <unistd.h>
 #include <xbt/misc.h>
 
 #ifdef _WIN32
@@ -38,7 +40,6 @@ SG_BEGIN_DECL()
 #define MPI_MAX_OBJECT_NAME    100
 #define MPI_MAX_PORT_NAME      100
 #define MPI_MAX_LIBRARY_VERSION_STRING 100
-#define SMPI_RAND_SEED 5
 #define MPI_ANY_SOURCE -555
 #define MPI_BOTTOM (void *)-111
 #define MPI_PROC_NULL -666
@@ -568,6 +569,7 @@ MPI_CALL(XBT_PUBLIC MPI_Fint, MPI_Request_c2f, (MPI_Request request));
 
 MPI_CALL(XBT_PUBLIC int, MPI_Bcast, (void* buf, int count, MPI_Datatype datatype, int root, MPI_Comm comm));
 MPI_CALL(XBT_PUBLIC int, MPI_Barrier, (MPI_Comm comm));
+MPI_CALL(XBT_PUBLIC int, MPI_Ibarrier, (MPI_Comm comm, MPI_Request *request));
 MPI_CALL(XBT_PUBLIC int, MPI_Gather, (void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount,
                                       MPI_Datatype recvtype, int root, MPI_Comm comm));
 MPI_CALL(XBT_PUBLIC int, MPI_Gatherv, (void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf,
@@ -951,9 +953,9 @@ XBT_ATTRIB_DEPRECATED_v324("Please use sg_host_get_consumed_energy(sg_host_self(
 XBT_PUBLIC unsigned long long smpi_rastro_resolution();
 XBT_PUBLIC unsigned long long smpi_rastro_timestamp();
 XBT_PUBLIC void smpi_sample_1(int global, const char* file, int line, int iters, double threshold);
-XBT_PUBLIC int smpi_sample_2(int global, const char* file, int line);
+XBT_PUBLIC int smpi_sample_2(int global, const char* file, int line, int iter_count);
 XBT_PUBLIC void smpi_sample_3(int global, const char* file, int line);
-
+XBT_PUBLIC int smpi_sample_exit(int global, const char* file, int line, int iter_count);
 /**
  * Need a public setter for SMPI copy_callback function, so users can define
  * their own while still using default SIMIX_copy_callback for S4U copies.
@@ -971,12 +973,21 @@ XBT_PUBLIC void smpi_trace_set_call_location_(const char* file, int* line);
 /** Fortran binding + -fsecond-underscore **/
 XBT_PUBLIC void smpi_trace_set_call_location__(const char* file, int* line);
 
-#define SMPI_SAMPLE_LOOP(global, iters, thres)                                                                         \
-  for (smpi_sample_1(global, __FILE__, __LINE__, iters, thres); smpi_sample_2(global, __FILE__, __LINE__);             \
-       smpi_sample_3(global, __FILE__, __LINE__))
-#define SMPI_SAMPLE_LOCAL(iters, thres) SMPI_SAMPLE_LOOP(0, iters, thres)
-#define SMPI_SAMPLE_GLOBAL(iters, thres) SMPI_SAMPLE_LOOP(1, iters, thres)
-
+#define SMPI_ITER_NAME1(line) iter_count##line
+#define SMPI_ITER_NAME(line) SMPI_ITER_NAME1(line)
+#define SMPI_SAMPLE_LOOP(loop_init, loop_end, loop_iter, global, iters, thres)\
+  int SMPI_ITER_NAME(__LINE__)=0;\
+  {loop_init;\
+  while(loop_end){\
+    SMPI_ITER_NAME(__LINE__)++;\
+    loop_iter;\
+  }}                                                                         \
+  for(loop_init; \
+      loop_end ? (smpi_sample_1(global, __FILE__, __LINE__, iters, thres), (smpi_sample_2(global, __FILE__, __LINE__, SMPI_ITER_NAME(__LINE__)))) :\
+      smpi_sample_exit(global, __FILE__, __LINE__, SMPI_ITER_NAME(__LINE__));\
+      smpi_sample_3(global, __FILE__, __LINE__),loop_iter)
+#define SMPI_SAMPLE_LOCAL(loop_init, loop_end, loop_iter, iters, thres) SMPI_SAMPLE_LOOP(loop_init, loop_end, loop_iter, 0, iters, thres)
+#define SMPI_SAMPLE_GLOBAL(loop_init, loop_end, loop_iter,iters, thres) SMPI_SAMPLE_LOOP(loop_init, loop_end, loop_iter, 1, iters, thres)
 #define SMPI_SAMPLE_DELAY(duration) for(smpi_execute(duration); 0; )
 #define SMPI_SAMPLE_FLOPS(flops) for(smpi_execute_flops(flops); 0; )
 
@@ -1088,4 +1099,4 @@ std::vector<std::pair<size_t, size_t>> merge_private_blocks(const std::vector<st
 
 #endif
 
-#endif
+#endif