X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/loba.git/blobdiff_plain/1bba96ae977208a57bd80c7011c2033435a64d44..e9c3c48dfa8ea8ebddb2550a1cdd9981c8874bf8:/process.cpp diff --git a/process.cpp b/process.cpp index 6d791bd..34ddbea 100644 --- a/process.cpp +++ b/process.cpp @@ -44,6 +44,8 @@ process::process(int argc, char* argv[]) 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; @@ -56,7 +58,7 @@ process::process(int argc, char* argv[]) std::tr1::mem_fn(&neighbor::get_name)); oss << neigh.back().get_name(); } - LOG1(logp, "Got %s.", oss.str().c_str()); + XBT_LOG(logp, "Got %s.", oss.str().c_str()); print_loads(false, logp); } @@ -64,48 +66,45 @@ process::~process() { total_load_exit += real_load; if (opt::bookkeeping) { - INFO4("Final load after %d:%d iterations: %g ; expected: %g", - lb_iter, comp_iter, real_load, expected_load); + XBT_INFO("Final load after %d:%d iterations: %g ; expected: %g", + lb_iter, comp_iter, real_load, expected_load); } else { - INFO2("Final load after %d iterations: %g", - lb_iter, real_load); + XBT_INFO("Final load after %d iterations: %g", + lb_iter, real_load); if (lb_iter != comp_iter) - WARN2("lb_iter (%d) and comp_iter (%d) differ!", - lb_iter, comp_iter); + XBT_WARN("lb_iter (%d) and comp_iter (%d) differ!", + lb_iter, comp_iter); } - VERB1("Total computation for this process: %g", comp); + XBT_VERB("Total computation for this process: %g", comp); } int process::run() { double next_iter_after_date = 0.0; - INFO1("Initial load: %g", real_load); - VERB0("Starting..."); - comp_iter = lb_iter = 0; + XBT_INFO("Initial load: %g", real_load); + XBT_VERB("Starting..."); 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); - next_iter_after_date = MSG_get_clock() + opt::min_iter_duration; + next_iter_after_date = MSG_get_clock() + opt::min_lb_iter_duration; ++lb_iter; 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, real_load, expected_load); + XBT_INFO("(%u:%u) current load: %g ; expected: %g", + lb_iter, comp_iter, real_load, expected_load); else - INFO2("(%u) current load: %g", - lb_iter, real_load); + XBT_INFO("(%u) current load: %g", + 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(); @@ -115,38 +114,38 @@ int process::run() } if (opt::lb_maxiter && lb_iter >= opt::lb_maxiter) { - VERB2("Reached lb_maxiter: %d/%d", lb_iter, opt::lb_maxiter); + XBT_VERB("Reached lb_maxiter: %d/%d", lb_iter, opt::lb_maxiter); break; } if (opt::comp_maxiter && comp_iter >= opt::comp_maxiter) { - VERB2("Reached comp_maxiter: %d/%d", comp_iter, opt::comp_maxiter); + XBT_VERB("Reached comp_maxiter: %d/%d", comp_iter, opt::comp_maxiter); break; } if (opt::time_limit && MSG_get_clock() >= opt::time_limit) { - VERB2("Reached time limit: %g/%g", MSG_get_clock(), opt::time_limit); + XBT_VERB("Reached time limit: %g/%g", MSG_get_clock(), opt::time_limit); break; } // block on receiving unless there is something to compute or // to send double timeout; - if (real_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; + else if (opt::min_lb_iter_duration) + timeout = opt::min_lb_iter_duration; else timeout = 1.0; receive(timeout); // one of our neighbor is finalizing if (opt::exit_on_close && close_received) { - VERB0("Close received"); + XBT_VERB("Close received"); break; } // have no load and cannot receive anything if (real_load == 0.0 && !may_receive()) { - VERB0("I'm a poor lonesome process, and I have no load..."); + XBT_VERB("I'm a poor lonesome process, and I have no load..."); break; } @@ -155,13 +154,13 @@ int process::run() // fixme: should this chunk be moved before call to receive() ? if (100.0 * total_load_running / total_load_init <= opt::load_ratio_threshold) { - VERB0("No more load to balance in system."); + XBT_VERB("No more load to balance in system."); break; } else { - DEBUG1("still %g load to balance, continuing...", total_load_running); + XBT_DEBUG("still %g load to balance, continuing...", total_load_running); } } - VERB0("Going to finalize..."); + XBT_VERB("Going to finalize..."); finalize(); /* Open Questions : @@ -170,15 +169,14 @@ int process::run() * - how to manage link failures ? */ - VERB0("Done."); + XBT_VERB("Done."); 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; + XBT_WARN("process::load_balance() is a no-op!"); } void process::compute() @@ -187,15 +185,22 @@ void process::compute() 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)); + XBT_DEBUG("compute %g flop%s", flops, ESSE(flops)); MSG_task_execute(task); comp += flops; MSG_task_destroy(task); } else { - DEBUG0("nothing to compute !"); + XBT_DEBUG("nothing to 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 (real_load != prev_load_broadcast) @@ -258,7 +263,7 @@ void process::receive(double timeout) message* msg; m_host_t from; - DEBUG2("%sblocking receive (%g)", "\0non-" + !timeout, timeout); + XBT_DEBUG("%sblocking receive (%g)", "\0non-" + !timeout, timeout); while (may_receive() && comm.recv(msg, from, timeout)) { switch (msg->get_type()) { case message::INFO: { @@ -305,15 +310,14 @@ void process::finalize() finalizing = true; total_load_running -= real_load; - DEBUG2("send CLOSE to %lu neighbor%s", - (unsigned long )neigh.size(), ESSE(neigh.size())); + XBT_DEBUG("send CLOSE to %zu neighbor%s", 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); + XBT_DEBUG("waiting for %d CTRL and %d DATA CLOSE", + ctrl_close_pending, data_close_pending); receive(-1.0); } @@ -324,7 +328,7 @@ void process::finalize() if (_XBT_LOG_ISENABLEDV((*cat), logp)) { \ using std::tr1::bind; \ using std::tr1::placeholders::_1; \ - XCLOG0(cat, logp, "Neighbor loads:"); \ + XBT_XCLOG(cat, logp, "Neighbor loads:"); \ std::for_each(vec.begin(), vec.end(), \ bind(&neighbor::print, _1, verbose, logp, cat)); \ } else ((void)0)