Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
add an "smpi/async_small_thres" configure option to smpi, to allow to toy with the...
[simgrid.git] / src / smpi / smpi_global.c
index 1b98966..cdbdc96 100644 (file)
@@ -5,12 +5,15 @@
   * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include <stdint.h>
+#include <stdio.h>
 #include <stdlib.h>
 
 #include "private.h"
 #include "smpi_mpi_dt_private.h"
 #include "mc/mc.h"
 #include "surf/surf.h"
+#include "simix/smx_private.h"
+
 
 XBT_LOG_NEW_CATEGORY(smpi, "All SMPI categories");
 
@@ -22,6 +25,7 @@ typedef struct s_smpi_process_data {
   int* argc;
   char*** argv;
   smx_rdv_t mailbox;
+  smx_rdv_t mailbox_small;
   xbt_os_timer_t timer;
   double simulated;
   MPI_Comm comm_self;
@@ -39,6 +43,11 @@ static char* get_mailbox_name(char* str, int index) {
   return str;
 }
 
+static char* get_mailbox_name_small(char* str, int index) {
+  snprintf(str, MAILBOX_NAME_MAXLEN, "small%0*x", (int)(sizeof(int) * 2), index);
+  return str;
+}
+
 void smpi_process_init(int *argc, char ***argv)
 {
   int index;
@@ -49,7 +58,7 @@ void smpi_process_init(int *argc, char ***argv)
     proc = SIMIX_process_self();
     index = atoi((*argv)[1]);
     data = smpi_process_remote_data(index);
-    SIMIX_req_process_set_data(proc, data);
+    simcall_process_set_data(proc, data);
     if (*argc > 2) {
       free((*argv)[1]);
       memmove(&(*argv)[1], &(*argv)[2], sizeof(char *) * (*argc - 2));
@@ -58,6 +67,7 @@ void smpi_process_init(int *argc, char ***argv)
     (*argc)--;
     data->argc = argc;
     data->argv = argv;
+    data->mailbox_small->permanent_receiver=proc;// set the process attached to the mailbox
     XBT_DEBUG("<%d> New process in the game: %p", index, proc);
   }
 }
@@ -69,6 +79,17 @@ void smpi_process_destroy(void)
   XBT_DEBUG("<%d> Process left the game", index);
 }
 
