aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFinn Williams <Finn.Williams@arm.com>2021-08-26 11:08:01 +0100
committerFinn Williams <Finn.Williams@arm.com>2021-08-26 11:09:32 +0100
commitdbf5f314f9498afa756e2637251a89a5291abde0 (patch)
tree2d974a44df4998291e2f2b9dc17c5d1e905f898e
parent4e62750a2171a7bccf0c9c37514d07d3d222d1d5 (diff)
downloadarmnn-dbf5f314f9498afa756e2637251a89a5291abde0.tar.gz
IVGCVSW-6311 Add the pre-import backend capability
* Update acl and ref backend capabilities * Add check for AsyncExecution capability in LoadedNetwork * Add new exception for capabilities Signed-off-by: Finn Williams <Finn.Williams@arm.com> Change-Id: I2f053c845a64f336e96d452793639c6e0d3eaa89
-rw-r--r--include/armnn/Exceptions.hpp6
-rw-r--r--src/armnn/LoadedNetwork.cpp9
-rw-r--r--src/backends/backendsCommon/test/CompatibilityTests.cpp76
-rw-r--r--src/backends/cl/ClBackend.hpp4
-rw-r--r--src/backends/neon/NeonBackend.hpp5
-rw-r--r--src/backends/reference/RefBackend.hpp4
6 files changed, 68 insertions, 36 deletions
diff --git a/include/armnn/Exceptions.hpp b/include/armnn/Exceptions.hpp
index e3f086e376..1a123bfbce 100644
--- a/include/armnn/Exceptions.hpp
+++ b/include/armnn/Exceptions.hpp
@@ -155,6 +155,12 @@ public:
using Exception::Exception;
};
+class BackendCapabilityException : public Exception
+{
+public:
+ using Exception::Exception;
+};
+
template <typename ExceptionType>
void ConditionalThrow(bool condition, const std::string& message)
{
diff --git a/src/armnn/LoadedNetwork.cpp b/src/armnn/LoadedNetwork.cpp
index 531d43dbb5..9b5748bcf2 100644
--- a/src/armnn/LoadedNetwork.cpp
+++ b/src/armnn/LoadedNetwork.cpp
@@ -19,6 +19,7 @@
#include <armnn/backends/IMemoryManager.hpp>
#include <backendsCommon/MemCopyWorkload.hpp>
#include <backendsCommon/MemSyncWorkload.hpp>
+#include <armnn/BackendHelper.hpp>
#include <fmt/format.h>
@@ -144,6 +145,14 @@ LoadedNetwork::LoadedNetwork(std::unique_ptr<IOptimizedNetwork> net,
IBackendInternal* backend = it.first->second.get();
+ if (networkProperties.m_AsyncEnabled &&
+ HasCapability(BackendOptions::BackendOption{"AsyncExecution", false}, backend->GetCapabilities()))
+ {
+ std::string er = backend->GetId();
+ er += " does not support AsyncExecution";
+ throw BackendCapabilityException(er);
+ }
+
if (backend->SupportsTensorAllocatorAPI())
{
auto workloadFactory = backend->CreateWorkloadFactory(
diff --git a/src/backends/backendsCommon/test/CompatibilityTests.cpp b/src/backends/backendsCommon/test/CompatibilityTests.cpp
index 34baad9d0c..7b25732daa 100644
--- a/src/backends/backendsCommon/test/CompatibilityTests.cpp
+++ b/src/backends/backendsCommon/test/CompatibilityTests.cpp
@@ -128,26 +128,27 @@ TEST_CASE("Neon_Cl_DirectCompatibility_Test")
TEST_SUITE("BackendCapability")
{
-#if defined(ARMNNREF_ENABLED)
-TEST_CASE("Ref_Backends_Capability_Test")
+namespace
{
- auto refBackend = std::make_unique<RefBackend>();
- auto refCapabilities = refBackend->GetCapabilities();
-
- CHECK(armnn::HasCapability("NonConstWeights", refCapabilities));
- CHECK(armnn::HasCapability("AsyncExecution", refCapabilities));
- armnn::BackendOptions::BackendOption nonConstWeights{"NonConstWeights", true};
- armnn::BackendOptions::BackendOption AsyncExecution{"AsyncExecution", true};
-
- CHECK(armnn::HasCapability(nonConstWeights, refCapabilities));
- CHECK(armnn::HasCapability(AsyncExecution, refCapabilities));
+void CapabilityTestHelper(BackendCapabilities &capabilities,
+ std::vector<std::pair<std::string, bool>> capabilityVector)
+{
+ for (auto pair : capabilityVector)
+ {
+ CHECK_MESSAGE(armnn::HasCapability(pair.first, capabilities),
+ pair.first << " capability was not been found");
+ CHECK_MESSAGE(armnn::HasCapability(BackendOptions::BackendOption{pair.first, pair.second}, capabilities),
+ pair.first << " capability set incorrectly");
+ }
}
-TEST_CASE("Ref_Backends_Unkown_Capability_Test")
+#if defined(ARMNNREF_ENABLED)
+
+TEST_CASE("Ref_Backends_Unknown_Capability_Test")
{
- auto refBackend = std::make_unique<RefBackend>();
+ auto refBackend = std::make_unique<RefBackend>();
auto refCapabilities = refBackend->GetCapabilities();
armnn::BackendOptions::BackendOption AsyncExecutionFalse{"AsyncExecution", false};
@@ -167,44 +168,53 @@ TEST_CASE("Ref_Backends_Unkown_Capability_Test")
CHECK(!armnn::HasCapability(unkownCapability, refCapabilities));
}
+TEST_CASE ("Ref_Backends_Capability_Test")
+{
+ auto refBackend = std::make_unique<RefBackend>();
+ auto refCapabilities = refBackend->GetCapabilities();
+
+ CapabilityTestHelper(refCapabilities,
+ {{"NonConstWeights", true},
+ {"AsyncExecution", true},
+ {"ProtectedContentAllocation", false},
+ {"ConstantTensorsAsInputs", true},
+ {"PreImportIOTensors", false}});
+}
+
#endif
#if defined(ARMCOMPUTENEON_ENABLED)
-TEST_CASE("Neon_Backends_Capability_Test")
+TEST_CASE ("Neon_Backends_Capability_Test")
{
auto neonBackend = std::make_unique<NeonBackend>();
auto neonCapabilities = neonBackend->GetCapabilities();
- CHECK(armnn::HasCapability("NonConstWeights", neonCapabilities));
- CHECK(armnn::HasCapability("AsyncExecution", neonCapabilities));
-
- armnn::BackendOptions::BackendOption nonConstWeights{"NonConstWeights", false};
- armnn::BackendOptions::BackendOption AsyncExecution{"AsyncExecution", false};
-
- CHECK(armnn::HasCapability(nonConstWeights, neonCapabilities));
- CHECK(armnn::HasCapability(AsyncExecution, neonCapabilities));
+ CapabilityTestHelper(neonCapabilities,
+ {{"NonConstWeights", false},
+ {"AsyncExecution", false},
+ {"ProtectedContentAllocation", false},
+ {"ConstantTensorsAsInputs", false},
+ {"PreImportIOTensors", false}});
}
#endif
#if defined(ARMCOMPUTECL_ENABLED)
-TEST_CASE("Cl_Backends_Capability_Test")
+TEST_CASE ("Cl_Backends_Capability_Test")
{
auto clBackend = std::make_unique<ClBackend>();
auto clCapabilities = clBackend->GetCapabilities();
- CHECK(armnn::HasCapability("NonConstWeights", clCapabilities));
- CHECK(armnn::HasCapability("AsyncExecution", clCapabilities));
-
- armnn::BackendOptions::BackendOption nonConstWeights{"NonConstWeights", false};
- armnn::BackendOptions::BackendOption AsyncExecution{"AsyncExecution", false};
-
- CHECK(armnn::HasCapability(nonConstWeights, clCapabilities));
- CHECK(armnn::HasCapability(AsyncExecution, clCapabilities));
+ CapabilityTestHelper(clCapabilities,
+ {{"NonConstWeights", false},
+ {"AsyncExecution", false},
+ {"ProtectedContentAllocation", true},
+ {"ConstantTensorsAsInputs", false},
+ {"PreImportIOTensors", false}});
}
#endif
-
+}
}
diff --git a/src/backends/cl/ClBackend.hpp b/src/backends/cl/ClBackend.hpp
index 4f68c3bcc7..570d301616 100644
--- a/src/backends/cl/ClBackend.hpp
+++ b/src/backends/cl/ClBackend.hpp
@@ -26,7 +26,9 @@ const BackendCapabilities gpuAccCapabilities("GpuAcc",
{
{"NonConstWeights", false},
{"AsyncExecution", false},
- {"ProtectedContentAllocation", true}
+ {"ProtectedContentAllocation", true},
+ {"ConstantTensorsAsInputs", false},
+ {"PreImportIOTensors", false}
});
class ClBackend : public IBackendInternal
diff --git a/src/backends/neon/NeonBackend.hpp b/src/backends/neon/NeonBackend.hpp
index eae57320cc..0ae28d8a71 100644
--- a/src/backends/neon/NeonBackend.hpp
+++ b/src/backends/neon/NeonBackend.hpp
@@ -13,7 +13,10 @@ namespace armnn
const BackendCapabilities cpuAccCapabilities("GpuAcc",
{
{"NonConstWeights", false},
- {"AsyncExecution", false}
+ {"AsyncExecution", false},
+ {"ProtectedContentAllocation", false},
+ {"ConstantTensorsAsInputs", false},
+ {"PreImportIOTensors", false}
});
diff --git a/src/backends/reference/RefBackend.hpp b/src/backends/reference/RefBackend.hpp
index 2855957e31..1a79d7090a 100644
--- a/src/backends/reference/RefBackend.hpp
+++ b/src/backends/reference/RefBackend.hpp
@@ -13,7 +13,9 @@ const BackendCapabilities cpuRefCapabilities("CpuRef",
{
{"NonConstWeights", true},
{"AsyncExecution", true},
- {"ConstantTensorsAsInputs", true}
+ {"ProtectedContentAllocation", false},
+ {"ConstantTensorsAsInputs", true},
+ {"PreImportIOTensors", false}
});
const std::set<armnn::BackendCapability> oldCpuRefCapabilities {