blob: d8e08d5556e2e8662def38105ad3edee5e4ff3f1 [file] [log] [blame]
Laurent Carlier749294b2020-06-01 09:03:17 +01001//
Cian McGriskin7894ef92023-08-01 14:04:09 +01002// Copyright © 2017-2023 Arm Ltd and Contributors. All rights reserved.
David Beckecb56cd2018-09-05 12:52:57 +01003// SPDX-License-Identifier: MIT
telsoa014fcda012018-03-09 14:13:49 +00004//
5#pragma once
6
David Beck0dbe0ee2018-09-24 15:59:27 +01007#include <armnn/IRuntime.hpp>
David Beck29c75de2018-10-23 13:35:58 +01008#include <armnn/Optional.hpp>
telsoa01c577f2c2018-08-31 09:22:23 +01009
Sadik Armagan04a72972020-09-14 15:44:18 +010010#include <armnn/backends/IBackendInternal.hpp>
11
Derek Lambertie3803ea2019-11-13 10:36:08 +000012#include <backendsCommon/WorkloadFactoryBase.hpp>
Aron Virginas-Tar60578952018-10-31 11:04:01 +000013#include <aclCommon/BaseMemoryManager.hpp>
Aron Virginas-Tarf9aeef02018-10-12 15:18:03 +010014
Sadik Armagandea8fb62020-11-26 10:38:11 +000015#include <arm_compute/core/CL/CLCompileContext.h>
16
telsoa014fcda012018-03-09 14:13:49 +000017namespace armnn
18{
19
telsoa01c577f2c2018-08-31 09:22:23 +010020// ARM Compute OpenCL workload factory.
Derek Lambertie3803ea2019-11-13 10:36:08 +000021class ClWorkloadFactory : public WorkloadFactoryBase
telsoa014fcda012018-03-09 14:13:49 +000022{
23public:
Aron Virginas-Tar56055192018-11-12 18:10:43 +000024 ClWorkloadFactory(const std::shared_ptr<ClMemoryManager>& memoryManager);
telsoa014fcda012018-03-09 14:13:49 +000025
Sadik Armagan04a72972020-09-14 15:44:18 +010026 ClWorkloadFactory(const std::shared_ptr<ClMemoryManager>& memoryManager,
27 const IBackendInternal::IBackendSpecificModelContextPtr& modelContextPtr);
28
Sadik Armagandea8fb62020-11-26 10:38:11 +000029 void AfterWorkloadsCreated() override;
30
David Beck79141b92018-10-23 16:09:36 +010031 const BackendId& GetBackendId() const override;
telsoa014fcda012018-03-09 14:13:49 +000032
David Beck29c75de2018-10-23 13:35:58 +010033 static bool IsLayerSupported(const Layer& layer,
34 Optional<DataType> dataType,
telsoa01c577f2c2018-08-31 09:22:23 +010035 std::string& outReasonIfUnsupported);
telsoa014fcda012018-03-09 14:13:49 +000036
Sadik Armagan04a72972020-09-14 15:44:18 +010037 static bool IsLayerSupported(const IConnectableLayer& layer,
38 Optional<DataType> dataType,
39 std::string& outReasonIfUnsupported,
40 const ModelOptions& modelOptions);
41
Matteo Martincigh3d6898c2019-01-15 16:11:44 +000042 bool SupportsSubTensors() const override { return true; }
telsoa014fcda012018-03-09 14:13:49 +000043
Sadik Armaganc83eb252020-07-22 16:32:06 +010044 ARMNN_DEPRECATED_MSG("Use ITensorHandleFactory::CreateSubTensorHandle instead")
Matteo Martincigh3d6898c2019-01-15 16:11:44 +000045 std::unique_ptr<ITensorHandle> CreateSubTensorHandle(ITensorHandle& parent,
46 TensorShape const& subTensorShape,
47 unsigned int const* subTensorOrigin) const override;
telsoa014fcda012018-03-09 14:13:49 +000048
Sadik Armaganc83eb252020-07-22 16:32:06 +010049 ARMNN_DEPRECATED_MSG("Use ITensorHandleFactory::CreateTensorHandle instead")
David Monahan3fb7e102019-08-20 11:25:29 +010050 std::unique_ptr<ITensorHandle> CreateTensorHandle(const TensorInfo& tensorInfo,
51 const bool IsMemoryManaged = true) const override;
telsoa014fcda012018-03-09 14:13:49 +000052
Sadik Armaganc83eb252020-07-22 16:32:06 +010053 ARMNN_DEPRECATED_MSG("Use ITensorHandleFactory::CreateTensorHandle instead")
Matteo Martincigh3d6898c2019-01-15 16:11:44 +000054 std::unique_ptr<ITensorHandle> CreateTensorHandle(const TensorInfo& tensorInfo,
David Monahan3fb7e102019-08-20 11:25:29 +010055 DataLayout dataLayout,
56 const bool IsMemoryManaged = true) const override;
Teresa Charlin611c7fb2022-01-07 09:47:29 +000057 std::unique_ptr<IWorkload> CreateWorkload(LayerType type,
58 const QueueDescriptor& descriptor,
59 const WorkloadInfo& info) const override;
60
surmeh01bceff2f2018-03-29 16:29:27 +010061private:
Aron Virginas-Tara8e06ed2018-10-19 16:46:15 +010062 template<typename FloatWorkload, typename Uint8Workload, typename QueueDescriptorType, typename... Args>
63 static std::unique_ptr<IWorkload> MakeWorkload(const QueueDescriptorType& descriptor,
64 const WorkloadInfo& info,
65 Args&&... args);
66
67 template <typename Workload, typename QueueDescriptorType, typename... Args>
68 static std::unique_ptr<IWorkload> MakeWorkload(const QueueDescriptorType& descriptor,
69 const WorkloadInfo& info,
70 Args&&... args);
71
Sadik Armagandea8fb62020-11-26 10:38:11 +000072 void InitializeCLCompileContext();
73
Aron Virginas-Tar56055192018-11-12 18:10:43 +000074 mutable std::shared_ptr<ClMemoryManager> m_MemoryManager;
Sadik Armagan04a72972020-09-14 15:44:18 +010075 const IBackendInternal::IBackendSpecificModelContextPtr m_ModelContextPtr;
Sadik Armagandea8fb62020-11-26 10:38:11 +000076 arm_compute::CLCompileContext m_CLCompileContext;
telsoa014fcda012018-03-09 14:13:49 +000077};
78
79} // namespace armnn