blob: b9cb8077794385026ab662cb5c2cafe581c4a3dc [file] [log] [blame]
Nattapat Chaimanowong233b3d62018-10-12 12:02:18 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// 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>
12#include <neon/NeonTensorHandle.hpp>
13#include <backendsCommon/CpuTensorHandle.hpp>
14#include <backendsCommon/Workload.hpp>
Nattapat Chaimanowong233b3d62018-10-12 12:02:18 +010015
16#include <boost/cast.hpp>
17
18namespace armnn
19{
20
21NeonConstantWorkload::NeonConstantWorkload(const ConstantQueueDescriptor& descriptor,
22 const WorkloadInfo& info)
23 : BaseWorkload<ConstantQueueDescriptor>(descriptor, info)
24 , m_RanOnce(false)
25{
26}
27
28void NeonConstantWorkload::Execute() const
29{
30 ARMNN_SCOPED_PROFILING_EVENT_NEON("NeonConstantWorkload_Execute");
31
32 using namespace armcomputetensorutils;
33
34 // The intermediate tensor held by the corresponding layer output handler can be initialised with the
35 // given data on the first inference, then reused for subsequent inferences.
36 // The initialisation cannot happen at workload construction time since the ACL kernel for the next layer
37 // may not have been configured at the time.
38 if (!m_RanOnce)
39 {
40 const ConstantQueueDescriptor& data = this->m_Data;
41
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +010042 ARMNN_ASSERT(data.m_LayerOutput != nullptr);
Nattapat Chaimanowong233b3d62018-10-12 12:02:18 +010043 arm_compute::ITensor& output =
44 boost::polymorphic_downcast<NeonTensorHandle*>(data.m_Outputs[0])->GetTensor();
45 arm_compute::DataType computeDataType =
46 boost::polymorphic_downcast<NeonTensorHandle*>(data.m_Outputs[0])->GetDataType();
47
48 switch (computeDataType)
49 {
Narumol Prangnawarat250d3922020-03-30 16:11:04 +010050 case arm_compute::DataType::BFLOAT16:
51 {
52 CopyArmComputeITensorData(data.m_LayerOutput->GetConstTensor<BFloat16>(), output);
53 break;
54 }
Nattapat Chaimanowong233b3d62018-10-12 12:02:18 +010055 case arm_compute::DataType::F16:
56 {
57 CopyArmComputeITensorData(data.m_LayerOutput->GetConstTensor<Half>(), output);
58 break;
59 }
60 case arm_compute::DataType::F32:
61 {
62 CopyArmComputeITensorData(data.m_LayerOutput->GetConstTensor<float>(), output);
63 break;
64 }
65 case arm_compute::DataType::QASYMM8:
66 {
67 CopyArmComputeITensorData(data.m_LayerOutput->GetConstTensor<uint8_t>(), output);
68 break;
69 }
70 default:
71 {
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +010072 ARMNN_ASSERT_MSG(false, "Unknown data type");
Nattapat Chaimanowong233b3d62018-10-12 12:02:18 +010073 break;
74 }
75 }
76
77 m_RanOnce = true;
78 }
79}
80
81} //namespace armnn