blob: ea23091ad3df02f45bbba175140f6ed1c7e70cf2 [file] [log] [blame]
David Beck32cbb0c2018-10-09 15:46:08 +01001//
Colm Donelana98e79a2022-12-06 21:32:29 +00002// Copyright © 2017,2022 Arm Ltd and Contributors. All rights reserved.
David Beck32cbb0c2018-10-09 15:46:08 +01003// SPDX-License-Identifier: MIT
4//
5#pragma once
6
David Beck111b5d92018-11-12 14:59:37 +00007#include <armnn/BackendId.hpp>
Finn Williams45a73622020-05-15 18:41:05 +01008#include <armnn/Optional.hpp>
David Beck111b5d92018-11-12 14:59:37 +00009#include <memory>
10#include <unordered_map>
jimfly0107bb5212018-11-14 14:52:40 +000011#include <functional>
Colm Donelana98e79a2022-12-06 21:32:29 +000012#include <stddef.h>
13#include <string>
David Beck32cbb0c2018-10-09 15:46:08 +010014
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000015namespace arm
16{
17namespace pipe
18{
19
Jim Flynnaf947722022-03-02 11:04:47 +000020class IProfilingService;
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000021
22} // namespace arm
23} // namespace pipe
24
David Beck32cbb0c2018-10-09 15:46:08 +010025namespace armnn
26{
David Beck111b5d92018-11-12 14:59:37 +000027
David Beck1b61be52018-11-08 09:19:14 +000028class IBackendInternal;
Colm Donelana98e79a2022-12-06 21:32:29 +000029class ICustomAllocator;
30class IMemoryOptimizerStrategy;
31
David Beck1b61be52018-11-08 09:19:14 +000032using 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