// // Copyright © 2022-2024 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // #include #include "GpuFsaWorkloadFactory.hpp" #include "GpuFsaBackendId.hpp" #include "GpuFsaTensorHandle.hpp" #include "workloads/GpuFsaConstantWorkload.hpp" #include "workloads/GpuFsaPreCompiledWorkload.hpp" #include namespace armnn { namespace { static const BackendId s_Id{GpuFsaBackendId()}; } template std::unique_ptr GpuFsaWorkloadFactory::MakeWorkload(const QueueDescriptorType& /*descriptor*/, const WorkloadInfo& /*info*/) const { return nullptr; } template bool IsDataType(const WorkloadInfo& info) { auto checkType = [](const TensorInfo& tensorInfo) {return tensorInfo.GetDataType() == ArmnnType;}; auto it = std::find_if(std::begin(info.m_InputTensorInfos), std::end(info.m_InputTensorInfos), checkType); if (it != std::end(info.m_InputTensorInfos)) { return true; } it = std::find_if(std::begin(info.m_OutputTensorInfos), std::end(info.m_OutputTensorInfos), checkType); if (it != std::end(info.m_OutputTensorInfos)) { return true; } return false; } GpuFsaWorkloadFactory::GpuFsaWorkloadFactory(const std::shared_ptr& memoryManager) : m_MemoryManager(memoryManager) { InitializeCLCompileContext(); } GpuFsaWorkloadFactory::GpuFsaWorkloadFactory() : m_MemoryManager(new GpuFsaMemoryManager()) { InitializeCLCompileContext(); } const BackendId& GpuFsaWorkloadFactory::GetBackendId() const { return s_Id; } bool GpuFsaWorkloadFactory::IsLayerSupported(const Layer& layer, Optional dataType, std::string& outReasonIfUnsupported) { return IWorkloadFactory::IsLayerSupported(s_Id, layer, dataType, outReasonIfUnsupported); } std::unique_ptr GpuFsaWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo, const bool /*isMemoryManaged*/) const { std::unique_ptr tensorHandle = std::make_unique(tensorInfo); tensorHandle->SetMemoryGroup(m_MemoryManager->GetInterLayerMemoryGroup()); return tensorHandle; } std::unique_ptr GpuFsaWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo, DataLayout dataLayout, const bool /*isMemoryManaged*/) const { std::unique_ptr tensorHandle = std::make_unique(tensorInfo, dataLayout); tensorHandle->SetMemoryGroup(m_MemoryManager->GetInterLayerMemoryGroup()); return tensorHandle; } void GpuFsaWorkloadFactory::InitializeCLCompileContext() { // Initialize our m_CLCompileContext using default device and context auto context = arm_compute::CLKernelLibrary::get().context(); auto device = arm_compute::CLKernelLibrary::get().get_device(); m_CLCompileContext = arm_compute::CLCompileContext(context, device); } std::unique_ptr GpuFsaWorkloadFactory::CreateWorkload(LayerType type, const QueueDescriptor& descriptor, const WorkloadInfo& info) const { switch(type) { case LayerType::Constant : { auto constQueueDescriptor = PolymorphicDowncast(&descriptor); return std::make_unique(*constQueueDescriptor, info, m_CLCompileContext); } case LayerType::Input : { auto inputQueueDescriptor = PolymorphicDowncast(&descriptor); return std::make_unique(*inputQueueDescriptor, info); } case LayerType::Output : { auto outputQueueDescriptor = PolymorphicDowncast(&descriptor); return std::make_unique(*outputQueueDescriptor, info); } case LayerType::MemCopy : { auto memCopyQueueDescriptor = PolymorphicDowncast(&descriptor); if (memCopyQueueDescriptor->m_Inputs.empty() || !memCopyQueueDescriptor->m_Inputs[0]) { throw InvalidArgumentException("GpuFsaWorkloadFactory: Invalid null input for MemCopy workload"); } return std::make_unique(*memCopyQueueDescriptor, info); } case LayerType::PreCompiled : { auto precompiledQueueDescriptor = PolymorphicDowncast(&descriptor); return std::make_unique(*precompiledQueueDescriptor, info); } default : return nullptr; } } } // namespace armnn