2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // See LICENSE file in the project root for full license information.
8 #include "RefWorkloadUtils.hpp"
10 #include "backends/WorkloadData.hpp"
12 #include <armnn/Tensor.hpp>
14 #include <boost/assert.hpp>
19 template <typename DataType>
20 void Splitter(const SplitterQueueDescriptor& data)
22 const TensorInfo& inputInfo0 = GetTensorInfo(data.m_Inputs[0]);
24 for (unsigned int index = 0; index < inputInfo0.GetNumElements(); ++index)
26 unsigned int indices[MaxNumOfTensorDimensions] = { 0 };
28 unsigned int indexRemainder = index;
29 unsigned int dimensionStride = inputInfo0.GetNumElements();
31 for (unsigned int i = 0; i<inputInfo0.GetNumDimensions(); i++)
33 dimensionStride /= inputInfo0.GetShape()[i];
34 indices[i] = indexRemainder / dimensionStride; // Use integer division to round down.
35 indexRemainder -= indices[i] * dimensionStride;
38 for (unsigned int viewIdx = 0; viewIdx < data.m_ViewOrigins.size(); ++viewIdx)
40 SplitterQueueDescriptor::ViewOrigin const& view = data.m_ViewOrigins[viewIdx];
42 //Split view extents are defined by the size of (the corresponding) input tensor.
43 const TensorInfo& outputInfo = GetTensorInfo(data.m_Outputs[viewIdx]);
44 BOOST_ASSERT(outputInfo.GetNumDimensions() == inputInfo0.GetNumDimensions());
46 // Check all dimensions to see if this element is inside the given input view.
47 bool insideView = true;
48 for (unsigned int i = 0; i<outputInfo.GetNumDimensions(); i++)
50 if (indices[i] < view.m_Origin[i])
54 if (indices[i] >= view.m_Origin[i] + outputInfo.GetShape()[i])
62 unsigned int outIndex = 0;
63 unsigned int dimensionStride = 1;
65 for (unsigned int i = outputInfo.GetNumDimensions(); i-- > 0;)
67 outIndex += dimensionStride * (indices[i] - view.m_Origin[i]);
68 dimensionStride *= outputInfo.GetShape()[i];
71 //We are within the view, to copy input data to the output corresponding to this view.
72 DataType* outputData = GetOutputTensorData<DataType>(viewIdx, data);
73 BOOST_ASSERT(outputData);
75 const DataType* inputData = GetInputTensorData<DataType>(0, data);
76 BOOST_ASSERT(inputData);
78 outputData[outIndex] = inputData[index];