15 static inline std::string Split(
const std::string& s,
const std::string& delim, std::size_t& pos)
17 if (pos >= s.length())
22 std::size_t end = s.find(delim, pos);
23 if (end == std::string::npos)
28 std::string str = s.substr(pos, end - pos);
38 m_Weight = std::make_unique<ScopedCpuTensorHandle>(*(descriptor.
m_Weight));
42 m_Bias = std::make_unique<ScopedCpuTensorHandle>(*(descriptor.
m_Bias));
45 m_Winograd = winograd;
47 m_IsBlockConfigsWinograd2dCompatible =
false;
50 while (!(part = Split(BlockConfigs,
",", pos)).empty())
54 m_IsBlockConfigsWinograd2dCompatible =
true;
56 else if (part ==
"8x16")
58 m_IsBlockConfigsWinograd2dCompatible =
true;
60 else if (part ==
"8x8")
62 m_IsBlockConfigsWinograd2dCompatible =
true;
65 if (BlockConfigs ==
"")
67 m_IsBlockConfigsWinograd2dCompatible =
true;
77 const TensorInfo& weightsInfo = m_Weight->GetTensorInfo();
79 bool useWinograd =
false;
81 if (m_Winograd ==
true) {
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>(
139 outputInfo.GetQuantizationScale(), outputInfo.GetQuantizationOffset(), weightsInfo);
143 EthosnRefWinogradConvImpl<armnn::Convolution2dQueueDescriptor, int16_t, int16_t, int32_t>(
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>();
157 if(useWinograd ==
false)
159 EthosnRefConvImpl<armnn::Convolution2dQueueDescriptor, int8_t, int8_t, int32_t, int32_t>(
164 outputInfo.GetQuantizationScale(), outputInfo.GetQuantizationOffset(), weightsInfo);
168 EthosnRefWinogradConvImpl<armnn::Convolution2dQueueDescriptor, int8_t, int8_t, int32_t>(
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>();
184 if(useWinograd ==
false)
186 EthosnRefConvImpl<armnn::Convolution2dQueueDescriptor, uint8_t, uint8_t, int32_t, int32_t>(
191 outputInfo.GetQuantizationScale(), outputInfo.GetQuantizationOffset(), weightsInfo);
195 EthosnRefWinogradConvImpl<armnn::Convolution2dQueueDescriptor, uint8_t, uint8_t, int32_t>(
200 outputInfo.GetQuantizationScale(), outputInfo.GetQuantizationOffset(), weightsInfo);
bool m_BiasEnabled
Enable/disable bias.
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
unsigned int GetWidthIndex() const
const TensorShape & GetShape() const
virtual void Execute() const override
EthosnRefConvolution2dWorkload(const Convolution2dQueueDescriptor &descriptor, const WorkloadInfo &info, bool winograd=false, std::string BlockConfigs="")
const ConstTensorHandle * m_Weight
const ConstTensorHandle * m_Bias
Copyright (c) 2021 ARM Limited and Contributors.
LayerDescriptor m_Parameters
unsigned int GetHeightIndex() const
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.
int32_t GetQuantizationOffset() const
float GetQuantizationScale() const
Convolution2dQueueDescriptor m_Data
DataType GetDataType() const
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
Contains information about TensorInfos of a layer.
std::vector< ITensorHandle * > m_Inputs
const TensorInfo & GetTensorInfo(const ITensorHandle *tensorHandle)
float32 helpers