From: Arnaud Giersch Date: Sun, 20 Feb 2011 20:08:51 +0000 (+0100) Subject: Add options to control min./max. data transfer amount. X-Git-Tag: v0.1~123 X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/loba.git/commitdiff_plain/805029acc414ec084affd6d6f2790e1f1fa20017?ds=sidebyside Add options to control min./max. data transfer amount. --- diff --git a/options.cpp b/options.cpp index 189bed2..9f7ea5c 100644 --- a/options.cpp +++ b/options.cpp @@ -48,6 +48,8 @@ namespace opt { std::string loba_algo("simple"); bool bookkeeping = false; double min_lb_iter_duration = 1.0; // fixme: find better defaults + double min_transfer_amount = 0.0; + double max_transfer_amount = 0.0; // Application parameters cost_func comp_cost("1e9, 0"); // fixme: find better defaults @@ -201,7 +203,7 @@ bool opt::parse_args(int* argc, char* argv[]) int c; opterr = 0; while ((c = getopt(*argc, argv, - "a:bc:C:d:D:ehi:I:l:L:N:s:S:t:T:vV")) != -1) { + "a:bc:C:d:D:ehi:I:l:L:m:M:N:s:S:t:T:vV")) != -1) { switch (c) { case 'a': opt::loba_algo = optarg; @@ -255,6 +257,12 @@ bool opt::parse_args(int* argc, char* argv[]) case 'L': PARSE_ARG(opt::auto_depl::load); break; + case 'm': + PARSE_ARG(opt::min_transfer_amount); + break; + case 'M': + PARSE_ARG(opt::max_transfer_amount); + break; case 'N': PARSE_ARG(opt::auto_depl::nhosts); break; @@ -308,6 +316,12 @@ bool opt::parse_args(int* argc, char* argv[]) result = false; } + if (opt::max_transfer_amount && + opt::max_transfer_amount < opt::min_transfer_amount) { + XBT_ERROR("max. data transfer amount < min. data transfer amount"); + result = false; + } + return result; } @@ -337,6 +351,8 @@ void opt::print() min_lb_iter_duration); DESCR("computation cost factors", "[%s]", comp_cost.to_string().c_str()); DESCR("communication cost factors", "[%s]", comm_cost.to_string().c_str()); + DESCR("minimum data transfer amount", "%g", min_transfer_amount); + DESCR("maximum data transfer amount", "%g", max_transfer_amount); DESCR("minimum duration between comp. iterations", "%g", min_comp_iter_duration); DESCR("computations start after lb. iter", "%u", comp_iter_delay); @@ -418,6 +434,12 @@ void opt::usage() std::clog << o("-C [aN,...]a0") << "polynomial factors for communication cost" << " [" << opt::comm_cost.to_string() << "]\n"; + std::clog << o("-m value") + << "minimum data transfer amount" + << " [" << opt::min_transfer_amount << "]\n"; + std::clog << o("-M value") + << "maximum data transfer amount (0 for no limit)" + << " [" << opt::max_transfer_amount << "]\n"; std::clog << o("-S value") << "minimum duration between comp. iterations" << " [" << opt::min_comp_iter_duration << "]\n"; diff --git a/options.h b/options.h index 1032a63..b3e3081 100644 --- a/options.h +++ b/options.h @@ -38,6 +38,8 @@ namespace opt { // Load balancing algorithm extern std::string loba_algo; extern bool bookkeeping; + extern double min_transfer_amount; + extern double max_transfer_amount; extern double min_lb_iter_duration; // Application parameters diff --git a/process.cpp b/process.cpp index 2b1b369..33a993e 100644 --- a/process.cpp +++ b/process.cpp @@ -302,23 +302,31 @@ void process::data_send(neighbor& nb) { double load_to_send; if (opt::bookkeeping) { - if (real_load <= nb.get_debt()) { - load_to_send = real_load; + load_to_send = std::min(real_load, nb.get_debt()); + if (load_to_send >= opt::min_transfer_amount) { nb.set_debt(nb.get_debt() - load_to_send); - real_load = 0.0; - } else { - load_to_send = nb.get_debt(); - nb.set_debt(0.0); real_load -= load_to_send; + } else { + load_to_send = 0.0; } } else { load_to_send = nb.get_to_send(); - nb.set_to_send(0.0); - real_load -= load_to_send; + if (load_to_send >= opt::min_transfer_amount) { + nb.set_to_send(0.0); + real_load -= load_to_send; + } else { + load_to_send = 0.0; + } + } + while (load_to_send > 0.0) { + double amount; + if (opt::max_transfer_amount) + amount = std::min(load_to_send, opt::max_transfer_amount); + else + amount = load_to_send; + comm.data_send(nb.get_data_mbox(), new message(message::LOAD, amount)); + load_to_send -= amount; } - if (load_to_send > 0.0) - comm.data_send(nb.get_data_mbox(), - new message(message::LOAD, load_to_send)); } void process::ctrl_close(neighbor& nb)