From: Francis Murtagh <francis.murtagh@arm.com>
Date: Tue, 1 Aug 2023 21:39:26 +0200
Subject: Split out backends to dynamically loadable libraries

X-Dgit-Generated: 20.08-1 ec2767a01cbc8e65137798609be54e4c039083f6

Last-Update: 2023-08-28 Emanuele Rocca <ema@debian.org>

 * Add cl neon ref internal headers
 * Link acl libraries
 * Remove workloads from libarmnn
 * Shared aclcommon linked to Neon and Cl Backends
 * Remove backend tests
 * Link OpenCl libraries to GpuAcc Backend
 * Version the AclCommon library

Signed-off-by: Francis Murtagh <francis.murtagh@arm.com>
Change-Id: I524fcc7de1f696185c19b5741f46eb4d435ca89d
---
 CMakeLists.txt                                    |   8 -
 src/backends/aclCommon/CMakeLists.txt             |  10 +-
 src/backends/aclCommon/common.cmake               |   2 -
 src/backends/backendsCommon/CMakeLists.txt        |   4 -
 src/backends/backendsCommon/common.cmake          |   3 +-
 src/backends/cl/CMakeLists.txt                    |  31 ++-
 src/backends/cl/ClBackend.cpp                     |  25 ++
 src/backends/cl/ClBackend.hpp                     | 283 +---------------------
 src/backends/cl/ClBackendInternal.hpp             |  44 ++++
 src/backends/cl/backend.cmake                     |   6 +-
 src/backends/dynamic/reference/CMakeLists.txt     |  14 --
 src/backends/neon/CMakeLists.txt                  |  28 ++-
 src/backends/neon/NeonBackend.cpp                 |  25 ++
 src/backends/neon/NeonBackend.hpp                 |  72 +-----
 src/backends/neon/NeonBackendInternal.hpp         |  42 ++++
 src/backends/neon/backend.cmake                   |   6 +-
 src/backends/reference/CMakeLists.txt             |  36 ++-
 src/backends/reference/RefBackend.cpp             |  25 ++
 src/backends/reference/RefBackend.hpp             |  68 +-----
 src/backends/reference/RefBackendInternal.hpp     |  46 ++++
 src/backends/reference/RefRegistryInitializer.cpp |   2 +-
 src/backends/reference/backend.cmake              |   2 +-
 22 files changed, 293 insertions(+), 489 deletions(-)
 create mode 100644 src/backends/cl/ClBackendInternal.hpp
 create mode 100644 src/backends/neon/NeonBackendInternal.hpp
 create mode 100644 src/backends/reference/RefBackendInternal.hpp

diff --git a/CMakeLists.txt b/CMakeLists.txt
index c7b8ab3..fb1f34c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -517,10 +517,6 @@ endif()
 
 install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
 
-if(ARMCOMPUTENEON OR ARMCOMPUTECL)
-    target_link_libraries(armnn PUBLIC ${ARMCOMPUTE_LIBRARIES})
-endif()
-
 # Flatbuffers is not included in armnn if the armnnSerializer is not present
 # Required to target link both flatbuffers and tosa_serialization_lib to armnn
 if(ARMNNTOSACOMMON)
@@ -565,10 +561,6 @@ if (ARMNNTOSAREF)
     endif()
 endif()
 
-if(ARMCOMPUTECL AND OPENCL_LIBRARIES)
-    target_link_libraries(armnn ${OPENCL_LIBRARIES})
-endif()
-
 if(PROFILING_BACKEND_STREAMLINE AND (NOT ("${CMAKE_SYSTEM_NAME}" STREQUAL Android)))
     target_link_libraries(armnn PUBLIC ${CMAKE_THREAD_LIBS_INIT})
 endif()
diff --git a/src/backends/aclCommon/CMakeLists.txt b/src/backends/aclCommon/CMakeLists.txt
index eaaed65..7505cda 100644
--- a/src/backends/aclCommon/CMakeLists.txt
+++ b/src/backends/aclCommon/CMakeLists.txt
@@ -21,14 +21,14 @@ if(ARMCOMPUTECL)
     )
 endif()
 
-if(BUILD_UNIT_TESTS)
-    add_subdirectory(test)
-endif()
-
-add_library(armnnAclCommon OBJECT ${armnnAclCommon_sources})
+add_library(armnnAclCommon SHARED ${armnnAclCommon_sources})
 target_include_directories(armnnAclCommon PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn)
 target_include_directories(armnnAclCommon PRIVATE ${PROJECT_SOURCE_DIR}/src/armnnUtils)
 target_include_directories(armnnAclCommon PRIVATE ${PROJECT_SOURCE_DIR}/src/backends)
 target_include_directories(armnnAclCommon PRIVATE ${PROJECT_SOURCE_DIR}/src/profiling)
 target_include_directories(armnnAclCommon PRIVATE ${PROJECT_SOURCE_DIR}/profiling/common/include)
 target_include_directories(armnnAclCommon PRIVATE ${PROJECT_SOURCE_DIR}/profiling/client/include)
+set_target_properties(armnnAclCommon PROPERTIES VERSION ${GENERIC_LIB_VERSION} SOVERSION ${GENERIC_LIB_SOVERSION} )
+
+install(TARGETS armnnAclCommon
+        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/)
diff --git a/src/backends/aclCommon/common.cmake b/src/backends/aclCommon/common.cmake
index 89be236..e32496b 100644
--- a/src/backends/aclCommon/common.cmake
+++ b/src/backends/aclCommon/common.cmake
@@ -5,6 +5,4 @@
 
 if(ARMCOMPUTENEON OR ARMCOMPUTECL)
     add_subdirectory(${PROJECT_SOURCE_DIR}/src/backends/aclCommon)
-    list(APPEND armnnLibraries armnnAclCommon)
-    list(APPEND armnnUnitTestLibraries armnnAclCommonUnitTests)
 endif()
