static int zero = 0;
static int tag_ub = INT_MAX;
static int last_used_code = MPI_ERR_LASTCODE;
+ static int universe_size;
if (comm==MPI_COMM_NULL){
*flag = 0;
return MPI_SUCCESS;
case MPI_UNIVERSE_SIZE:
*flag = 1;
- *static_cast<int**>(attr_value) = &smpi_universe_size;
+ universe_size = smpi_get_universe_size();
+ *static_cast<int**>(attr_value) = &universe_size;
return MPI_SUCCESS;
case MPI_LASTUSEDCODE:
*flag = 1;
XBT_PRIVATE simgrid::smpi::ActorExt* smpi_process();
XBT_PRIVATE simgrid::smpi::ActorExt* smpi_process_remote(simgrid::s4u::ActorPtr actor);
-XBT_PRIVATE int smpi_process_count();
+XBT_PRIVATE int smpi_get_universe_size();
XBT_PRIVATE void smpi_deployment_register_process(const std::string& instance_id, int rank,
simgrid::s4u::ActorPtr actor);
typedef s_smpi_privatization_region_t* smpi_privatization_region_t;
extern XBT_PRIVATE int smpi_loaded_page;
-extern XBT_PRIVATE int smpi_universe_size;
XBT_PRIVATE smpi_privatization_region_t smpi_init_global_memory_segment_process();
/**
void ActorExt::init()
{
- xbt_assert(smpi_process_count() != 0, "SimGrid was not initialized properly before entering MPI_Init. "
- "Aborting, please check compilation process and use smpirun.");
+ xbt_assert(smpi_get_universe_size() != 0, "SimGrid was not initialized properly before entering MPI_Init. "
+ "Aborting, please check compilation process and use smpirun.");
simgrid::s4u::ActorPtr proc = simgrid::s4u::Actor::self();
// cheinrich: I'm not sure what the impact of the SMPI_switch_data_segment on this call is. I moved
namespace smpi {
namespace app {
+static int universe_size = 0;
+
class Instance {
public:
Instance(const std::string& name, int max_no_processes, MPI_Comm comm, simgrid::s4u::Barrier* finalization_barrier)
// 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;
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.
Instance instance(std::string(name), num_processes, MPI_COMM_NULL, new simgrid::s4u::Barrier(num_processes));
- 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;
+}
std::unordered_map<std::string, double> location2speedup;
static std::map</*process_id*/ simgrid::s4u::Actor const*, simgrid::smpi::ActorExt*> process_data;
-int process_count = 0;
static int smpi_exit_status = 0;
-int smpi_universe_size = 0;
extern double smpi_total_benched_time;
xbt_os_timer_t global_timer;
static std::vector<std::string> privatize_libs_paths;
void (*smpi_comm_copy_data_callback)(simgrid::kernel::activity::CommImpl*, void*,
size_t) = &smpi_comm_copy_buffer_callback;
-int smpi_process_count()
-{
- return process_count;
-}
-
simgrid::smpi::ActorExt* smpi_process()
{
simgrid::s4u::ActorPtr me = simgrid::s4u::Actor::self();
SMPI_app_instance_register(smpi_default_instance_name.c_str(), nullptr,
process_data.size()); // This call has a side effect on process_count...
MPI_COMM_WORLD = *smpi_deployment_comm_world(smpi_default_instance_name);
- smpi_universe_size = process_count;
-
/* Clean IO before the run */
fflush(stdout);
void kernel(simgrid::xbt::ReplayAction&)
{
static std::map<simgrid::s4u::ActorPtr, int> migration_call_counter;
- static simgrid::s4u::Barrier smpilb_bar(smpi_process_count());
+ static simgrid::s4u::Barrier smpilb_bar(smpi_get_universe_size());
simgrid::s4u::Host* cur_host = simgrid::s4u::this_actor::get_host();
simgrid::s4u::Host* migrate_to_host;