- if (opt::bookkeeping)
- expected_load -= load_balance(expected_load);
- else
- load -= load_balance(load);
-
- send();
- compute();
-
-// NDS for Need To Send
-#define NDS ((opt::bookkeeping ? expected_load : load) != prev_load_broadcast)
- bool can_recv;
- do {
- // General idea: do not iterate if there is nothing to
- // compute, nor to send.
-
- // fixme: review this chunk, and remove this NDS macro!
-
- bool recv_wait = (load == 0 && !NDS);
- bool close_received = !receive(recv_wait? WAIT: NO_WAIT);
-
- if (opt::exit_on_close && close_received)
- one_more = false;
- else if (opt::maxiter && iter >= opt::maxiter)
- one_more = false;
-
- can_recv = (ctrl_close_pending || data_close_pending);
-
- } while (one_more && can_recv && load == 0 && !NDS);
-#undef NDS
-
- } while (one_more);
- VERB0("Going to finalize...");
- finalize();
-
- /* Open Questions :
- * - definition of load on heterogeneous hosts ?
- * - how to detect convergence ?
- * - how to manage link failures ?
- */
-
- VERB0("Done.");
- INFO3("Final load after %d iteration%s: %g", iter, ESSE(iter), load);
- if (opt::bookkeeping)
- INFO1("Expected load: %g", expected_load);
- return 0;
-}