def partition_with_splits(ts): # Use worst-fit-decreasing APA partitioning with C=D splitting fail, maps = apa.edf_worst_fit_decreasing_difficulty(ts, with_splits=True, split_callback=split_task) assert fail == set(), 'WARN: some tasks failed mapping: ' + str(fail) # Figure out all the processors on which a task is mapped vcpu_list = {} for i in maps: for t in maps[i]: name = '%d.%d' % (t.dom_id, t.vcpu_id) if name not in vcpu_list: vcpu_list[name] = [] vcpu_list[name].append(i) # Now generate a VCPU info list from the mapping info splits = [] vinfo_list = [] i = 0 for k, v in vcpu_list.iteritems(): dom = k.split('.')[0] vcpu = k.split('.')[1] burstable = [x for x in ts if x.dom_id == int(dom) and x.vcpu_id == int(vcpu)][0].burstable vinfo_list.append(VCPUInfo(dom, vcpu, v, i, burstable)) if len(v) > 1: splits.append([dom, vcpu]) i += 1 return maps, vinfo_list, splits
def test_worst_fit_with_splits(self): failed, mapping = apa.edf_worst_fit_decreasing_difficulty(self.ts1, with_splits=True) self.assertEqual(failed, set()) self.assertEqual(len(mapping), 2) self.assertEqual(mapping[1][0].cost, 66) self.assertEqual(mapping[1][1].cost, 34) self.assertEqual(mapping[2][0].cost, 66) self.assertEqual(mapping[2][1].cost, 32)
def test_worst_fit_with_splits(self): failed, mapping = apa.edf_worst_fit_decreasing_difficulty( self.ts1, with_splits=True) self.assertEqual(failed, set()) self.assertEqual(len(mapping), 2) self.assertEqual(mapping[1][0].cost, 66) self.assertEqual(mapping[1][1].cost, 34) self.assertEqual(mapping[2][0].cost, 66) self.assertEqual(mapping[2][1].cost, 32)
def test_worst_fit(self): failed, mapping = apa.edf_worst_fit_decreasing_difficulty(self.ts) self.assertEqual(failed, set()) self.assertEqual(len(mapping), 3) self.assertEqual(mapping[1], [self.ts[0], self.ts[1]]) self.assertEqual(mapping[2], [self.ts[2]]) self.assertEqual(mapping[3], [self.ts[3]]) # give it one more to place self.ts.append(tasks.SporadicTask(19, 31)) self.ts[-1].affinity = set([2, 3]) self.ts.assign_ids() failed, mapping = apa.edf_worst_fit_decreasing_difficulty(self.ts) self.assertEqual(len(mapping), 3) self.assertEqual(mapping[1], [self.ts[0], self.ts[1]]) self.assertEqual(mapping[2], [self.ts[2]]) self.assertEqual(mapping[3], [self.ts[4]]) self.assertEqual(failed, set([self.ts[3]]))
def test_worst_fit_with_splits2(self): self.ts1.append(tasks.SporadicTask(31, 100)) self.ts1[-1].affinity = set([1, 2]) failed, mapping = apa.edf_worst_fit_decreasing_difficulty(self.ts1, with_splits=True) self.assertNotEqual(failed, set()) self.assertEqual(failed.pop().id, self.ts1[-1].id) self.assertEqual(len(mapping), 2) self.assertEqual(mapping[1][0].cost, 66) self.assertEqual(mapping[1][1].cost, 34) self.assertEqual(mapping[2][0].cost, 66) self.assertEqual(mapping[2][1].cost, 32) self.assertEqual(mapping[2][2].cost, 2)
def test_worst_fit_with_splits2(self): self.ts1.append(tasks.SporadicTask(31, 100)) self.ts1[-1].affinity = set([1, 2]) failed, mapping = apa.edf_worst_fit_decreasing_difficulty( self.ts1, with_splits=True) self.assertNotEqual(failed, set()) self.assertEqual(failed.pop().id, self.ts1[-1].id) self.assertEqual(len(mapping), 2) self.assertEqual(mapping[1][0].cost, 66) self.assertEqual(mapping[1][1].cost, 34) self.assertEqual(mapping[2][0].cost, 66) self.assertEqual(mapping[2][1].cost, 32) self.assertEqual(mapping[2][2].cost, 2)