diff --git a/src/backends/backendsCommon/CMakeLists.txt b/src/backends/backendsCommon/CMakeLists.txt
index 117bda1..3320e61 100644
--- a/src/backends/backendsCommon/CMakeLists.txt
+++ b/src/backends/backendsCommon/CMakeLists.txt
@@ -43,10 +43,6 @@ list(APPEND armnnBackendsCommon_sources
 
 add_subdirectory(memoryOptimizerStrategyLibrary)
 
-if(BUILD_UNIT_TESTS)
-    add_subdirectory(test)
-endif()
-
 add_library(armnnBackendsCommon OBJECT ${armnnBackendsCommon_sources})
 target_include_directories(armnnBackendsCommon PRIVATE ${PROJECT_SOURCE_DIR}/include/armnn/backends)
 target_include_directories(armnnBackendsCommon PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn)
diff --git a/src/backends/backendsCommon/common.cmake b/src/backends/backendsCommon/common.cmake
index d5973be..f39bebd 100644
--- a/src/backends/backendsCommon/common.cmake
+++ b/src/backends/backendsCommon/common.cmake
@@ -6,5 +6,4 @@
 add_subdirectory(${PROJECT_SOURCE_DIR}/src/backends/backendsCommon)
 list(APPEND armnnLibraries armnnBackendsCommon)
 list(APPEND armnnLibraries armnnMemoryOptimizationStrategies)
-list(APPEND armnnUnitTestLibraries armnnBackendsCommonUnitTests)
-list(APPEND armnnUnitTestLibraries armnnMemoryOptimizationStrategiesUnitTests)
\ No newline at end of file
+list(APPEND armnnUnitTestLibraries armnnMemoryOptimizationStrategiesUnitTests)
diff --git a/src/backends/cl/CMakeLists.txt b/src/backends/cl/CMakeLists.txt
index cc71069..e6d2e60 100644
--- a/src/backends/cl/CMakeLists.txt
+++ b/src/backends/cl/CMakeLists.txt
@@ -38,7 +38,6 @@ if(ARMCOMPUTECL)
         ClImportTensorHandleFactory.hpp
         ClLayerSupport.cpp
         ClLayerSupport.hpp
-        ClRegistryInitializer.cpp
         ClTensorHandle.cpp
         ClTensorHandle.hpp
         ClTensorHandleFactory.cpp
@@ -52,11 +51,28 @@ if(ARMCOMPUTECL)
 
     add_subdirectory(workloads)
 
-    if(BUILD_UNIT_TESTS)
-        add_subdirectory(test)
+    include_directories(SYSTEM "${FLATBUFFERS_INCLUDE_PATH}")
+
+    # add workload object to backend module instead of adding to armnn
+    add_library(Arm_GpuAcc_backend MODULE ${armnnClBackend_sources} $<TARGET_OBJECTS:armnnClBackendWorkloads>)
+
+    target_include_directories(Arm_GpuAcc_backend PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn)
+    target_include_directories(Arm_GpuAcc_backend PRIVATE ${PROJECT_SOURCE_DIR}/src/armnnUtils)
+    target_include_directories(Arm_GpuAcc_backend PRIVATE ${PROJECT_SOURCE_DIR}/src/backends)
+    target_include_directories(Arm_GpuAcc_backend PRIVATE ${PROJECT_SOURCE_DIR}/src/profiling)
+    target_include_directories(Arm_GpuAcc_backend PRIVATE ${PROJECT_SOURCE_DIR}/profiling/common/include)
+    set_target_properties(Arm_GpuAcc_backend PROPERTIES PREFIX "")
+    target_link_libraries(Arm_GpuAcc_backend ${ARMCOMPUTE_LIBRARIES})
+    target_link_libraries(Arm_GpuAcc_backend armnn)
+    message("# Link OpenCl libraries to GpuAcc backend: "${OPENCL_LIBRARIES})
+    target_link_libraries(Arm_GpuAcc_backend armnnAclCommon)
+    if(OPENCL_LIBRARIES)
+        target_link_libraries(Arm_GpuAcc_backend ${OPENCL_LIBRARIES})
     endif()
 
-    include_directories(SYSTEM "${FLATBUFFERS_INCLUDE_PATH}")
+    set(armnnMajor "armnn${ARMNN_MAJOR_VERSION}")
+    install(TARGETS Arm_GpuAcc_backend
+            LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/${armnnMajor})
 
 else()
     list(APPEND armnnClBackend_sources
@@ -66,10 +82,3 @@ else()
     )
 endif()
 
-add_library(armnnClBackend OBJECT ${armnnClBackend_sources})
-target_include_directories(armnnClBackend PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn)
-target_include_directories(armnnClBackend PRIVATE ${PROJECT_SOURCE_DIR}/src/armnnUtils)
-target_include_directories(armnnClBackend PRIVATE ${PROJECT_SOURCE_DIR}/src/backends)
-target_include_directories(armnnClBackend PRIVATE ${PROJECT_SOURCE_DIR}/src/profiling)
-target_include_directories(armnnClBackend PRIVATE ${PROJECT_SOURCE_DIR}/profiling/common/include)
-target_include_directories(armnnClBackend PRIVATE ${PROJECT_SOURCE_DIR}/profiling/client/include)
diff --git a/src/backends/cl/ClBackend.cpp b/src/backends/cl/ClBackend.cpp
index 1d8ae21..9d8361b 100644
--- a/src/backends/cl/ClBackend.cpp
+++ b/src/backends/cl/ClBackend.cpp
@@ -12,6 +12,7 @@
 #include "ClLayerSupport.hpp"
 #include "ClTensorHandleFactory.hpp"
 #include "ClWorkloadFactory.hpp"
+#include "ClBackendInternal.hpp"
 
 #include <armnn/BackendRegistry.hpp>
 #include <armnn/Descriptors.hpp>
@@ -712,3 +713,27 @@ OptimizationViews ClBackend::OptimizeSubgraphView(const SubgraphView& subgraph,
 }
 
 } // namespace armnn
+
+
+const char* GetBackendId()
+{
+    return armnn::ClBackend::GetIdStatic().Get().c_str();
+}
+
+void GetVersion(uint32_t* outMajor, uint32_t* outMinor)
+{
+    if (!outMajor || !outMinor)
+    {
+        return;
+    }
+
+    armnn::BackendVersion apiVersion = armnn::IBackendInternal::GetApiVersion();
+
+    *outMajor = apiVersion.m_Major;
+    *outMinor = apiVersion.m_Minor;
+}
+
+void* BackendFactory()
+{
+    return new armnn::ClBackend();
+}
diff --git a/src/backends/cl/ClBackend.hpp b/src/backends/cl/ClBackend.hpp
index 1d2a866..a93ab7a 100644
--- a/src/backends/cl/ClBackend.hpp
+++ b/src/backends/cl/ClBackend.hpp
@@ -6,282 +6,11 @@
 
 #include <armnn/backends/IBackendInternal.hpp>
 
-#include <arm_compute/core/Types.h>
-#include <arm_compute/runtime/CL/CLBufferAllocator.h>
+#include <cstdint>
 
