blob: ffdd469609f790bafd463023eba8eaa42656c9a3 [file] [log] [blame]
Mohamed Nour Abouelseoud7420e552018-10-12 12:26:24 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include "Pad.hpp"
Matteo Martincighe5b8eb92019-11-28 15:45:42 +00007#include <backendsCommon/WorkloadData.hpp>
Mohamed Nour Abouelseoud7420e552018-10-12 12:26:24 +01008#include "TensorBufferArrayView.hpp"
David Monahan34757812019-06-19 11:47:21 +01009#include "Encoders.hpp"
10
11#include <boost/numeric/conversion/cast.hpp>
Mohamed Nour Abouelseoud7420e552018-10-12 12:26:24 +010012#include <cmath>
13#include <cstddef>
14#include <functional>
15#include <limits>
16#include <cassert>
17
Mohamed Nour Abouelseoud7420e552018-10-12 12:26:24 +010018namespace armnn
19{
David Monahan34757812019-06-19 11:47:21 +010020
21template <typename T>
Mohamed Nour Abouelseoud7420e552018-10-12 12:26:24 +010022void Pad(const TensorInfo& inputInfo,
23 const TensorInfo& outputInfo,
David Monahan34757812019-06-19 11:47:21 +010024 std::vector<std::pair<unsigned int, unsigned int>> m_padList,
Mohamed Nour Abouelseouddd6acea2018-10-18 12:26:19 +010025 const T* inputData,
David Monahan34757812019-06-19 11:47:21 +010026 T* outData,
27 const float padValue)
Mohamed Nour Abouelseoud7420e552018-10-12 12:26:24 +010028{
29 unsigned int numOutputElements = outputInfo.GetNumElements();
30
31 TensorShape outputShape = outputInfo.GetShape();
32 TensorShape inputShape = inputInfo.GetShape();
33
34 unsigned int numInputDimensions = inputShape.GetNumDimensions();
Mohamed Nour Abouelseoud7420e552018-10-12 12:26:24 +010035
Mohamed Nour Abouelseouddd6acea2018-10-18 12:26:19 +010036 #ifndef NDEBUG
37
38 unsigned int numOutputDimensions = outputShape.GetNumDimensions();
Mohamed Nour Abouelseoud7420e552018-10-12 12:26:24 +010039 assert(numInputDimensions == numOutputDimensions);
Mohamed Nour Abouelseouddd6acea2018-10-18 12:26:19 +010040
Mohamed Nour Abouelseoud7420e552018-10-12 12:26:24 +010041 #endif
42
43 unsigned int inputBatches = 0;
44 unsigned int inputChannels = 0;
45 unsigned int inputHeight = 0;
46 unsigned int inputWidth = 0;
47
48 unsigned int outputChannels = 0;
49 unsigned int outputHeight = 0;
50 unsigned int outputWidth = 0;
51
Mike Kelly0a08ec62019-07-25 08:39:31 +010052 T convertedPadValue = static_cast<T>(padValue);
David Monahan34757812019-06-19 11:47:21 +010053
Mohamed Nour Abouelseoud7420e552018-10-12 12:26:24 +010054 for (unsigned int i = 0; i < numOutputElements; ++i)
55 {
David Monahan34757812019-06-19 11:47:21 +010056 outData[i] = convertedPadValue;
Mohamed Nour Abouelseoud7420e552018-10-12 12:26:24 +010057 }
58
59 switch(numInputDimensions) {
Mohamed Nour Abouelseouddd6acea2018-10-18 12:26:19 +010060
Mohamed Nour Abouelseoud7420e552018-10-12 12:26:24 +010061 case 1:
62
63 inputWidth = inputShape[0];
64
65 for (unsigned int w = 0; w < inputWidth ; w++)
66 {
David Monahan34757812019-06-19 11:47:21 +010067 outData[w+std::get<0>(m_padList[0])] = inputData[w];
Mohamed Nour Abouelseoud7420e552018-10-12 12:26:24 +010068 }
69
70 break;
Mohamed Nour Abouelseouddd6acea2018-10-18 12:26:19 +010071
Mohamed Nour Abouelseoud7420e552018-10-12 12:26:24 +010072 case 2 :
73
74 inputHeight = inputShape[0];
75 inputWidth = inputShape[1];
Mohamed Nour Abouelseoud7420e552018-10-12 12:26:24 +010076 outputHeight = outputShape[0];
77 outputWidth = outputShape[1];
78
79 for (unsigned int h = 0; h < inputHeight; h++)
80 {
Mohamed Nour Abouelseoud7420e552018-10-12 12:26:24 +010081 for (unsigned int w = 0; w < inputWidth ; w++)
82 {
David Monahan34757812019-06-19 11:47:21 +010083 outData[(h+std::get<0>(m_padList[0]))*outputWidth
84 + (w+std::get<0>(m_padList[1]))] = inputData[h * inputWidth + w];
Mohamed Nour Abouelseoud7420e552018-10-12 12:26:24 +010085 }
86 }
87
88 break;
Mohamed Nour Abouelseouddd6acea2018-10-18 12:26:19 +010089
Mohamed Nour Abouelseoud7420e552018-10-12 12:26:24 +010090 case 3 :
91
92 inputChannels = inputShape[0];
93 inputHeight = inputShape[1];
94 inputWidth = inputShape[2];
Mohamed Nour Abouelseoud7420e552018-10-12 12:26:24 +010095 outputChannels = outputShape[0];
96 outputHeight = outputShape[1];
97 outputWidth = outputShape[2];
98
99 for (unsigned int c = 0; c < inputChannels; c++)
100 {
Mohamed Nour Abouelseoud7420e552018-10-12 12:26:24 +0100101 for (unsigned int h = 0; h < inputHeight; h++)
102 {
Mohamed Nour Abouelseoud7420e552018-10-12 12:26:24 +0100103 for (unsigned int w = 0; w < inputWidth ; w++)
104 {
David Monahan34757812019-06-19 11:47:21 +0100105 outData[(c+std::get<0>(m_padList[0]))*outputHeight*outputWidth
106 + (h+std::get<0>(m_padList[1]))*outputWidth
107 + (w+std::get<0>(m_padList[2]))] = inputData[c * inputHeight * inputWidth
Mohamed Nour Abouelseoud7420e552018-10-12 12:26:24 +0100108 + h * inputWidth
109 + w];
110 }
111 }
112 }
113
114 break;
Mohamed Nour Abouelseouddd6acea2018-10-18 12:26:19 +0100115
Mohamed Nour Abouelseoud7420e552018-10-12 12:26:24 +0100116 case 4 :
117
118 inputBatches = inputShape[0];
119 inputChannels = inputShape[1];
120 inputHeight = inputShape[2];
121 inputWidth = inputShape[3];
Mohamed Nour Abouelseoud7420e552018-10-12 12:26:24 +0100122 outputChannels = outputShape[1];
123 outputHeight = outputShape[2];
124 outputWidth = outputShape[3];
125
126 for (unsigned int b = 0; b < inputBatches; b++)
127 {
128 for (unsigned int c = 0; c < inputChannels; c++)
129 {
Mohamed Nour Abouelseoud7420e552018-10-12 12:26:24 +0100130 for (unsigned int h = 0; h < inputHeight; h++)
131 {
Mohamed Nour Abouelseoud7420e552018-10-12 12:26:24 +0100132 for (unsigned int w = 0; w < inputWidth ; w++)
133 {
David Monahan34757812019-06-19 11:47:21 +0100134 outData[(b+std::get<0>(m_padList[0])) * outputChannels * outputHeight * outputWidth
135 + (c+std::get<0>(m_padList[1])) * outputHeight * outputWidth
136 + (h+std::get<0>(m_padList[2])) * outputWidth
137 + (w+std::get<0>(m_padList[3]))] = inputData[b * inputChannels * inputHeight
Mohamed Nour Abouelseoud7420e552018-10-12 12:26:24 +0100138 * inputWidth
139 + c * inputHeight * inputWidth
140 + h * inputWidth
141 + w];
Mohamed Nour Abouelseoud7420e552018-10-12 12:26:24 +0100142 }
143 }
144 }
145 }
146
147 break;
148
149 default :
Mohamed Nour Abouelseouddd6acea2018-10-18 12:26:19 +0100150
Mohamed Nour Abouelseoud7420e552018-10-12 12:26:24 +0100151 break;
152 }
Mohamed Nour Abouelseoud7420e552018-10-12 12:26:24 +0100153}
154
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000155template void Pad<BFloat16>(const TensorInfo& inputInfo,
156 const TensorInfo& outputInfo,
157 std::vector<std::pair<unsigned int, unsigned int>> m_PadList,
158 const BFloat16* inputData,
159 BFloat16* outData,
160 const float padValue);
161
Mohamed Nour Abouelseouddd6acea2018-10-18 12:26:19 +0100162template void Pad<float>(const TensorInfo& inputInfo,
163 const TensorInfo& outputInfo,
164 std::vector<std::pair<unsigned int, unsigned int>> m_PadList,
165 const float* inputData,
David Monahan34757812019-06-19 11:47:21 +0100166 float* outData,
167 const float padValue);
Matthew Jackson252df3a2019-09-11 09:19:18 +0100168template void Pad<Half>(const TensorInfo& inputInfo,
169 const TensorInfo& outputInfo,
170 std::vector<std::pair<unsigned int, unsigned int>> m_PadList,
171 const Half* inputData,
172 Half* outData,
173 const float padValue);
Mohamed Nour Abouelseouddd6acea2018-10-18 12:26:19 +0100174template void Pad<uint8_t>(const TensorInfo& inputInfo,
175 const TensorInfo& outputInfo,
176 std::vector<std::pair<unsigned int, unsigned int>> m_PadList,
177 const uint8_t* inputData,
David Monahan34757812019-06-19 11:47:21 +0100178 uint8_t* outData,
179 const float padValue);
Narumol Prangnawarate6eaf662019-07-08 08:57:17 +0100180template void Pad<int16_t>(const TensorInfo& inputInfo,
181 const TensorInfo& outputInfo,
182 std::vector<std::pair<unsigned int, unsigned int>> m_PadList,
183 const int16_t* inputData,
184 int16_t* outData,
185 const float padValue);
Mohamed Nour Abouelseouddd6acea2018-10-18 12:26:19 +0100186
187} //namespace armnn