aboutsummaryrefslogtreecommitdiff
path: root/ethosu/vela/graph_optimiser.py
diff options
context:
space:
mode:
authorCharles Xu <charles.xu@arm.com>2020-05-13 10:15:26 +0200
committerTim Hall <tim.hall@arm.com>2020-06-18 17:53:52 +0100
commit78792223369fa34dacd0e69e189af035283da2ae (patch)
treeac3826df5528866319fd65d7a99eef8e87cd4084 /ethosu/vela/graph_optimiser.py
parent620d88c60482bad4d96da4d32cc4cca5561cca9e (diff)
downloadethos-u-vela-78792223369fa34dacd0e69e189af035283da2ae.tar.gz
Add elementwise vector scalars support
Write the constant scalars into flash. In case it's Dram or OffChipFlash, DMA the scalars from flash to sram. Signed-off-by: Charles Xu <charles.xu@arm.com> Change-Id: I42300a05dfe968d623b8aec8549644549e0f54b5
Diffstat (limited to 'ethosu/vela/graph_optimiser.py')
-rw-r--r--ethosu/vela/graph_optimiser.py13
1 files changed, 13 insertions, 0 deletions
diff --git a/ethosu/vela/graph_optimiser.py b/ethosu/vela/graph_optimiser.py
index 913b9a6a..351716e0 100644
--- a/ethosu/vela/graph_optimiser.py
+++ b/ethosu/vela/graph_optimiser.py
@@ -25,6 +25,7 @@ from .data_type import DataType
from .operation import NpuBlockType
from .operation import Operation
from .tensor import Tensor
+from .numeric_util import full_shape
passthrough_nodes = set(("Identity",))
@@ -313,6 +314,7 @@ fc_op = set(
depthwise_op = set(("DepthwiseConv2dNative", "DepthwiseConv2dBiasAct",))
pool_op = set(("AvgPool", "MaxPool", "QuantizedAvgPool", "QuantizedMaxPool", "AvgPoolAct", "MaxPoolAct", "ResizeBilinear",))
elementwise_op = set(("AddAct", "MulAct", "SubAct", "Maximum", "Minimum", "LeakyRelu", "Abs"))
+binary_elementwise_op = set(("AddAct", "MulAct", "SubAct", "Maximum", "Minimum"))
activation_ops = set(("Relu", "Relu6", "ReluN1To1", "Sigmoid", "Tanh"))
memory_only_ops = set(("Reshape",))
@@ -399,6 +401,16 @@ def fixup_act_reorder(op, arch):
op.type = "Identity"
return op
+def fixup_elementwise_with_scalars(op, arch):
+ if op.type in binary_elementwise_op:
+ ifm_tensor, ifm2_tensor, _, ofm_tensor = op.get_ifm_ifm2_weights_ofm()
+ if ifm2_tensor.shape != [] and ifm_tensor.shape != []:
+ diff = len(ifm_tensor.shape) - len(ifm2_tensor.shape)
+ if diff > 0:
+ ifm2_tensor.shape = full_shape(len(ifm_tensor.shape), ifm2_tensor.shape, 1)
+ elif diff < 0:
+ ifm_tensor.shape = full_shape(len(ifm2_tensor.shape), ifm_tensor.shape, 1)
+ return op
# Set input/output tensor equivalence to the same id for memory operations
def set_tensor_equivalence(op, arch):
@@ -492,6 +504,7 @@ def optimise_graph_a(nng, arch, verbose_graph=False):
fixup_act_reorder,
add_padding_fields,
mark_npu_block_type,
+ fixup_elementwise_with_scalars,
# convert_mul_max_to_abs_or_lrelu # TODO: enable optimisation once quantisation issues are resolved
]