-#include <aclCommon/BaseMemoryManager.hpp>
-#include <arm_compute/runtime/CL/CLMemoryRegion.h>
-
-#include <arm_compute/core/CL/CLKernelLibrary.h>
-#include <CL/cl_ext.h>
-
-// System includes for mapping and unmapping memory
-#include <sys/mman.h>
-
-namespace armnn
-{
-
-class ClBackend : public IBackendInternal
+extern "C"
 {
-public:
-    ClBackend() : m_CustomAllocator(nullptr) {};
-    ClBackend(std::shared_ptr<ICustomAllocator> allocator)
-    {
-        std::string err;
-        UseCustomMemoryAllocator(allocator, err);
-    }
-    ~ClBackend() = default;
-
-    static const BackendId& GetIdStatic();
-    const BackendId& GetId() const override { return GetIdStatic(); }
-
-    IBackendInternal::IMemoryManagerUniquePtr CreateMemoryManager() const override;
-
-    IBackendInternal::IWorkloadFactoryPtr CreateWorkloadFactory(
-        const IBackendInternal::IMemoryManagerSharedPtr& memoryManager = nullptr) const override;
-
-    IBackendInternal::IWorkloadFactoryPtr CreateWorkloadFactory(
-        TensorHandleFactoryRegistry& registry) const override;
-
-    IWorkloadFactoryPtr CreateWorkloadFactory(const IMemoryManagerSharedPtr& memoryManager,
-                                              const ModelOptions& modelOptions) const override;
-
-    IWorkloadFactoryPtr CreateWorkloadFactory(class TensorHandleFactoryRegistry& tensorHandleFactoryRegistry,
-                                              const ModelOptions& modelOptions) const override;
-
-    IWorkloadFactoryPtr CreateWorkloadFactory(class TensorHandleFactoryRegistry& tensorHandleFactoryRegistry,
-                                              const ModelOptions& modelOptions,
-                                              MemorySourceFlags inputFlags,
-                                              MemorySourceFlags outputFlags) const override;
-
-    std::vector<ITensorHandleFactory::FactoryId> GetHandleFactoryPreferences() const override;
-
-    void RegisterTensorHandleFactories(TensorHandleFactoryRegistry& registry) override;
-
-    void RegisterTensorHandleFactories(TensorHandleFactoryRegistry& registry,
-                                       MemorySourceFlags inputFlags,
-                                       MemorySourceFlags outputFlags) override;
-
-    IBackendInternal::IBackendContextPtr CreateBackendContext(const IRuntime::CreationOptions&) const override;
-    IBackendInternal::IBackendProfilingContextPtr CreateBackendProfilingContext(
-        const IRuntime::CreationOptions&, IBackendProfilingPtr& backendProfiling) override;
-
-    IBackendInternal::ILayerSupportSharedPtr GetLayerSupport() const override;
-    IBackendInternal::ILayerSupportSharedPtr GetLayerSupport(const ModelOptions& modelOptions) const override;
-
-    OptimizationViews OptimizeSubgraphView(const SubgraphView& subgraph,
-                                           const ModelOptions& modelOptions) const override;
-
-    IBackendInternal::IBackendSpecificModelContextPtr CreateBackendSpecificModelContext(
-        const ModelOptions& modelOptions) const override;
-
-    std::unique_ptr<ICustomAllocator> GetDefaultAllocator() const override;
-
-    BackendCapabilities GetCapabilities() const override;
-
-    virtual bool UseCustomMemoryAllocator(std::shared_ptr<ICustomAllocator> allocator,
-                                          armnn::Optional<std::string&> errMsg) override
-    {
-        IgnoreUnused(errMsg);
-        ARMNN_LOG(info) << "Using Custom Allocator for ClBackend";
-
-        // Set flag to signal the backend to use a custom memory allocator
-        m_CustomAllocator = std::make_shared<ClBackendCustomAllocatorWrapper>(std::move(allocator));
-        m_UsingCustomAllocator = true;
-        return m_UsingCustomAllocator;
-    }
-
-    virtual unsigned int GetNumberOfCacheFiles() const override { return 1; }
-
-    // Cl requires a arm_compute::IAllocator we wrap the Arm NN ICustomAllocator to achieve this
-    class ClBackendCustomAllocatorWrapper : public arm_compute::IAllocator
-    {
-    public:
-        ClBackendCustomAllocatorWrapper(std::shared_ptr<ICustomAllocator> alloc) : m_CustomAllocator(alloc)
-        {}
-        // Inherited methods overridden:
-        void* allocate(size_t size, size_t alignment) override
-        {
-            auto alloc = m_CustomAllocator->allocate(size, alignment);
-            return MapAllocatedMemory(alloc, size, m_CustomAllocator->GetMemorySourceType());
-        }
-        void free(void* ptr) override
-        {
-            auto hostMemPtr = m_AllocatedBufferMappings[ptr];
-            clReleaseMemObject(static_cast<cl_mem>(ptr));
-            m_CustomAllocator->free(hostMemPtr);
-        }
-        std::unique_ptr<arm_compute::IMemoryRegion> make_region(size_t size, size_t alignment) override
-        {
-            auto hostMemPtr = m_CustomAllocator->allocate(size, alignment);
-            cl_mem buffer = MapAllocatedMemory(hostMemPtr, size, m_CustomAllocator->GetMemorySourceType());
-
-            return std::make_unique<ClBackendCustomAllocatorMemoryRegion>(cl::Buffer(buffer),
-                                                                          hostMemPtr,
-                                                                          m_CustomAllocator->GetMemorySourceType());
-        }
-    private:
-        cl_mem MapAllocatedMemory(void* memory, size_t size, MemorySource source)
-        {
-            // Round the size of the buffer to a multiple of the CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE
-            auto cachelineAlignment =
-                    arm_compute::CLKernelLibrary::get().get_device().getInfo<CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE>();
-            auto roundedSize = cachelineAlignment + size - (size % cachelineAlignment);
-
-            if (source == MemorySource::Malloc)
-            {
-                const cl_import_properties_arm importProperties[] =
-                        {
-                            CL_IMPORT_TYPE_ARM,
-                            CL_IMPORT_TYPE_HOST_ARM,
-                            0
-                        };
-                cl_int error = CL_SUCCESS;
-                cl_mem buffer = clImportMemoryARM(arm_compute::CLKernelLibrary::get().context().get(),
-                                                  CL_MEM_READ_WRITE,
-                                                  importProperties,
-                                                  memory,
-                                                  roundedSize,
-                                                  &error);
-                if (error == CL_SUCCESS)
-                {
-                    m_AllocatedBufferMappings.insert(std::make_pair(static_cast<void *>(buffer), memory));
-                    return buffer;
-                }
-                throw armnn::Exception(
-                    "Mapping allocated memory from CustomMemoryAllocator failed, errcode: " + std::to_string(error));
-            }
-            else if (source == MemorySource::DmaBuf)
-            {
-                const cl_import_properties_arm importProperties[] =
-                        {
-                            CL_IMPORT_TYPE_ARM,
-                            CL_IMPORT_TYPE_DMA_BUF_ARM,
-                            CL_IMPORT_DMA_BUF_DATA_CONSISTENCY_WITH_HOST_ARM,
-                            CL_TRUE,
-                            0
-                        };
-                cl_int error = CL_SUCCESS;
-                cl_mem buffer = clImportMemoryARM(arm_compute::CLKernelLibrary::get().context().get(),
-                                                  CL_MEM_READ_WRITE,
-                                                  importProperties,
-                                                  memory,
-                                                  roundedSize,
-                                                  &error);
-                if (error == CL_SUCCESS)
-                {
-                    m_AllocatedBufferMappings.insert(std::make_pair(static_cast<void *>(buffer), memory));
-                    return buffer;
-                }
-                throw armnn::Exception(
-                        "Mapping allocated memory from CustomMemoryAllocator failed, errcode: "
-                         + std::to_string(error));
-            }
-            else if (source == MemorySource::DmaBufProtected)
-            {
-                const cl_import_properties_arm importProperties[] =
-                        {
-                                CL_IMPORT_TYPE_ARM,
-                                CL_IMPORT_TYPE_DMA_BUF_ARM,
-                                CL_IMPORT_TYPE_PROTECTED_ARM,
-                                CL_TRUE,
-                                0
-                        };
-                cl_int error = CL_SUCCESS;
-                cl_mem buffer = clImportMemoryARM(arm_compute::CLKernelLibrary::get().context().get(),
-                                                  CL_MEM_READ_WRITE,
-                                                  importProperties,
-                                                  memory,
-                                                  roundedSize,
-                                                  &error);
-                if (error == CL_SUCCESS)
-                {
-                    m_AllocatedBufferMappings.insert(std::make_pair(static_cast<void *>(buffer), memory));
-                    return buffer;
-                }
-                throw armnn::Exception(
-                        "Mapping allocated memory from CustomMemoryAllocator failed, errcode: "
-                         + std::to_string(error));
-            }
-            throw armnn::Exception(
-                    "Attempting to allocate memory with unsupported MemorySource type in CustomAllocator");
-        }
-        std::shared_ptr<ICustomAllocator> m_CustomAllocator;
-        std::map<void*, void*> m_AllocatedBufferMappings;
-    };
-
-    class ClBackendCustomAllocatorMemoryRegion : public arm_compute::ICLMemoryRegion
-    {
-    public:
-        // We need to have a new version of ICLMemoryRegion which holds a hostMemPtr to allow for cpu copy access
-        ClBackendCustomAllocatorMemoryRegion(const cl::Buffer &buffer, void* hostMemPtr, armnn::MemorySource source)
-            : ICLMemoryRegion(buffer.getInfo<CL_MEM_SIZE>())
-        {
-            _mem = buffer;
-            m_HostMemPtr = hostMemPtr;
-            m_MemorySource = source;
-        }
-
-        // Inherited methods overridden :
-        void* ptr() override
-        {
-            return nullptr;
-        }
-
-        void* map(cl::CommandQueue &q, bool blocking) override
-        {
-            armnn::IgnoreUnused(q, blocking);
-            if (m_HostMemPtr == nullptr)
-            {
-                throw armnn::Exception("ClBackend: Attempting to map memory with an invalid host ptr");
-            }
-            if (_mapping != nullptr)
-            {
-                throw armnn::Exception("ClBackend: Attempting to map memory which has not yet been unmapped");
-            }
-            switch (m_MemorySource)
-            {
-                case armnn::MemorySource::Malloc:
-                    _mapping = m_HostMemPtr;
-                    return _mapping;
-                    break;
-                case armnn::MemorySource::DmaBuf:
-                case armnn::MemorySource::DmaBufProtected:
-                    // If the source is a Dmabuf then the memory ptr should be pointing to an integer value for the fd
-                    _mapping = mmap(NULL, _size, PROT_WRITE, MAP_SHARED, *(reinterpret_cast<int*>(m_HostMemPtr)), 0);
-                    return _mapping;
-                    break;
-                default:
-                    throw armnn::Exception("ClBackend: Attempting to map imported memory without a valid source");
-                    break;
-            }
-        }
-
-        void unmap(cl::CommandQueue &q) override
-        {
-            armnn::IgnoreUnused(q);
-            switch (m_MemorySource)
-            {
-                case armnn::MemorySource::Malloc:
-                    _mapping = nullptr;
-                    break;
-                case armnn::MemorySource::DmaBuf:
-                case armnn::MemorySource::DmaBufProtected:
-                    munmap(_mapping, _size);
-                    _mapping = nullptr;
-                    break;
-                default:
-                    throw armnn::Exception("ClBackend: Attempting to unmap imported memory without a valid source");
-                    break;
-            }
-        }
-    private:
-        void* m_HostMemPtr = nullptr;
-        armnn::MemorySource m_MemorySource;
-    };
-
-    std::shared_ptr<ClBackendCustomAllocatorWrapper> m_CustomAllocator;
-    bool m_UsingCustomAllocator = false;
-};
-
-} // namespace armnn
+const char* GetBackendId();
+void GetVersion(uint32_t* outMajor, uint32_t* outMinor);
+void* BackendFactory();
+}
diff --git a/src/backends/cl/ClBackendInternal.hpp b/src/backends/cl/ClBackendInternal.hpp
new file mode 100644
index 0000000..9bf964c
--- /dev/null
+++ b/src/backends/cl/ClBackendInternal.hpp
@@ -0,0 +1,44 @@
+//
+// Copyright © 2017 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+#pragma once
+
+#include <armnn/backends/IBackendInternal.hpp>
+
+namespace armnn
+{
+
+class ClBackend : public IBackendInternal
+{
+
+public:
+    ClBackend()  = default;
+    ~ClBackend() = default;
+
+    static const BackendId& GetIdStatic();
+    const BackendId& GetId() const override { return GetIdStatic(); }
+
+    IBackendInternal::IMemoryManagerUniquePtr CreateMemoryManager() const override;
+
+    IBackendInternal::IWorkloadFactoryPtr CreateWorkloadFactory(
+        const IBackendInternal::IMemoryManagerSharedPtr& memoryManager = nullptr) const override;
+
+    IBackendInternal::IWorkloadFactoryPtr CreateWorkloadFactory(
+        TensorHandleFactoryRegistry& registry) const override;
+
+    std::vector<ITensorHandleFactory::FactoryId> GetHandleFactoryPreferences() const override;
+
+    void RegisterTensorHandleFactories(TensorHandleFactoryRegistry& registry) override;
+
+    IBackendInternal::IBackendContextPtr CreateBackendContext(const IRuntime::CreationOptions&) const override;
+    IBackendInternal::IBackendProfilingContextPtr CreateBackendProfilingContext(
+        const IRuntime::CreationOptions&, IBackendProfilingPtr& backendProfiling) override;
+
+    IBackendInternal::Optimizations GetOptimizations() const override;
+    IBackendInternal::ILayerSupportSharedPtr GetLayerSupport() const override;
+
+    OptimizationViews OptimizeSubgraphView(const SubgraphView& subgraph) const override;
+};
+
+} // namespace armnn
diff --git a/src/backends/cl/backend.cmake b/src/backends/cl/backend.cmake
index 9484b94..69fa888 100644
--- a/src/backends/cl/backend.cmake
+++ b/src/backends/cl/backend.cmake
@@ -4,11 +4,11 @@
 #
 
 add_subdirectory(${PROJECT_SOURCE_DIR}/src/backends/cl)
