blob: f98fe4403987df69c7d270353e319f83df2d00e9 [file] [log] [blame]
telsoa014fcda012018-03-09 14:13:49 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
David Beckecb56cd2018-09-05 12:52:57 +01003// SPDX-License-Identifier: MIT
telsoa014fcda012018-03-09 14:13:49 +00004//
5#pragma once
6
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00007#include <backendsCommon/Workload.hpp>
8#include <aclCommon/ArmComputeTensorUtils.hpp>
9#include <neon/NeonTensorHandle.hpp>
10#include <neon/NeonTimer.hpp>
11#include <backendsCommon/CpuTensorHandle.hpp>
telsoa014fcda012018-03-09 14:13:49 +000012
Nattapat Chaimanowong177d8d22018-10-16 13:21:27 +010013#include <Half.hpp>
telsoa014fcda012018-03-09 14:13:49 +000014
Nattapat Chaimanowong177d8d22018-10-16 13:21:27 +010015#define ARMNN_SCOPED_PROFILING_EVENT_NEON(name) \
telsoa01c577f2c2018-08-31 09:22:23 +010016 ARMNN_SCOPED_PROFILING_EVENT_WITH_INSTRUMENTS(armnn::Compute::CpuAcc, \
17 name, \
Nina Drozd69851b52018-09-21 18:42:09 +010018 armnn::NeonTimer(), \
19 armnn::WallClockTimer())
Nattapat Chaimanowong177d8d22018-10-16 13:21:27 +010020
21using namespace armnn::armcomputetensorutils;
22
23namespace armnn
24{
25
26template <typename T>
27void CopyArmComputeTensorData(arm_compute::Tensor& dstTensor, const T* srcData)
28{
29 InitialiseArmComputeTensorEmpty(dstTensor);
30 CopyArmComputeITensorData(srcData, dstTensor);
31}
32
33inline void InitializeArmComputeTensorData(arm_compute::Tensor& tensor,
34 const ConstCpuTensorHandle* handle)
35{
36 BOOST_ASSERT(handle);
37
38 switch(handle->GetTensorInfo().GetDataType())
39 {
40 case DataType::Float16:
41 CopyArmComputeTensorData(tensor, handle->GetConstTensor<armnn::Half>());
42 break;
43 case DataType::Float32:
44 CopyArmComputeTensorData(tensor, handle->GetConstTensor<float>());
45 break;
Derek Lambertif90c56d2020-01-10 17:14:08 +000046 case DataType::QAsymmU8:
Nattapat Chaimanowong177d8d22018-10-16 13:21:27 +010047 CopyArmComputeTensorData(tensor, handle->GetConstTensor<uint8_t>());
48 break;
Aron Virginas-Tar21fc28b2019-11-26 14:04:54 +000049 case DataType::QuantizedSymm8PerAxis:
50 CopyArmComputeTensorData(tensor, handle->GetConstTensor<int8_t>());
51 break;
Nattapat Chaimanowong177d8d22018-10-16 13:21:27 +010052 case DataType::Signed32:
53 CopyArmComputeTensorData(tensor, handle->GetConstTensor<int32_t>());
54 break;
55 default:
56 BOOST_ASSERT_MSG(false, "Unexpected tensor type.");
57 }
58};
59
FinnWilliamsArm1fa19192019-08-02 17:26:31 +010060inline auto SetNeonStridedSliceData(const std::vector<int>& m_begin,
61 const std::vector<int>& m_end,
62 const std::vector<int>& m_stride)
63{
64 arm_compute::Coordinates starts;
65 arm_compute::Coordinates ends;
66 arm_compute::Coordinates strides;
67
68 unsigned int num_dims = static_cast<unsigned int>(m_begin.size());
69
70 for (unsigned int i = 0; i < num_dims; i++)
71 {
72 unsigned int revertedIndex = num_dims - i - 1;
73
74 starts.set(i, static_cast<int>(m_begin[revertedIndex]));
75 ends.set(i, static_cast<int>(m_end[revertedIndex]));
76 strides.set(i, static_cast<int>(m_stride[revertedIndex]));
77 }
78
79 return std::make_tuple(starts, ends, strides);
80}
81
josh minor036f02d2019-11-15 14:53:22 -060082inline auto SetNeonSliceData(const std::vector<unsigned int>& m_begin,
83 const std::vector<unsigned int>& m_size)
84{
85 // This function must translate the size vector given to an end vector
86 // expected by the ACL NESlice workload
87 arm_compute::Coordinates starts;
88 arm_compute::Coordinates ends;
89
90 unsigned int num_dims = static_cast<unsigned int>(m_begin.size());
91
92 // For strided slices, we have the relationship size = (end - begin) / stride
93 // For slice, we assume stride to be a vector of all ones, yielding the formula
94 // size = (end - begin) therefore we know end = size + begin
95 for (unsigned int i = 0; i < num_dims; i++)
96 {
97 unsigned int revertedIndex = num_dims - i - 1;
98
99 starts.set(i, static_cast<int>(m_begin[revertedIndex]));
100 ends.set(i, static_cast<int>(m_begin[revertedIndex] + m_size[revertedIndex]));
101 }
102
103 return std::make_tuple(starts, ends);
104}
105
Nattapat Chaimanowong177d8d22018-10-16 13:21:27 +0100106} //namespace armnn