blob: 40a117ea48b825f4eb9fd3b898f2030396a1591e [file] [log] [blame]
David Beck32cbb0c2018-10-09 15:46:08 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5#pragma once
6
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00007#include <armnn/Types.hpp>
David Beck111b5d92018-11-12 14:59:37 +00008#include <armnn/BackendId.hpp>
Finn Williams45a73622020-05-15 18:41:05 +01009#include <armnn/Optional.hpp>
Jan Eilersc1c872f2021-07-22 13:17:04 +010010#include <armnn/backends/ICustomAllocator.hpp>
Sadik Armaganb8a26d82021-10-04 15:13:11 +010011#include <armnn/backends/IMemoryOptimizerStrategy.hpp>
David Beck111b5d92018-11-12 14:59:37 +000012
Sadik Armaganb8a26d82021-10-04 15:13:11 +010013#include <algorithm>
David Beck111b5d92018-11-12 14:59:37 +000014#include <memory>
15#include <unordered_map>
jimfly0107bb5212018-11-14 14:52:40 +000016#include <functional>
David Beck32cbb0c2018-10-09 15:46:08 +010017
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000018namespace arm
19{
20namespace pipe
21{
22
Jim Flynnaf947722022-03-02 11:04:47 +000023class IProfilingService;
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000024
25} // namespace arm
26} // namespace pipe
27
David Beck32cbb0c2018-10-09 15:46:08 +010028namespace armnn
29{
David Beck111b5d92018-11-12 14:59:37 +000030
David Beck1b61be52018-11-08 09:19:14 +000031class IBackendInternal;
32using IBackendInternalUniquePtr = std::unique_ptr<IBackendInternal>;
Sadik Armaganb8a26d82021-10-04 15:13:11 +010033using MemoryOptimizerStrategiesMapRef = std::unordered_map<BackendId, std::shared_ptr<IMemoryOptimizerStrategy>>;
David Beck111b5d92018-11-12 14:59:37 +000034
35class BackendRegistry
36{
37public:
38 using PointerType = IBackendInternalUniquePtr;
39 using FactoryFunction = std::function<PointerType()>;
40
41 void Register(const BackendId& id, FactoryFunction factory);
42 bool IsBackendRegistered(const BackendId& id) const;
43 FactoryFunction GetFactory(const BackendId& id) const;
44 size_t Size() const;
45 BackendIdSet GetBackendIds() const;
46 std::string GetBackendIdsAsString() const;
Jim Flynnaf947722022-03-02 11:04:47 +000047 void SetProfilingService(armnn::Optional<arm::pipe::IProfilingService&> profilingService);
Jan Eilersc1c872f2021-07-22 13:17:04 +010048 void RegisterAllocator(const BackendId& id, std::shared_ptr<ICustomAllocator> alloc);
49 std::unordered_map<BackendId, std::shared_ptr<ICustomAllocator>> GetAllocators();
Sadik Armaganb8a26d82021-10-04 15:13:11 +010050 void RegisterMemoryOptimizerStrategy(const BackendId& id, std::shared_ptr<IMemoryOptimizerStrategy> strategy);
51 MemoryOptimizerStrategiesMapRef GetMemoryOptimizerStrategies();
David Beck111b5d92018-11-12 14:59:37 +000052
53 BackendRegistry() {}
54 virtual ~BackendRegistry() {}
55
56 struct StaticRegistryInitializer
57 {
58 StaticRegistryInitializer(BackendRegistry& instance,
59 const BackendId& id,
60 FactoryFunction factory)
61 {
62 instance.Register(id, factory);
63 }
64 };
65
Narumol Prangnawarat60a20fb2019-12-09 17:24:41 +000066 void Deregister(const BackendId& id);
Jan Eilersc1c872f2021-07-22 13:17:04 +010067 void DeregisterAllocator(const BackendId &id);
Sadik Armaganb8a26d82021-10-04 15:13:11 +010068 void DeregisterMemoryOptimizerStrategy(const BackendId &id);
Narumol Prangnawarat60a20fb2019-12-09 17:24:41 +000069
David Beck111b5d92018-11-12 14:59:37 +000070protected:
71 using FactoryStorage = std::unordered_map<BackendId, FactoryFunction>;
72
Ryan OShea2bbfaa72020-02-12 16:15:27 +000073 /// For testing only
David Beck111b5d92018-11-12 14:59:37 +000074 static void Swap(BackendRegistry& instance, FactoryStorage& other);
75
76private:
77 BackendRegistry(const BackendRegistry&) = delete;
78 BackendRegistry& operator=(const BackendRegistry&) = delete;
79
80 FactoryStorage m_Factories;
Jim Flynnaf947722022-03-02 11:04:47 +000081 armnn::Optional<arm::pipe::IProfilingService&> m_ProfilingService;
Jan Eilersc1c872f2021-07-22 13:17:04 +010082 std::unordered_map<BackendId, std::shared_ptr<ICustomAllocator>> m_CustomMemoryAllocatorMap;
Sadik Armaganb8a26d82021-10-04 15:13:11 +010083 std::unordered_map<BackendId, std::shared_ptr<IMemoryOptimizerStrategy>> m_MemoryOptimizerStrategyMap;
David Beck111b5d92018-11-12 14:59:37 +000084};
David Beck32cbb0c2018-10-09 15:46:08 +010085
David Beck3e9e1152018-10-17 14:17:50 +010086BackendRegistry& BackendRegistryInstance();
87
jimfly0107bb5212018-11-14 14:52:40 +000088} // namespace armnn