blob: f5b0128dc7cff0b5c8825b5f1b724b8b7fa721dc [file] [log] [blame]
Nattapat Chaimanowong233b3d62018-10-12 12:02:18 +01001//
Mike Kelly7cbe7812023-07-25 17:37:33 +01002// Copyright © 2017-2018,2020-2023 Arm Ltd and Contributors. All rights reserved.
Nattapat Chaimanowong233b3d62018-10-12 12:02:18 +01003// SPDX-License-Identifier: MIT
4//
5
6#include "NeonConstantWorkload.hpp"
7
8#include <arm_compute/core/Types.h>
Narumol Prangnawarat250d3922020-03-30 16:11:04 +01009#include <BFloat16.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000010#include <Half.hpp>
11#include <aclCommon/ArmComputeTensorUtils.hpp>
Jan Eilersbb446e52020-04-02 13:56:54 +010012#include <armnn/utility/PolymorphicDowncast.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000013#include <neon/NeonTensorHandle.hpp>
Colm Donelan0c479742021-12-10 12:43:54 +000014#include <armnn/backends/TensorHandle.hpp>
Teresa Charlin588cbdf2022-01-19 15:55:37 +000015#include "NeonBaseWorkload.hpp"
Nattapat Chaimanowong233b3d62018-10-12 12:02:18 +010016
Nattapat Chaimanowong233b3d62018-10-12 12:02:18 +010017namespace armnn
18{
19
Mike Kelly0886ac42020-04-27 09:55:40 +010020arm_compute::Status NeonConstantWorkloadValidate(const TensorInfo& output)
21{
22 const arm_compute::TensorInfo neonOutputInfo = armcomputetensorutils::BuildArmComputeTensorInfo(output);
23
Teresa Charlinf540eb82020-04-10 19:24:55 +010024 std::array<arm_compute::DataType,9> supportedTypes = {
Mike Kelly0886ac42020-04-27 09:55:40 +010025 arm_compute::DataType::BFLOAT16,
26 arm_compute::DataType::F16,
27 arm_compute::DataType::F32,
28 arm_compute::DataType::QASYMM8,
29 arm_compute::DataType::QASYMM8_SIGNED,
30 arm_compute::DataType::QSYMM16,
31 arm_compute::DataType::QSYMM8,
Teresa Charlinf540eb82020-04-10 19:24:55 +010032 arm_compute::DataType::QSYMM8_PER_CHANNEL,
33 arm_compute::DataType::S32
Mike Kelly0886ac42020-04-27 09:55:40 +010034 };
35 auto it = std::find(begin(supportedTypes), end(supportedTypes), neonOutputInfo.data_type());
36
37 if (it != end(supportedTypes))
38 {
39 return arm_compute::Status{};
40 }
41 else
42 {
43 return arm_compute::Status{arm_compute::ErrorCode::RUNTIME_ERROR, "Unsupported DataType"};
44 }
45}
46
Nattapat Chaimanowong233b3d62018-10-12 12:02:18 +010047NeonConstantWorkload::NeonConstantWorkload(const ConstantQueueDescriptor& descriptor,
48 const WorkloadInfo& info)
Teresa Charlin588cbdf2022-01-19 15:55:37 +000049 : NeonBaseWorkload<ConstantQueueDescriptor>(descriptor, info)
Nattapat Chaimanowong233b3d62018-10-12 12:02:18 +010050 , m_RanOnce(false)
51{
52}
53
54void NeonConstantWorkload::Execute() const
55{
Mike Kelly7cbe7812023-07-25 17:37:33 +010056 ARMNN_SCOPED_PROFILING_EVENT_NEON_NAME_GUID("NeonConstantWorkload_Execute");
Nattapat Chaimanowong233b3d62018-10-12 12:02:18 +010057
58 using namespace armcomputetensorutils;
59
60 // The intermediate tensor held by the corresponding layer output handler can be initialised with the
61 // given data on the first inference, then reused for subsequent inferences.
62 // The initialisation cannot happen at workload construction time since the ACL kernel for the next layer
63 // may not have been configured at the time.
64 if (!m_RanOnce)
65 {
66 const ConstantQueueDescriptor& data = this->m_Data;
67
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +010068 ARMNN_ASSERT(data.m_LayerOutput != nullptr);
Nattapat Chaimanowong233b3d62018-10-12 12:02:18 +010069 arm_compute::ITensor& output =
Jan Eilersbb446e52020-04-02 13:56:54 +010070 PolymorphicDowncast<NeonTensorHandle*>(data.m_Outputs[0])->GetTensor();
Nattapat Chaimanowong233b3d62018-10-12 12:02:18 +010071 arm_compute::DataType computeDataType =
Jan Eilersbb446e52020-04-02 13:56:54 +010072 PolymorphicDowncast<NeonTensorHandle*>(data.m_Outputs[0])->GetDataType();
Nattapat Chaimanowong233b3d62018-10-12 12:02:18 +010073
74 switch (computeDataType)
75 {
Narumol Prangnawarat250d3922020-03-30 16:11:04 +010076 case arm_compute::DataType::BFLOAT16:
77 {
78 CopyArmComputeITensorData(data.m_LayerOutput->GetConstTensor<BFloat16>(), output);
79 break;
80 }
Nattapat Chaimanowong233b3d62018-10-12 12:02:18 +010081 case arm_compute::DataType::F16:
82 {
83 CopyArmComputeITensorData(data.m_LayerOutput->GetConstTensor<Half>(), output);
84 break;
85 }
86 case arm_compute::DataType::F32:
87 {
88 CopyArmComputeITensorData(data.m_LayerOutput->GetConstTensor<float>(), output);
89 break;
90 }
91 case arm_compute::DataType::QASYMM8:
92 {
93 CopyArmComputeITensorData(data.m_LayerOutput->GetConstTensor<uint8_t>(), output);
94 break;
95 }
Mike Kelly0886ac42020-04-27 09:55:40 +010096 case arm_compute::DataType::QASYMM8_SIGNED:
97 {
98 CopyArmComputeITensorData(data.m_LayerOutput->GetConstTensor<int8_t>(), output);
99 break;
100 }
101 case arm_compute::DataType::QSYMM16:
102 {
103 CopyArmComputeITensorData(data.m_LayerOutput->GetConstTensor<int16_t>(), output);
104 break;
105 }
106 case arm_compute::DataType::QSYMM8:
107 case arm_compute::DataType::QSYMM8_PER_CHANNEL:
108 {
109 CopyArmComputeITensorData(data.m_LayerOutput->GetConstTensor<int8_t>(), output);
110 break;
111 }
Teresa Charlinf540eb82020-04-10 19:24:55 +0100112 case arm_compute::DataType::S32:
113 {
114 CopyArmComputeITensorData(data.m_LayerOutput->GetConstTensor<int32_t>(), output);
115 break;
116 }
Nattapat Chaimanowong233b3d62018-10-12 12:02:18 +0100117 default:
118 {
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +0100119 ARMNN_ASSERT_MSG(false, "Unknown data type");
Nattapat Chaimanowong233b3d62018-10-12 12:02:18 +0100120 break;
121 }
122 }
123
124 m_RanOnce = true;
125 }
126}
127
128} //namespace armnn