namespace smpi {
namespace app {
+static int universe_size = 0;
+
class Instance {
public:
- Instance(std::string name, int max_no_processes, MPI_Comm comm, simgrid::s4u::Barrier* finalization_barrier)
- : name(std::move(name))
+ Instance(const std::string& name, int max_no_processes, MPI_Comm comm, simgrid::s4u::Barrier* finalization_barrier)
+ : name(name)
, size(max_no_processes)
, present_processes(0)
, comm_world(comm)
, finalization_barrier(finalization_barrier)
- { }
+ {
+ MPI_Group group = new simgrid::smpi::Group(size);
+ comm_world = new simgrid::smpi::Comm(group, nullptr, 0, -1);
+ // FIXME : using MPI_Attr_put with MPI_UNIVERSE_SIZE is forbidden and we make it a no-op (which triggers a warning
+ // as MPI_ERR_ARG is returned). Directly calling Comm::attr_put breaks for now, as MPI_UNIVERSE_SIZE,is <0
+ // instance.comm_world->attr_put<simgrid::smpi::Comm>(MPI_UNIVERSE_SIZE, reinterpret_cast<void*>(instance.size));
+
+ universe_size += max_no_processes;
+ }
const std::string name;
int size;
using simgrid::smpi::app::Instance;
static std::map<std::string, Instance> smpi_instances;
-extern int process_count; // How many processes have been allocated over all instances?
/** @ingroup smpi_simulation
* @brief Registers a running instance of a MPI program.
*/
void SMPI_app_instance_register(const char *name, xbt_main_func_t code, int num_processes)
{
- if (code != nullptr) { // When started with smpirun, we will not execute a function
+ if (code != nullptr) // When started with smpirun, we will not execute a function
simgrid::s4u::Engine::get_instance()->register_function(name, code);
- }
- static int already_called = 0;
+ static bool already_called = false;
if (not already_called) {
- already_called = 1;
- std::vector<simgrid::s4u::Host*> list = simgrid::s4u::Engine::get_instance()->get_all_hosts();
- for (auto const& host : list) {
+ already_called = true;
+ for (auto const& host : simgrid::s4u::Engine::get_instance()->get_all_hosts())
host->extension_set(new simgrid::smpi::Host(host));
- }
}
Instance instance(std::string(name), num_processes, MPI_COMM_NULL, new simgrid::s4u::Barrier(num_processes));
- MPI_Group group = new simgrid::smpi::Group(instance.size);
- instance.comm_world = new simgrid::smpi::Comm(group, nullptr);
-// FIXME : using MPI_Attr_put with MPI_UNIVERSE_SIZE is forbidden and we make it a no-op (which triggers a warning as MPI_ERR_ARG is returned).
-// Directly calling Comm::attr_put breaks for now, as MPI_UNIVERSE_SIZE,is <0
-// instance.comm_world->attr_put<simgrid::smpi::Comm>(MPI_UNIVERSE_SIZE, reinterpret_cast<void*>(instance.size));
-
- process_count+=num_processes;
smpi_instances.insert(std::pair<std::string, Instance>(name, instance));
}
}
smpi_instances.clear();
}
+
+int smpi_get_universe_size()
+{
+ return simgrid::smpi::app::universe_size;
+}