-list(APPEND armnnLibraries armnnClBackend)
+#list(APPEND armnnLibraries armnnClBackend)
 
 if(ARMCOMPUTECL)
-    list(APPEND armnnLibraries armnnClBackendWorkloads)
-    list(APPEND armnnUnitTestLibraries armnnClBackendUnitTests)
+#    list(APPEND armnnLibraries armnnClBackendWorkloads)
+#    list(APPEND armnnUnitTestLibraries armnnClBackendUnitTests)
 else()
     message(STATUS "CL backend is disabled")
 endif()
diff --git a/src/backends/dynamic/reference/CMakeLists.txt b/src/backends/dynamic/reference/CMakeLists.txt
index acf5338..314081a 100644
--- a/src/backends/dynamic/reference/CMakeLists.txt
+++ b/src/backends/dynamic/reference/CMakeLists.txt
@@ -17,17 +17,3 @@ set(RefBackendPath ${PROJECT_SOURCE_DIR}/src/backends/reference)
 file(GLOB RefBackendBaseFiles ${RefBackendPath}/*.cpp)
 file(GLOB RefBackendWorloadFiles ${RefBackendPath}/workloads/*.cpp)
 set(RefBackendFiles ${RefBackendBaseFiles} ${RefBackendWorloadFiles})
-
-# Remove the file that contains the static backend registration
-list(REMOVE_ITEM RefBackendFiles ${RefBackendPath}/RefRegistryInitializer.cpp)
-
-# Create the shared object
-add_library(Arm_CpuRef_backend MODULE ${armnnRefDynamicBackend_sources} ${RefBackendFiles})
-target_include_directories(Arm_CpuRef_backend PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn)
-target_include_directories(Arm_CpuRef_backend PRIVATE ${PROJECT_SOURCE_DIR}/src/armnnUtils)
-target_include_directories(Arm_CpuRef_backend PRIVATE ${PROJECT_SOURCE_DIR}/src/backends)
-target_include_directories(Arm_CpuRef_backend PRIVATE ${PROJECT_SOURCE_DIR}/src/profiling)
-target_include_directories(Arm_CpuRef_backend PRIVATE ${PROJECT_SOURCE_DIR}/profiling/common/include)
-target_include_directories(Arm_CpuRef_backend PRIVATE ${PROJECT_SOURCE_DIR}/profiling/client/include)
-set_target_properties(Arm_CpuRef_backend PROPERTIES PREFIX "")
-target_link_libraries(Arm_CpuRef_backend armnn)
diff --git a/src/backends/neon/CMakeLists.txt b/src/backends/neon/CMakeLists.txt
index 1c07773..93e0760 100644
--- a/src/backends/neon/CMakeLists.txt
+++ b/src/backends/neon/CMakeLists.txt
@@ -14,7 +14,7 @@ if(ARMCOMPUTENEON)
         NeonInterceptorScheduler.cpp
         NeonLayerSupport.cpp
         NeonLayerSupport.hpp
-        NeonRegistryInitializer.cpp
+        #NeonRegistryInitializer.cpp # Prevent static registration
         NeonTensorHandle.hpp
         NeonTensorHandle.cpp
         NeonTensorHandleFactory.cpp
@@ -27,9 +27,22 @@ if(ARMCOMPUTENEON)
 
     add_subdirectory(workloads)
 
-    if(BUILD_UNIT_TESTS)
-        add_subdirectory(test)
-    endif()
+    # add workload object to backend module instead of adding to armnn
+    add_library(Arm_CpuAcc_backend MODULE ${armnnNeonBackend_sources} $<TARGET_OBJECTS:armnnNeonBackendWorkloads>)
+
+    target_include_directories(Arm_CpuAcc_backend PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn)
+    target_include_directories(Arm_CpuAcc_backend PRIVATE ${PROJECT_SOURCE_DIR}/src/armnnUtils)
+    target_include_directories(Arm_CpuAcc_backend PRIVATE ${PROJECT_SOURCE_DIR}/src/backends)
+    target_include_directories(Arm_CpuAcc_backend PRIVATE ${PROJECT_SOURCE_DIR}/src/profiling)
+    target_include_directories(Arm_CpuAcc_backend PRIVATE ${PROJECT_SOURCE_DIR}/profiling/common/include)
+    set_target_properties(Arm_CpuAcc_backend PROPERTIES PREFIX "")
+    target_link_libraries(Arm_CpuAcc_backend ${ARMCOMPUTE_LIBRARIES})
+    target_link_libraries(Arm_CpuAcc_backend armnn)
+    target_link_libraries(Arm_CpuAcc_backend armnnAclCommon)
+
+    set(armnnMajor "armnn${ARMNN_MAJOR_VERSION}")
+    install(TARGETS Arm_CpuAcc_backend
+            LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/${armnnMajor})
 
 else()
     list(APPEND armnnNeonBackend_sources
@@ -39,10 +52,3 @@ else()
     )
 endif()
 
-add_library(armnnNeonBackend OBJECT ${armnnNeonBackend_sources})
-target_include_directories(armnnNeonBackend PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn)
-target_include_directories(armnnNeonBackend PRIVATE ${PROJECT_SOURCE_DIR}/src/armnnUtils)
-target_include_directories(armnnNeonBackend PRIVATE ${PROJECT_SOURCE_DIR}/src/backends)
-target_include_directories(armnnNeonBackend PRIVATE ${PROJECT_SOURCE_DIR}/src/profiling)
-target_include_directories(armnnNeonBackend PRIVATE ${PROJECT_SOURCE_DIR}/profiling/common/include)
-target_include_directories(armnnNeonBackend PRIVATE ${PROJECT_SOURCE_DIR}/profiling/client/include)
diff --git a/src/backends/neon/NeonBackend.cpp b/src/backends/neon/NeonBackend.cpp
index a5e9ab9..4f6383b 100644
--- a/src/backends/neon/NeonBackend.cpp
+++ b/src/backends/neon/NeonBackend.cpp
@@ -9,6 +9,7 @@
 #include "NeonWorkloadFactory.hpp"
 #include "NeonLayerSupport.hpp"
 #include "NeonTensorHandleFactory.hpp"
+#include "NeonBackendInternal.hpp"
 
 #include <armnn/BackendRegistry.hpp>
 #include <armnn/Descriptors.hpp>
@@ -563,3 +564,27 @@ std::unique_ptr<ICustomAllocator> NeonBackend::GetDefaultAllocator() const
 
 
 } // namespace armnn
+
+
+const char* GetBackendId()
+{
+    return armnn::NeonBackend::GetIdStatic().Get().c_str();
+}
+
+void GetVersion(uint32_t* outMajor, uint32_t* outMinor)
+{
+    if (!outMajor || !outMinor)
+    {
+        return;
+    }
+
+    armnn::BackendVersion apiVersion = armnn::IBackendInternal::GetApiVersion();
+
+    *outMajor = apiVersion.m_Major;
+    *outMinor = apiVersion.m_Minor;
+}
+
+void* BackendFactory()
+{
+    return new armnn::NeonBackend();
+}
diff --git a/src/backends/neon/NeonBackend.hpp b/src/backends/neon/NeonBackend.hpp
index ef5258b..a93ab7a 100644
--- a/src/backends/neon/NeonBackend.hpp
+++ b/src/backends/neon/NeonBackend.hpp
@@ -6,71 +6,11 @@
 
 #include <armnn/backends/IBackendInternal.hpp>
 
-#include <arm_compute/core/CPP/CPPTypes.h>
+#include <cstdint>
 
-namespace armnn
+extern "C"
 {
-
-// add new capabilities here..
-const BackendCapabilities cpuAccCapabilities("CpuAcc",
-                                             {
-                                                     {"NonConstWeights", true},
-                                                     {"AsyncExecution", false},
-                                                     {"ProtectedContentAllocation", false},
-                                                     {"ConstantTensorsAsInputs", true},
-                                                     {"PreImportIOTensors", false},
-                                                     {"ExternallyManagedMemory", true},
-                                                     {"MultiAxisPacking", false},
-                                                     {"SingleAxisPacking", true},
-                                                     {"HasFp16", arm_compute::CPUInfo::get().has_fp16()}
-                                             });
-
-
-class NeonBackend : public IBackendInternal
-{
-public:
-    NeonBackend()  = default;
-    ~NeonBackend() = default;
-
-    static const BackendId& GetIdStatic();
-    const BackendId& GetId() const override { return GetIdStatic(); }
-
-    IBackendInternal::IMemoryManagerUniquePtr CreateMemoryManager() const override;
-
-    IWorkloadFactoryPtr CreateWorkloadFactory(
-        const IBackendInternal::IMemoryManagerSharedPtr& memoryManager = nullptr) const override;
-
-    IWorkloadFactoryPtr CreateWorkloadFactory(
-        class TensorHandleFactoryRegistry& tensorHandleFactoryRegistry) const override;
-
-    IWorkloadFactoryPtr CreateWorkloadFactory( const IMemoryManagerSharedPtr& memoryManager,
-                                               const ModelOptions& modelOptions) const override;
-
-    IWorkloadFactoryPtr CreateWorkloadFactory(class TensorHandleFactoryRegistry& tensorHandleFactoryRegistry,
-                                              const ModelOptions& modelOptions) const override;
-
-    IBackendInternal::IBackendContextPtr CreateBackendContext(const IRuntime::CreationOptions&) const override;
-    IBackendInternal::IBackendProfilingContextPtr CreateBackendProfilingContext(
-        const IRuntime::CreationOptions&, IBackendProfilingPtr& backendProfiling) override;
-    IBackendInternal::ILayerSupportSharedPtr GetLayerSupport() const override;
-    IBackendInternal::ILayerSupportSharedPtr GetLayerSupport(const ModelOptions& modelOptions) const override;
-
-    OptimizationViews OptimizeSubgraphView(const SubgraphView& subgraph,
-                                           const ModelOptions& modelOptions) const override;
-
-    std::vector<ITensorHandleFactory::FactoryId> GetHandleFactoryPreferences() const override;
-
-    void RegisterTensorHandleFactories(class TensorHandleFactoryRegistry& registry) override;
-
-    IBackendInternal::IBackendSpecificModelContextPtr CreateBackendSpecificModelContext(
-        const ModelOptions& modelOptions) const override;
-
-    BackendCapabilities GetCapabilities() const override
-    {
-        return cpuAccCapabilities;
-    };
-
-    std::unique_ptr<ICustomAllocator> GetDefaultAllocator() const override;
-};
-
-} // namespace armnn
+const char* GetBackendId();
+void GetVersion(uint32_t* outMajor, uint32_t* outMinor);
+void* BackendFactory();
+}
diff --git a/src/backends/neon/NeonBackendInternal.hpp b/src/backends/neon/NeonBackendInternal.hpp
new file mode 100644
index 0000000..ad4ac8d
--- /dev/null
+++ b/src/backends/neon/NeonBackendInternal.hpp
@@ -0,0 +1,42 @@
+//
+// Copyright © 2017 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+#pragma once
+
+#include <armnn/backends/IBackendInternal.hpp>
+
+namespace armnn
+{
+
+class NeonBackend : public IBackendInternal
+{
+public:
+    NeonBackend()  = default;
+    ~NeonBackend() = default;
+
+    static const BackendId& GetIdStatic();
+    const BackendId& GetId() const override { return GetIdStatic(); }
+
+    IBackendInternal::IMemoryManagerUniquePtr CreateMemoryManager() const override;
+
+    IWorkloadFactoryPtr CreateWorkloadFactory(
+        const IBackendInternal::IMemoryManagerSharedPtr& memoryManager = nullptr) const override;
+
+    IWorkloadFactoryPtr CreateWorkloadFactory(
+        class TensorHandleFactoryRegistry& tensorHandleFactoryRegistry) const override;
+
+    IBackendInternal::IBackendContextPtr CreateBackendContext(const IRuntime::CreationOptions&) const override;
+    IBackendInternal::IBackendProfilingContextPtr CreateBackendProfilingContext(
+        const IRuntime::CreationOptions&, IBackendProfilingPtr& backendProfiling) override;
+    IBackendInternal::Optimizations GetOptimizations() const override;
+    IBackendInternal::ILayerSupportSharedPtr GetLayerSupport() const override;
+
+    OptimizationViews OptimizeSubgraphView(const SubgraphView& subgraph) const override;
+
+    std::vector<ITensorHandleFactory::FactoryId> GetHandleFactoryPreferences() const override;
+
+    void RegisterTensorHandleFactories(class TensorHandleFactoryRegistry& registry) override;
+};
+
+} // namespace armnn
diff --git a/src/backends/neon/backend.cmake b/src/backends/neon/backend.cmake
index 801ba7c..3819616 100644
--- a/src/backends/neon/backend.cmake
+++ b/src/backends/neon/backend.cmake
@@ -4,11 +4,11 @@
 #
 
 add_subdirectory(${PROJECT_SOURCE_DIR}/src/backends/neon)
-list(APPEND armnnLibraries armnnNeonBackend)
+#list(APPEND armnnLibraries armnnNeonBackend)
 
 if(ARMCOMPUTENEON)
-    list(APPEND armnnLibraries armnnNeonBackendWorkloads)
-    list(APPEND armnnUnitTestLibraries armnnNeonBackendUnitTests)
+#    list(APPEND armnnLibraries armnnNeonBackendWorkloads)
+#    list(APPEND armnnUnitTestLibraries armnnNeonBackendUnitTests)
 else()
     message(STATUS "NEON backend is disabled")
 endif()
diff --git a/src/backends/reference/CMakeLists.txt b/src/backends/reference/CMakeLists.txt
index 688a2d7..241caf0 100644
--- a/src/backends/reference/CMakeLists.txt
+++ b/src/backends/reference/CMakeLists.txt
@@ -3,7 +3,7 @@
 # SPDX-License-Identifier: MIT
 #
 
-if(ARMNNREF)
+#if(ARMNNREF)
     list(APPEND armnnRefBackend_sources
         RefBackend.cpp
         RefBackend.hpp
@@ -14,31 +14,29 @@ if(ARMNNREF)
         RefLayerSupport.hpp
         RefMemoryManager.hpp
         RefMemoryManager.cpp
-        RefRegistryInitializer.cpp
+        #RefRegistryInitializer.cpp  # Prevent static registration
         RefWorkloadFactory.cpp
         RefWorkloadFactory.hpp
         RefTensorHandleFactory.cpp
         RefTensorHandleFactory.hpp
+        RefBackendInternal.hpp
     )
 
     add_subdirectory(workloads)
+#endif()
 
-    if(BUILD_UNIT_TESTS)
-        add_subdirectory(test)
-    endif()
+# add workload object to backend module instead of adding to armnn
+add_library(Arm_CpuRef_backend MODULE ${armnnRefBackend_sources}  $<TARGET_OBJECTS:armnnRefBackendWorkloads>)
+target_include_directories(Arm_CpuRef_backend PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn)
+target_include_directories(Arm_CpuRef_backend PRIVATE ${PROJECT_SOURCE_DIR}/src/armnnUtils)
+target_include_directories(Arm_CpuRef_backend PRIVATE ${PROJECT_SOURCE_DIR}/src/backends)
+target_include_directories(Arm_CpuRef_backend PRIVATE ${PROJECT_SOURCE_DIR}/src/profiling)
+target_include_directories(Arm_CpuRef_backend PRIVATE ${PROJECT_SOURCE_DIR}/profiling/common/include)
+target_include_directories(Arm_CpuRef_backend PRIVATE ${PROJECT_SOURCE_DIR}/profiling/client/include)
+set_target_properties(Arm_CpuRef_backend PROPERTIES PREFIX "")
 
-else()
-    list(APPEND armnnRefBackend_sources
-        RefBackendId.hpp
-        RefLayerSupport.cpp
-        RefLayerSupport.hpp
-    )
-endif()
+target_link_libraries(Arm_CpuRef_backend armnn)
 
-add_library(armnnRefBackend OBJECT ${armnnRefBackend_sources})
-target_include_directories(armnnRefBackend PRIVATE ${PROJECT_SOURCE_DIR}/src/armnn)
-target_include_directories(armnnRefBackend PRIVATE ${PROJECT_SOURCE_DIR}/src/armnnUtils)
-target_include_directories(armnnRefBackend PRIVATE ${PROJECT_SOURCE_DIR}/src/backends)
-target_include_directories(armnnRefBackend PRIVATE ${PROJECT_SOURCE_DIR}/src/profiling)
-target_include_directories(armnnRefBackend PRIVATE ${PROJECT_SOURCE_DIR}/profiling/common/include)
-target_include_directories(armnnRefBackend PRIVATE ${PROJECT_SOURCE_DIR}/profiling/client/include)
+set(armnnMajor "armnn${ARMNN_MAJOR_VERSION}")
+install(TARGETS Arm_CpuRef_backend
+        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/${armnnMajor})
diff --git a/src/backends/reference/RefBackend.cpp b/src/backends/reference/RefBackend.cpp
index fe11fd2..ac3877d 100644
--- a/src/backends/reference/RefBackend.cpp
+++ b/src/backends/reference/RefBackend.cpp
@@ -8,6 +8,7 @@
 #include "RefWorkloadFactory.hpp"
 #include "RefLayerSupport.hpp"
 #include "RefTensorHandleFactory.hpp"
+#include "RefBackendInternal.hpp"
 
 #include <armnn/BackendRegistry.hpp>
 #include <armnn/backends/IBackendContext.hpp>
@@ -172,3 +173,27 @@ void RefBackend::UpdateExecutionData(ExecutionData& executionData, WorkingMemDes
 }
 
 } // namespace armnn
+
+
+const char* GetBackendId()
+{
+    return armnn::RefBackend::GetIdStatic().Get().c_str();
+}
+
+void GetVersion(uint32_t* outMajor, uint32_t* outMinor)
+{
+    if (!outMajor || !outMinor)
+    {
+        return;
+    }
+
+    armnn::BackendVersion apiVersion = armnn::IBackendInternal::GetApiVersion();
+
+    *outMajor = apiVersion.m_Major;
+    *outMinor = apiVersion.m_Minor;
+}
+
+void* BackendFactory()
+{
+    return new armnn::RefBackend();
+}
\ No newline at end of file
diff --git a/src/backends/reference/RefBackend.hpp b/src/backends/reference/RefBackend.hpp
index 7d355ea..38e54a5 100644
--- a/src/backends/reference/RefBackend.hpp
+++ b/src/backends/reference/RefBackend.hpp
@@ -6,68 +6,12 @@
 
 #include <armnn/backends/IBackendInternal.hpp>
 
-namespace armnn
-{
-// add new capabilities here..
-const BackendCapabilities cpuRefCapabilities("CpuRef",
-                                             {
-                                                    {"NonConstWeights", true},
-                                                    {"AsyncExecution", true},
-                                                    {"ProtectedContentAllocation", false},
-                                                    {"ConstantTensorsAsInputs", true},
-                                                    {"PreImportIOTensors", true},
-                                                    {"ExternallyManagedMemory", true},
-                                                    {"MultiAxisPacking", false},
-                                                    {"SingleAxisPacking", true},
-                                                    {"HasFp16", true}
-                                             });
-
-const std::set<armnn::BackendCapability> oldCpuRefCapabilities {
-        armnn::BackendCapability::NonConstWeights,
-};
-
+#include <cstdint>
 
-class RefBackend : public IBackendInternal
+extern "C"
 {
-public:
-    RefBackend()  = default;
-    ~RefBackend() = default;
-
-    static const BackendId& GetIdStatic();
-    const BackendId& GetId() const override { return GetIdStatic(); }
-
-    IBackendInternal::IMemoryManagerUniquePtr CreateMemoryManager() const override;
-
-    IBackendInternal::IWorkloadFactoryPtr CreateWorkloadFactory(
-        const IBackendInternal::IMemoryManagerSharedPtr& memoryManager = nullptr) const override;
-
-    IBackendInternal::IWorkloadFactoryPtr CreateWorkloadFactory(
-        class TensorHandleFactoryRegistry& tensorHandleFactoryRegistry) const override;
-
-    IBackendInternal::IBackendContextPtr CreateBackendContext(const IRuntime::CreationOptions&) const override;
-
-    IBackendInternal::IBackendProfilingContextPtr CreateBackendProfilingContext(
-        const IRuntime::CreationOptions& creationOptions, IBackendProfilingPtr& backendProfiling) override;
-
-    IBackendInternal::ILayerSupportSharedPtr GetLayerSupport() const override;
-
-    OptimizationViews OptimizeSubgraphView(const SubgraphView& subgraph,
-                                           const ModelOptions& modelOptions) const override;
-
-    std::vector<ITensorHandleFactory::FactoryId> GetHandleFactoryPreferences() const override;
-
-    void RegisterTensorHandleFactories(class TensorHandleFactoryRegistry& registry) override;
-
-    BackendCapabilities GetCapabilities() const override
-    {
-        return cpuRefCapabilities;
-    };
-
-    std::unique_ptr<ICustomAllocator> GetDefaultAllocator() const override;
-
-    ExecutionData CreateExecutionData(WorkingMemDescriptor& workingMemDescriptor) const override;
-
-    void UpdateExecutionData(ExecutionData& executionData, WorkingMemDescriptor& workingMemDescriptor) const override;
-};
+const char* GetBackendId();
+void GetVersion(uint32_t* outMajor, uint32_t* outMinor);
+void* BackendFactory();
+}
 
-} // namespace armnn
diff --git a/src/backends/reference/RefBackendInternal.hpp b/src/backends/reference/RefBackendInternal.hpp
new file mode 100644
index 0000000..1467a4b
--- /dev/null
+++ b/src/backends/reference/RefBackendInternal.hpp
@@ -0,0 +1,46 @@
+//
+// Copyright © 2017 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+#pragma once
+
+#include <armnn/backends/IBackendInternal.hpp>
+
+namespace armnn
+{
+
+class RefBackend : public IBackendInternal {
+public:
+    RefBackend() = default;
+
+    ~RefBackend() = default;
+
+    static const BackendId &GetIdStatic();
+
+    const BackendId &GetId() const override { return GetIdStatic(); }
+
+    IBackendInternal::IMemoryManagerUniquePtr CreateMemoryManager() const override;
+
+    IBackendInternal::IWorkloadFactoryPtr CreateWorkloadFactory(
+            const IBackendInternal::IMemoryManagerSharedPtr &memoryManager = nullptr) const override;
+
+    IBackendInternal::IWorkloadFactoryPtr CreateWorkloadFactory(
+            class TensorHandleFactoryRegistry &tensorHandleFactoryRegistry) const override;
+
+    IBackendInternal::IBackendContextPtr CreateBackendContext(const IRuntime::CreationOptions &) const override;
+
+    IBackendInternal::IBackendProfilingContextPtr CreateBackendProfilingContext(
+            const IRuntime::CreationOptions &creationOptions, IBackendProfilingPtr &backendProfiling) override;
+
+    IBackendInternal::Optimizations GetOptimizations() const override;
+
+    IBackendInternal::ILayerSupportSharedPtr GetLayerSupport() const override;
+
+    OptimizationViews OptimizeSubgraphView(const SubgraphView &subgraph) const override;
+
+    std::vector <ITensorHandleFactory::FactoryId> GetHandleFactoryPreferences() const override;
+
+    void RegisterTensorHandleFactories(class TensorHandleFactoryRegistry &registry) override;
+};
+
+}
\ No newline at end of file
diff --git a/src/backends/reference/RefRegistryInitializer.cpp b/src/backends/reference/RefRegistryInitializer.cpp
index a06bd8d..1e2753c 100644
--- a/src/backends/reference/RefRegistryInitializer.cpp
+++ b/src/backends/reference/RefRegistryInitializer.cpp
@@ -3,7 +3,7 @@
 // SPDX-License-Identifier: MIT
 //
 
-#include "RefBackend.hpp"
+#include "RefBackendInternal.hpp"
 
 #include <armnn/BackendRegistry.hpp>
 
diff --git a/src/backends/reference/backend.cmake b/src/backends/reference/backend.cmake
index e8654d8..eb83317 100644
--- a/src/backends/reference/backend.cmake
+++ b/src/backends/reference/backend.cmake
@@ -4,7 +4,7 @@
 #
 
 add_subdirectory(${PROJECT_SOURCE_DIR}/src/backends/reference)
-list(APPEND armnnLibraries armnnRefBackend)
+#list(APPEND armnnLibraries armnnRefBackend)
 
 if(ARMNNREF)
     list(APPEND armnnLibraries armnnRefBackendWorkloads)
