aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Monahan <David.Monahan@arm.com>2022-01-13 10:48:33 +0000
committerDavid Monahan <David.Monahan@arm.com>2022-01-13 14:41:16 +0000
commit0fa1050a8cb6e7445e62a3fd1a1dce947d305cce (patch)
tree9dae2c168f16cb6f69d4e5660d7700ff7424c81b
parente0db4db4119369043b5518cece6f155d4c2704ca (diff)
downloadarmnn-0fa1050a8cb6e7445e62a3fd1a1dce947d305cce.tar.gz
IVGCVSW-6674 Implement CanBeImported function in NeonTensorHandle
* Added CanBeImported function * Updated existing checks to use the CanBeImported function * Added Unittest Signed-off-by: David Monahan <David.Monahan@arm.com> Change-Id: I1fe4b9cf2a803d00f35bb16d0e312fd93503dbd8
-rw-r--r--src/backends/neon/NeonTensorHandle.hpp12
-rw-r--r--src/backends/neon/test/NeonTensorHandleTests.cpp22
2 files changed, 33 insertions, 1 deletions
diff --git a/src/backends/neon/NeonTensorHandle.hpp b/src/backends/neon/NeonTensorHandle.hpp
index dd4c2572f9..f40b5fc2e5 100644
--- a/src/backends/neon/NeonTensorHandle.hpp
+++ b/src/backends/neon/NeonTensorHandle.hpp
@@ -114,13 +114,23 @@ public:
m_IsImportEnabled = importEnabledFlag;
}
+ bool CanBeImported(void* memory, MemorySource source) override
+ {
+ armnn::IgnoreUnused(source);
+ if (reinterpret_cast<uintptr_t>(memory) % m_TypeAlignment)
+ {
+ return false;
+ }
+ return true;
+ }
+
virtual bool Import(void* memory, MemorySource source) override
{
if (m_ImportFlags & static_cast<MemorySourceFlags>(source))
{
if (source == MemorySource::Malloc && m_IsImportEnabled)
{
- if (reinterpret_cast<uintptr_t>(memory) % m_TypeAlignment)
+ if (!CanBeImported(memory, source))
{
throw MemoryImportException("NeonTensorHandle::Import Attempting to import unaligned memory");
}
diff --git a/src/backends/neon/test/NeonTensorHandleTests.cpp b/src/backends/neon/test/NeonTensorHandleTests.cpp
index 9d69a5c2d0..c8e781b71d 100644
--- a/src/backends/neon/test/NeonTensorHandleTests.cpp
+++ b/src/backends/neon/test/NeonTensorHandleTests.cpp
@@ -703,6 +703,28 @@ TEST_CASE("NeonTensorHandleFactoryImport")
memoryManager->Release();
}
+TEST_CASE("NeonTensorHandleCanBeImported")
+{
+ std::shared_ptr<NeonMemoryManager> memoryManager = std::make_shared<NeonMemoryManager>(
+ std::make_unique<arm_compute::Allocator>(),
+ BaseMemoryManager::MemoryAffinity::Offset);
+ NeonTensorHandleFactory handleFactory(memoryManager);
+ TensorInfo info({ 1, 1, 2, 1 }, DataType::Float32);
+
+ // create TensorHandle (Memory Managed status is irrelevant)
+ auto handle = handleFactory.CreateTensorHandle(info, false);
+
+ // Create an aligned buffer
+ float alignedBuffer[2] = { 2.5f, 5.5f };
+ // Check aligned buffers return true
+ CHECK(handle->CanBeImported(&alignedBuffer, MemorySource::Malloc) == true);
+
+ // Create a misaligned buffer from the aligned one
+ float* misalignedBuffer = reinterpret_cast<float*>(reinterpret_cast<char*>(alignedBuffer) + 1);
+ // Check misaligned buffers return false
+ CHECK(handle->CanBeImported(static_cast<void*>(misalignedBuffer), MemorySource::Malloc) == false);
+}
+
TEST_CASE("NeonTensorHandleSupportsInPlaceComputation")
{
std::shared_ptr<NeonMemoryManager> memoryManager = std::make_shared<NeonMemoryManager>();