def test_total_proc_time(self): ''' Accessor total_proc_time. ''' result = SchedulingResult(scheme=self.scheme, ofmap_layout=self.ofmap_layout, sched_seq=self.sched_seq) self.assertAlmostEqual(result.total_proc_time, 59) scheme = self.scheme scheme['bus_time'] = 100 result = SchedulingResult(scheme=scheme, ofmap_layout=self.ofmap_layout, sched_seq=self.sched_seq) self.assertAlmostEqual(result.total_proc_time, 59)
def test_invalid_sched_seq(self): ''' Invalid sched_seq. ''' with self.assertRaisesRegexp(TypeError, 'SchedulingResult: .*sched_seq.*'): _ = SchedulingResult(scheme=self.scheme, ofmap_layout=self.ofmap_layout, sched_seq=list(self.sched_seq)) with self.assertRaisesRegexp(ValueError, 'SchedulingResult: .*sched_seq.*'): _ = SchedulingResult(scheme=self.scheme, ofmap_layout=self.ofmap_layout, sched_seq=self.sched_seq[:-1])
def test_invalid_ofmap_layout(self): ''' Invalid ofmap_layout. ''' with self.assertRaisesRegexp(TypeError, 'SchedulingResult: .*ofmap_layout.*'): _ = SchedulingResult(scheme=self.scheme, ofmap_layout=None, sched_seq=self.sched_seq)
def test_invalid_dict_loop(self): ''' Invalid dict_loop. ''' with self.assertRaisesRegexp(TypeError, 'SchedulingResult: .*dict_loop.*'): _ = SchedulingResult(dict_loop={}, dict_part=self.dict_part, ofmap_layout=self.ofmap_layout)
def test_invalid_ofmap_layout(self): ''' Invalid ofmap_layout. ''' with self.assertRaisesRegexp(TypeError, 'SchedulingResult: .*ofmap_layout.*'): _ = SchedulingResult(dict_loop=self.dict_loop, dict_part=self.dict_part, ofmap_layout=None)
def test_invalid_scheme(self): ''' Invalid scheme. ''' with self.assertRaisesRegexp(TypeError, 'SchedulingResult: .*scheme.*'): _ = SchedulingResult(scheme={}, ofmap_layout=self.ofmap_layout, sched_seq=self.sched_seq)
def setUp(self): self.network = Network('test_net') self.network.set_input(InputLayer(3, 224)) self.network.add('c1', ConvLayer(3, 64, 224, 3)) self.network.add('p1', PoolingLayer(64, 7, 32), prevs='c1') self.network.add('p2', PoolingLayer(64, 7, 32), prevs='c1') self.network.add('f1', FCLayer(64, 1000, 7), prevs=['p1', 'p2']) self.batch_size = 4 self.input_layout = partition.get_ofmap_layout( self.network.input_layer(), self.batch_size, PartitionScheme(order=range(pe.NUM), pdims=[(1, 1)] * pe.NUM), NodeRegion(origin=PhyDim2(0, 0), dim=PhyDim2(2, 1), type=NodeRegion.DATA)) self.c1res = SchedulingResult( dict_loop=OrderedDict([('cost', 1.), ('time', 2.), ('ops', 4.), ('access', [[7, 8, 9]] * me.NUM), ]), dict_part=OrderedDict([('cost', 0.5), ('total_nhops', [4, 5, 6]), ('num_nodes', 4), ]), ofmap_layout=partition.get_ofmap_layout( self.network['c1'], self.batch_size, PartitionScheme(order=range(pe.NUM), pdims=[(1, 1)] * pe.NUM), NodeRegion(origin=PhyDim2(0, 0), dim=PhyDim2(1, 2), type=NodeRegion.DATA))) self.pres = SchedulingResult( dict_loop=OrderedDict([('cost', 0.1), ('time', 0.05), ('ops', 0.1), ('access', [[.7, .8, .9]] * me.NUM), ]), dict_part=OrderedDict([('cost', 0.5), ('total_nhops', [.4, .5, .6]), ('num_nodes', 2), ]), ofmap_layout=partition.get_ofmap_layout( self.network['p1'], self.batch_size, PartitionScheme(order=range(pe.NUM), pdims=[(1, 1)] * pe.NUM), NodeRegion(origin=PhyDim2(0, 0), dim=PhyDim2(1, 2), type=NodeRegion.DATA))) self.dtfl = NNDataflowScheme(self.network, self.input_layout) self.dtfl['c1'] = self.c1res self.dtfl['p1'] = self.pres self.dtfl['p2'] = self.pres
def test_valid_args(self): ''' Valid arguments. ''' result = SchedulingResult(dict_loop=self.dict_loop, dict_part=self.dict_part, ofmap_layout=self.ofmap_layout) self.assertIn('ops', result.dict_loop) self.assertIn('total_nhops', result.dict_part) self.assertEqual(result.ofmap_layout, self.ofmap_layout)
def test_total_accesses_rgbuf(self): ''' Accessor total_accesses remote gbuf. ''' scheme = self.scheme.copy() scheme['remote_gbuf_access'] = [10, 20, 30] result = SchedulingResult(scheme=scheme, ofmap_layout=self.ofmap_layout, sched_seq=self.sched_seq) self.assertSequenceEqual(result.total_accesses, [9, 120 + 60, 1500, 18000])
def test_total_time(self): ''' Accessor total_time. ''' result = SchedulingResult(scheme=self.scheme, ofmap_layout=self.ofmap_layout, sched_seq=self.sched_seq) self.assertAlmostEqual(result.total_time, 123.4) self.assertGreaterEqual(result.total_time, result.total_node_time) self.assertGreaterEqual(result.total_time, result.total_dram_time)
def test_valid_args(self): ''' Valid arguments. ''' result = SchedulingResult(scheme=self.scheme, ofmap_layout=self.ofmap_layout, sched_seq=self.sched_seq) self.assertIn('ops', result.scheme) self.assertIn('total_nhops', result.scheme) self.assertEqual(result.ofmap_layout, self.ofmap_layout) self.assertTupleEqual(result.sched_seq, self.sched_seq)
def _make_sched_res(self, sched_seq, time, top_ti=1, top_to=1, top_tb=1, top_ord=range(le.NUM), dram_time=0, num_nodes=4): scheme = OrderedDict() scheme['cost'] = 1.234 + 9.876 scheme['time'] = max(time, dram_time) scheme['num_nodes'] = num_nodes scheme['proc_time'] = time scheme['bus_time'] = 0 scheme['dram_time'] = dram_time scheme['ti'] = [top_ti, 1, 1] scheme['to'] = [top_to, 1, 1] scheme['tb'] = [top_tb, 1, 1] scheme['tvals'] = [[top_ti, top_to, top_tb], [1] * 3, [1] * 3] scheme['orders'] = [top_ord, range(le.NUM), range(le.NUM)] return SchedulingResult(scheme=scheme, ofmap_layout=self.ofmap_layout, sched_seq=sched_seq)
def test_total_cost(self): ''' Accessor total_cost. ''' result = SchedulingResult(scheme=self.scheme, ofmap_layout=self.ofmap_layout, sched_seq=self.sched_seq) self.assertAlmostEqual(result.total_cost, 1.234 + 9.876)
def setUp(self): self.network = Network('test_net') self.network.set_input_layer(InputLayer(3, 224)) self.network.add('c1', ConvLayer(3, 64, 224, 3)) self.network.add('p1', PoolingLayer(64, 7, 32), prevs='c1') self.network.add('p2', PoolingLayer(64, 7, 32), prevs='c1') self.network.add('f1', FCLayer(128, 1000, 7), prevs=['p1', 'p2']) self.batch_size = 4 input_layer = self.network.input_layer() self.input_layout = DataLayout( frngs=(FmapRange((0, 0, 0, 0), FmapPosition(b=self.batch_size, n=input_layer.nofm, h=input_layer.hofm, w=input_layer.wofm)), ), regions=(NodeRegion(origin=PhyDim2(0, 0), dim=PhyDim2(2, 1), type=NodeRegion.DRAM), ), parts=(PartitionScheme(order=range(pe.NUM), pdims=[(1, 1)] * pe.NUM), )) c1_layer = self.network['c1'] self.c1res = SchedulingResult( scheme=OrderedDict([ ('cost', 1.5), ('time', 200.), ('ops', 4.), ('num_nodes', 4), ('cost_op', 0.5), ('cost_access', 1.), ('cost_noc', 0), ('cost_static', 0), ('proc_time', 200), ('bus_time', 0), ('dram_time', 0), ('access', [[7, 8, 9]] * me.NUM), ('remote_gbuf_access', [0] * 3), ('total_nhops', [4, 5, 6]), ('fetch', [[1, 1, 1], [2, 2, 2]]), ('ti', [2, 2, 3]), ('to', [1, 2, 3]), ('tb', [1, 2, 3]), ('tvals', [[2, 1, 1], [2, 2, 2], [3, 3, 3]]), ('orders', [range(3)] * 2), ]), ofmap_layout=DataLayout( frngs=(FmapRange( (0, 0, 0, 0), FmapPosition(b=self.batch_size, n=c1_layer.nofm, h=c1_layer.hofm, w=c1_layer.wofm)), ), regions=(NodeRegion(origin=PhyDim2(0, 0), dim=PhyDim2(1, 2), type=NodeRegion.DRAM), ), parts=(PartitionScheme(order=range(pe.NUM), pdims=[(1, 1)] * pe.NUM), )), sched_seq=(0, 0, 0)) p1_layer = self.network['p1'] self.p1res = SchedulingResult( scheme=OrderedDict([ ('cost', 0.6), ('time', 5), ('ops', 0.1), ('num_nodes', 2), ('cost_op', 0.1), ('cost_access', 0.5), ('cost_noc', 0), ('cost_static', 0), ('proc_time', 5), ('bus_time', 0), ('dram_time', 0), ('access', [[.7, .8, .9]] * me.NUM), ('remote_gbuf_access', [0] * 3), ('total_nhops', [.4, .5, .6]), ('fetch', [[1, 1, 1], [2, 2, 2]]), ('ti', [2, 2, 3]), ('to', [1, 2, 3]), ('tb', [1, 2, 3]), ('tvals', [[2, 1, 1], [2, 2, 2], [3, 3, 3]]), ('orders', [range(3)] * 2), ]), ofmap_layout=DataLayout( frngs=(FmapRange( (0, 0, 0, 0), FmapPosition(b=self.batch_size, n=p1_layer.nofm, h=p1_layer.hofm, w=p1_layer.wofm)), ), regions=(NodeRegion(origin=PhyDim2(0, 0), dim=PhyDim2(1, 2), type=NodeRegion.DRAM), ), parts=(PartitionScheme(order=range(pe.NUM), pdims=[(1, 1)] * pe.NUM), )), sched_seq=(0, 1, 0)) self.p2res = SchedulingResult(scheme=self.p1res.scheme, ofmap_layout=self.p1res.ofmap_layout, sched_seq=(0, 2, 0)) self.dtfl = NNDataflowScheme(self.network, self.input_layout) self.dtfl['c1'] = self.c1res self.dtfl['p1'] = self.p1res self.dtfl['p2'] = self.p2res
def test_total_ops(self): ''' Accessor total_ops. ''' result = SchedulingResult(dict_loop=self.dict_loop, dict_part=self.dict_part, ofmap_layout=self.ofmap_layout) self.assertEqual(result.total_ops, 1234)
def test_total_time(self): ''' Accessor total_time. ''' result = SchedulingResult(dict_loop=self.dict_loop, dict_part=self.dict_part, ofmap_layout=self.ofmap_layout) self.assertAlmostEqual(result.total_time, 123.4)
def test_total_cost(self): ''' Accessor total_cost. ''' result = SchedulingResult(dict_loop=self.dict_loop, dict_part=self.dict_part, ofmap_layout=self.ofmap_layout) self.assertAlmostEqual(result.total_cost, 1.234 + 9.876)
def test_total_accesses(self): ''' Accessor total_cost. ''' result = SchedulingResult(scheme=self.scheme, ofmap_layout=self.ofmap_layout, sched_seq=self.sched_seq) self.assertSequenceEqual(result.total_accesses, [9, 120, 1500, 18000])
def test_total_accesses(self): ''' Accessor total_cost. ''' result = SchedulingResult(dict_loop=self.dict_loop, dict_part=self.dict_part, ofmap_layout=self.ofmap_layout) self.assertSequenceEqual(result.total_accesses, [9, 120, 1500, 18000])
def test_total_noc_hops(self): ''' Accessor total_noc_hops. ''' result = SchedulingResult(scheme=self.scheme, ofmap_layout=self.ofmap_layout, sched_seq=self.sched_seq) self.assertEqual(result.total_noc_hops, 1368)
def test_num_nodes(self): ''' Accessor num_nodes. ''' result = SchedulingResult(scheme=self.scheme, ofmap_layout=self.ofmap_layout, sched_seq=self.sched_seq) self.assertEqual(result.num_nodes, 4)