2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
7 #include "backendsCommon/WorkloadData.hpp"
8 #include <boost/numeric/conversion/cast.hpp>
9 #include "TensorBufferArrayView.hpp"
19 void Pad(const TensorInfo& inputInfo,
20 const TensorInfo& outputInfo,
21 std::vector<std::pair<unsigned int, unsigned int>> m_PadList,
25 unsigned int numOutputElements = outputInfo.GetNumElements();
27 TensorShape outputShape = outputInfo.GetShape();
28 TensorShape inputShape = inputInfo.GetShape();
30 unsigned int numInputDimensions = inputShape.GetNumDimensions();
34 unsigned int numOutputDimensions = outputShape.GetNumDimensions();
35 assert(numInputDimensions == numOutputDimensions);
39 unsigned int inputBatches = 0;
40 unsigned int inputChannels = 0;
41 unsigned int inputHeight = 0;
42 unsigned int inputWidth = 0;
44 unsigned int outputChannels = 0;
45 unsigned int outputHeight = 0;
46 unsigned int outputWidth = 0;
48 for (unsigned int i = 0; i < numOutputElements; ++i)
53 switch(numInputDimensions) {
57 inputWidth = inputShape[0];
59 for (unsigned int w = 0; w < inputWidth ; w++)
61 outData[w+std::get<0>(m_PadList[0])] = inputData[w];
68 inputHeight = inputShape[0];
69 inputWidth = inputShape[1];
70 outputHeight = outputShape[0];
71 outputWidth = outputShape[1];
73 for (unsigned int h = 0; h < inputHeight; h++)
75 for (unsigned int w = 0; w < inputWidth ; w++)
77 outData[(h+std::get<0>(m_PadList[0]))*outputWidth
78 + (w+std::get<0>(m_PadList[1]))] = inputData[h * inputWidth + w];
86 inputChannels = inputShape[0];
87 inputHeight = inputShape[1];
88 inputWidth = inputShape[2];
89 outputChannels = outputShape[0];
90 outputHeight = outputShape[1];
91 outputWidth = outputShape[2];
93 for (unsigned int c = 0; c < inputChannels; c++)
95 for (unsigned int h = 0; h < inputHeight; h++)
97 for (unsigned int w = 0; w < inputWidth ; w++)
99 outData[(c+std::get<0>(m_PadList[0]))*outputHeight*outputWidth
100 + (h+std::get<0>(m_PadList[1]))*outputWidth
101 + (w+std::get<0>(m_PadList[2]))] = inputData[c * inputHeight * inputWidth
112 inputBatches = inputShape[0];
113 inputChannels = inputShape[1];
114 inputHeight = inputShape[2];
115 inputWidth = inputShape[3];
116 outputChannels = outputShape[1];
117 outputHeight = outputShape[2];
118 outputWidth = outputShape[3];
120 for (unsigned int b = 0; b < inputBatches; b++)
122 for (unsigned int c = 0; c < inputChannels; c++)
124 for (unsigned int h = 0; h < inputHeight; h++)
126 for (unsigned int w = 0; w < inputWidth ; w++)
128 outData[(b+std::get<0>(m_PadList[0])) * outputChannels * outputHeight * outputWidth
129 + (c+std::get<0>(m_PadList[1])) * outputHeight * outputWidth
130 + (h+std::get<0>(m_PadList[2])) * outputWidth
131 + (w+std::get<0>(m_PadList[3]))] = inputData[b * inputChannels * inputHeight
133 + c * inputHeight * inputWidth
149 template void Pad<float>(const TensorInfo& inputInfo,
150 const TensorInfo& outputInfo,
151 std::vector<std::pair<unsigned int, unsigned int>> m_PadList,
152 const float* inputData,
154 template void Pad<uint8_t>(const TensorInfo& inputInfo,
155 const TensorInfo& outputInfo,
156 std::vector<std::pair<unsigned int, unsigned int>> m_PadList,
157 const uint8_t* inputData,