blob: e972524f11c89113a9c9f1a000e8aca496385320 [file] [log] [blame]
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +01001//
2// Copyright © 2019 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include "Slice.hpp"
7
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +01008#include <armnn/utility/Assert.hpp>
Jan Eilers8eb25602020-03-09 12:13:48 +00009#include <armnn/utility/IgnoreUnused.hpp>
10
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +010011#include <boost/numeric/conversion/cast.hpp>
12
13namespace armnn
14{
15
16void Slice(const TensorInfo& inputInfo,
17 const SliceDescriptor& descriptor,
18 const void* inputData,
19 void* outputData,
20 unsigned int dataTypeSize)
21{
22 const TensorShape& inputShape = inputInfo.GetShape();
23 const unsigned int numDims = inputShape.GetNumDimensions();
24
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +010025 ARMNN_ASSERT(descriptor.m_Begin.size() == numDims);
26 ARMNN_ASSERT(descriptor.m_Size.size() == numDims);
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +010027
28 constexpr unsigned int maxNumDims = 4;
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +010029 ARMNN_ASSERT(numDims <= maxNumDims);
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +010030
31 std::vector<unsigned int> paddedInput(4);
32 std::vector<unsigned int> paddedBegin(4);
33 std::vector<unsigned int> paddedSize (4);
34
35 const unsigned int numPaddingDims = maxNumDims - numDims;
36 for (unsigned int i = 0u; i < maxNumDims; ++i)
37 {
38 if (i < numPaddingDims)
39 {
40 paddedInput[i] = 1u;
41 paddedBegin[i] = 0u;
42 paddedSize[i] = 1u;
43 }
44 else
45 {
46 const unsigned int j = i - numPaddingDims;
47 paddedInput[i] = inputShape[j];
48 paddedBegin[i] = descriptor.m_Begin[j];
49 paddedSize[i] = descriptor.m_Size[j];
50 }
51 }
52
53 unsigned int dim0 = paddedInput[0];
54 unsigned int dim1 = paddedInput[1];
55 unsigned int dim2 = paddedInput[2];
56 unsigned int dim3 = paddedInput[3];
57
58 unsigned int begin0 = paddedBegin[0];
59 unsigned int begin1 = paddedBegin[1];
60 unsigned int begin2 = paddedBegin[2];
61 unsigned int begin3 = paddedBegin[3];
62
63 unsigned int size0 = paddedSize[0];
64 unsigned int size1 = paddedSize[1];
65 unsigned int size2 = paddedSize[2];
66 unsigned int size3 = paddedSize[3];
67
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +010068 ARMNN_ASSERT(begin0 + size0 <= dim0);
69 ARMNN_ASSERT(begin1 + size1 <= dim1);
70 ARMNN_ASSERT(begin2 + size2 <= dim2);
71 ARMNN_ASSERT(begin3 + size3 <= dim3);
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +010072
73 const unsigned char* input = reinterpret_cast<const unsigned char*>(inputData);
74 unsigned char* output = reinterpret_cast<unsigned char*>(outputData);
75
Jan Eilers8eb25602020-03-09 12:13:48 +000076 IgnoreUnused(dim0);
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +010077 for (unsigned int idx0 = begin0; idx0 < begin0 + size0; ++idx0)
78 {
79 for (unsigned int idx1 = begin1; idx1 < begin1 + size1; ++idx1)
80 {
81 for (unsigned int idx2 = begin2; idx2 < begin2 + size2; ++idx2)
82 {
83 for (unsigned int idx3 = begin3; idx3 < begin3 + size3; ++idx3)
84 {
85 const unsigned int inputOffset =
86 (((idx0 * dim1 + idx1) * dim2 + idx2) * dim3 + idx3) * dataTypeSize;
87
88 ::memcpy(output, input + inputOffset, dataTypeSize);
89 output += dataTypeSize;
90 }
91 }
92 }
93 }
94}
95
96} // namespace armnn