From 4e3e831da1d6d85dffffacf57e9de8fc891b7e58 Mon Sep 17 00:00:00 2001 From: Teresa Charlin Date: Thu, 5 Aug 2021 12:34:37 +0100 Subject: IVGCVSW-6262 Add support for Reduce Prod * Tflite parser * Tflite delegate * Serializer * Deserializer * Ref, CpuAcc and GpuAcc workloads Signed-off-by: Teresa Charlin Change-Id: I601a9ee1680b372c7955d9a628857d08c3cfd377 --- src/backends/reference/test/RefLayerTests.cpp | 7 +++++ src/backends/reference/workloads/Reduce.cpp | 43 ++++++++++++++++----------- 2 files changed, 33 insertions(+), 17 deletions(-) (limited to 'src/backends/reference') diff --git a/src/backends/reference/test/RefLayerTests.cpp b/src/backends/reference/test/RefLayerTests.cpp index e906b2962c..18490e29c7 100644 --- a/src/backends/reference/test/RefLayerTests.cpp +++ b/src/backends/reference/test/RefLayerTests.cpp @@ -2321,6 +2321,13 @@ ARMNN_AUTO_TEST_CASE_WITH_THF(ReduceSumSingleAxisFloat32_2, ReduceSumSingleAxisT ARMNN_AUTO_TEST_CASE_WITH_THF(ReduceSumSingleAxisFloat32_3, ReduceSumSingleAxisTest3) ARMNN_AUTO_TEST_CASE_WITH_THF(ReduceSumMultipleAxisFloat32, ReduceSumMultipleAxisTest) +// ReduceProd +ARMNN_AUTO_TEST_CASE_WITH_THF(ReduceProdFloat32, ReduceProdSimpleTest) +ARMNN_AUTO_TEST_CASE_WITH_THF(ReduceProdSingleAxisFloat32_1, ReduceProdSingleAxisTest1) +ARMNN_AUTO_TEST_CASE_WITH_THF(ReduceProdSingleAxisFloat32_2, ReduceProdSingleAxisTest2) +ARMNN_AUTO_TEST_CASE_WITH_THF(ReduceProdSingleAxisFloat32_3, ReduceProdSingleAxisTest3) +ARMNN_AUTO_TEST_CASE_WITH_THF(ReduceProdMultipleAxisFloat32, ReduceProdMultipleAxisTest) + // ReduceMax ARMNN_AUTO_TEST_CASE_WITH_THF(ReduceMaxFloat32, ReduceMaxSimpleTest) ARMNN_AUTO_TEST_CASE_WITH_THF(ReduceMaxNegativeAxisFloat32, ReduceMaxNegativeAxisTest) diff --git a/src/backends/reference/workloads/Reduce.cpp b/src/backends/reference/workloads/Reduce.cpp index 8bf422aea3..3f929c43bc 100644 --- a/src/backends/reference/workloads/Reduce.cpp +++ b/src/backends/reference/workloads/Reduce.cpp @@ -9,7 +9,6 @@ #include -#include #include #include #include @@ -87,6 +86,9 @@ void Reduce(const TensorInfo& inputInfo, case ReduceOperation::Sum: std::fill(tempOut.begin(), tempOut.end(), 0.0f); break; + case ReduceOperation::Prod: + std::fill(tempOut.begin(), tempOut.end(), 1.0f); + break; case ReduceOperation::Max: std::fill(tempOut.begin(), tempOut.end(), -1 * std::numeric_limits::max()); break; @@ -119,23 +121,30 @@ void Reduce(const TensorInfo& inputInfo, numResolvedAxis, resolvedAxis); input[inputOffset]; auto inputValue = input.Get(); - if (reduceOperation == ReduceOperation::Max) - { - if (inputValue > tempOut[outputOffset]) - { - tempOut[outputOffset] = inputValue; - } - } - else if (reduceOperation == ReduceOperation::Min) - { - if (inputValue < tempOut[outputOffset]) - { - tempOut[outputOffset] = inputValue; - } - } - else + switch(reduceOperation) { - tempOut[outputOffset] += inputValue; + case ReduceOperation::Mean: + case ReduceOperation::Sum: + tempOut[outputOffset] += inputValue; + break; + case ReduceOperation::Prod: + tempOut[outputOffset] *= inputValue; + break; + case ReduceOperation::Max: + if (inputValue > tempOut[outputOffset]) + { + tempOut[outputOffset] = inputValue; + } + break; + case ReduceOperation::Min: + if (inputValue < tempOut[outputOffset]) + { + tempOut[outputOffset] = inputValue; + } + break; + default: + throw armnn::InvalidArgumentException("Unknown reduce method: " + + std::to_string(static_cast(reduceOperation))); } } -- cgit v1.2.1