aboutsummaryrefslogtreecommitdiff
path: root/src/backends/cl/test
diff options
context:
space:
mode:
authorColm Donelan <Colm.Donelan@arm.com>2021-03-12 15:58:48 +0000
committerColm Donelan <colm.donelan@arm.com>2021-03-23 13:59:15 +0000
commitc74b1750fe8cf7affdbc59edd53357e0ea4efa53 (patch)
treefc925b928147f70016605a0c123066cfdf9c15a1 /src/backends/cl/test
parent4441d94fa0a97d4137e49315d69d32fdc0bbcd03 (diff)
downloadarmnn-c74b1750fe8cf7affdbc59edd53357e0ea4efa53.tar.gz
IVGCVSW-5724 Add import tensor handling as ClImportTensorHandleFactory.
* Add new ClImportTensorHandlefactory for tensor import. * Add unit tests. Signed-off-by: Colm Donelan <Colm.Donelan@arm.com> Change-Id: I61884fed65e764ebd6985fe0833e43a7296d0641
Diffstat (limited to 'src/backends/cl/test')
-rw-r--r--src/backends/cl/test/CMakeLists.txt1
-rw-r--r--src/backends/cl/test/ClImportTensorHandleFactoryTests.cpp125
2 files changed, 126 insertions, 0 deletions
diff --git a/src/backends/cl/test/CMakeLists.txt b/src/backends/cl/test/CMakeLists.txt
index a2950d9d44..422c0a56e4 100644
--- a/src/backends/cl/test/CMakeLists.txt
+++ b/src/backends/cl/test/CMakeLists.txt
@@ -8,6 +8,7 @@ list(APPEND armnnClBackendUnitTests_sources
ClContextSerializerTests.cpp
ClCreateWorkloadTests.cpp
ClEndToEndTests.cpp
+ ClImportTensorHandleFactoryTests.cpp
ClJsonPrinterTests.cpp
ClLayerSupportTests.cpp
ClLayerTests.cpp
diff --git a/src/backends/cl/test/ClImportTensorHandleFactoryTests.cpp b/src/backends/cl/test/ClImportTensorHandleFactoryTests.cpp
new file mode 100644
index 0000000000..0c6a9c6e7b
--- /dev/null
+++ b/src/backends/cl/test/ClImportTensorHandleFactoryTests.cpp
@@ -0,0 +1,125 @@
+//
+// Copyright © 2021 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#include <cl/ClImportTensorHandleFactory.hpp>
+
+#include <boost/test/unit_test.hpp>
+
+BOOST_AUTO_TEST_SUITE(ClImportTensorHandleFactoryTests)
+using namespace armnn;
+
+BOOST_AUTO_TEST_CASE(ImportTensorFactoryAskedToCreateManagedTensorThrowsException)
+{
+ // Create the factory to import tensors.
+ ClImportTensorHandleFactory factory(static_cast<MemorySourceFlags>(MemorySource::Malloc),
+ static_cast<MemorySourceFlags>(MemorySource::Malloc));
+ TensorInfo tensorInfo;
+ // This factory is designed to import the memory of tensors. Asking for a handle that requires
+ // a memory manager should result in an exception.
+ BOOST_REQUIRE_THROW(factory.CreateTensorHandle(tensorInfo, true), InvalidArgumentException);
+ BOOST_REQUIRE_THROW(factory.CreateTensorHandle(tensorInfo, DataLayout::NCHW, true), InvalidArgumentException);
+}
+
+BOOST_AUTO_TEST_CASE(ImportTensorFactoryCreateMallocTensorHandle)
+{
+ // Create the factory to import tensors.
+ ClImportTensorHandleFactory factory(static_cast<MemorySourceFlags>(MemorySource::Malloc),
+ static_cast<MemorySourceFlags>(MemorySource::Malloc));
+ TensorShape tensorShape{ 6, 7, 8, 9 };
+ TensorInfo tensorInfo(tensorShape, armnn::DataType::Float32);
+ // Start with the TensorInfo factory method. Create an import tensor handle and verify the data is
+ // passed through correctly.
+ auto tensorHandle = factory.CreateTensorHandle(tensorInfo);
+ BOOST_ASSERT(tensorHandle);
+ BOOST_ASSERT(tensorHandle->GetImportFlags() == static_cast<MemorySourceFlags>(MemorySource::Malloc));
+ BOOST_ASSERT(tensorHandle->GetShape() == tensorShape);
+
+ // Same method but explicitly specifying isManaged = false.
+ tensorHandle = factory.CreateTensorHandle(tensorInfo, false);
+ BOOST_CHECK(tensorHandle);
+ BOOST_ASSERT(tensorHandle->GetImportFlags() == static_cast<MemorySourceFlags>(MemorySource::Malloc));
+ BOOST_ASSERT(tensorHandle->GetShape() == tensorShape);
+
+ // Now try TensorInfo and DataLayout factory method.
+ tensorHandle = factory.CreateTensorHandle(tensorInfo, DataLayout::NHWC);
+ BOOST_CHECK(tensorHandle);
+ BOOST_ASSERT(tensorHandle->GetImportFlags() == static_cast<MemorySourceFlags>(MemorySource::Malloc));
+ BOOST_ASSERT(tensorHandle->GetShape() == tensorShape);
+}
+
+BOOST_AUTO_TEST_CASE(CreateSubtensorOfImportTensor)
+{
+ // Create the factory to import tensors.
+ ClImportTensorHandleFactory factory(static_cast<MemorySourceFlags>(MemorySource::Malloc),
+ static_cast<MemorySourceFlags>(MemorySource::Malloc));
+ // Create a standard inport tensor.
+ TensorShape tensorShape{ 224, 224, 1, 1 };
+ TensorInfo tensorInfo(tensorShape, armnn::DataType::Float32);
+ auto tensorHandle = factory.CreateTensorHandle(tensorInfo);
+ // Use the factory to create a 16x16 sub tensor.
+ TensorShape subTensorShape{ 16, 16, 1, 1 };
+ // Starting at an offset of 1x1.
+ uint32_t origin[4] = { 1, 1, 0, 0 };
+ auto subTensor = factory.CreateSubTensorHandle(*tensorHandle, subTensorShape, origin);
+ BOOST_CHECK(subTensor);
+ BOOST_ASSERT(subTensor->GetShape() == subTensorShape);
+ BOOST_ASSERT(subTensor->GetParent() == tensorHandle.get());
+}
+
+BOOST_AUTO_TEST_CASE(CreateSubtensorNonZeroXYIsInvalid)
+{
+ // Create the factory to import tensors.
+ ClImportTensorHandleFactory factory(static_cast<MemorySourceFlags>(MemorySource::Malloc),
+ static_cast<MemorySourceFlags>(MemorySource::Malloc));
+ // Create a standard import tensor.
+ TensorShape tensorShape{ 224, 224, 1, 1 };
+ TensorInfo tensorInfo(tensorShape, armnn::DataType::Float32);
+ auto tensorHandle = factory.CreateTensorHandle(tensorInfo);
+ // Use the factory to create a 16x16 sub tensor.
+ TensorShape subTensorShape{ 16, 16, 1, 1 };
+ // This looks a bit backwards because of how Cl specifies tensors. Essentially we want to trigger our
+ // check "(coords.x() != 0 || coords.y() != 0)"
+ uint32_t origin[4] = { 0, 0, 1, 1 };
+ auto subTensor = factory.CreateSubTensorHandle(*tensorHandle, subTensorShape, origin);
+ // We expect a nullptr.
+ BOOST_ASSERT(subTensor == nullptr);
+}
+
+BOOST_AUTO_TEST_CASE(CreateSubtensorXYMustMatchParent)
+{
+ // Create the factory to import tensors.
+ ClImportTensorHandleFactory factory(static_cast<MemorySourceFlags>(MemorySource::Malloc),
+ static_cast<MemorySourceFlags>(MemorySource::Malloc));
+ // Create a standard import tensor.
+ TensorShape tensorShape{ 224, 224, 1, 1 };
+ TensorInfo tensorInfo(tensorShape, armnn::DataType::Float32);
+ auto tensorHandle = factory.CreateTensorHandle(tensorInfo);
+ // Use the factory to create a 16x16 sub tensor but make the CL x and y axis different.
+ TensorShape subTensorShape{ 16, 16, 2, 2 };
+ // We want to trigger our ((parentShape.x() != shape.x()) || (parentShape.y() != shape.y()))
+ uint32_t origin[4] = { 1, 1, 0, 0 };
+ auto subTensor = factory.CreateSubTensorHandle(*tensorHandle, subTensorShape, origin);
+ // We expect a nullptr.
+ BOOST_ASSERT(subTensor == nullptr);
+}
+
+BOOST_AUTO_TEST_CASE(CreateSubtensorMustBeSmallerThanParent)
+{
+ // Create the factory to import tensors.
+ ClImportTensorHandleFactory factory(static_cast<MemorySourceFlags>(MemorySource::Malloc),
+ static_cast<MemorySourceFlags>(MemorySource::Malloc));
+ // Create a standard import tensor.
+ TensorShape tensorShape{ 224, 224, 1, 1 };
+ TensorInfo tensorInfo(tensorShape, armnn::DataType::Float32);
+ auto tensorHandle = factory.CreateTensorHandle(tensorInfo);
+ // Ask for a subtensor that's the same size as the parent.
+ TensorShape subTensorShape{ 224, 224, 1, 1 };
+ uint32_t origin[4] = { 1, 1, 0, 0 };
+ // This should result in a nullptr.
+ auto subTensor = factory.CreateSubTensorHandle(*tensorHandle, subTensorShape, origin);
+ BOOST_ASSERT(subTensor == nullptr);
+}
+
+BOOST_AUTO_TEST_SUITE_END()