From 611fcdf8f0e33dabba4486eb78ce482c189248e5 Mon Sep 17 00:00:00 2001 From: Jacob Bohlin Date: Thu, 11 Jun 2020 15:09:57 +0200 Subject: MLBEDSW-2435: Fix for cascading upscaling operators Fixed a coordinate issue which caused the compiler to crash when cascading upscaling operators such as ResizeBilinear. Signed-off-by: Jacob Bohlin Change-Id: I982863573b0e5829e6d0c255dbbc308cb332a37a --- ethosu/vela/high_level_command_stream.py | 8 +++++++- ethosu/vela/high_level_command_stream_generator.py | 14 +++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) (limited to 'ethosu') diff --git a/ethosu/vela/high_level_command_stream.py b/ethosu/vela/high_level_command_stream.py index 9b0298bb..f9048a1e 100644 --- a/ethosu/vela/high_level_command_stream.py +++ b/ethosu/vela/high_level_command_stream.py @@ -34,11 +34,17 @@ class Box: assert self.start_coord[i] <= self.end_coord[i] def transform_with_strides_and_skirt( - self, strides, skirt, ifm_shape, npu_block_type, concat_axis=0, concat_offset=0, split_offset=None, k_height=1 + self, strides, skirt, ifm_shape, npu_block_type, concat_axis=0, concat_offset=0, split_offset=None, k_height=1, + upscaling_factor=1 ): new_start_coord = list(self.start_coord) new_end_coord = list(self.end_coord) + # Adjust for upscaling + if len(new_start_coord) == len(new_end_coord) == 4: + new_start_coord[1] = new_start_coord[1] // upscaling_factor + new_end_coord[1] = new_end_coord[1] // upscaling_factor + new_start_coord[concat_axis] -= concat_offset new_end_coord[concat_axis] -= concat_offset diff --git a/ethosu/vela/high_level_command_stream_generator.py b/ethosu/vela/high_level_command_stream_generator.py index 0cd3ad22..ab72fbcd 100644 --- a/ethosu/vela/high_level_command_stream_generator.py +++ b/ethosu/vela/high_level_command_stream_generator.py @@ -75,9 +75,13 @@ def generate_high_level_command_stream_for_pass(strat, passes, block_configs, id strides = None skirt = None + upscaling = 1 if ps.primary_op is not None: strides = ps.primary_op.attrs.get("strides", None) skirt = ps.primary_op.attrs.get("skirt", None) + if ps.primary_op.type in set(("Conv2DBackpropInputSwitchedBias", "ResizeBilinear")): + upscaling = ofm_tensor.shape[-3] // ifm_tensor.shape[-3] + assert ofm_tensor.shape[-2] == (ifm_tensor.shape[-2] * upscaling) concat_axis = 0 concat_offset = 0 @@ -113,13 +117,13 @@ def generate_high_level_command_stream_for_pass(strat, passes, block_configs, id if ifm_tensor.shape != []: ifm_box, _, _ = ofm_box.transform_with_strides_and_skirt( - strides, skirt, ifm_tensor.shape, npu_block_type, concat_axis, concat_offset, split_offsets[0] + strides, skirt, ifm_tensor.shape, npu_block_type, concat_axis, concat_offset, split_offsets[0], upscaling ) else: ifm_box = Box([], []) if ifm2_tensor is not None and ifm2_tensor.shape != []: ifm2_box, _, _ = ofm_box.transform_with_strides_and_skirt( - strides, skirt, ifm2_tensor.shape, npu_block_type, concat_axis, concat_offset, split_offsets[1] + strides, skirt, ifm2_tensor.shape, npu_block_type, concat_axis, concat_offset, split_offsets[1], upscaling ) else: ifm2_box = Box([], []) @@ -127,7 +131,7 @@ def generate_high_level_command_stream_for_pass(strat, passes, block_configs, id for intermediate in ps.intermediates: if intermediate != None and intermediate.shape != [] and intermediate.purpose == TensorPurpose.FeatureMap: intermediate_box, _, _ = ofm_box.transform_with_strides_and_skirt( - strides, skirt, intermediate.shape, npu_block_type, concat_axis, concat_offset, split_offsets[0] + strides, skirt, intermediate.shape, npu_block_type, concat_axis, concat_offset, split_offsets[0], upscaling ) yield from dma_if_necessary(ps, intermediate_box, intermediate) @@ -214,13 +218,13 @@ def generate_high_level_command_stream_for_pass(strat, passes, block_configs, id k_height = weight_tensor.shape[0] ifm_box, pad_top, pad_bottom = ofm_box.transform_with_strides_and_skirt( - strides, skirt, ifm_tensor.shape, npu_block_type, concat_axis, concat_offset, split_offsets[0], k_height + strides, skirt, ifm_tensor.shape, npu_block_type, concat_axis, concat_offset, split_offsets[0], k_height, upscaling ) for intermediate in ps.intermediates: if intermediate != None and intermediate.shape != [] and intermediate.purpose == TensorPurpose.FeatureMap: intermediate_box, _, _ = ofm_box.transform_with_strides_and_skirt( - strides, skirt, intermediate.shape, npu_block_type, concat_axis, concat_offset, split_offsets[0] + strides, skirt, intermediate.shape, npu_block_type, concat_axis, concat_offset, split_offsets[0], upscaling ) yield from dma_if_necessary(ps, intermediate_box, intermediate) -- cgit v1.2.1