diff options
Diffstat (limited to 'src/backends')
5 files changed, 95 insertions, 10 deletions
diff --git a/src/backends/cl/workloads/ClConvolution2dWorkload.cpp b/src/backends/cl/workloads/ClConvolution2dWorkload.cpp index 5c731aa0a1..b3df7ce0b1 100644 --- a/src/backends/cl/workloads/ClConvolution2dWorkload.cpp +++ b/src/backends/cl/workloads/ClConvolution2dWorkload.cpp @@ -120,6 +120,23 @@ ClConvolution2dWorkload::ClConvolution2dWorkload(const Convolution2dQueueDescrip aclDilationInfo, isFastMathEnabled); + // Add details for profiling output + std::string workloadName = "ClConvolution2dWorkload_Execute_Guid" + std::to_string(this->GetGuid()); + + WorkloadInfo detailsInfo; + + detailsInfo.m_InputTensorInfos = info.m_InputTensorInfos; + detailsInfo.m_OutputTensorInfos = info.m_OutputTensorInfos; + detailsInfo.m_WeightsTensorInfo = armnn::Optional<armnn::TensorInfo>(descriptor.m_Weight->GetTensorInfo()); + detailsInfo.m_ConvolutionMethod = armnn::Optional<std::string>(GetConvolutionMethodString()); + if (descriptor.m_Parameters.m_BiasEnabled) + { + detailsInfo.m_BiasTensorInfo = armnn::Optional<armnn::TensorInfo>(descriptor.m_Bias->GetTensorInfo()); + } + + // Report Profiling Details + ARMNN_REPORT_PROFILING_WORKLOAD_DESC(workloadName, descriptor.m_Parameters, detailsInfo); + InitializeArmComputeClTensorData(*m_KernelTensor, m_Data.m_Weight); if (m_BiasTensor) @@ -144,6 +161,23 @@ arm_compute::ConvolutionMethod ClConvolution2dWorkload::GetConvolutionMethod() c return m_ConvolutionMethod; } +std::string ClConvolution2dWorkload::GetConvolutionMethodString() +{ + switch ( m_ConvolutionMethod ) + { + case arm_compute::ConvolutionMethod::FFT: + return "FFT"; + case arm_compute::ConvolutionMethod::DIRECT: + return "Direct"; + case arm_compute::ConvolutionMethod::GEMM: + return "GEMM"; + case arm_compute::ConvolutionMethod::WINOGRAD: + return "Winograd"; + default: + return "Unknown"; + } +} + void ClConvolution2dWorkload::FreeUnusedTensors() { FreeTensorIfUnused(m_KernelTensor); diff --git a/src/backends/cl/workloads/ClConvolution2dWorkload.hpp b/src/backends/cl/workloads/ClConvolution2dWorkload.hpp index d0f7a5b251..49d7f773df 100644 --- a/src/backends/cl/workloads/ClConvolution2dWorkload.hpp +++ b/src/backends/cl/workloads/ClConvolution2dWorkload.hpp @@ -37,6 +37,7 @@ public: void Execute() const override; arm_compute::ConvolutionMethod GetConvolutionMethod() const; + std::string GetConvolutionMethodString(); private: mutable arm_compute::CLConvolutionLayer m_ConvolutionLayer; diff --git a/src/backends/neon/workloads/NeonConvolution2dWorkload.cpp b/src/backends/neon/workloads/NeonConvolution2dWorkload.cpp index 32af3f853a..1e12e13357 100644 --- a/src/backends/neon/workloads/NeonConvolution2dWorkload.cpp +++ b/src/backends/neon/workloads/NeonConvolution2dWorkload.cpp @@ -74,8 +74,6 @@ NeonConvolution2dWorkload::NeonConvolution2dWorkload( m_Data.ValidateInputsOutputs("NeonConvolution2dWorkload", 1, 1); - // todo: check tensor shapes match. - arm_compute::ITensor& input = PolymorphicDowncast<IAclTensorHandle*>(m_Data.m_Inputs[0])->GetTensor(); arm_compute::ITensor& output = PolymorphicDowncast<IAclTensorHandle*>(m_Data.m_Outputs[0])->GetTensor(); @@ -120,6 +118,23 @@ NeonConvolution2dWorkload::NeonConvolution2dWorkload( activationInfo, isFastMathEnabled); + // Add details for profiling output + std::string workloadName = "NeonConvolution2dWorkload_Execute_Guid" + std::to_string(this->GetGuid()); + + WorkloadInfo detailsInfo; + + detailsInfo.m_InputTensorInfos = info.m_InputTensorInfos; + detailsInfo.m_OutputTensorInfos = info.m_OutputTensorInfos; + detailsInfo.m_WeightsTensorInfo = armnn::Optional<armnn::TensorInfo>(descriptor.m_Weight->GetTensorInfo()); + detailsInfo.m_ConvolutionMethod = armnn::Optional<std::string>(GetConvolutionMethodString()); + if (descriptor.m_Parameters.m_BiasEnabled) + { + detailsInfo.m_BiasTensorInfo = armnn::Optional<armnn::TensorInfo>(descriptor.m_Bias->GetTensorInfo()); + } + + // Report Profiling Details + ARMNN_REPORT_PROFILING_WORKLOAD_DESC(workloadName, descriptor.m_Parameters, detailsInfo); + m_ConvolutionLayer.reset(convolutionLayer.release()); ARMNN_ASSERT(m_ConvolutionLayer); @@ -146,6 +161,23 @@ arm_compute::ConvolutionMethod NeonConvolution2dWorkload::GetConvolutionMethod() return m_ConvolutionMethod; } +std::string NeonConvolution2dWorkload::GetConvolutionMethodString() +{ + switch ( m_ConvolutionMethod ) + { + case arm_compute::ConvolutionMethod::FFT: + return "FFT"; + case arm_compute::ConvolutionMethod::DIRECT: + return "Direct"; + case arm_compute::ConvolutionMethod::GEMM: + return "GEMM"; + case arm_compute::ConvolutionMethod::WINOGRAD: + return "Winograd"; + default: + return "Unknown"; + } +} + void NeonConvolution2dWorkload::FreeUnusedTensors() { FreeTensorIfUnused(m_KernelTensor); diff --git a/src/backends/neon/workloads/NeonConvolution2dWorkload.hpp b/src/backends/neon/workloads/NeonConvolution2dWorkload.hpp index 4b6e58ce41..4b4c07ae87 100644 --- a/src/backends/neon/workloads/NeonConvolution2dWorkload.hpp +++ b/src/backends/neon/workloads/NeonConvolution2dWorkload.hpp @@ -37,6 +37,7 @@ public: void Execute() const override; arm_compute::ConvolutionMethod GetConvolutionMethod() const; + std::string GetConvolutionMethodString(); private: std::unique_ptr<arm_compute::IFunction> m_ConvolutionLayer; diff --git a/src/backends/reference/workloads/RefConvolution2dWorkload.cpp b/src/backends/reference/workloads/RefConvolution2dWorkload.cpp index 5ae1af8967..7c331715d8 100644 --- a/src/backends/reference/workloads/RefConvolution2dWorkload.cpp +++ b/src/backends/reference/workloads/RefConvolution2dWorkload.cpp @@ -13,18 +13,33 @@ namespace armnn { RefConvolution2dWorkload::RefConvolution2dWorkload( - const Convolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) - : BaseWorkload<Convolution2dQueueDescriptor>(descriptor, info) + const Convolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) + : BaseWorkload<Convolution2dQueueDescriptor>(descriptor, info) { - m_Weight = std::make_unique<ScopedTensorHandle>(*(descriptor.m_Weight)); + // Construct params for reporting operator details + std::string workloadName = "RefConvolution2dWorkload_Execute_Guid" + std::to_string(this->GetGuid()); + + WorkloadInfo detailsInfo; + detailsInfo.m_InputTensorInfos = info.m_InputTensorInfos; + detailsInfo.m_OutputTensorInfos = info.m_OutputTensorInfos; + detailsInfo.m_WeightsTensorInfo = armnn::Optional<armnn::TensorInfo>(descriptor.m_Weight->GetTensorInfo()); + if (descriptor.m_Parameters.m_BiasEnabled) + { + detailsInfo.m_BiasTensorInfo = armnn::Optional<armnn::TensorInfo>(descriptor.m_Bias->GetTensorInfo()); + } + + // Report Profiling Details + ARMNN_REPORT_PROFILING_WORKLOAD_DESC(workloadName, descriptor.m_Parameters, detailsInfo); + + m_Weight = std::make_unique<ScopedTensorHandle>(*( descriptor.m_Weight )); const TensorInfo& rFilterInfo = m_Weight->GetTensorInfo(); m_FilterShape = rFilterInfo.GetShape(); m_FilterDecoder = MakeDecoder<float>(rFilterInfo, m_Weight.get()->Map(true)); - if (descriptor.m_Parameters.m_BiasEnabled) + if ( descriptor.m_Parameters.m_BiasEnabled ) { - m_Bias = std::make_unique<ScopedTensorHandle>(*(descriptor.m_Bias)); + m_Bias = std::make_unique<ScopedTensorHandle>(*( descriptor.m_Bias )); const TensorInfo& biasInfo = m_Bias->GetTensorInfo(); m_BiasDecoder = MakeDecoder<float>(biasInfo, m_Bias->Map(true)); } @@ -35,13 +50,15 @@ void RefConvolution2dWorkload::Execute() const Execute(m_Data.m_Inputs, m_Data.m_Outputs); } -void RefConvolution2dWorkload::ExecuteAsync(WorkingMemDescriptor &workingMemDescriptor) +void RefConvolution2dWorkload::ExecuteAsync(WorkingMemDescriptor& workingMemDescriptor) { Execute(workingMemDescriptor.m_Inputs, workingMemDescriptor.m_Outputs); } -void RefConvolution2dWorkload::Execute(std::vector<ITensorHandle*> inputs, std::vector<ITensorHandle*> outputs) const { - ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, "RefConvolution2dWorkload_Execute"); +void RefConvolution2dWorkload::Execute(std::vector<ITensorHandle*> inputs, std::vector<ITensorHandle*> outputs) const +{ + std::string workloadName = "RefConvolutionWorkload_Execute_Guid" + std::to_string(this->GetGuid()); + ARMNN_SCOPED_PROFILING_EVENT(Compute::CpuRef, workloadName); std::unique_ptr<Decoder<float>> inputDecoder = MakeDecoder<float>(GetTensorInfo(inputs[0]), inputs[0]->Map()); std::unique_ptr<Encoder<float>> outputEncoder = MakeEncoder<float>(GetTensorInfo(outputs[0]), outputs[0]->Map()); |