77 const TensorInfo& weightsInfo = m_Weight->GetTensorInfo();
79 bool useWinograd =
false;
81 if (m_Winograd ==
true) {
83 unsigned int weightsHeight = weightsInfo.GetShape()[dataLayoutIndexed.GetHeightIndex()];
84 unsigned int weightsWidth = weightsInfo.GetShape()[dataLayoutIndexed.GetWidthIndex()];
88 bool isWinograd1D = weightsWidth == 1 || weightsHeight == 1;
89 bool isBlockSizeOk = isWinograd1D? true : m_IsBlockConfigsWinograd2dCompatible;
91 uint32_t numMultsDirect, numMultsWinograd;
93 if ( weightsWidth == 1 || weightsHeight == 1)
98 numMultsDirect = weightsWidth * weightsHeight * 2;
99 numMultsWinograd = 4 *
DivideRoundUp(weightsWidth * weightsHeight, 3);
106 numMultsDirect = weightsWidth * weightsHeight * 4;
109 if (numMultsWinograd < numMultsDirect &&
113 xStride == 1 && yStride == 1)
117 if (useWinograd ==
true)
119 std::cout <<
"[EthosNRef] Runnning in Winograd Mode.\n";
123 std::cout <<
"[EthosNRef] Runnning in Direct Mode.\n";
127 const int16_t* inputData = GetInputTensorData<int16_t>(0,
m_Data);
128 const int16_t* weightsData = m_Weight->template GetConstTensor<int16_t>();
132 if(useWinograd ==
false)
134 EthosnRefConvImpl<armnn::Convolution2dQueueDescriptor, int16_t, int16_t, int32_t, int64_t>(
136 inputData, inputInfo.GetQuantizationScale(), inputInfo.GetQuantizationOffset(),
137 weightsData, weightsInfo.GetQuantizationScale(), weightsInfo.GetQuantizationOffset(),
139 outputInfo.GetQuantizationScale(), outputInfo.GetQuantizationOffset(), weightsInfo);
143 EthosnRefWinogradConvImpl<armnn::Convolution2dQueueDescriptor, int16_t, int16_t, int32_t>(
145 inputData, inputInfo.GetQuantizationScale(), inputInfo.GetQuantizationOffset(),
146 weightsData, weightsInfo.GetQuantizationScale(), weightsInfo.GetQuantizationOffset(),
148 outputInfo.GetQuantizationScale(), outputInfo.GetQuantizationOffset(), weightsInfo);
152 const int8_t* inputData = GetInputTensorData<int8_t>(0,
m_Data);
153 const int8_t* weightsData = m_Weight->template GetConstTensor<int8_t>();
154 const int32_t* biasData = m_Data.m_Parameters.m_BiasEnabled ? m_Bias->template GetConstTensor<int32_t>() :
nullptr;
155 const TensorInfo& outputInfo =
GetTensorInfo(m_Data.m_Outputs[0]);
157 if(useWinograd ==
false)
159 EthosnRefConvImpl<armnn::Convolution2dQueueDescriptor, int8_t, int8_t, int32_t, int32_t>(
161 inputData, inputInfo.GetQuantizationScale(), inputInfo.GetQuantizationOffset(),
162 weightsData, weightsInfo.GetQuantizationScale(), weightsInfo.GetQuantizationOffset(),
164 outputInfo.GetQuantizationScale(), outputInfo.GetQuantizationOffset(), weightsInfo);
168 EthosnRefWinogradConvImpl<armnn::Convolution2dQueueDescriptor, int8_t, int8_t, int32_t>(
170 inputData, inputInfo.GetQuantizationScale(), inputInfo.GetQuantizationOffset(),
171 weightsData, weightsInfo.GetQuantizationScale(), weightsInfo.GetQuantizationOffset(),
173 outputInfo.GetQuantizationScale(), outputInfo.GetQuantizationOffset(), weightsInfo);
179 const uint8_t* inputData = GetInputTensorData<uint8_t>(0,
m_Data);
180 const uint8_t* weightsData = m_Weight->template GetConstTensor<uint8_t>();
181 const int32_t* biasData = m_Data.m_Parameters.m_BiasEnabled ? m_Bias->template GetConstTensor<int32_t>() :
nullptr;
182 const TensorInfo& outputInfo =
GetTensorInfo(m_Data.m_Outputs[0]);
184 if(useWinograd ==
false)
186 EthosnRefConvImpl<armnn::Convolution2dQueueDescriptor, uint8_t, uint8_t, int32_t, int32_t>(
188 inputData, inputInfo.GetQuantizationScale(), inputInfo.GetQuantizationOffset(),
189 weightsData, weightsInfo.GetQuantizationScale(), weightsInfo.GetQuantizationOffset(),
191 outputInfo.GetQuantizationScale(), outputInfo.GetQuantizationOffset(), weightsInfo);
195 EthosnRefWinogradConvImpl<armnn::Convolution2dQueueDescriptor, uint8_t, uint8_t, int32_t>(
197 inputData, inputInfo.GetQuantizationScale(), inputInfo.GetQuantizationOffset(),
198 weightsData, weightsInfo.GetQuantizationScale(), weightsInfo.GetQuantizationOffset(),
200 outputInfo.GetQuantizationScale(), outputInfo.GetQuantizationOffset(), weightsInfo);
bool m_BiasEnabled
Enable/disable bias.
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
LayerDescriptor m_Parameters
uint32_t DivideRoundUp(uint32_t numerator, uint32_t denominator)
bool CheckDataType(DataType type, DataType inputType, DataType weightsType)
uint32_t m_StrideX
Stride value when proceeding through input for the width dimension.
Convolution2dQueueDescriptor m_Data
Provides access to the appropriate indexes for Channels, Height and Width based on DataLayout...
uint32_t m_StrideY
Stride value when proceeding through input for the height dimension.
#define ARMNN_SCOPED_PROFILING_EVENT_ETHOSN(name)
std::vector< ITensorHandle * > m_Outputs
std::vector< ITensorHandle * > m_Inputs
const TensorInfo & GetTensorInfo(const ITensorHandle *tensorHandle)
float32 helpers