total_load_init += real_load;
received_load = 0.0;
+ idle_duration = 0.0;
convergence = -1.0;
process_counter++;
using std::placeholders::_1;
double next_iter_after_date = MSG_get_clock() + opt::min_comp_iter_duration;
+ double idle_since_date = 0.0;
while (still_running()) {
do {
- // receive (do not block if there is something to compute)
- data_receive(real_load > 0.0 ? 0.0 : opt::min_comp_iter_duration);
+ // receive
+ // if there is something to compute, do not block
+ // else, block the duration of an *lb* iteration
+ data_receive(real_load > 0.0 ? 0.0 : opt::min_lb_iter_duration);
// send
comm.data_flush(false);
convergence_check();
// compute
+ idle_duration += MSG_get_clock() - idle_since_date;
++comp_iter;
double flops = opt::comp_cost(real_load);
m_task_t task = MSG_task_create("computation", flops, 0.0, NULL);
add_comp_amount(flops);
MSG_task_destroy(task);
+ idle_since_date = MSG_get_clock();
+
sleep_until_date(next_iter_after_date, opt::min_comp_iter_duration);
}