From 3a613cc9103484249ffcd7c63a7ae57783b1ea18 Mon Sep 17 00:00:00 2001 From: Mike Kelly Date: Tue, 29 Sep 2020 20:50:35 +0100 Subject: [PATCH] Refactored Optimize(...) function to throw exceptions instead of returning null * INetwork::Optimize(...) states that the function should throw an exception if it fails but the implementation in Network.cpp returned null in some scenarios instead. This has led to some confusion amongst users. Signed-off-by: Mike Kelly Change-Id: I358d1293232c9464772aa0e39ab3355e3570c823 --- src/armnn/Network.cpp | 8 +++---- src/armnn/test/EndToEndTest.cpp | 14 +++++++++-- src/armnn/test/FlowControl.cpp | 14 +++++++++-- src/armnn/test/RuntimeTests.cpp | 18 ++++++++------ .../backendsCommon/test/OptimizedNetworkTests.cpp | 28 ++++++++++++++++++---- .../neon/test/NeonOptimizedNetworkTests.cpp | 14 +++++++++-- 6 files changed, 74 insertions(+), 22 deletions(-) diff --git a/src/armnn/Network.cpp b/src/armnn/Network.cpp index 1f59ed5..668b634 100644 --- a/src/armnn/Network.cpp +++ b/src/armnn/Network.cpp @@ -1018,7 +1018,7 @@ IOptimizedNetworkPtr Optimize(const INetwork& inNetwork, { if (backendPreferences.empty()) { - throw armnn::InvalidArgumentException("Invoked Optimize with no backends specified"); + throw InvalidArgumentException("Invoked Optimize with no backends specified"); } if (options.m_ReduceFp32ToFp16 && options.m_ReduceFp32ToBf16) @@ -1082,7 +1082,7 @@ IOptimizedNetworkPtr Optimize(const INetwork& inNetwork, failureMsg << "None of the preferred backends " << backendPreferences << " are supported. Current platform provides " << backendSettings.m_SupportedBackends; ReportError(failureMsg.str(), messages); - return IOptimizedNetworkPtr(nullptr, &IOptimizedNetwork::Destroy); + throw InvalidArgumentException(failureMsg.str()); } // Create a map to temporarily hold initialized backend objects @@ -1100,7 +1100,7 @@ IOptimizedNetworkPtr Optimize(const INetwork& inNetwork, if (assignBackendsResult.m_Error) { // Failed to assign a backend to each layer - return IOptimizedNetworkPtr(nullptr, &IOptimizedNetwork::Destroy); + throw InvalidArgumentException("Failed to assign a backend to each layer"); } Optimizer::Pass(optGraph, MakeOptimizations(OptimizeInverseConversionsFp16(), @@ -1114,7 +1114,7 @@ IOptimizedNetworkPtr Optimize(const INetwork& inNetwork, if (backendOptimizationResult.m_Error) { // Failed to apply the backend-specific optimizations - return IOptimizedNetworkPtr(nullptr, &IOptimizedNetwork::Destroy); + throw InvalidArgumentException("Failed to apply the backend-specific optimizations"); } // If the debug flag is set, then insert a DebugLayer after each layer diff --git a/src/armnn/test/EndToEndTest.cpp b/src/armnn/test/EndToEndTest.cpp index a8192a6..56ff454 100644 --- a/src/armnn/test/EndToEndTest.cpp +++ b/src/armnn/test/EndToEndTest.cpp @@ -42,8 +42,18 @@ BOOST_AUTO_TEST_CASE(ErrorOnLoadNetwork) // optimize the network std::vector backends = {Compute::CpuAcc}; - IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime->GetDeviceSpec()); - BOOST_CHECK(!optNet); + std::vector errMessages; + + try + { + Optimize(*net, backends, runtime->GetDeviceSpec(), OptimizerOptions(), errMessages); + BOOST_FAIL("Should have thrown an exception."); + } + catch (const InvalidArgumentException& e) + { + // Different exceptions are thrown on different backends + } + BOOST_CHECK(errMessages.size() > 0); } BOOST_AUTO_TEST_SUITE_END() diff --git a/src/armnn/test/FlowControl.cpp b/src/armnn/test/FlowControl.cpp index 6198ca8..b0667a3 100644 --- a/src/armnn/test/FlowControl.cpp +++ b/src/armnn/test/FlowControl.cpp @@ -51,8 +51,18 @@ BOOST_AUTO_TEST_CASE(ErrorOnLoadNetwork) // optimize the network std::vector backends = {Compute::CpuRef}; - IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime->GetDeviceSpec()); - BOOST_CHECK(!optNet); // Should have failed to optimise, as flow control is not yet implemented + std::vector errMessages; + + try + { + Optimize(*net, backends, runtime->GetDeviceSpec(), OptimizerOptions(), errMessages); + BOOST_FAIL("Should have thrown an exception."); + } + catch (const InvalidArgumentException& e) + { + // Different exceptions are thrown on different backends + } + BOOST_TEST(errMessages.size() > 1); } BOOST_AUTO_TEST_SUITE_END() diff --git a/src/armnn/test/RuntimeTests.cpp b/src/armnn/test/RuntimeTests.cpp index 12ec8b1..b3a8bbd 100644 --- a/src/armnn/test/RuntimeTests.cpp +++ b/src/armnn/test/RuntimeTests.cpp @@ -262,17 +262,21 @@ BOOST_AUTO_TEST_CASE(IVGCVSW_1929_QuantizedSoftmaxIssue) std::vector backends = { armnn::Compute::CpuRef }; std::vector errMessages; - armnn::IOptimizedNetworkPtr optNet = Optimize(*net, + + try + { + armnn::IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime->GetDeviceSpec(), OptimizerOptions(), errMessages); - - BOOST_TEST(errMessages.size() == 1); - BOOST_TEST(errMessages[0] == - "ERROR: output 0 of layer Softmax (softmax) is of type " - "Quantized 8 bit but its scale parameter has not been set"); - BOOST_TEST(!optNet); + BOOST_FAIL("An exception should have been thrown"); + } + catch (const InvalidArgumentException& e) + { + // Different exceptions are thrown on different backends + } + BOOST_CHECK(errMessages.size() > 0); } BOOST_AUTO_TEST_CASE(RuntimeBackendOptions) diff --git a/src/backends/backendsCommon/test/OptimizedNetworkTests.cpp b/src/backends/backendsCommon/test/OptimizedNetworkTests.cpp index d82ee0e..c8986f5 100644 --- a/src/backends/backendsCommon/test/OptimizedNetworkTests.cpp +++ b/src/backends/backendsCommon/test/OptimizedNetworkTests.cpp @@ -84,8 +84,18 @@ BOOST_AUTO_TEST_CASE(OptimizeValidateDeviceNonSupportLayerNoFallback) armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options)); std::vector backends = { armnn::Compute::CpuAcc }; - armnn::IOptimizedNetworkPtr optNet = armnn::Optimize(*net, backends, runtime->GetDeviceSpec()); - BOOST_CHECK(!optNet); + std::vector errMessages; + + try + { + Optimize(*net, backends, runtime->GetDeviceSpec(), armnn::OptimizerOptions(), errMessages); + BOOST_FAIL("Should have thrown an exception."); + } + catch (const armnn::InvalidArgumentException& e) + { + // Different exceptions are thrown on different backends + } + BOOST_CHECK(errMessages.size() > 0); } BOOST_AUTO_TEST_CASE(OptimizeValidateDeviceNonSupportLayerWithFallback) @@ -190,10 +200,18 @@ BOOST_AUTO_TEST_CASE(OptimizeValidateWorkloadsUndefinedComputeDevice) armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options)); std::vector backends = { armnn::Compute::Undefined }; + std::vector errMessages; - armnn::IOptimizedNetworkPtr optNet = armnn::Optimize(net, backends, runtime->GetDeviceSpec()); - BOOST_CHECK(!optNet); - + try + { + Optimize(net, backends, runtime->GetDeviceSpec(), armnn::OptimizerOptions(), errMessages); + BOOST_FAIL("Should have thrown an exception."); + } + catch (const armnn::InvalidArgumentException& e) + { + // Different exceptions are thrown on different backends + } + BOOST_CHECK(errMessages.size() > 0); } BOOST_AUTO_TEST_CASE(OptimizeValidateWorkloadsUndefinedComputeDeviceWithFallback) diff --git a/src/backends/neon/test/NeonOptimizedNetworkTests.cpp b/src/backends/neon/test/NeonOptimizedNetworkTests.cpp index 4c27aca..3027110 100644 --- a/src/backends/neon/test/NeonOptimizedNetworkTests.cpp +++ b/src/backends/neon/test/NeonOptimizedNetworkTests.cpp @@ -66,8 +66,18 @@ BOOST_AUTO_TEST_CASE(OptimizeValidateDeviceNonSupportLayerNoFallback) armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options)); std::vector backends = { armnn::Compute::CpuAcc }; - armnn::IOptimizedNetworkPtr optNet = armnn::Optimize(*net, backends, runtime->GetDeviceSpec()); - BOOST_CHECK(!optNet); + std::vector errMessages; + + try + { + Optimize(*net, backends, runtime->GetDeviceSpec(), armnn::OptimizerOptions(), errMessages); + BOOST_FAIL("Should have thrown an exception."); + } + catch (const armnn::InvalidArgumentException& e) + { + // Different exceptions are thrown on different backends + } + BOOST_CHECK(errMessages.size() > 0); } BOOST_AUTO_TEST_CASE(FastMathEnabledTestOnCpuAcc) -- 2.7.4