aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Kelly <mike.kelly@arm.com>2020-09-29 20:50:35 +0100
committerTeresaARM <teresa.charlinreyes@arm.com>2020-09-30 11:43:24 +0000
commit3a613cc9103484249ffcd7c63a7ae57783b1ea18 (patch)
tree62c0ed3ef0418494e8f9591a2442f52fde8b3af7
parentae55dc7bb1ce52d83ccee14f94a5c1d9d218867f (diff)
downloadarmnn-3a613cc9103484249ffcd7c63a7ae57783b1ea18.tar.gz
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 <mike.kelly@arm.com> Change-Id: I358d1293232c9464772aa0e39ab3355e3570c823
-rw-r--r--src/armnn/Network.cpp8
-rw-r--r--src/armnn/test/EndToEndTest.cpp14
-rw-r--r--src/armnn/test/FlowControl.cpp14
-rw-r--r--src/armnn/test/RuntimeTests.cpp18
-rw-r--r--src/backends/backendsCommon/test/OptimizedNetworkTests.cpp28
-rw-r--r--src/backends/neon/test/NeonOptimizedNetworkTests.cpp14
6 files changed, 74 insertions, 22 deletions
diff --git a/src/armnn/Network.cpp b/src/armnn/Network.cpp
index 1f59ed51a2..668b634bc7 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 a8192a6480..56ff454703 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<BackendId> backends = {Compute::CpuAcc};
- IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime->GetDeviceSpec());
- BOOST_CHECK(!optNet);
+ std::vector<std::string> 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 6198ca8a24..b0667a3778 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<BackendId> 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<std::string> 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 12ec8b1ece..b3a8bbd6a6 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<armnn::BackendId> backends = { armnn::Compute::CpuRef };
std::vector<std::string> 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 d82ee0e2fc..c8986f5d4d 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<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
- armnn::IOptimizedNetworkPtr optNet = armnn::Optimize(*net, backends, runtime->GetDeviceSpec());
- BOOST_CHECK(!optNet);
+ std::vector<std::string> 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<armnn::BackendId> backends = { armnn::Compute::Undefined };
+ std::vector<std::string> 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 4c27aca6c3..302711029e 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<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
- armnn::IOptimizedNetworkPtr optNet = armnn::Optimize(*net, backends, runtime->GetDeviceSpec());
- BOOST_CHECK(!optNet);
+ std::vector<std::string> 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)