-/* Copyright (c) 2004-2014. The SimGrid Team.
+/* Copyright (c) 2004-2017. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
#include "private.h"
#include "simgrid/msg.h" /* barrier */
+#include "src/smpi/SmpiHost.hpp"
#include "xbt/dict.h"
#include "xbt/log.h"
#include "xbt/sysdep.h"
s_smpi_mpi_instance_t* instance = (s_smpi_mpi_instance_t*)xbt_malloc(sizeof(s_smpi_mpi_instance_t));
+ static int already_called = 0;
+ if (!already_called) {
+ already_called = 1;
+ xbt_dynar_t hosts = MSG_hosts_as_dynar();
+ unsigned int cursor;
+ void* h;
+ xbt_dynar_foreach(hosts, cursor, h) {
+ simgrid::s4u::Host* host = static_cast<simgrid::s4u::Host*>(h);
+ host->extension_set(new simgrid::smpi::SmpiHost(host));
+ }
+ xbt_dynar_free(&hosts);
+ }
+
instance->name = name;
instance->size = num_processes;
instance->present_processes = 0;
smpi_instances = xbt_dict_new_homogeneous(xbt_free_f);
}
+
xbt_dict_set(smpi_instances, name, (void*)instance, nullptr);
}
//get the index of the process in the process_data array
-void smpi_deployment_register_process(const char* instance_id, int rank, int index, MPI_Comm** comm, msg_bar_t* bar)
+void smpi_deployment_register_process(const char* instance_id, int rank, int index)
{
if(smpi_instances==nullptr){//no instance registered, we probably used smpirun.
index_to_process_data[index]=index;
- *bar = nullptr;
- *comm = nullptr;
return;
}
xbt_assert(instance, "Error, unknown instance %s", instance_id);
if(instance->comm_world == MPI_COMM_NULL){
- MPI_Group group = new Group(instance->size);
- instance->comm_world = new Comm(group, nullptr);
+ MPI_Group group = new simgrid::smpi::Group(instance->size);
+ instance->comm_world = new simgrid::smpi::Comm(group, nullptr);
}
instance->present_processes++;
index_to_process_data[index]=instance->index+rank;
instance->comm_world->group()->set_mapping(index, rank);
- *bar = instance->finalization_barrier;
- *comm = &instance->comm_world;
+}
+
+//get the index of the process in the process_data array
+MPI_Comm* smpi_deployment_comm_world(const char* instance_id)
+{
+ if(smpi_instances==nullptr){//no instance registered, we probably used smpirun.
+ return nullptr;
+ }
+ s_smpi_mpi_instance_t* instance =
+ static_cast<s_smpi_mpi_instance_t*>(xbt_dict_get_or_null(smpi_instances, instance_id));
+ xbt_assert(instance, "Error, unknown instance %s", instance_id);
+ return &instance->comm_world;
+}
+
+msg_bar_t smpi_deployment_finalization_barrier(const char* instance_id)
+{
+ if(smpi_instances==nullptr){//no instance registered, we probably used smpirun.
+ return nullptr;
+ }
+ s_smpi_mpi_instance_t* instance =
+ static_cast<s_smpi_mpi_instance_t*>(xbt_dict_get_or_null(smpi_instances, instance_id));
+ xbt_assert(instance, "Error, unknown instance %s", instance_id);
+ return instance->finalization_barrier;
}
void smpi_deployment_cleanup_instances(){