+/**
+ * @brief Prepares the current process for termination.
+ */
+void smpi_process_finalize(void)
+{
+  // wait for all pending asynchronous comms to finish
+  while (SIMIX_process_has_pending_comms(SIMIX_process_self())) {
+    simcall_process_sleep(0.01);
+  }
+}
+
 int smpi_process_argc(void) {
   smpi_process_data_t data = smpi_process_data();
 
@@ -98,6 +119,7 @@ int smpi_global_size(void) {
    char* value = getenv("SMPI_GLOBAL_SIZE");
 
    if(!value) {
+      fprintf(stderr, "Please set env var SMPI_GLOBAL_SIZE to expected number of processes.\n");
       abort();
    }
    return atoi(value);
@@ -105,7 +127,7 @@ int smpi_global_size(void) {
 
 smpi_process_data_t smpi_process_data(void)
 {
-  return SIMIX_process_self_get_data();
+  return SIMIX_process_self_get_data(SIMIX_process_self());
 }
 
 smpi_process_data_t smpi_process_remote_data(int index)
@@ -131,12 +153,25 @@ smx_rdv_t smpi_process_mailbox(void) {
   return data->mailbox;
 }
 
+smx_rdv_t smpi_process_mailbox_small(void) {
+  smpi_process_data_t data = smpi_process_data();
+
+  return data->mailbox_small;
+}
+
 smx_rdv_t smpi_process_remote_mailbox(int index) {
   smpi_process_data_t data = smpi_process_remote_data(index);
 
   return data->mailbox;
 }
 
+
+smx_rdv_t smpi_process_remote_mailbox_small(int index) {
+  smpi_process_data_t data = smpi_process_remote_data(index);
+
+  return data->mailbox_small;
+}
+
 xbt_os_timer_t smpi_process_timer(void)
 {
   smpi_process_data_t data = smpi_process_data();
@@ -144,29 +179,25 @@ xbt_os_timer_t smpi_process_timer(void)
   return data->timer;
 }
 
-void smpi_process_simulated_start(void)
-{
+void smpi_process_simulated_start(void) {
   smpi_process_data_t data = smpi_process_data();
 
   data->simulated = SIMIX_get_clock();
 }
 
-double smpi_process_simulated_elapsed(void)
-{
+double smpi_process_simulated_elapsed(void) {
   smpi_process_data_t data = smpi_process_data();
 
   return SIMIX_get_clock() - data->simulated;
 }
 
-MPI_Comm smpi_process_comm_self(void)
-{
+MPI_Comm smpi_process_comm_self(void) {
   smpi_process_data_t data = smpi_process_data();
 
   return data->comm_self;
 }
 
-void print_request(const char *message, MPI_Request request)
-{
+void print_request(const char *message, MPI_Request request) {
   XBT_DEBUG("%s  request %p  [buf = %p, size = %zu, src = %d, dst = %d, tag = %d, flags = %x]",
          message, request, request->buf, request->size,
          request->src, request->dst, request->tag, request->flags);
@@ -178,8 +209,7 @@ void smpi_global_init(void)
   MPI_Group group;
   char name[MAILBOX_NAME_MAXLEN];
 
-  SIMIX_comm_set_copy_data_callback
-      (&SIMIX_comm_copy_buffer_callback);
+  SIMIX_comm_set_copy_data_callback(&smpi_comm_copy_data_callback);
   process_count = SIMIX_process_count();
   process_data = xbt_new(smpi_process_data_t, process_count);
   for (i = 0; i < process_count; i++) {
@@ -187,7 +217,8 @@ void smpi_global_init(void)
     process_data[i]->index = i;
     process_data[i]->argc = NULL;
     process_data[i]->argv = NULL;
-    process_data[i]->mailbox = SIMIX_req_rdv_create(get_mailbox_name(name, i));
+    process_data[i]->mailbox = simcall_rdv_create(get_mailbox_name(name, i));
+    process_data[i]->mailbox_small = simcall_rdv_create(get_mailbox_name_small(name, i));
     process_data[i]->timer = xbt_os_timer_new();
     group = smpi_group_new(1);
     process_data[i]->comm_self = smpi_comm_new(group);
@@ -211,11 +242,14 @@ void smpi_global_destroy(void)
   for (i = 0; i < count; i++) {
     smpi_comm_destroy(process_data[i]->comm_self);
     xbt_os_timer_free(process_data[i]->timer);
-    SIMIX_req_rdv_destroy(process_data[i]->mailbox);
+    simcall_rdv_destroy(process_data[i]->mailbox);
+    simcall_rdv_destroy(process_data[i]->mailbox_small);
     xbt_free(process_data[i]);
   }
   xbt_free(process_data);
   process_data = NULL;
+
+  smpi_free_static();
 }
 
 /* Fortran specific stuff */
@@ -234,28 +268,23 @@ int MAIN__(void)
 {
   srand(SMPI_RAND_SEED);
 
-  double default_reference_speed = 20000.0;
-  xbt_cfg_register(&_surf_cfg_set, "smpi/running_power",
-                   "Power of the host running the simulation (in flop/s). Used to bench the operations.",
-                   xbt_cfgelm_double, &default_reference_speed, 1, 1, NULL,
-                   NULL);
-
-  int default_display_timing = 0;
-  xbt_cfg_register(&_surf_cfg_set, "smpi/display_timing",
-                   "Boolean indicating whether we should display the timing after simulation.",
-                   xbt_cfgelm_int, &default_display_timing, 1, 1, NULL,
-                   NULL);
-
-  double default_threshold = 1e-6;
-  xbt_cfg_register(&_surf_cfg_set, "smpi/cpu_threshold",
-                   "Minimal computation time (in seconds) not discarded.",
-                   xbt_cfgelm_double, &default_threshold, 1, 1, NULL,
-                   NULL);
-
   if(getenv("SMPI_PRETEND_CC") != NULL) {
+  /* Hack to ensure that smpicc can pretend to be a simple compiler. Particularly handy to pass it to the configuration tools */
     return 0;
   }
 
+  /* Connect log categories.  See xbt/log.c */
+  XBT_LOG_CONNECT(smpi);
+  XBT_LOG_CONNECT(smpi_base);
+  XBT_LOG_CONNECT(smpi_bench);
+  XBT_LOG_CONNECT(smpi_coll);
+  XBT_LOG_CONNECT(smpi_comm);
+  XBT_LOG_CONNECT(smpi_group);
+  XBT_LOG_CONNECT(smpi_kernel);
+  XBT_LOG_CONNECT(smpi_mpi);
+  XBT_LOG_CONNECT(smpi_mpi_dt);
+  XBT_LOG_CONNECT(smpi_pmpi);
+
 #ifdef HAVE_TRACING
   TRACE_global_init(&xargc, xargv);
 #endif
@@ -263,13 +292,13 @@ int MAIN__(void)
   SIMIX_global_init(&xargc, xargv);
 
 #ifdef HAVE_TRACING
-  TRACE_smpi_start();
+  TRACE_start();
 #endif
 
   // parse the platform file: get the host list
   SIMIX_create_environment(xargv[1]);
 
-  SIMIX_function_register("smpi_simulated_main", smpi_simulated_main);
+  SIMIX_function_register_default(smpi_simulated_main);
   SIMIX_launch_application(xargv[2]);
 
   smpi_global_init();
@@ -284,12 +313,12 @@ int MAIN__(void)
     SIMIX_run();
 
   if (xbt_cfg_get_int(_surf_cfg_set, "smpi/display_timing"))
-    XBT_INFO("simulation time %g", SIMIX_get_clock());
+    XBT_INFO("Simulation time: %g seconds.", SIMIX_get_clock());
 
   smpi_global_destroy();
 
 #ifdef HAVE_TRACING
-  TRACE_smpi_release();
+  TRACE_end();
 #endif
 
   SIMIX_clean();