Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Remove explicit conversion to std::string when it's not required.
[simgrid.git] / src / smpi / bindings / smpi_pmpi.cpp
index 25ce5f9..684b283 100644 (file)
@@ -1,16 +1,19 @@
-/* Copyright (c) 2007-2021. The SimGrid Team. All rights reserved.          */
+/* Copyright (c) 2007-2022. 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. */
 
 #include "private.hpp"
+#include "simgrid/host.h"
 #include "simgrid/instr.h"
 #include "simgrid/s4u/Engine.hpp"
 #include "simgrid/s4u/Host.hpp"
 #include "simgrid/version.h"
+#include "smpi_coll.hpp"
 #include "smpi_comm.hpp"
 #include "smpi_datatype_derived.hpp"
 #include "smpi_status.hpp"
+#include "src/kernel/EngineImpl.hpp"
 #include "src/kernel/actor/ActorImpl.hpp"
 #include "src/smpi/include/smpi_actor.hpp"
 
@@ -20,14 +23,13 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_pmpi, smpi, "Logging specific to SMPI (pmpi
 void TRACE_smpi_set_category(const char *category)
 {
   //need to end bench otherwise categories for execution tasks are wrong
-  smpi_bench_end();
+  const SmpiBenchGuard suspend_bench;
+
   if (category != nullptr) {
     // declare category
-    TRACE_category(category);
+    simgrid::instr::declare_tracing_category(category);
     smpi_process()->set_tracing_category(category);
   }
-  //begin bench after changing process's category
-  smpi_bench_begin();
 }
 
 /* PMPI User level calls */
@@ -51,12 +53,12 @@ int PMPI_Init(int*, char***)
   }
 
   simgrid::smpi::ActorExt::init();
-  int rank_traced = simgrid::s4u::this_actor::get_pid();
-  TRACE_smpi_init(rank_traced, __func__);
+  TRACE_smpi_init(simgrid::s4u::this_actor::get_pid(), __func__);
+  smpi_mpi_init();
   smpi_bench_begin();
   smpi_process()->mark_as_initialized();
 
-  smpi_mpi_init();
+  CHECK_COLLECTIVE(smpi_process()->comm_world(), "MPI_Init")
 
   return MPI_SUCCESS;
 }
@@ -64,9 +66,14 @@ int PMPI_Init(int*, char***)
 int PMPI_Finalize()
 {
   smpi_bench_end();
-  int rank_traced = simgrid::s4u::this_actor::get_pid();
+  CHECK_COLLECTIVE(smpi_process()->comm_world(), "MPI_Finalize")
+  aid_t rank_traced = simgrid::s4u::this_actor::get_pid();
+  smpi_process()->mark_as_finalizing();
   TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::NoOpTIData("finalize"));
 
+  if (simgrid::config::get_value<bool>("smpi/barrier-finalization"))
+    simgrid::smpi::colls::barrier(MPI_COMM_WORLD);
+
   smpi_process()->finalize();
 
   TRACE_smpi_comm_out(rank_traced);
@@ -86,9 +93,9 @@ int PMPI_Get_version (int *version,int *subversion){
 }
 
 int PMPI_Get_library_version (char *version,int *len){
-  snprintf(version, MPI_MAX_LIBRARY_VERSION_STRING, "SMPI Version %d.%d. Copyright The SimGrid Team 2007-2021",
+  snprintf(version, MPI_MAX_LIBRARY_VERSION_STRING, "SMPI Version %d.%d. Copyright The SimGrid Team 2007-2022",
            SIMGRID_VERSION_MAJOR, SIMGRID_VERSION_MINOR);
-  *len = strlen(version) > MPI_MAX_LIBRARY_VERSION_STRING ? MPI_MAX_LIBRARY_VERSION_STRING : strlen(version);
+  *len = std::min(static_cast<int>(strlen(version)), MPI_MAX_LIBRARY_VERSION_STRING);
   return MPI_SUCCESS;
 }
 
@@ -124,13 +131,19 @@ int PMPI_Is_thread_main(int *flag)
   }
 }
 
