From 2523b79fd01dfba6c12fa903c80b7a66b853f861 Mon Sep 17 00:00:00 2001 From: Matthew Sloyan Date: Mon, 14 Nov 2022 10:18:01 +0000 Subject: Add additional data type support to TOSA Reference Backend * Added all data types to TosaRefPreCompiledWorkload::Execute(). * Generalised IsTosaLayerSupported and fixed Addition support. * Added Fp16 and Int32 Addition End to End tests. Signed-off-by: Matthew Sloyan Change-Id: I1f89c310ede33615427343e89bcec7e7bb643fa1 --- .../test/AdditionEndToEndTestImpl.hpp | 33 ++++++- src/backends/tosaReference/TosaRefLayerSupport.cpp | 103 +++++++++++++-------- .../tosaReference/test/TosaRefEndToEndTests.cpp | 10 ++ .../test/TosaRefLayerSupportTests.cpp | 6 +- .../workloads/TosaRefPreCompiledWorkload.cpp | 32 +++++++ 5 files changed, 140 insertions(+), 44 deletions(-) diff --git a/src/backends/backendsCommon/test/AdditionEndToEndTestImpl.hpp b/src/backends/backendsCommon/test/AdditionEndToEndTestImpl.hpp index f1a93c7548..a1a8bac0e7 100644 --- a/src/backends/backendsCommon/test/AdditionEndToEndTestImpl.hpp +++ b/src/backends/backendsCommon/test/AdditionEndToEndTestImpl.hpp @@ -4,12 +4,12 @@ // #pragma once -#include - #include -#include #include +#include + +#include namespace { @@ -78,4 +78,31 @@ void AdditionEndToEnd(const std::vector& backends) EndToEndLayerTestImpl(std::move(network), inputTensorData, expectedOutputData, backends); } +template +void AdditionEndToEndFloat16(const std::vector& backends) +{ + using namespace armnn; + using namespace half_float::literal; + using Half = half_float::half; + + const TensorShape& inputXShape = { 2, 2 }; + const TensorShape& inputYShape = { 2, 2 }; + const TensorShape& outputShape = { 2, 2 }; + + INetworkPtr network = CreateAdditionNetwork(inputXShape, inputYShape, outputShape); + CHECK(network); + + std::vector inputXData{ 1._h, 2._h, + 3._h, 4._h }; + std::vector inputYData{ 5._h, 7._h, + 6._h, 8._h }; + std::vector expectedOutput{ 6._h, 9._h, + 9._h, 12._h }; + + std::map> inputTensorData = {{ 0, inputXData }, { 1, inputYData }}; + std::map> expectedOutputData = { { 0, expectedOutput } }; + + EndToEndLayerTestImpl(std::move(network), inputTensorData, expectedOutputData, backends); +} + } // anonymous namespaceS \ No newline at end of file diff --git a/src/backends/tosaReference/TosaRefLayerSupport.cpp b/src/backends/tosaReference/TosaRefLayerSupport.cpp index c2b0b1b0b9..a39bfb6c4d 100644 --- a/src/backends/tosaReference/TosaRefLayerSupport.cpp +++ b/src/backends/tosaReference/TosaRefLayerSupport.cpp @@ -17,6 +17,61 @@ namespace armnn { +static bool RunTosaLayerChecks(TosaSerializationOperator* op, + const std::vector& inputs, + const std::vector& outputs, + const std::vector& supportedAttributes, + const std::vector& supportedTypes, + Optional reasonIfUnsupported) +{ + bool supported = true; + + std::string opCode = std::to_string(op->GetOp()); + + // Check Attribute from operator (GetAttribute) + supported &= CheckSupportRule(TosaOperatorAttributeOfAny(op, supportedAttributes), reasonIfUnsupported, + std::string("TOSA Reference Operator: " + opCode + + " has an unsupported attribute.").c_str()); + + for (auto input : inputs) + { + std::string dataTypeCode = std::to_string(input->GetDtype()); + + // Check Dtype from tensor (GetDtype) + supported &= CheckSupportRule(TosaTypeAnyOf(input, supportedTypes), + reasonIfUnsupported, + std::string("TOSA Reference Operator: " + opCode + " for input: " + + input->GetName() + " has an unsupported data type: " + + dataTypeCode).c_str()); + + // Check Shape from tensor (GetShape) + supported &= CheckSupportRule(TosaTensorNumDimensionsWithinBounds(input), + reasonIfUnsupported, + std::string("Tosa Reference Operator: " + opCode + " for input: " + + input->GetName() + " exceeds MaxNumOfTensorDimensions.").c_str()); + } + + for (auto output : outputs) + { + std::string dataTypeCode = std::to_string(output->GetDtype()); + + // Check Dtype from tensor (GetDtype) + supported &= CheckSupportRule(TosaTypeAnyOf(output, supportedTypes), + reasonIfUnsupported, + std::string("TOSA Reference Operator: " + opCode + " for output: " + + output->GetName() + " has an unsupported data type: " + + dataTypeCode).c_str()); + + // Check Shape from tensor (GetShape) + supported &= CheckSupportRule(TosaTensorNumDimensionsWithinBounds(output), + reasonIfUnsupported, + std::string("Tosa Reference Operator: " + opCode + " for output: " + + output->GetName() + " exceeds MaxNumOfTensorDimensions.").c_str()); + } + + return supported; +} + static bool IsTosaLayerSupported(TosaSerializationOperator* op, const std::vector& inputs, const std::vector& outputs, @@ -28,54 +83,26 @@ static bool IsTosaLayerSupported(TosaSerializationOperator* op, { bool supported = true; - std::array supportedAttributes = + std::vector supportedAttributes = { Attribute_NONE }; - // Check Attribute from operator (GetAttribute) - supported &= CheckSupportRule(TosaOperatorAttributeOfAny(op, supportedAttributes), reasonIfUnsupported, - std::string("TOSA Reference addition: operator has an unsupported attribute.").c_str()); - - std::array supportedTypes = + // Only Int32, Fp32 and Fp16 are currently supported by the TOSA Reference Model. + std::vector supportedTypes = { - DType_BOOL, - DType_UINT8, - DType_UINT16, - DType_INT4, - DType_INT8, - DType_INT16, DType_INT32, DType_FP16, DType_FP32 }; - for (auto tensor : inputs) - { - // Check Dtype from tensor (GetDtype) - supported &= CheckSupportRule(TosaTypeAnyOf(tensor, supportedTypes), - reasonIfUnsupported, - std::string("TOSA Reference addition: " + tensor->GetName() + - " is not a supported type.").c_str()); - - // Check Shape from tensor (GetShape) - supported &= CheckSupportRule(TosaTensorNumDimensionsWithinBounds(tensor), - reasonIfUnsupported, - std::string("Tosa Reference addition: " + tensor->GetName() + " Shape.Size()" - " outside bounds of between Zero and MaxNumOfTensorDimensions.").c_str()); - } - - // Check Dtype from tensor (GetDtype) - supported &= CheckSupportRule(TosaTypeAnyOf(outputs[0], supportedTypes), - reasonIfUnsupported, - std::string("TOSA Reference addition: " + outputs[0]->GetName() + - " is not a supported type.").c_str()); - - // Check Shape from tensor (GetShape) - supported &= CheckSupportRule(TosaTensorNumDimensionsWithinBounds(outputs[0]), - reasonIfUnsupported, - std::string("Tosa Reference addition: " + outputs[0]->GetName() + " Shape.Size()" - " outside bounds of between Zero and MaxNumOfTensorDimensions.").c_str()); + // Check the attribute, data types and bounds for inputs and outputs. + supported = RunTosaLayerChecks(op, + inputs, + outputs, + supportedAttributes, + supportedTypes, + reasonIfUnsupported); return supported; } diff --git a/src/backends/tosaReference/test/TosaRefEndToEndTests.cpp b/src/backends/tosaReference/test/TosaRefEndToEndTests.cpp index ce4cde2423..54d6db6cef 100644 --- a/src/backends/tosaReference/test/TosaRefEndToEndTests.cpp +++ b/src/backends/tosaReference/test/TosaRefEndToEndTests.cpp @@ -19,4 +19,14 @@ TEST_CASE("TosaRefEndtoEndTestFloat32") AdditionEndToEnd(tosaDefaultBackends); } +TEST_CASE("TosaRefEndtoEndTestInt32") +{ + AdditionEndToEnd(tosaDefaultBackends); +} + +TEST_CASE("TosaRefEndtoEndTestFloat16") +{ + AdditionEndToEndFloat16(tosaDefaultBackends); +} + } \ No newline at end of file diff --git a/src/backends/tosaReference/test/TosaRefLayerSupportTests.cpp b/src/backends/tosaReference/test/TosaRefLayerSupportTests.cpp index 99f7fd2705..47f31380a5 100644 --- a/src/backends/tosaReference/test/TosaRefLayerSupportTests.cpp +++ b/src/backends/tosaReference/test/TosaRefLayerSupportTests.cpp @@ -57,9 +57,9 @@ TEST_CASE("IsLayerSupportedTosaReferenceAdditionUnsupported") reasonIfNotSupported); CHECK(!supported); - REQUIRE(reasonIfNotSupported.find("TOSA Reference addition: Op_ADD_input0_") != std::string::npos); - REQUIRE(reasonIfNotSupported.find("TOSA Reference addition: Op_ADD_input1_") != std::string::npos); - REQUIRE(reasonIfNotSupported.find("TOSA Reference addition: Op_ADD_output0_") != std::string::npos); + REQUIRE(reasonIfNotSupported.find("TOSA Reference Operator: 14 for input: Op_ADD_input0_") != std::string::npos); + REQUIRE(reasonIfNotSupported.find("TOSA Reference Operator: 14 for input: Op_ADD_input1_") != std::string::npos); + REQUIRE(reasonIfNotSupported.find("TOSA Reference Operator: 14 for output: Op_ADD_output0_") != std::string::npos); } } diff --git a/src/backends/tosaReference/workloads/TosaRefPreCompiledWorkload.cpp b/src/backends/tosaReference/workloads/TosaRefPreCompiledWorkload.cpp index 18d2900eff..ffdbf6f49b 100644 --- a/src/backends/tosaReference/workloads/TosaRefPreCompiledWorkload.cpp +++ b/src/backends/tosaReference/workloads/TosaRefPreCompiledWorkload.cpp @@ -47,9 +47,25 @@ void TosaRefPreCompiledWorkload::Execute() const DataType dataType = m_workloadInfo.m_InputTensorInfos[inputSlotIdx].GetDataType(); switch (dataType) { + case DataType::Float16: + SetInput(runner, input_names[inputSlotIdx], inputSlotIdx); + break; case DataType::Float32: SetInput(runner, input_names[inputSlotIdx], inputSlotIdx); break; + case DataType::QAsymmU8: + case DataType::QAsymmS8: + case DataType::QSymmS8: + case DataType::QSymmS16: + case DataType::Signed32: + SetInput(runner, input_names[inputSlotIdx], inputSlotIdx); + break; + case DataType::Signed64: + SetInput(runner, input_names[inputSlotIdx], inputSlotIdx); + break; + case DataType::Boolean: + SetInput(runner, input_names[inputSlotIdx], inputSlotIdx); + break; default: throw armnn::Exception("Input data type is unsupported in TOSA Reference Backend."); } @@ -68,9 +84,25 @@ void TosaRefPreCompiledWorkload::Execute() const DataType dataType = m_workloadInfo.m_OutputTensorInfos[outputSlotIdx].GetDataType(); switch (dataType) { + case DataType::Float16: + GetOutput(runner, output_names[outputSlotIdx], outputSlotIdx); + break; case DataType::Float32: GetOutput(runner, output_names[outputSlotIdx], outputSlotIdx); break; + case DataType::QAsymmU8: + case DataType::QAsymmS8: + case DataType::QSymmS8: + case DataType::QSymmS16: + case DataType::Signed32: + GetOutput(runner, output_names[outputSlotIdx], outputSlotIdx); + break; + case DataType::Signed64: + GetOutput(runner, output_names[outputSlotIdx], outputSlotIdx); + break; + case DataType::Boolean: + GetOutput(runner, output_names[outputSlotIdx], outputSlotIdx); + break; default: throw armnn::Exception("Output data type is unsupported in TOSA Reference Backend."); } -- cgit v1.2.1