From d87773918ca3b992f598895cb952e9aeb88c5219 Mon Sep 17 00:00:00 2001 From: Matthew Bentham Date: Mon, 8 Oct 2018 09:38:55 +0100 Subject: IVGCVSW-1951 Remove type templating from ClDepthwiseConvolutionWorkload Change-Id: I8bc11c93759605e21cc52f44d032c32a0be63658 --- src/backends/cl/ClLayerSupport.cpp | 2 +- src/backends/cl/ClWorkloadFactory.cpp | 2 +- src/backends/cl/backend.mk | 4 +- src/backends/cl/workloads/CMakeLists.txt | 8 +- .../ClDepthwiseConvolutionBaseWorkload.cpp | 125 ------------------ .../ClDepthwiseConvolutionBaseWorkload.hpp | 39 ------ .../ClDepthwiseConvolutionFloatWorkload.cpp | 39 ------ .../ClDepthwiseConvolutionFloatWorkload.hpp | 26 ---- .../ClDepthwiseConvolutionUint8Workload.cpp | 40 ------ .../ClDepthwiseConvolutionUint8Workload.hpp | 23 ---- .../workloads/ClDepthwiseConvolutionWorkload.cpp | 139 +++++++++++++++++++++ .../workloads/ClDepthwiseConvolutionWorkload.hpp | 42 +++++++ src/backends/cl/workloads/ClWorkloads.hpp | 3 +- 13 files changed, 187 insertions(+), 305 deletions(-) delete mode 100644 src/backends/cl/workloads/ClDepthwiseConvolutionBaseWorkload.cpp delete mode 100644 src/backends/cl/workloads/ClDepthwiseConvolutionBaseWorkload.hpp delete mode 100644 src/backends/cl/workloads/ClDepthwiseConvolutionFloatWorkload.cpp delete mode 100644 src/backends/cl/workloads/ClDepthwiseConvolutionFloatWorkload.hpp delete mode 100644 src/backends/cl/workloads/ClDepthwiseConvolutionUint8Workload.cpp delete mode 100644 src/backends/cl/workloads/ClDepthwiseConvolutionUint8Workload.hpp create mode 100644 src/backends/cl/workloads/ClDepthwiseConvolutionWorkload.cpp create mode 100644 src/backends/cl/workloads/ClDepthwiseConvolutionWorkload.hpp diff --git a/src/backends/cl/ClLayerSupport.cpp b/src/backends/cl/ClLayerSupport.cpp index 09dfab9924..434b069092 100644 --- a/src/backends/cl/ClLayerSupport.cpp +++ b/src/backends/cl/ClLayerSupport.cpp @@ -20,7 +20,7 @@ #include "workloads/ClConvertFp16ToFp32Workload.hpp" #include "workloads/ClConvertFp32ToFp16Workload.hpp" #include "workloads/ClConvolution2dWorkload.hpp" -#include "workloads/ClDepthwiseConvolutionBaseWorkload.hpp" +#include "workloads/ClDepthwiseConvolutionWorkload.hpp" #include "workloads/ClDivisionFloatWorkload.hpp" #include "workloads/ClL2NormalizationFloatWorkload.hpp" #include "workloads/ClMultiplicationWorkload.hpp" diff --git a/src/backends/cl/ClWorkloadFactory.cpp b/src/backends/cl/ClWorkloadFactory.cpp index 2e074450dd..c00d0ba5f0 100644 --- a/src/backends/cl/ClWorkloadFactory.cpp +++ b/src/backends/cl/ClWorkloadFactory.cpp @@ -150,7 +150,7 @@ std::unique_ptr ClWorkloadFactory::CreateConvolution2d(const C std::unique_ptr ClWorkloadFactory::CreateDepthwiseConvolution2d( const DepthwiseConvolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const { - return MakeWorkload(descriptor, info); + return std::make_unique(descriptor, info); } std::unique_ptr ClWorkloadFactory::CreateNormalization(const NormalizationQueueDescriptor& descriptor, diff --git a/src/backends/cl/backend.mk b/src/backends/cl/backend.mk index c86940cda1..04b8b9e69c 100644 --- a/src/backends/cl/backend.mk +++ b/src/backends/cl/backend.mk @@ -22,9 +22,7 @@ BACKEND_SOURCES := \ workloads/ClConvertFp16ToFp32Workload.cpp \ workloads/ClConvertFp32ToFp16Workload.cpp \ workloads/ClConvolution2dWorkload.cpp \ - workloads/ClDepthwiseConvolutionBaseWorkload.cpp \ - workloads/ClDepthwiseConvolutionFloatWorkload.cpp \ - workloads/ClDepthwiseConvolutionUint8Workload.cpp \ + workloads/ClDepthwiseConvolutionWorkload.cpp \ workloads/ClDivisionFloatWorkload.cpp \ workloads/ClFloorFloatWorkload.cpp \ workloads/ClFullyConnectedWorkload.cpp \ diff --git a/src/backends/cl/workloads/CMakeLists.txt b/src/backends/cl/workloads/CMakeLists.txt index 5a1653e8e3..4d1c1bf5c3 100644 --- a/src/backends/cl/workloads/CMakeLists.txt +++ b/src/backends/cl/workloads/CMakeLists.txt @@ -25,12 +25,8 @@ list(APPEND armnnClBackendWorkloads_sources ClConvertFp32ToFp16Workload.hpp ClConvolution2dWorkload.cpp ClConvolution2dWorkload.hpp - ClDepthwiseConvolutionBaseWorkload.cpp - ClDepthwiseConvolutionBaseWorkload.hpp - ClDepthwiseConvolutionFloatWorkload.cpp - ClDepthwiseConvolutionFloatWorkload.hpp - ClDepthwiseConvolutionUint8Workload.cpp - ClDepthwiseConvolutionUint8Workload.hpp + ClDepthwiseConvolutionWorkload.cpp + ClDepthwiseConvolutionWorkload.hpp ClDivisionFloatWorkload.cpp ClDivisionFloatWorkload.hpp ClFloorFloatWorkload.cpp diff --git a/src/backends/cl/workloads/ClDepthwiseConvolutionBaseWorkload.cpp b/src/backends/cl/workloads/ClDepthwiseConvolutionBaseWorkload.cpp deleted file mode 100644 index 53ac3bae99..0000000000 --- a/src/backends/cl/workloads/ClDepthwiseConvolutionBaseWorkload.cpp +++ /dev/null @@ -1,125 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include "ClDepthwiseConvolutionBaseWorkload.hpp" - -#include "TypeUtils.hpp" - -#include -#include -#include -#include - -namespace armnn -{ - -using namespace armcomputetensorutils; - -arm_compute::Status ClDepthwiseConvolutionWorkloadValidate(const TensorInfo& input, - const TensorInfo& output, - const DepthwiseConvolution2dDescriptor& descriptor, - const TensorInfo& weights, - const Optional& biases) -{ - const arm_compute::TensorInfo aclInputInfo = BuildArmComputeTensorInfo(input, descriptor.m_DataLayout); - const arm_compute::TensorInfo aclOutputInfo = BuildArmComputeTensorInfo(output, descriptor.m_DataLayout); - const arm_compute::TensorInfo aclWeightsInfo = BuildArmComputeTensorInfo(weights, descriptor.m_DataLayout); - - arm_compute::TensorInfo aclBiasesInfo; - arm_compute::TensorInfo *optionalAclBiasesInfo = nullptr; - - if (descriptor.m_BiasEnabled) - { - BOOST_ASSERT(biases.has_value()); - - aclBiasesInfo = BuildArmComputeTensorInfo(biases.value(), descriptor.m_DataLayout); - optionalAclBiasesInfo = &aclBiasesInfo; - } - - const arm_compute::PadStrideInfo aclPadStrideInfo = BuildArmComputePadStrideInfo(descriptor); - const unsigned int aclDepthMultiplier = weights.GetShape()[0]; - - return arm_compute::CLDepthwiseConvolutionLayer::validate(&aclInputInfo, - &aclWeightsInfo, - optionalAclBiasesInfo, - &aclOutputInfo, - aclPadStrideInfo, - aclDepthMultiplier); -} - -template -ClDepthwiseConvolutionBaseWorkload::ClDepthwiseConvolutionBaseWorkload( - const DepthwiseConvolution2dQueueDescriptor& descriptor, - const WorkloadInfo& info) - : TypedWorkload(descriptor, info) -{ - auto& weightInfo = m_Data.m_Weight->GetTensorInfo(); - - m_KernelTensor = std::make_unique(); - BuildArmComputeTensor(*m_KernelTensor, weightInfo); - - if (m_Data.m_Parameters.m_BiasEnabled) - { - m_BiasTensor = std::make_unique(); - BuildArmComputeTensor(*m_BiasTensor, m_Data.m_Bias->GetTensorInfo()); - } - - arm_compute::PadStrideInfo padStrideInfo(m_Data.m_Parameters.m_StrideX, - m_Data.m_Parameters.m_StrideY, - m_Data.m_Parameters.m_PadLeft, - m_Data.m_Parameters.m_PadRight, - m_Data.m_Parameters.m_PadTop, - m_Data.m_Parameters.m_PadBottom, - arm_compute::DimensionRoundingType::FLOOR); - - std::string name = std::string("ClDepthwiseConvolution") + - GetDataTypeName(m_Data.m_Weight->GetTensorInfo().GetDataType()) + "Workload"; - m_Data.ValidateInputsOutputs(name, 1, 1); - - arm_compute::ICLTensor& input = static_cast(m_Data.m_Inputs[0])->GetTensor(); - arm_compute::ICLTensor& output = static_cast(m_Data.m_Outputs[0])->GetTensor(); - - const unsigned int depthMultiplier = weightInfo.GetShape()[0]; - - //Check for optimisation opportunities. - bool use3x3Optimisation = (weightInfo.GetShape()[3] == 3) && (weightInfo.GetShape()[2] == 3); - if (use3x3Optimisation) - { - m_DepthwiseConvolutionLayer = std::make_unique(); - static_cast(m_DepthwiseConvolutionLayer.get())->configure( - &input, - m_KernelTensor.get(), - m_BiasTensor.get(), - &output, - padStrideInfo, - depthMultiplier); - } - else - { - m_DepthwiseConvolutionLayer = std::make_unique(); - static_cast(m_DepthwiseConvolutionLayer.get())->configure( - &input, - m_KernelTensor.get(), - m_BiasTensor.get(), - &output, - padStrideInfo, - depthMultiplier); - } - - BOOST_ASSERT(m_DepthwiseConvolutionLayer); -} - -template -void ClDepthwiseConvolutionBaseWorkload::FreeUnusedTensors() -{ - FreeTensorIfUnused(m_KernelTensor); - FreeTensorIfUnused(m_BiasTensor); -} - -// Generate known implementations for linker -template class ClDepthwiseConvolutionBaseWorkload; -template class ClDepthwiseConvolutionBaseWorkload; - -} // namespace armnn diff --git a/src/backends/cl/workloads/ClDepthwiseConvolutionBaseWorkload.hpp b/src/backends/cl/workloads/ClDepthwiseConvolutionBaseWorkload.hpp deleted file mode 100644 index 27aec8ecdd..0000000000 --- a/src/backends/cl/workloads/ClDepthwiseConvolutionBaseWorkload.hpp +++ /dev/null @@ -1,39 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#pragma once - -#include - -#include - -namespace armnn -{ - -arm_compute::Status ClDepthwiseConvolutionWorkloadValidate(const TensorInfo& input, - const TensorInfo& output, - const DepthwiseConvolution2dDescriptor& descriptor, - const TensorInfo& weights, - const Optional& biases); - -template -class ClDepthwiseConvolutionBaseWorkload : public TypedWorkload -{ -public: - using TypedWorkload::m_Data; - - ClDepthwiseConvolutionBaseWorkload(const DepthwiseConvolution2dQueueDescriptor& descriptor, - const WorkloadInfo& info); - -protected: - std::unique_ptr m_DepthwiseConvolutionLayer; - - std::unique_ptr m_KernelTensor; - std::unique_ptr m_BiasTensor; - - void FreeUnusedTensors(); -}; - -} //namespace armnn diff --git a/src/backends/cl/workloads/ClDepthwiseConvolutionFloatWorkload.cpp b/src/backends/cl/workloads/ClDepthwiseConvolutionFloatWorkload.cpp deleted file mode 100644 index 17ecd29307..0000000000 --- a/src/backends/cl/workloads/ClDepthwiseConvolutionFloatWorkload.cpp +++ /dev/null @@ -1,39 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include "ClDepthwiseConvolutionFloatWorkload.hpp" - -#include - -#include "ClWorkloadUtils.hpp" - -namespace armnn -{ - -ClDepthwiseConvolutionFloatWorkload::ClDepthwiseConvolutionFloatWorkload( - const DepthwiseConvolution2dQueueDescriptor& descriptor, - const WorkloadInfo& info) - : ClDepthwiseConvolutionBaseWorkload(descriptor, info) -{ - InitializeArmComputeClTensorData(*m_KernelTensor, m_Data.m_Weight); - - if (m_BiasTensor) - { - InitializeArmComputeClTensorData(*m_BiasTensor, m_Data.m_Bias); - } - - m_DepthwiseConvolutionLayer->prepare(); - FreeUnusedTensors(); -} - -void ClDepthwiseConvolutionFloatWorkload::Execute() const -{ - ARMNN_SCOPED_PROFILING_EVENT_CL("ClDepthwiseConvolutionFloatWorkload_Execute"); - BOOST_ASSERT(m_DepthwiseConvolutionLayer); - - m_DepthwiseConvolutionLayer->run(); -} - -} //namespace armnn diff --git a/src/backends/cl/workloads/ClDepthwiseConvolutionFloatWorkload.hpp b/src/backends/cl/workloads/ClDepthwiseConvolutionFloatWorkload.hpp deleted file mode 100644 index 4f9d5f332e..0000000000 --- a/src/backends/cl/workloads/ClDepthwiseConvolutionFloatWorkload.hpp +++ /dev/null @@ -1,26 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#pragma once - -#include "ClDepthwiseConvolutionBaseWorkload.hpp" - -namespace armnn -{ - -class ClDepthwiseConvolutionFloatWorkload : public ClDepthwiseConvolutionBaseWorkload -{ -public: - ClDepthwiseConvolutionFloatWorkload(const DepthwiseConvolution2dQueueDescriptor& descriptor, - const WorkloadInfo& info); - void Execute() const override; -}; - -} //namespace armnn - - - - diff --git a/src/backends/cl/workloads/ClDepthwiseConvolutionUint8Workload.cpp b/src/backends/cl/workloads/ClDepthwiseConvolutionUint8Workload.cpp deleted file mode 100644 index 22922e4df6..0000000000 --- a/src/backends/cl/workloads/ClDepthwiseConvolutionUint8Workload.cpp +++ /dev/null @@ -1,40 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include "ClDepthwiseConvolutionUint8Workload.hpp" - -#include - -#include "ClWorkloadUtils.hpp" - -namespace armnn -{ - -ClDepthwiseConvolutionUint8Workload::ClDepthwiseConvolutionUint8Workload( - const DepthwiseConvolution2dQueueDescriptor& descriptor, - const WorkloadInfo& info) - : ClDepthwiseConvolutionBaseWorkload(descriptor, info) -{ - InitializeArmComputeClTensorData(*m_KernelTensor, m_Data.m_Weight); - - if (m_BiasTensor) - { - InitializeArmComputeClTensorData(*m_BiasTensor, m_Data.m_Bias); - } - - m_DepthwiseConvolutionLayer->prepare(); - FreeUnusedTensors(); -} - -void ClDepthwiseConvolutionUint8Workload::Execute() const -{ - ARMNN_SCOPED_PROFILING_EVENT_CL("ClDepthwiseConvolutionUint8Workload_Execute"); - BOOST_ASSERT(m_DepthwiseConvolutionLayer); - - m_DepthwiseConvolutionLayer->run(); -} - -} //namespace armnn - diff --git a/src/backends/cl/workloads/ClDepthwiseConvolutionUint8Workload.hpp b/src/backends/cl/workloads/ClDepthwiseConvolutionUint8Workload.hpp deleted file mode 100644 index b9f676de94..0000000000 --- a/src/backends/cl/workloads/ClDepthwiseConvolutionUint8Workload.hpp +++ /dev/null @@ -1,23 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#pragma once - -#include "ClDepthwiseConvolutionBaseWorkload.hpp" - -namespace armnn -{ - -class ClDepthwiseConvolutionUint8Workload : public ClDepthwiseConvolutionBaseWorkload -{ -public: - ClDepthwiseConvolutionUint8Workload(const DepthwiseConvolution2dQueueDescriptor& descriptor, - const WorkloadInfo& info); - void Execute() const override; -}; - -} //namespace armnn - - diff --git a/src/backends/cl/workloads/ClDepthwiseConvolutionWorkload.cpp b/src/backends/cl/workloads/ClDepthwiseConvolutionWorkload.cpp new file mode 100644 index 0000000000..142cbc230f --- /dev/null +++ b/src/backends/cl/workloads/ClDepthwiseConvolutionWorkload.cpp @@ -0,0 +1,139 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "ClDepthwiseConvolutionWorkload.hpp" + +#include "TypeUtils.hpp" +#include "ClWorkloadUtils.hpp" + +#include +#include +#include +#include + +#include + +namespace armnn +{ + +using namespace armcomputetensorutils; + +arm_compute::Status ClDepthwiseConvolutionWorkloadValidate(const TensorInfo& input, + const TensorInfo& output, + const DepthwiseConvolution2dDescriptor& descriptor, + const TensorInfo& weights, + const Optional& biases) +{ + const arm_compute::TensorInfo aclInputInfo = BuildArmComputeTensorInfo(input, descriptor.m_DataLayout); + const arm_compute::TensorInfo aclOutputInfo = BuildArmComputeTensorInfo(output, descriptor.m_DataLayout); + const arm_compute::TensorInfo aclWeightsInfo = BuildArmComputeTensorInfo(weights, descriptor.m_DataLayout); + + arm_compute::TensorInfo aclBiasesInfo; + arm_compute::TensorInfo *optionalAclBiasesInfo = nullptr; + + if (descriptor.m_BiasEnabled) + { + BOOST_ASSERT(biases.has_value()); + + aclBiasesInfo = BuildArmComputeTensorInfo(biases.value(), descriptor.m_DataLayout); + optionalAclBiasesInfo = &aclBiasesInfo; + } + + const arm_compute::PadStrideInfo aclPadStrideInfo = BuildArmComputePadStrideInfo(descriptor); + const unsigned int aclDepthMultiplier = weights.GetShape()[0]; + + return arm_compute::CLDepthwiseConvolutionLayer::validate(&aclInputInfo, + &aclWeightsInfo, + optionalAclBiasesInfo, + &aclOutputInfo, + aclPadStrideInfo, + aclDepthMultiplier); +} + +ClDepthwiseConvolutionWorkload::ClDepthwiseConvolutionWorkload( + const DepthwiseConvolution2dQueueDescriptor& descriptor, + const WorkloadInfo& info) + : BaseWorkload(descriptor, info) +{ + auto& weightInfo = m_Data.m_Weight->GetTensorInfo(); + + m_KernelTensor = std::make_unique(); + BuildArmComputeTensor(*m_KernelTensor, weightInfo); + + if (m_Data.m_Parameters.m_BiasEnabled) + { + m_BiasTensor = std::make_unique(); + BuildArmComputeTensor(*m_BiasTensor, m_Data.m_Bias->GetTensorInfo()); + } + + arm_compute::PadStrideInfo padStrideInfo(m_Data.m_Parameters.m_StrideX, + m_Data.m_Parameters.m_StrideY, + m_Data.m_Parameters.m_PadLeft, + m_Data.m_Parameters.m_PadRight, + m_Data.m_Parameters.m_PadTop, + m_Data.m_Parameters.m_PadBottom, + arm_compute::DimensionRoundingType::FLOOR); + + std::string name = std::string("ClDepthwiseConvolutionWorkload"); + m_Data.ValidateInputsOutputs(name, 1, 1); + + arm_compute::ICLTensor& input = static_cast(m_Data.m_Inputs[0])->GetTensor(); + arm_compute::ICLTensor& output = static_cast(m_Data.m_Outputs[0])->GetTensor(); + + const unsigned int depthMultiplier = weightInfo.GetShape()[0]; + + //Check for optimisation opportunities. + bool use3x3Optimisation = (weightInfo.GetShape()[3] == 3) && (weightInfo.GetShape()[2] == 3); + if (use3x3Optimisation) + { + m_DepthwiseConvolutionLayer = std::make_unique(); + static_cast(m_DepthwiseConvolutionLayer.get())->configure( + &input, + m_KernelTensor.get(), + m_BiasTensor.get(), + &output, + padStrideInfo, + depthMultiplier); + } + else + { + m_DepthwiseConvolutionLayer = std::make_unique(); + static_cast(m_DepthwiseConvolutionLayer.get())->configure( + &input, + m_KernelTensor.get(), + m_BiasTensor.get(), + &output, + padStrideInfo, + depthMultiplier); + } + + BOOST_ASSERT(m_DepthwiseConvolutionLayer); + + InitializeArmComputeClTensorData(*m_KernelTensor, m_Data.m_Weight); + + if (m_BiasTensor) + { + InitializeArmComputeClTensorData(*m_BiasTensor, m_Data.m_Bias); + } + + m_DepthwiseConvolutionLayer->prepare(); + FreeUnusedTensors(); +} + +void ClDepthwiseConvolutionWorkload::FreeUnusedTensors() +{ + FreeTensorIfUnused(m_KernelTensor); + FreeTensorIfUnused(m_BiasTensor); +} + +void ClDepthwiseConvolutionWorkload::Execute() const +{ + ARMNN_SCOPED_PROFILING_EVENT_CL("ClDepthwiseConvolutionWorkload_Execute"); + BOOST_ASSERT(m_DepthwiseConvolutionLayer); + + m_DepthwiseConvolutionLayer->run(); +} + +} // namespace armnn diff --git a/src/backends/cl/workloads/ClDepthwiseConvolutionWorkload.hpp b/src/backends/cl/workloads/ClDepthwiseConvolutionWorkload.hpp new file mode 100644 index 0000000000..cde9f50d38 --- /dev/null +++ b/src/backends/cl/workloads/ClDepthwiseConvolutionWorkload.hpp @@ -0,0 +1,42 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include + +#include +#include +#include + +namespace armnn +{ + +arm_compute::Status ClDepthwiseConvolutionWorkloadValidate(const TensorInfo& input, + const TensorInfo& output, + const DepthwiseConvolution2dDescriptor& descriptor, + const TensorInfo& weights, + const Optional& biases); + +class ClDepthwiseConvolutionWorkload : public BaseWorkload +{ +public: + using BaseWorkload::m_Data; + + ClDepthwiseConvolutionWorkload(const DepthwiseConvolution2dQueueDescriptor& descriptor, + const WorkloadInfo& info); + + void Execute() const override; + +protected: + std::unique_ptr m_DepthwiseConvolutionLayer; + + std::unique_ptr m_KernelTensor; + std::unique_ptr m_BiasTensor; + + void FreeUnusedTensors(); +}; + +} //namespace armnn diff --git a/src/backends/cl/workloads/ClWorkloads.hpp b/src/backends/cl/workloads/ClWorkloads.hpp index 0ef8fd34bf..6574d43659 100644 --- a/src/backends/cl/workloads/ClWorkloads.hpp +++ b/src/backends/cl/workloads/ClWorkloads.hpp @@ -13,8 +13,7 @@ #include "ClConstantFloatWorkload.hpp" #include "ClConstantUint8Workload.hpp" #include "ClConvolution2dWorkload.hpp" -#include "ClDepthwiseConvolutionFloatWorkload.hpp" -#include "ClDepthwiseConvolutionUint8Workload.hpp" +#include "ClDepthwiseConvolutionWorkload.hpp" #include "ClDivisionFloatWorkload.hpp" #include "ClFloorFloatWorkload.hpp" #include "ClFullyConnectedWorkload.hpp" -- cgit v1.2.1