X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/e3d0549bc884f737ea5a3ba2d30f9547e43fb84d..2c0aa88e3d941e79fc79d39e3e58224d282b76d3:/examples/smpi/replay_multiple_manual_deploy/replay_multiple_manual.cpp diff --git a/examples/smpi/replay_multiple_manual_deploy/replay_multiple_manual.cpp b/examples/smpi/replay_multiple_manual_deploy/replay_multiple_manual.cpp index 9506b99906..2e769f6ca8 100644 --- a/examples/smpi/replay_multiple_manual_deploy/replay_multiple_manual.cpp +++ b/examples/smpi/replay_multiple_manual_deploy/replay_multiple_manual.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2018. The SimGrid Team. +/* Copyright (c) 2009-2020. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -14,7 +14,7 @@ This is done to avoid SMPI actors to start at actor_id=0. 3. For each job: 1. Sleep until job's starting time is reached (if needed) - 2. Launch the replay of the corresponding time-indepent trace. + 2. Launch the replay of the corresponding time-independent trace. 3. Create inter-process noise, by spawning useless actors. 4. Wait for completion (via s4u::Engine's run method) */ @@ -27,7 +27,6 @@ #include -#include #include #include #include @@ -45,8 +44,8 @@ struct Job { }; // ugly globals to avoid creating structures for giving args to processes -std::vector hosts; -int noise_between_jobs; +static std::vector hosts; +static int noise_between_jobs; static bool job_comparator(const Job* j1, const Job* j2) { @@ -55,31 +54,18 @@ static bool job_comparator(const Job* j1, const Job* j2) return j1->starting_time < j2->starting_time; } -struct s_smpi_replay_process_args { - Job* job; - simgrid::s4u::BarrierPtr barrier; - int rank; -}; - -static int smpi_replay_process(int argc, char* argv[]) +static void smpi_replay_process(Job* job, simgrid::s4u::BarrierPtr barrier, int rank) { - s_smpi_replay_process_args* args = static_cast(MSG_process_get_data(MSG_process_self())); - - XBT_INFO("Replaying rank %d of job %d (smpi_app '%s')", args->rank, args->job->unique_job_number, - args->job->smpi_app_name.c_str()); - - smpi_replay_run(&argc, &argv); - XBT_INFO("Finished replaying rank %d of job %d (smpi_app '%s')", args->rank, args->job->unique_job_number, - args->job->smpi_app_name.c_str()); + XBT_INFO("Replaying rank %d of job %d (smpi_app '%s')", rank, job->unique_job_number, job->smpi_app_name.c_str()); + smpi_replay_run(job->smpi_app_name.c_str(), rank, 0, job->traces_filenames[rank].c_str()); + XBT_INFO("Finished replaying rank %d of job %d (smpi_app '%s')", rank, job->unique_job_number, + job->smpi_app_name.c_str()); - args->barrier->wait(); - - delete args; - return 0; + barrier->wait(); } // Sleeps for a given amount of time -static int sleeper_process(int* param) +static int sleeper_process(const int* param) { XBT_DEBUG("Sleeping for %d seconds", *param); simgrid::s4u::this_actor::sleep_for(*param); @@ -93,8 +79,7 @@ static int sleeper_process(int* param) static void pop_some_processes(int nb_processes, simgrid::s4u::Host* host) { for (int i = 0; i < nb_processes; ++i) { - int* param = new int; - *param = i + 1; + auto* param = new int(i + 1); simgrid::s4u::Actor::create("meh", host, sleeper_process, param); } } @@ -106,32 +91,21 @@ static int job_executor_process(Job* job) simgrid::s4u::BarrierPtr barrier = simgrid::s4u::Barrier::create(job->app_size + 1); for (int i = 0; i < job->app_size; ++i) { - char** argv = xbt_new(char*, 5); - argv[0] = xbt_strdup("1"); // log only? - argv[1] = xbt_strdup(job->smpi_app_name.c_str()); // application instance - argv[2] = bprintf("%d", i); // rank - argv[3] = xbt_strdup(job->traces_filenames[i].c_str()); // smpi trace file for this rank - argv[4] = xbt_strdup("0"); // ? - - s_smpi_replay_process_args* args = new s_smpi_replay_process_args; - args->job = job; - args->barrier = barrier; - args->rank = i; - - char* str_pname = bprintf("%d_%d", job->unique_job_number, i); - MSG_process_create_with_arguments(str_pname, smpi_replay_process, (void*)args, hosts[job->allocation[i]], 5, argv); + char* str_pname = bprintf("rank_%d_%d", job->unique_job_number, i); + simgrid::s4u::Actor::create(str_pname, hosts[job->allocation[i]], smpi_replay_process, job, barrier, i); xbt_free(str_pname); } barrier->wait(); + simgrid::s4u::this_actor::sleep_for(1); XBT_INFO("Finished job %d (smpi_app '%s')", job->unique_job_number, job->smpi_app_name.c_str()); return 0; } // Executes a workload of SMPI processes -static int workload_executor_process(std::vector* workload) +static int workload_executor_process(const std::vector* workload) { for (Job* job : *workload) { // Let's wait until the job's waiting time if needed @@ -151,9 +125,10 @@ static int workload_executor_process(std::vector* workload) } // Let's finally run the job executor - std::string job_process_name = "job_" + job->smpi_app_name; + char* str_pname = bprintf("job_%04d", job->unique_job_number); XBT_INFO("Launching the job executor of job %d (app '%s')", job->unique_job_number, job->smpi_app_name.c_str()); - simgrid::s4u::Actor::create(job_process_name.c_str(), hosts[job->allocation[0]], job_executor_process, job); + simgrid::s4u::Actor::create(str_pname, hosts[job->allocation[0]], job_executor_process, job); + xbt_free(str_pname); } return 0; @@ -240,7 +215,6 @@ int main(int argc, char* argv[]) argv[0], argv[0]); // Simulation setting - MSG_init(&argc, argv); simgrid::s4u::Engine e(&argc, argv); e.load_platform(argv[1]); hosts = e.get_all_hosts(); @@ -251,7 +225,7 @@ int main(int argc, char* argv[]) // Let's register them for (const Job* job : jobs) - SMPI_app_instance_register(job->smpi_app_name.c_str(), smpi_replay_process, job->app_size); + SMPI_app_instance_register(job->smpi_app_name.c_str(), nullptr, job->app_size); SMPI_init(); @@ -268,7 +242,7 @@ int main(int argc, char* argv[]) } // Let's execute the workload - simgrid::s4u::Actor::create("workload_executor", hosts[0], workload_executor_process, &jobs); + simgrid::s4u::Actor::create("workload", hosts[0], workload_executor_process, &jobs); e.run(); XBT_INFO("Simulation finished! Final time: %g", e.get_clock());