#! /usr/bin/perl #$num_ctrs = 11; for ($num_ctrs = 2; $num_ctrs <= 12; $num_ctrs++) { $num_events = $num_ctrs + 1; @sched_log = (); $scheduled = 0; $used_mask = 0; $loops = 0; $redos = 0; $scheduled = 0; while ($scheduled < $num_events) { for ($idx = $sched_log[$scheduled] || 0; $idx < $num_ctrs; $idx++) { $loops++; last if !((1 << $idx) & $used_mask); } if ($idx == $num_ctrs) { printf "Failed to schedule event #%d\n", $scheduled; last if (!$scheduled); $sched_log[$scheduled] = 0; $scheduled--; $idx = $sched_log[$scheduled]; $sched_log[$scheduled]++; $used_mask &= ~(1 << $idx); printf "Rollback event #%d on counter #%d\n", $scheduled, $idx; $redos++; redo; } $used_mask |= (1 << $idx); $sched_log[$scheduled] = $idx; printf "Scheduling event #%d on counter #%d\n", $scheduled, $idx; $scheduled++; } printf("Number of counters: %2d, loops: %3d, redos: %3d, ratio: %.1f\n", $num_ctrs, $loops, $redos, $loops / $redos); }