name); $sum2 = new RESULT($p2->name); @mkdir($out_dir); foreach ($set as $s) { $sum1 = do_sim_aux($out_dir, $s, $p1, "p1", $sum1); $sum2 = do_sim_aux($out_dir, $s, $p2, "p2", $sum2); } $sum1->scale(count($set)); $sum2->scale(count($set)); graph_2_results($title, $out_dir, $sum1, $sum2); } // For a given policy and a set of parameterized scenarios, // show the average results as a function of the parameter. // Outputs are stored in the given directory. // Subdirectories scenario_arg/ store individual sim outputs // function compare_scenario_params1($title, $set, $policy, $lo, $hi, $inc, $out_dir) { @mkdir($out_dir); $results = array(); for ($x = $lo; $x <= $hi; $x += $inc) { $sum = new RESULT($x); foreach ($set as $s) { $sum = do_sim_scenario_param($out_dir, $s, $policy, $x, $sum); } $results[] = $sum; } graph_n_results1($title, $out_dir, $results); } // same, but compare 2 policies and graph only wasted CPU // function compare_scenario_params2($title, $xlabel, $lab1, $lab2, $set, $p1, $p2, $lo, $hi, $inc, $out_dir) { @mkdir($out_dir); $rr1 = array(); $rr2 = array(); for ($x = $lo; $x <= $hi; $x += $inc) { $sum = new RESULT($x); foreach ($set as $s) { $sum = do_sim_scenario_param($out_dir, $s, $p1, $x, $sum); } $rr1[] = $sum; $sum = new RESULT($x); foreach ($set as $s) { $sum = do_sim_scenario_param($out_dir, $s, $p2, $x, $sum); } $rr2[] = $sum; } graph_n_results2($title, $xlabel, $lab1, $lab2, $out_dir, $rr1, $rr2, 3); } // compare two policies, varying rec_half_life // function compare_policy_params($title, $xlabel, $lab1, $lab2, $set, $p1, $p2, $lo, $hi, $inc, $out_dir) { global $rec_half_life; @mkdir($out_dir); $rr1 = array(); $rr2 = array(); for ($x = $lo; $x <= $hi; $x += $inc) { $rec_half_life = $x; $sum = new RESULT($x); foreach ($set as $s) { $sum1 = do_sim_policy_param($out_dir, $s, $p1, $x, $sum); } $rr1[] = $sum; $sum = new RESULT($x); foreach ($set as $s) { $sum1 = do_sim_policy_param($out_dir, $s, $p2, $x, $sum); } $rr2[] = $sum; } graph_n_results2($title, $xlabel, $lab1, $lab2, $out_dir, $rr1, $rr2, 7); } ///////////// EXAMPLE USAGES //////////// // compare REC and debt scheduling for a set of scenarios // if (0) { $p1 = new POLICY("JS_LOCAL"); $p2 = new POLICY("JS_GLOBAL"); $p2->use_rec = true; compare_policies("Scenario 2", array("scen2"), $p1, $p2, "test1"); } if (0) { $p = new POLICY(""); $p->use_rec = true; $lo = 2e9; $hi = 1e10; $inc = 1e9; compare_scenario_params1("Scenario 3", array("s3"), $p, $lo, $hi, $inc, "test2"); } if (1) { $p1 = new POLICY("WF_ORIG"); $p2 = new POLICY("WF_HYST"); $p2->use_hyst_fetch = true; compare_policies("Scenario 4", array("scen4"), $p1, $p2, "test3"); } if (0) { $p1 = new POLICY("JS_LOCAL"); $p2 = new POLICY("JS_GLOBAL"); $p2->use_rec = true; compare_policies("Scenario 4", array("scen4"), $p1, $p2, "test4"); } if (0) { $duration = 50* 86400; $p1 = new POLICY("JS_LOCAL"); $p2 = new POLICY("JS_GLOBAL"); $p2->use_rec = true; compare_policies("Scenario 3", array("scen3"), $p1, $p2, "test5"); } // compare WRR and EDF if (0) { $p1 = new POLICY("JS_LOCAL"); $p1->use_rec = true; $p1->use_hyst_fetch = true; $p1->cpu_sched_rr_only = true; $p2 = new POLICY("JS_WRR"); $p2->use_rec = true; $p2->use_hyst_fetch = true; $lo = 1000; $hi = 2000; $inc = 100; compare_scenario_params2("Wasted processing", "Latency bound", "JS_WRR", "JS_LOCAL", array("scen5"), $p1, $p2, $lo, $hi, $inc, "test6"); } // compare rec and debt over a range of rec_half_life if (0) { $p1 = new POLICY("JS_LOCAL"); $p2 = new POLICY("JS_GLOBAL"); $p2->use_rec = true; $lo = 5*86400; $hi = 40*86400; $inc = 5*86400; $duration = 50* 86400; compare_policy_params("Resource share violation", "REC half-life", "JS_LOCAL", "JS_GLOBAL", array("scen3"), $p1, $p2, $lo, $hi, $inc, "test7"); } if (0) { $p1 = new POLICY("JS_LOCAL + WF_ORIG"); $p2 = new POLICY("JS_GLOBAL + WF_HYSTERESIS"); $p2->use_rec = true; compare_policies("Scenario 4", array("scen4"), $p1, $p2, "test8"); } ?>