diff options
author | Francis Murtagh <francis.murtagh@arm.com> | 2021-10-14 17:30:24 +0100 |
---|---|---|
committer | Teresa Charlin <teresa.charlinreyes@arm.com> | 2021-10-19 22:26:45 +0100 |
commit | e8d7ccb1a18b5c39ecf17fb063fcc50baacc74b3 (patch) | |
tree | d1a072111807145a786b4c4221707bd34c1373be /src/backends/cl | |
parent | fc7c2f3c1dd990620a01ecf1a6641813e6f46ef8 (diff) | |
download | armnn-e8d7ccb1a18b5c39ecf17fb063fcc50baacc74b3.tar.gz |
IVGCVSW-6310 Update ICustomAllocator and add GetDefaultAllocator function to backends
Signed-off-by: Francis Murtagh <francis.murtagh@arm.com>
Change-Id: If2879e8a82692285e7fa3f4d09abd608ca28de12
Diffstat (limited to 'src/backends/cl')
-rw-r--r-- | src/backends/cl/test/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/backends/cl/test/ClCustomAllocatorTests.cpp | 10 | ||||
-rw-r--r-- | src/backends/cl/test/DefaultAllocatorTests.cpp | 124 |
3 files changed, 130 insertions, 5 deletions
diff --git a/src/backends/cl/test/CMakeLists.txt b/src/backends/cl/test/CMakeLists.txt index 41cbe24c15..8ee532a323 100644 --- a/src/backends/cl/test/CMakeLists.txt +++ b/src/backends/cl/test/CMakeLists.txt @@ -17,6 +17,7 @@ list(APPEND armnnClBackendUnitTests_sources ClOptimizedNetworkTests.cpp ClRuntimeTests.cpp ClWorkloadFactoryHelper.hpp + DefaultAllocatorTests.cpp Fp16SupportTest.cpp OpenClTimerTest.cpp ) diff --git a/src/backends/cl/test/ClCustomAllocatorTests.cpp b/src/backends/cl/test/ClCustomAllocatorTests.cpp index e614f4c624..60145139ff 100644 --- a/src/backends/cl/test/ClCustomAllocatorTests.cpp +++ b/src/backends/cl/test/ClCustomAllocatorTests.cpp @@ -10,13 +10,13 @@ #include <armnn/IRuntime.hpp> #include <armnn/Utils.hpp> #include <armnn/BackendRegistry.hpp> + #include <cl/ClBackend.hpp> #if defined(ARMCOMPUTENEON_ENABLED) #include <neon/NeonBackend.hpp> #endif - #include <doctest/doctest.h> - +#include <armnn/utility/IgnoreUnused.hpp> // Contains the OpenCl interfaces for mapping memory in the Gpu Page Tables // Requires the OpenCl backend to be included (GpuAcc) #include <arm_compute/core/CL/CLKernelLibrary.h> @@ -31,7 +31,7 @@ class SampleClBackendCustomAllocator : public armnn::ICustomAllocator public: SampleClBackendCustomAllocator() = default; - void* allocate(size_t size, size_t alignment) + void* allocate(size_t size, size_t alignment) override { // If alignment is 0 just use the CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE for alignment if (alignment == 0) @@ -49,12 +49,12 @@ public: } /** Interface to be implemented by the child class to free the allocated tensor */ - void free(void* ptr) + void free(void* ptr) override { std::free(ptr); } - armnn::MemorySource GetMemorySourceType() + armnn::MemorySource GetMemorySourceType() override { return armnn::MemorySource::Malloc; } diff --git a/src/backends/cl/test/DefaultAllocatorTests.cpp b/src/backends/cl/test/DefaultAllocatorTests.cpp new file mode 100644 index 0000000000..196c0fb412 --- /dev/null +++ b/src/backends/cl/test/DefaultAllocatorTests.cpp @@ -0,0 +1,124 @@ +// +// Copyright © 2021 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include <armnn/backends/ICustomAllocator.hpp> +#include <armnn/Descriptors.hpp> +#include <armnn/Exceptions.hpp> +#include <armnn/IRuntime.hpp> +#include <backendsCommon/TensorHandle.hpp> +// Requires the OpenCl backend to be included (GpuAcc) +#include <cl/ClBackend.hpp> +#include <doctest/doctest.h> +#include <backendsCommon/DefaultAllocator.hpp> +#include <backendsCommon/test/MockBackend.hpp> + +using namespace armnn; + + +namespace +{ + +TEST_SUITE("DefaultAllocatorTests") +{ + +TEST_CASE("DefaultAllocatorTest") +{ + float number = 3; + + TensorInfo inputTensorInfo(TensorShape({1, 1}), DataType::Float32); + + // Create ArmNN runtime + IRuntime::CreationOptions options; // default options + auto customAllocator = std::make_shared<DefaultAllocator>(); + options.m_CustomAllocatorMap = {{"GpuAcc", std::move(customAllocator)}}; + IRuntimePtr run = IRuntime::Create(options); + + // Creates structures for input & output + unsigned int numElements = inputTensorInfo.GetNumElements(); + size_t totalBytes = numElements * sizeof(float); + + void* alignedInputPtr = options.m_CustomAllocatorMap["GpuAcc"]->allocate(totalBytes, 0); + + auto* inputPtr = reinterpret_cast<float*>(alignedInputPtr); + std::fill_n(inputPtr, numElements, number); + CHECK(inputPtr[0] == 3); + + auto& backendRegistry = armnn::BackendRegistryInstance(); + backendRegistry.DeregisterAllocator(ClBackend::GetIdStatic()); +} + +TEST_CASE("DefaultAllocatorTestMulti") +{ + float number = 3; + + TensorInfo inputTensorInfo(TensorShape({2, 1}), DataType::Float32); + + // Create ArmNN runtime + IRuntime::CreationOptions options; // default options + auto customAllocator = std::make_shared<DefaultAllocator>(); + options.m_CustomAllocatorMap = {{"GpuAcc", std::move(customAllocator)}}; + IRuntimePtr run = IRuntime::Create(options); + + // Creates structures for input & output + unsigned int numElements = inputTensorInfo.GetNumElements(); + size_t totalBytes = numElements * sizeof(float); + + void* alignedInputPtr = options.m_CustomAllocatorMap["GpuAcc"]->allocate(totalBytes, 0); + void* alignedInputPtr2 = options.m_CustomAllocatorMap["GpuAcc"]->allocate(totalBytes, 0); + + auto* inputPtr = reinterpret_cast<float*>(alignedInputPtr); + std::fill_n(inputPtr, numElements, number); + CHECK(inputPtr[0] == 3); + CHECK(inputPtr[1] == 3); + + auto* inputPtr2 = reinterpret_cast<float*>(alignedInputPtr2); + std::fill_n(inputPtr2, numElements, number); + CHECK(inputPtr2[0] == 3); + CHECK(inputPtr2[1] == 3); + + // No overlap + CHECK(inputPtr[0] == 3); + CHECK(inputPtr[1] == 3); + + auto& backendRegistry = armnn::BackendRegistryInstance(); + backendRegistry.DeregisterAllocator(ClBackend::GetIdStatic()); +} + +TEST_CASE("DefaultAllocatorTestMock") +{ + // Create ArmNN runtime + IRuntime::CreationOptions options; // default options + IRuntimePtr run = IRuntime::Create(options); + + // Initialize Mock Backend + MockBackendInitialiser initialiser; + auto factoryFun = BackendRegistryInstance().GetFactory(MockBackend().GetIdStatic()); + ARMNN_ASSERT(factoryFun != nullptr); + auto backend = factoryFun(); + auto defaultAllocator = backend->GetDefaultAllocator(); + + // GetMemorySourceType + CHECK(defaultAllocator->GetMemorySourceType() == MemorySource::Malloc); + + size_t totalBytes = 1 * sizeof(float); + // Allocate + void* ptr = defaultAllocator->allocate(totalBytes, 0); + + // GetMemoryRegionAtOffset + CHECK(defaultAllocator->GetMemoryRegionAtOffset(ptr, 0, 0)); + + // Free + defaultAllocator->free(ptr); + + // Clean up + auto& backendRegistry = armnn::BackendRegistryInstance(); + backendRegistry.Deregister(MockBackend().GetIdStatic()); + backendRegistry.DeregisterAllocator(ClBackend::GetIdStatic()); +} + + +} + +} // namespace armnn
\ No newline at end of file |