-int PMPI_Abort(MPI_Comm /*comm*/, int /*errorcode*/)
+int PMPI_Abort(MPI_Comm comm, int /*errorcode*/)
 {
   smpi_bench_end();
-  // FIXME: should kill all processes in comm instead
-  XBT_WARN("MPI_Abort was called, something went probably wrong in this simulation ! Killing this process");
-  smx_actor_t actor = SIMIX_process_self();
-  simgrid::kernel::actor::simcall([actor] { actor->exit(); });
+  CHECK_COMM(1)
+  XBT_WARN("MPI_Abort was called, something went probably wrong in this simulation ! Killing all processes sharing the same MPI_COMM_WORLD");
+  auto myself = simgrid::kernel::actor::ActorImpl::self();
+  for (int i = 0; i < comm->size(); i++){
+    auto actor = simgrid::kernel::EngineImpl::get_instance()->get_actor_by_pid(comm->group()->actor(i));
+    if (actor != nullptr && actor != myself)
+      simgrid::kernel::actor::simcall_answered([actor] { actor->exit(); });
+  }
+  // now ourself
+  simgrid::kernel::actor::simcall_answered([myself] { myself->exit(); });
   return MPI_SUCCESS;
 }
 
@@ -174,8 +187,8 @@ MPI_Aint PMPI_Aint_diff(MPI_Aint address, MPI_Aint disp)
 
 int PMPI_Get_processor_name(char *name, int *resultlen)
 {
-  int len = std::min<int>(sg_host_self()->get_name().size(), MPI_MAX_PROCESSOR_NAME - 1);
-  std::string(sg_host_self()->get_name()).copy(name, len);
+  int len = std::min(static_cast<int>(sg_host_self()->get_name().size()), MPI_MAX_PROCESSOR_NAME - 1);
+  sg_host_self()->get_name().copy(name, len);
   name[len]  = '\0';
   *resultlen = len;
 
@@ -189,10 +202,9 @@ int PMPI_Get_count(const MPI_Status * status, MPI_Datatype datatype, int *count)
   } else if (not datatype->is_valid()) {
     return MPI_ERR_TYPE;
   } else {
-    size_t size = datatype->size();
-    if (size == 0) {
+    if (datatype->size() == 0) {
       *count = 0;
-    } else if (status->count % size != 0) {
+    } else if (status->count % datatype->size() != 0) {
       *count = MPI_UNDEFINED;
     } else {
       *count = simgrid::smpi::Status::get_count(status, datatype);
@@ -208,6 +220,7 @@ int PMPI_Initialized(int* flag) {
 
 int PMPI_Alloc_mem(MPI_Aint size, MPI_Info /*info*/, void* baseptr)
 {
+  CHECK_NEGATIVE(1, MPI_ERR_COUNT, size)
   void *ptr = xbt_malloc(size);
   *static_cast<void**>(baseptr) = ptr;
   return MPI_SUCCESS;
@@ -242,21 +255,11 @@ int PMPI_Keyval_create(MPI_Copy_function* copy_fn, MPI_Delete_function* delete_f
 }
 
 int PMPI_Keyval_free(int* keyval) {
+  CHECK_NULL(1, MPI_ERR_ARG, keyval)
+  CHECK_VAL(1, MPI_KEYVAL_INVALID, MPI_ERR_KEYVAL, *keyval)
   return simgrid::smpi::Keyval::keyval_free<simgrid::smpi::Comm>(keyval);
 }
 
-MPI_Errhandler PMPI_Errhandler_f2c(MPI_Fint errhan){
-  if(errhan==-1)
-    return MPI_ERRHANDLER_NULL;
-  return simgrid::smpi::Errhandler::f2c(errhan);
-}
-
-MPI_Fint PMPI_Errhandler_c2f(MPI_Errhandler errhan){
-  if(errhan==MPI_ERRHANDLER_NULL)
-    return -1;
-  return errhan->c2f();
-}
-
 int PMPI_Buffer_attach(void *buf, int size){
   if(buf==nullptr)
     return MPI_ERR_BUFFER;