X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/loba.git/blobdiff_plain/29d6013f6a85f43d958add37f8317cf038cf335b..596a21890fc3cae8f7ec57c76224b300c246ed1f:/process.cpp diff --git a/process.cpp b/process.cpp index cd11433..57c0661 100644 --- a/process.cpp +++ b/process.cpp @@ -20,7 +20,7 @@ double process::total_load_exit = 0.0; process::process(int argc, char* argv[]) { - if (argc < 2 || !(std::istringstream(argv[1]) >> load)) + if (argc < 2 || !(std::istringstream(argv[1]) >> real_load)) throw std::invalid_argument("bad or missing initial load parameter"); neigh.assign(argv + 2, argv + argc); @@ -36,14 +36,16 @@ process::process(int argc, char* argv[]) comp = 0.0; prev_load_broadcast = -1; // force sending of load on first send_all() - expected_load = load; - total_load_running += load; - total_load_init += load; + expected_load = real_load; + total_load_running += real_load; + total_load_init += real_load; ctrl_close_pending = data_close_pending = neigh.size(); close_received = false; finalizing = false; + comp_iter = lb_iter = 0; + e_xbt_log_priority_t logp = xbt_log_priority_verbose; if (!LOG_ISENABLED(logp)) return; @@ -62,13 +64,13 @@ process::process(int argc, char* argv[]) process::~process() { - total_load_exit += load; + total_load_exit += real_load; if (opt::bookkeeping) { INFO4("Final load after %d:%d iterations: %g ; expected: %g", - lb_iter, comp_iter, load, expected_load); + lb_iter, comp_iter, real_load, expected_load); } else { INFO2("Final load after %d iterations: %g", - lb_iter, load); + lb_iter, real_load); if (lb_iter != comp_iter) WARN2("lb_iter (%d) and comp_iter (%d) differ!", lb_iter, comp_iter); @@ -79,12 +81,10 @@ process::~process() int process::run() { double next_iter_after_date = 0.0; - INFO1("Initial load: %g", load); + INFO1("Initial load: %g", real_load); VERB0("Starting..."); - comp_iter = lb_iter = 0; while (true) { - double ld = lb_load(); - if (ld > 0.0) { + if (get_load() > 0.0) { double now = MSG_get_clock(); if (now < next_iter_after_date) MSG_process_sleep(next_iter_after_date - now); @@ -95,21 +95,20 @@ int process::run() if (opt::log_rate && lb_iter % opt::log_rate == 0) { if (opt::bookkeeping) INFO4("(%u:%u) current load: %g ; expected: %g", - lb_iter, comp_iter, load, expected_load); + lb_iter, comp_iter, real_load, expected_load); else INFO2("(%u) current load: %g", - lb_iter, load); + lb_iter, real_load); } - ld -= load_balance(ld); + load_balance(); print_loads(true, xbt_log_priority_debug); } - lb_load() = ld; // send load information, and load (data) if any send_all(); - if (load > 0.0) { + if (real_load > 0.0) { ++comp_iter; compute(); } @@ -130,7 +129,7 @@ int process::run() // block on receiving unless there is something to compute or // to send double timeout; - if (load != 0 || lb_load() != prev_load_broadcast) + if (real_load != 0 || get_load() != prev_load_broadcast) timeout = 0.0; else if (opt::min_iter_duration) timeout = opt::min_iter_duration; @@ -145,7 +144,7 @@ int process::run() } // have no load and cannot receive anything - if (load == 0.0 && !may_receive()) { + if (real_load == 0.0 && !may_receive()) { VERB0("I'm a poor lonesome process, and I have no load..."); break; } @@ -174,17 +173,16 @@ int process::run() return 0; } -double process::load_balance(double /*my_load*/) +void process::load_balance() { if (lb_iter == 1) // warn only once WARN0("process::load_balance() is a no-op!"); - return 0.0; } void process::compute() { - if (load > 0.0) { - double flops = opt::comp_cost(load); + if (real_load > 0.0) { + double flops = opt::comp_cost(real_load); m_task_t task = MSG_task_create("computation", flops, 0.0, NULL); TRACE_msg_set_task_category(task, TRACE_CAT_COMP); DEBUG2("compute %g flop%s", flops, ESSE(flops)); @@ -196,10 +194,17 @@ void process::compute() } } +void process::send(neighbor& nb, double amount) +{ + set_load(get_load() - amount); + nb.set_to_send(nb.get_to_send() + amount); + nb.set_load(nb.get_load() + amount); // fixme: make this optional? +} + void process::send1_no_bookkeeping(neighbor& nb) { - if (load != prev_load_broadcast) - comm.send(nb.get_ctrl_mbox(), new message(message::INFO, load)); + if (real_load != prev_load_broadcast) + comm.send(nb.get_ctrl_mbox(), new message(message::INFO, real_load)); double load_to_send = nb.get_to_send(); if (load_to_send > 0.0) { comm.send(nb.get_data_mbox(), new message(message::LOAD, load_to_send)); @@ -223,14 +228,14 @@ void process::send1_bookkeeping(neighbor& nb) } else { new_debt = nb.get_debt(); } - if (load <= new_debt) { - load_to_send = load; + if (real_load <= new_debt) { + load_to_send = real_load; nb.set_debt(new_debt - load_to_send); - load = 0.0; + real_load = 0.0; } else { load_to_send = new_debt; nb.set_debt(0.0); - load -= load_to_send; + real_load -= load_to_send; } if (load_to_send > 0.0) comm.send(nb.get_data_mbox(), new message(message::LOAD, load_to_send)); @@ -248,7 +253,7 @@ void process::send_all() } else { std::for_each(neigh.begin(), neigh.end(), bind(&process::send1_no_bookkeeping, this, _1)); - prev_load_broadcast = load; + prev_load_broadcast = real_load; } comm.flush(false); } @@ -271,7 +276,7 @@ void process::receive(double timeout) break; case message::LOAD: { double ld = msg->get_amount(); - load += ld; + real_load += ld; if (finalizing) total_load_running -= ld; break; @@ -303,17 +308,17 @@ void process::finalize() using std::tr1::placeholders::_1; finalizing = true; - total_load_running -= load; + total_load_running -= real_load; DEBUG2("send CLOSE to %lu neighbor%s", (unsigned long )neigh.size(), ESSE(neigh.size())); std::for_each(neigh.begin(), neigh.end(), bind(&process::finalize1, this, _1)); - DEBUG2("wait for CLOSE from %lu neighbor%s", - (unsigned long )neigh.size(), ESSE(neigh.size())); while (may_receive()) { comm.flush(false); + DEBUG2("waiting for %d CTRL and %d DATA CLOSE", + ctrl_close_pending, data_close_pending); receive(-1.0); }