From 0fa1050a8cb6e7445e62a3fd1a1dce947d305cce Mon Sep 17 00:00:00 2001 From: David Monahan Date: Thu, 13 Jan 2022 10:48:33 +0000 Subject: 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 Change-Id: I1fe4b9cf2a803d00f35bb16d0e312fd93503dbd8 --- src/backends/neon/NeonTensorHandle.hpp | 12 +++++++++++- src/backends/neon/test/NeonTensorHandleTests.cpp | 22 ++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) (limited to 'src') 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(memory) % m_TypeAlignment) + { + return false; + } + return true; + } + virtual bool Import(void* memory, MemorySource source) override { if (m_ImportFlags & static_cast(source)) { if (source == MemorySource::Malloc && m_IsImportEnabled) { - if (reinterpret_cast(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 memoryManager = std::make_shared( + std::make_unique(), + 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(reinterpret_cast(alignedBuffer) + 1); + // Check misaligned buffers return false + CHECK(handle->CanBeImported(static_cast(misalignedBuffer), MemorySource::Malloc) == false); +} + TEST_CASE("NeonTensorHandleSupportsInPlaceComputation") { std::shared_ptr memoryManager = std::make_shared(); -- cgit v1.2.1