20 #include <fmt/format.h>
30 switch (inputDataType)
32 case DataType::Float16:
33 return DataType::Float16;
35 case DataType::Float32:
36 return DataType::Float32;
37 case DataType::QAsymmS8:
38 case DataType::QAsymmU8:
39 case DataType::QSymmS8:
40 case DataType::QSymmS16:
41 return DataType::Signed32;
53 std::string to_string(T value)
55 std::ostringstream os;
61 void ValidatePointer(
const void* ptr, std::string
const& descName, std::string
const& paramName)
66 paramName +
" parameter must be set.");
71 void ValidateTensorShapesMatch(
const TensorInfo& first,
73 std::string
const& descName,
74 std::string
const& firstName,
75 std::string
const& secondName)
80 + firstName +
" & " + secondName +
" must have identical shapes");
85 void ValidateNumInputs(
const WorkloadInfo& workloadInfo, std::string
const& descName,
const unsigned int expectedSize)
90 ": Requires exactly " + to_string(expectedSize) +
"input(s). " +
96 void ValidateNumOutputs(
const WorkloadInfo& workloadInfo, std::string
const& descName,
const unsigned int expectedSize)
101 ": Requires exactly " + to_string(expectedSize) +
" output(s). " +
109 void ValidateTensorNumElements(
const TensorInfo& tensor,
110 std::string
const& descName,
111 unsigned int numElements,
112 std::string
const& tensorName)
118 tensorName +
" tensor.");
124 const std::string& descName, std::string
const& tensorName)
133 void ValidPerAxisQuantizedDataType(
const TensorInfo& tensor,
const std::string& descName,
const std::string& tensorName)
138 ": Expected data type which supports per-axis quantization scheme but got " +
144 void ValidateTensorQuantizationSpace(
const TensorInfo& first,
146 const std::string& descName,
147 std::string
const& firstName,
148 std::string
const& secondName)
160 if (firstDataType != secondDataType)
163 " must be of the same quantized type, " +
171 " must have the same quantization space, " +
180 void ValidateBiasTensorQuantization(
const TensorInfo& biasTensor,
182 const std::string& descName)
196 if (weightScales.size() != biasScales.size())
198 std::stringstream msg;
199 msg << descName <<
": Expected matching number of per-axis quantization scales for weights and bias, "
200 <<
"but got different values. This is currently unsupported: weights=" << weightScales.size()
201 <<
", biases=" << biasScales.size();
208 void ValidateTensors(
const std::vector<ITensorHandle*>& vec,
209 unsigned int numExpected,
210 const std::string& descName,
211 const std::string& varName)
213 if (vec.empty() && numExpected > 0)
218 for (
unsigned int i = 0; i < numExpected; ++i)
228 void ValidateBroadcastTensorShapesMatch(
const TensorInfo& first,
231 std::string
const& descName,
232 std::string
const& firstName,
233 std::string
const& secondName)
241 + firstName +
" & " + secondName
242 +
" must have the same number of dimensions in order to be broadcasted");
245 std::vector<uint32_t> outputDims(numDims, 0u);
246 for (uint32_t i = 0; i < numDims; i++)
249 const bool dimsNotOne = (first.
GetShape()[i] != 1) && (second.
GetShape()[i] != 1);
250 if (dimsNotEqual && dimsNotOne)
256 TensorShape broadcastShape =
TensorShape(armnn::numeric_cast<unsigned int>(outputDims.size()), outputDims.data());
257 if (broadcastShape != output.
GetShape())
260 + firstName +
" & " + secondName
261 +
" does not match the output shape");
266 void ValidateDataTypes(
const TensorInfo& info,
267 const std::vector<armnn::DataType>& supportedTypes,
268 std::string
const& descName)
270 auto iterator = std::find(supportedTypes.begin(), supportedTypes.end(),
info.GetDataType());
271 if (iterator == supportedTypes.end())
274 " is not supported.");
279 void ValidateTensorDataTypesMatch(
const TensorInfo& first,
281 std::string
const& descName,
282 std::string
const& firstName,
283 std::string
const& secondName)
288 " must have identical data types.");
293 void ValidateTensorNumElementsMatch(
const TensorInfo& first,
295 std::string
const& descName,
296 std::string
const& firstName,
297 std::string
const& secondName)
302 " must have the same number of elements.");
306 void ValidateWeightDataType(
const TensorInfo& inputInfo,
308 const std::string& descName)
313 const std::vector<DataType> validTypes =
320 ValidateDataTypes(weightInfo, validTypes, descName);
324 ValidateTensorDataTypesMatch(inputInfo, weightInfo, descName,
"input",
"weight");
328 void ValidatePerAxisQuantizationDimension(
const TensorInfo& tensorInfo,
329 const std::string& descName,
330 const std::string& tensorName)
336 "not set on tensor {1}.", descName, tensorName));
340 void ValidatePerAxisQuantizationOffset(
const TensorInfo& tensorInfo,
341 const std::string& descName,
342 const std::string& tensorName)
345 if (quantizationOffset != 0)
348 "{0}: Quantization offset for per-axis quantization expected to be 0 on tensor {1}, but got: {2}",
349 descName, tensorName, quantizationOffset));
353 void ValidatePerAxisQuantization(
const TensorInfo& inputInfo,
357 const std::string& descName)
364 const bool canHavePerAxisQuantization = (
IsQuantized8BitType(inputDataType)) && inputDataType == outputDataType;
366 if (!canHavePerAxisQuantization)
369 "{0}: Per-axis quantization parameters set on tensor {1}, but data type does not support "
370 "per-axis quantization.", descName,
"weight"));
374 ValidPerAxisQuantizedDataType(weightInfo, descName,
"weight");
375 ValidatePerAxisQuantizationDimension(weightInfo, descName,
"weight");
376 ValidatePerAxisQuantizationOffset(weightInfo, descName,
"weight");
384 "{}: Per-axis quantization parameters not set on bias tensor, "
385 "despite being set on weight tensor.", descName));
388 ValidateTensorDataType(biasInfo, DataType::Signed32, descName,
"bias");
389 ValidatePerAxisQuantizationDimension(biasInfo, descName,
"bias");
390 ValidatePerAxisQuantizationOffset(biasInfo, descName,
"bias");
399 std::string
const& descName,
400 unsigned int numDimensions,
401 std::string
const& tensorName)
const
408 unsigned int squeezedDims = 0;
417 if (tensor.
GetNumDimensions() < numDimensions || squeezedDims > numDimensions)
421 tensorName +
" tensor.");
430 tensorName +
" tensor.");
437 unsigned int numDimension,
438 unsigned int numElements,
439 std::string
const& tensorName)
const
441 const std::string functionName{
"ValidateTensorNumDimNumElem"};
443 ValidateTensorNumElements(tensorInfo, functionName, numElements, tensorName);
448 unsigned int numExpectedIn,
unsigned int numExpectedOut)
const
450 ValidateTensors(
m_Inputs, numExpectedIn, descName,
"input");
451 ValidateTensors(
m_Outputs, numExpectedOut, descName,
"output");
457 const std::string descriptorName{
"MapQueueDescriptor"};
459 ValidateNumInputs(workloadInfo, descriptorName, 1);
460 ValidateNumOutputs(workloadInfo, descriptorName, 0);
462 for (
unsigned int i = 0; i <
m_Inputs.size(); ++i)
467 fmt::format(
"{}: Invalid NULL input {}.", descriptorName,
static_cast<int>(i)));
475 const std::string descriptorName{
"UnmapQueueDescriptor"};
477 ValidateNumInputs(workloadInfo, descriptorName, 1);
478 ValidateNumOutputs(workloadInfo, descriptorName, 0);
480 for (
unsigned int i = 0; i <
m_Inputs.size(); ++i)
485 fmt::format(
"{}: Invalid NULL input {}.", descriptorName,
static_cast<int>(i)));
493 const std::string descriptorName{
"MemCopyQueueDescriptor"};
495 ValidateNumInputs(workloadInfo, descriptorName, 1);
496 ValidateNumOutputs(workloadInfo, descriptorName , 1);
501 ValidateTensorNumElementsMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
502 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
507 "{0}: Number of inputs ({1}) does not match the number of outputs ({2}).",
511 for (
unsigned int i = 0; i <
m_Inputs.size(); ++i)
516 "{0}: Invalid NULL input {1}.", descriptorName, i));
529 ValidateNumInputs(workloadInfo,
"MemImportQueueDescriptor", 1);
530 ValidateNumOutputs(workloadInfo,
"MemImportQueueDescriptor" , 1);
542 "Number of input infos ({0}) does not match the number of output infos ({1})",
552 "Number of elements for tensor input and output {} does not match", i ));
564 "Number of inputs ({0}) does not match the number of outputs ({1})",
568 for (
unsigned int i = 0; i <
m_Inputs.size(); ++i)
585 ValidateNumInputs(workloadInfo,
"MemSyncQueueDescriptor", 1);
606 const std::string descriptorName{
"ActivationQueueDescriptor"};
608 ValidateNumInputs(workloadInfo, descriptorName, 1);
609 ValidateNumOutputs(workloadInfo, descriptorName, 1);
614 std::vector<DataType> supportedTypes =
624 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
625 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
626 ValidateTensorShapesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
631 const std::string descriptorName{
"ArgMinMaxQueueDescriptor"};
633 ValidateNumInputs(workloadInfo, descriptorName, 1);
634 ValidateNumOutputs(workloadInfo, descriptorName, 1);
645 std::vector<DataType> supportedInputTypes =
657 ValidateDataTypes(inputTensorInfo, supportedInputTypes, descriptorName);
659 auto inputShape = inputTensorInfo.
GetShape();
660 auto outputShape = outputTensorInfo.
GetShape();
665 const std::string outputShapeError{
": Output tensor shape does not match shape inferred from input tensor."};
668 if (inputShape.GetNumDimensions() == 1)
670 if (outputShape.GetNumDimensions() != 1 && outputShape[0] != 1)
677 for (
unsigned int i = 0; i < unsignedAxis; ++i)
679 if (outputShape[i] != inputShape[i])
685 for (
auto i = unsignedAxis + 1; i < inputNumDimensions; ++i)
687 if (outputShape[i - 1] != inputShape[i])
697 const std::string descriptorName{
"CastQueueDescriptor"};
699 ValidateNumInputs(workloadInfo, descriptorName, 1);
700 ValidateNumOutputs(workloadInfo, descriptorName, 1);
705 std::vector<DataType> supportedTypes =
719 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
720 ValidateTensorShapesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
725 const std::string descriptorName{
"SoftmaxQueueDescriptor"};
727 ValidateNumInputs(workloadInfo, descriptorName, 1);
728 ValidateNumOutputs(workloadInfo, descriptorName, 1);
733 std::vector<DataType> supportedTypes =
743 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
744 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
745 ValidateTensorShapesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
750 const std::string descriptorName{
"SplitterQueueDescriptor"};
752 ValidateNumInputs(workloadInfo, descriptorName, 1);
755 std::vector<DataType> supportedTypes =
771 ValidateDataTypes(outputTensorInfo, supportedTypes, descriptorName);
773 const std::string outputName =
"output_" + std::to_string(i);
774 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input", outputName);
785 descriptorName +
": Number of split windows "
786 "has to match number of workloadInfo.m_OutputTensorInfos. "
787 "Number of windows: " +
789 ". Number of workloadInfo.m_OutputTensorInfos: " + to_string(workloadInfo.
m_OutputTensorInfos.size()));
801 "have the same dimensionality as the input tensor. "
802 "Window origin (index: " +
803 to_string(w) +
") has " + to_string(e.
m_Origin.size()) +
804 " dimensions, the input "
806 to_string(inputDims) +
" dimensions.");
808 for (
unsigned int i = 0; i < e.
m_Origin.size(); ++i)
814 "be smaller or equal than the size of the input in that coord.");
822 const std::string descriptorName{
"ConcatQueueDescriptor"};
824 ValidateNumOutputs(workloadInfo, descriptorName, 1);
857 descriptorName +
": Number of split windows "
858 "has to match number of workloadInfo.m_InputTensorInfos. "
859 "Number of windows: " +
861 ". Number of workloadInfo.m_InputTensorInfos: " + to_string(workloadInfo.
m_InputTensorInfos.size()));
870 if (e.
m_Origin.size() != outputDims)
873 "have the same dimensionality as the output tensor. "
874 "Window origin (index: " +
875 to_string(w) +
") has " + to_string(e.
m_Origin.size()) +
876 " dimensions, the output "
878 to_string(outputDims) +
" dimensions.");
881 for (
unsigned int i = 0; i < e.
m_Origin.size(); ++i)
887 "be smaller or equal than the size of the output in that coord.");
893 std::vector<DataType> supportedTypes =
909 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
911 const std::string inputName =
"input_" + std::to_string(i);
912 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName, inputName,
"output");
918 const std::string descriptorName{
"StackQueueDescriptor"};
920 ValidateNumOutputs(workloadInfo, descriptorName, 1);
947 "than the number of input dimensions.");
954 if (outputShape[i] != inputShape[i])
957 "match shape inferred from input tensor.");
964 "match shape inferred from input tensor.");
969 if (outputShape[i] != inputShape[i-1])
972 "match shape inferred from input tensor.");
982 std::vector<DataType> supportedTypes =
995 ValidateDataTypes(workloadInfo.
m_InputTensorInfos[0], supportedTypes, descriptorName);
1003 "input_" + std::to_string(i));
1015 const std::string descriptorName{
"FillQueueDescriptor"};
1017 ValidateNumInputs(workloadInfo, descriptorName, 1);
1018 ValidateNumOutputs(workloadInfo, descriptorName, 1);
1025 std::vector<DataType> supportedTypes =
1033 ValidateDataTypes(outputTensorInfo, supportedTypes, descriptorName);
1038 const std::string descriptorName{
"FullyConnectedQueueDescriptor"};
1040 uint32_t numInputs = 2;
1046 ValidateNumInputs(workloadInfo, descriptorName, numInputs);
1047 ValidateNumOutputs(workloadInfo, descriptorName, 1);
1066 ValidateBiasTensorQuantization(biasTensorInfo, weightTensorInfo, descriptorName);
1072 std::vector<DataType> supportedTypes =
1083 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
1091 "for BFloat16 input.");
1096 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
1107 const std::string descriptorName{
"NormalizationQueueDescriptor"};
1109 ValidateNumInputs(workloadInfo, descriptorName, 1);
1110 ValidateNumOutputs(workloadInfo, descriptorName, 1);
1116 std::vector<DataType> supportedTypes =
1126 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
1128 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
1130 ValidateTensorShapesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
1135 const std::string descriptorName{
"AdditionQueueDescriptor"};
1137 ValidateNumInputs(workloadInfo, descriptorName, 2);
1138 ValidateNumOutputs(workloadInfo, descriptorName, 1);
1144 std::vector<DataType> supportedTypes =
1155 ValidateDataTypes(inputTensorInfo0, supportedTypes, descriptorName);
1156 ValidateDataTypes(inputTensorInfo1, supportedTypes, descriptorName);
1157 ValidateDataTypes(outputTensorInfo, supportedTypes, descriptorName);
1159 ValidateTensorDataTypesMatch(inputTensorInfo0, inputTensorInfo1, descriptorName,
"input_0",
"input_1");
1160 ValidateTensorDataTypesMatch(inputTensorInfo1, outputTensorInfo, descriptorName,
"input_1",
"output");
1162 ValidateBroadcastTensorShapesMatch(inputTensorInfo0,
1172 const std::string descriptorName{
"MultiplicationQueueDescriptor"};
1174 ValidateNumInputs(workloadInfo, descriptorName, 2);
1175 ValidateNumOutputs(workloadInfo, descriptorName, 1);
1181 std::vector<DataType> supportedTypes =
1192 ValidateDataTypes(inputTensorInfo0, supportedTypes, descriptorName);
1193 ValidateDataTypes(inputTensorInfo1, supportedTypes, descriptorName);
1194 ValidateDataTypes(outputTensorInfo, supportedTypes, descriptorName);
1196 ValidateTensorDataTypesMatch(inputTensorInfo0, inputTensorInfo1, descriptorName,
"input_0",
"input_1");
1197 ValidateTensorDataTypesMatch(inputTensorInfo1, outputTensorInfo, descriptorName,
"input_1",
"output");
1199 ValidateBroadcastTensorShapesMatch(inputTensorInfo0,
1209 const std::string descriptorName{
"BatchNormalizationQueueDescriptor"};
1211 ValidateNumInputs(workloadInfo, descriptorName, 1);
1212 ValidateNumOutputs(workloadInfo, descriptorName, 1);
1217 std::vector<DataType> supportedTypes =
1227 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
1228 ValidateDataTypes(outputTensorInfo, supportedTypes, descriptorName);
1230 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
1231 ValidateTensorShapesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
1233 ValidatePointer(
m_Mean, descriptorName,
"mean");
1234 ValidatePointer(
m_Variance, descriptorName,
"variance");
1235 ValidatePointer(
m_Beta, descriptorName,
"beta");
1236 ValidatePointer(
m_Gamma, descriptorName,
"gamma");
1248 ValidateTensorShapesMatch(mean, variance, descriptorName,
"mean",
"variance");
1249 ValidateTensorShapesMatch(mean, beta, descriptorName,
"mean",
"beta");
1250 ValidateTensorShapesMatch(mean, gamma, descriptorName,
"mean",
"gamma");
1255 const std::string descriptorName{
"Convolution2dQueueDescriptor"};
1257 uint32_t numInputs = 2;
1263 ValidateNumInputs(workloadInfo, descriptorName, numInputs);
1264 ValidateNumOutputs(workloadInfo, descriptorName, 1);
1276 ValidateWeightDataType(inputTensorInfo, weightTensorInfo, descriptorName);
1281 optionalBiasTensorInfo = MakeOptional<TensorInfo>(workloadInfo.
m_InputTensorInfos[2]);
1285 ValidateBiasTensorQuantization(biasTensorInfo, weightTensorInfo, descriptorName);
1291 fmt::format(
"{}: strideX (provided {}) and strideY (provided {}) "
1292 "cannot be either negative or 0.",
1296 ValidatePerAxisQuantization(inputTensorInfo,
1299 optionalBiasTensorInfo,
1302 std::vector<DataType> supportedTypes =
1313 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
1321 "for BFloat16 input.");
1326 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
1332 const std::string descriptorName{
"Convolution3dQueueDescriptor"};
1334 uint32_t numInputs = 2;
1339 ValidateNumInputs(workloadInfo, descriptorName, numInputs);
1340 ValidateNumOutputs(workloadInfo, descriptorName, 1);
1351 ValidateWeightDataType(inputTensorInfo, weightTensorInfo, descriptorName);
1356 optionalBiasTensorInfo = MakeOptional<TensorInfo>(workloadInfo.
m_InputTensorInfos[2]);
1360 ValidateBiasTensorQuantization(biasTensorInfo, weightTensorInfo, descriptorName);
1366 fmt::format(
"{}: strideX (provided {}), strideY (provided {}) or strideZ (provided {})"
1367 "cannot be either negative or 0.",
1371 ValidatePerAxisQuantization(inputTensorInfo,
1374 optionalBiasTensorInfo,
1377 std::vector<DataType> supportedTypes =
1388 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
1389 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
1394 const std::string descriptorName{
"DepthwiseConvolution2dQueueDescriptor"};
1396 uint32_t numInputs = 2;
1402 ValidateNumInputs(workloadInfo, descriptorName, numInputs);
1403 ValidateNumOutputs(workloadInfo, descriptorName, 1);
1417 fmt::format(
"{}: dilationX (provided {}) and dilationY (provided {}) "
1418 "cannot be smaller than 1.",
1425 fmt::format(
"{}: strideX (provided {}) and strideY (provided {}) "
1426 "cannot be either negative or 0.",
1430 if (weightTensorInfo.
GetShape()[0] != 1)
1433 "{0}: The weight format in armnn is expected to be [1, H, W, Cout]."
1434 "But first dimension is not equal to 1. Provided weight shape: [{1}, {2}, {3}, {4}]",
1443 const unsigned int numWeightOutputChannelsRefFormat = weightTensorInfo.
GetShape()[3];
1444 const unsigned int numWeightOutputChannelsAclFormat = weightTensorInfo.
GetShape()[1];
1445 const unsigned int numOutputChannels = outputTensorInfo.
GetShape()[channelIndex];
1448 bool validRefFormat = (numWeightOutputChannelsRefFormat == numOutputChannels);
1449 bool validAclFormat = (numWeightOutputChannelsAclFormat == numOutputChannels);
1451 if (!(validRefFormat || validAclFormat))
1454 "{0}: The weight format in armnn is expected to be [1, H, W, Cout] (CpuRef) or [1, Cout, H, W] "
1455 "(CpuAcc/GpuAcc). But neither the 4th (CpuRef) or 2nd (CpuAcc/GpuAcc) dimension is equal to Cout."
1456 "Cout = {1} Provided weight shape: [{2}, {3}, {4}, {5}]",
1465 ValidateWeightDataType(inputTensorInfo, weightTensorInfo, descriptorName);
1470 optionalBiasTensorInfo = MakeOptional<TensorInfo>(workloadInfo.
m_InputTensorInfos[2]);
1473 ValidateBiasTensorQuantization(biasTensorInfo, weightTensorInfo, descriptorName);
1476 ValidatePerAxisQuantization(inputTensorInfo,
1479 optionalBiasTensorInfo,
1482 std::vector<DataType> supportedTypes =
1492 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
1493 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
1498 const std::string descriptorName{
"PermuteQueueDescriptor"};
1500 ValidateNumInputs(workloadInfo, descriptorName, 1);
1501 ValidateNumOutputs(workloadInfo, descriptorName, 1);
1511 for (
unsigned int i = 0u; i < mapping.
GetSize(); ++i)
1513 if (inputTensorInfo.
GetShape()[i] != outputTensorInfo.
GetShape()[mapping[i]])
1516 " (=" + to_string(inputTensorInfo.
GetShape()[i]) +
") " +
1517 "must match dst dimension " + to_string(mapping[i]) +
1518 " (=" + to_string(outputTensorInfo.
GetShape()[mapping[i]]) +
")");
1522 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
1527 const std::string descriptorName{
"Pooling2dQueueDescriptor"};
1529 ValidateNumInputs(workloadInfo, descriptorName, 1);
1530 ValidateNumOutputs(workloadInfo, descriptorName, 1);
1538 std::vector<DataType> supportedTypes =
1548 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
1549 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
1554 const std::string descriptorName{
"Pooling3dQueueDescriptor"};
1556 ValidateNumInputs(workloadInfo, descriptorName, 1);
1557 ValidateNumOutputs(workloadInfo, descriptorName, 1);
1565 std::vector<DataType> supportedTypes =
1575 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
1576 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
1581 const std::string descriptorName{
"ResizeQueueDescriptor"};
1583 ValidateNumInputs(workloadInfo, descriptorName, 1);
1584 ValidateNumOutputs(workloadInfo, descriptorName, 1);
1592 std::vector<DataType> supportedTypes =
1603 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
1604 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
1607 const unsigned int inputBatchSize = inputTensorInfo.
GetShape()[0];
1608 const unsigned int outputBatchSize = outputTensorInfo.
GetShape()[0];
1609 if (inputBatchSize != outputBatchSize)
1612 fmt::format(
"{}: Input batch size ({}) does not match output batch size ({})",
1613 descriptorName, inputBatchSize, outputBatchSize));
1619 if (inputChannelCount != outputChannelCount)
1622 fmt::format(
"{}: Input channel count ({}) does not match output channel count ({})",
1623 descriptorName, inputChannelCount, outputChannelCount));
1629 const std::string descriptorName{
"ReverseV2QueueDescriptor"};
1632 const unsigned int maxDimensions = 4;
1634 ValidateNumInputs(workloadInfo, descriptorName, 2);
1635 ValidateNumOutputs(workloadInfo, descriptorName, 1);
1642 if (inputTensorNumDimensions > maxDimensions)
1645 ": Input tensors with rank greater than " +
1646 std::to_string(maxDimensions) +
" are not supported.");
1650 if (axisTensorNumDimensions > maxDimensions)
1653 ": More than " + std::to_string(maxDimensions) +
" axes cannot be specified.");
1656 if (axisTensorNumDimensions > inputTensorNumDimensions)
1659 ": More axes specified than the number of axes on the input tensor.");
1662 std::vector<DataType> supportedTypes =
1675 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
1677 std::vector<DataType> axisSupportedTypes =
1682 ValidateDataTypes(axisTensorInfo, axisSupportedTypes, descriptorName);
1684 ValidateTensorShapesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
1685 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
1690 const std::string descriptorName{
"FakeQuantizationQueueDescriptor"};
1692 ValidateNumInputs(workloadInfo, descriptorName, 1);
1693 ValidateNumOutputs(workloadInfo, descriptorName, 1);
1701 ValidateTensorShapesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
1711 const std::string descriptorName{
"InstanceNormalizationQueueDescriptor"};
1713 ValidateNumInputs(workloadInfo, descriptorName, 1);
1714 ValidateNumOutputs(workloadInfo, descriptorName, 1);
1724 ValidateTensorShapesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
1727 std::vector<DataType> supportedTypes =
1734 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
1735 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
1740 const std::string descriptorName{
"L2NormalizationQueueDescriptor"};
1742 ValidateNumInputs(workloadInfo, descriptorName, 1);
1743 ValidateNumOutputs(workloadInfo, descriptorName, 1);
1753 ValidateTensorShapesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
1756 std::vector<DataType> supportedTypes =
1766 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
1767 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
1772 const std::string descriptorName{
"LogSoftmaxQueueDescriptor"};
1774 ValidateNumInputs(workloadInfo, descriptorName, 1);
1775 ValidateNumOutputs(workloadInfo, descriptorName, 1);
1780 ValidateTensorShapesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
1782 std::vector<DataType> supportedTypes =
1791 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
1792 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
1797 const std::string descriptorName{
"ConstantQueueDescriptor"};
1799 ValidateNumInputs(workloadInfo, descriptorName, 0);
1800 ValidateNumOutputs(workloadInfo, descriptorName, 1);
1811 std::vector<DataType> supportedTypes =
1824 ValidateDataTypes(outputTensorInfo, supportedTypes, descriptorName);
1829 const std::string descriptorName{
"ReshapeQueueDescriptor"};
1831 ValidateNumInputs(workloadInfo, descriptorName, 1);
1832 ValidateNumOutputs(workloadInfo, descriptorName, 1);
1837 ValidateTensorNumElementsMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
1840 std::vector<DataType> supportedTypes =
1852 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
1853 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
1858 const std::string descriptorName{
"SpaceToBatchNdQueueDescriptor"};
1860 ValidateNumInputs(workloadInfo, descriptorName, 1);
1861 ValidateNumOutputs(workloadInfo, descriptorName, 1);
1869 "dimensions as Block Shape.");
1891 const unsigned int inputWidth = (inputTensorInfo.
GetNumDimensions() == 3) ? 1 :
1896 const unsigned int channelsIndex = channelsIndex_int < 0 ?
1897 static_cast<unsigned int>(channelsIndex_int) + inputTensorInfo.
GetNumDimensions()
1898 :
static_cast<unsigned int>(channelsIndex_int);
1900 const unsigned int numInputElements = inputTensorInfo.
GetShape()[0] *
1903 inputTensorInfo.
GetShape()[channelsIndex];
1908 to_string(numInputElements) +
" after padding but output tensor has " +
1917 unsigned int spatialDimension = firstSpatialDimension + i;
1918 auto inputSize = inputTensorInfo.
GetShape()[spatialDimension] +
1924 "divisible by Block Shape in dimension: " + to_string(spatialDimension) +
".");
1928 std::vector<DataType> supportedTypes =
1938 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
1939 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
1944 const std::string descriptorName{
"SpaceToDepthQueueDescriptor"};
1946 ValidateNumInputs(workloadInfo, descriptorName, 1);
1947 ValidateNumOutputs(workloadInfo, descriptorName, 1);
1955 std::vector<DataType> supportedTypes =
1967 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
1968 ValidateDataTypes(outputTensorInfo, supportedTypes, descriptorName);
1970 ValidateTensorNumElementsMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
1978 const unsigned int wIndex = dimensionIndices.
GetWidthIndex();
1986 "by block size in all spatial dimensions");
1993 "must be divisible by the square of block size." );
1999 const std::string descriptorName{
"FloorQueueDescriptor"};
2001 ValidateNumInputs(workloadInfo, descriptorName, 1);
2002 ValidateNumOutputs(workloadInfo, descriptorName, 1);
2007 std::vector<DataType> supportedTypes =
2015 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
2016 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
2017 ValidateTensorShapesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
2018 ValidateTensorQuantizationSpace(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
2025 const std::string descriptorName{
"LstmQueueDescriptor"};
2037 std::vector<DataType> supportedTypes =
2046 ValidateDataTypes(workloadInfo.
m_InputTensorInfos[0], supportedTypes, descriptorName);
2055 "input_" + std::to_string(i));
2062 "LstmQueueDescriptor",
2064 "output_" + std::to_string(i));
2089 descriptorName +
" input_0");
2092 descriptorName +
" input_1");
2095 descriptorName +
" input_2");
2099 descriptorName +
" output_0");
2102 descriptorName +
" output_1");
2105 descriptorName +
" output_2");
2108 descriptorName +
" output_3");
2114 (n_cell * n_input),
"InputLayerNormWeights");
2119 (n_cell * n_input),
"InputToForgetWeights");
2123 (n_cell * n_input),
"InputToCellWeights");
2128 (n_cell * n_output),
"RecurrentToInputWeights");
2133 (n_cell * n_output),
"RecurrentToForgetWeights");
2137 (n_cell * n_output),
"RecurrentToCellWeights");
2145 if (!cifg_weights_all_or_none)
2148 "RecurrentToInputWeights must either both be present (regular LSTM) "
2149 "or both not present (CIFG-LSTM). In addition CifgEnable must be set "
2156 n_cell,
"CellToInputWeights");
2161 n_cell,
"CellToForgetWeights");
2166 n_cell,
"CellToOutputWeights");
2170 bool peephole_weights_all_or_none =
2175 if (!peephole_weights_all_or_none)
2193 "must be present.");
2196 n_cell,
"InputGateBias");
2202 ValidatePointer(
m_CellBias,
"Null pointer check",
"CellBias");
2211 (n_cell * n_output),
"ProjectionWeights");
2228 if (!projecton_tensors_consistent)
2261 "disabled but InputLayerNormWeights are not present");
2264 1, n_cell,
"InputLayerNormWeights");
2273 "ForgetLayerNormWeights");
2277 "OutputLayerNormWeights");
2281 "CellLayerNormWeights");
2287 "normalisation weights are present.");
2293 const std::string descriptorName{
"ConvertFp32ToFp16QueueDescriptor"};
2295 ValidateNumInputs(workloadInfo, descriptorName, 1);
2296 ValidateNumOutputs(workloadInfo, descriptorName, 1);
2311 ValidateTensorShapesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
2316 const std::string descriptorName{
"ConvertFp16ToFp32QueueDescriptor"};
2318 ValidateNumInputs(workloadInfo, descriptorName, 1);
2319 ValidateNumOutputs(workloadInfo, descriptorName, 1);
2334 ValidateTensorShapesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
2339 const std::string descriptorName{
"DivisionQueueDescriptor"};
2341 ValidateNumInputs(workloadInfo, descriptorName, 2);
2342 ValidateNumOutputs(workloadInfo, descriptorName, 1);
2348 std::vector<DataType> supportedTypes =
2359 ValidateDataTypes(inputTensorInfo0, supportedTypes, descriptorName);
2360 ValidateDataTypes(inputTensorInfo1, supportedTypes, descriptorName);
2361 ValidateDataTypes(outputTensorInfo, supportedTypes, descriptorName);
2363 ValidateBroadcastTensorShapesMatch(inputTensorInfo0,
2373 const std::string descriptorName{
"SubtractionQueueDescriptor"};
2375 ValidateNumInputs(workloadInfo, descriptorName, 2);
2376 ValidateNumOutputs(workloadInfo, descriptorName, 1);
2382 std::vector<DataType> supportedTypes =
2393 ValidateDataTypes(inputTensorInfo0, supportedTypes, descriptorName);
2394 ValidateDataTypes(inputTensorInfo1, supportedTypes, descriptorName);
2395 ValidateDataTypes(outputTensorInfo, supportedTypes, descriptorName);
2397 ValidateBroadcastTensorShapesMatch(inputTensorInfo0,
2407 const std::string descriptorName{
"MaximumQueueDescriptor"};
2409 ValidateNumInputs(workloadInfo, descriptorName, 2);
2410 ValidateNumOutputs(workloadInfo, descriptorName, 1);
2416 std::vector<DataType> supportedTypes =
2427 ValidateDataTypes(inputTensorInfo0, supportedTypes, descriptorName);
2428 ValidateDataTypes(inputTensorInfo1, supportedTypes, descriptorName);
2429 ValidateDataTypes(outputTensorInfo, supportedTypes, descriptorName);
2431 ValidateBroadcastTensorShapesMatch(inputTensorInfo0,
2441 const std::string descriptorName{
"MeanQueueDescriptor"};
2443 ValidateNumInputs(workloadInfo, descriptorName, 1);
2444 ValidateNumOutputs(workloadInfo, descriptorName, 1);
2449 std::vector<DataType> supportedTypes =
2462 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
2463 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
2475 unsigned int outputDim =
2479 outputDim > 0 ? outputDim : 1,
2486 const std::string descriptorName{
"PadQueueDescriptor"};
2488 ValidateNumInputs(workloadInfo, descriptorName, 1);
2489 ValidateNumOutputs(workloadInfo, descriptorName, 1);
2500 "as there are dimensions in the input tensor that is " +
2508 const std::string descriptorName{
"QuantizeQueueDescriptor"};
2510 ValidateNumInputs(workloadInfo, descriptorName, 1);
2511 ValidateNumOutputs(workloadInfo, descriptorName, 1);
2516 std::vector<DataType> supportedTypes =
2527 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
2537 const std::string descriptorName{
"BatchToSpaceNdQueueDescriptor"};
2539 ValidateNumInputs(workloadInfo, descriptorName, 1);
2540 ValidateNumOutputs(workloadInfo, descriptorName, 1);
2548 "dimensions as Block Shape.");
2571 unsigned int spatialDimension = firstSpatialDimension + i;
2574 if (cropSize > outputSize)
2577 "outputSize in dimension: " + to_string(spatialDimension) +
".");
2581 std::vector<DataType> supportedTypes =
2591 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
2592 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
2597 const std::string descriptorName{
"StridedSliceQueueDescriptor"};
2599 ValidateNumInputs(workloadInfo, descriptorName, 1);
2600 ValidateNumOutputs(workloadInfo, descriptorName, 1);
2605 std::vector<DataType> supportedTypes =
2616 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
2617 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
2619 ValidateTensorQuantizationSpace(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
2655 const std::string descriptorName{
"MinimumQueueDescriptor"};
2657 ValidateNumInputs(workloadInfo, descriptorName, 2);
2658 ValidateNumOutputs(workloadInfo, descriptorName, 1);
2664 std::vector<DataType> supportedTypes =
2675 ValidateDataTypes(inputTensorInfo0, supportedTypes, descriptorName);
2676 ValidateDataTypes(inputTensorInfo1, supportedTypes, descriptorName);
2677 ValidateDataTypes(outputTensorInfo, supportedTypes, descriptorName);
2679 ValidateBroadcastTensorShapesMatch(inputTensorInfo0,
2689 const std::string descriptorName{
"DebugQueueDescriptor"};
2691 ValidateNumInputs(workloadInfo, descriptorName, 1);
2692 ValidateNumOutputs(workloadInfo, descriptorName, 1);
2697 const std::string descriptorName{
"EqualQueueDescriptor"};
2699 ValidateNumInputs(workloadInfo, descriptorName, 2);
2700 ValidateNumOutputs(workloadInfo, descriptorName, 1);
2706 ValidateBroadcastTensorShapesMatch(inputTensorInfo0,
2721 const std::string descriptorName{
"GreaterQueueDescriptor"};
2723 ValidateNumInputs(workloadInfo, descriptorName, 2);
2724 ValidateNumOutputs(workloadInfo, descriptorName, 1);
2730 ValidateBroadcastTensorShapesMatch(inputTensorInfo0,
2745 const std::string descriptorName{
"RsqrtQueueDescriptor"};
2747 ValidateNumInputs(workloadInfo, descriptorName, 1);
2748 ValidateNumOutputs(workloadInfo, descriptorName, 1);
2753 ValidateTensorShapesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
2755 std::vector<DataType> supportedTypes =
2765 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
2766 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
2771 const std::string descriptorName{
"GatherNdQueueDescriptor"};
2773 ValidateNumInputs(workloadInfo, descriptorName, 2);
2774 ValidateNumOutputs(workloadInfo, descriptorName, 1);
2785 std::vector<DataType> supportedTypes =
2797 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
2799 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
2807 const std::string descriptorName{
"GatherQueueDescriptor"};
2809 ValidateNumInputs(workloadInfo, descriptorName, 2);
2810 ValidateNumOutputs(workloadInfo, descriptorName, 1);
2821 std::vector<DataType> supportedTypes =
2833 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
2835 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
2843 const std::string& descriptorName{
"DetectionPostProcessQueueDescriptor"};
2845 ValidateNumInputs(workloadInfo, descriptorName, 2);
2871 const std::vector<DataType> supportedInputTypes =
2881 ValidateDataTypes(boxEncodingsInfo, supportedInputTypes, descriptorName);
2882 ValidateDataTypes(scoresInfo, supportedInputTypes, descriptorName);
2883 ValidateDataTypes(anchorsInfo, supportedInputTypes, descriptorName);
2891 ValidateTensorDataType(detectionBoxesInfo,
DataType::Float32, descriptorName,
"detection boxes");
2892 ValidateTensorDataType(detectionScoresInfo,
DataType::Float32, descriptorName,
"detection scores");
2893 ValidateTensorDataType(detectionClassesInfo,
DataType::Float32, descriptorName,
"detection classes");
2894 ValidateTensorDataType(numDetectionsInfo,
DataType::Float32, descriptorName,
"num detections");
2899 "must be positive and less than or equal to 1.");
2905 "should be equal to number of classes + 1.");
2911 const std::string& descriptorName{
"DequantizeQueueDescriptor"};
2913 ValidateNumInputs(workloadInfo, descriptorName, 1);
2914 ValidateNumOutputs(workloadInfo, descriptorName, 1);
2919 std::vector<DataType> inputSupportedTypes =
2927 ValidateDataTypes(inputTensorInfo, inputSupportedTypes, descriptorName);
2929 std::vector<DataType> outputSupportedTypes =
2936 ValidateDataTypes(outputTensorInfo, outputSupportedTypes, descriptorName);
2941 const std::string& descriptorName{
"MergeQueueDescriptor"};
2943 ValidateNumInputs(workloadInfo, descriptorName, 2);
2944 ValidateNumOutputs(workloadInfo, descriptorName, 1);
2950 ValidateTensorShapesMatch(inputTensorInfo0, inputTensorInfo1, descriptorName,
"input_0",
"input_1");
2951 ValidateTensorShapesMatch(inputTensorInfo0, outputTensorInfo, descriptorName,
"input_0",
"output");
2953 ValidateTensorDataTypesMatch(inputTensorInfo0, inputTensorInfo1, descriptorName,
"input_0",
"input_1");
2954 ValidateTensorDataTypesMatch(inputTensorInfo0, outputTensorInfo, descriptorName,
"input_0",
"output");
2959 const std::string& descriptorName{
"ShapeQueueDescriptor"};
2961 ValidateNumInputs(workloadInfo, descriptorName, 1);
2962 ValidateNumOutputs(workloadInfo, descriptorName, 1);
2967 std::vector<DataType> supportedTypes =
2979 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
2985 const std::string& descriptorName{
"SwitchQueueDescriptor"};
2987 ValidateNumInputs(workloadInfo, descriptorName, 2);
2988 ValidateNumOutputs(workloadInfo, descriptorName, 2);
2996 std::vector<DataType> supportedTypes =
3005 ValidateDataTypes(inputTensorInfo0, supportedTypes, descriptorName);
3006 ValidateDataTypes(inputTensorInfo1, supportedTypes, descriptorName);
3008 ValidateDataTypes(outputTensorInfo0, supportedTypes, descriptorName);
3009 ValidateDataTypes(outputTensorInfo1, supportedTypes, descriptorName);
3011 ValidateTensorShapesMatch(inputTensorInfo0,
3017 ValidateTensorShapesMatch(inputTensorInfo0,
3031 const std::string& descriptorName{
"PreluQueueDescriptor"};
3033 ValidateNumInputs(workloadInfo, descriptorName, 2);
3034 ValidateNumOutputs(workloadInfo, descriptorName, 1);
3040 std::vector<DataType> supportedTypes
3050 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
3051 ValidateDataTypes(alphaTensorInfo, supportedTypes, descriptorName);
3053 ValidateDataTypes(outputTensorInfo, supportedTypes, descriptorName);
3055 ValidateTensorDataTypesMatch(inputTensorInfo, alphaTensorInfo, descriptorName,
"input",
"alpha");
3056 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"ouptut");
3058 ValidateBroadcastTensorShapesMatch(inputTensorInfo,
3068 const std::string descriptorName{
"TransposeConvolution2dQueueDescriptor"};
3070 ValidateNumInputs(workloadInfo, descriptorName, 1);
3071 ValidateNumOutputs(workloadInfo, descriptorName, 1);
3079 ValidatePointer(
m_Weight, descriptorName,
"weight");
3084 ValidateWeightDataType(inputTensorInfo, weightTensorInfo, descriptorName);
3089 ValidatePointer(
m_Bias, descriptorName,
"bias");
3095 ValidateBiasTensorQuantization(biasTensorInfo, weightTensorInfo, descriptorName);
3098 ValidatePerAxisQuantization(inputTensorInfo,
3101 optionalBiasTensorInfo,
3104 std::vector<DataType> supportedTypes =
3114 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
3115 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
3120 const std::string descriptorName{
"TransposeQueueDescriptor"};
3122 ValidateNumInputs(workloadInfo, descriptorName, 1);
3123 ValidateNumOutputs(workloadInfo, descriptorName, 1);
3133 for (
unsigned int i = 0u; i < mapping.
GetSize(); ++i)
3135 if (inputTensorInfo.
GetShape()[mapping[i]] != outputTensorInfo.
GetShape()[i])
3138 " (=" + to_string(inputTensorInfo.
GetShape()[mapping[i]]) +
") " +
3139 "must match dst dimension " + to_string(i) +
3140 " (=" + to_string(outputTensorInfo.
GetShape()[i]) +
")");
3144 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
3149 const std::string descriptorName{
"TransposeQueueDescriptor"};
3151 ValidateNumInputs(workloadInfo, descriptorName, 1);
3152 ValidateNumOutputs(workloadInfo, descriptorName, 1);
3157 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
3162 const std::string descriptorName{
"QLstmQueueDescriptor"};
3165 ValidateNumInputs(workloadInfo, descriptorName, 3);
3166 ValidateNumOutputs(workloadInfo, descriptorName, 3);
3178 std::vector<DataType> inputOutputSupportedTypes =
3183 std::vector<DataType> cellStateSupportedTypes =
3188 std::vector<DataType> weightsSupportedTypes =
3193 std::vector<DataType> layerNormPeepholeWeightsSupportedTypes =
3198 std::vector<DataType> biasSupportedTypes =
3204 ValidateDataTypes(inputInfo, inputOutputSupportedTypes, descriptorName);
3205 ValidateDataTypes(outputStateInInfo, inputOutputSupportedTypes, descriptorName);
3206 ValidateDataTypes(cellStateInInfo, cellStateSupportedTypes, descriptorName);
3208 ValidateDataTypes(outputStateOutInfo, inputOutputSupportedTypes, descriptorName);
3209 ValidateDataTypes(cellStateOutInfo, cellStateSupportedTypes, descriptorName);
3210 ValidateDataTypes(outputInfo, inputOutputSupportedTypes, descriptorName);
3213 ValidateTensorDataTypesMatch(inputInfo, outputStateInInfo, descriptorName,
"input",
"outputStateIn");
3214 ValidateTensorDataTypesMatch(outputStateInInfo, outputStateOutInfo, descriptorName,
3215 "outputStateIn",
"outputStateOut");
3216 ValidateTensorDataTypesMatch(cellStateInInfo, cellStateOutInfo, descriptorName,
"cellStateIn",
"cellStateOut");
3219 const uint32_t numBatches = inputInfo.
GetShape()[0];
3220 const uint32_t inputSize = inputInfo.
GetShape()[1];
3221 const uint32_t outputSize = outputStateInInfo.GetShape()[1];
3222 const uint32_t numUnits = cellStateInInfo.GetShape()[1];
3249 " RecurrentToForgetWeights");
3260 ValidateDataTypes(inputToForgetWeightsInfo, weightsSupportedTypes, descriptorName);
3262 ValidateTensorDataTypesMatch(inputToForgetWeightsInfo, inputToCellWeightsInfo, descriptorName,
3263 "inputToForgetWeights",
"inputToCellWeights");
3264 ValidateTensorDataTypesMatch(inputToForgetWeightsInfo, inputToOutputWeightsInfo, descriptorName,
3265 "inputToForgetWeights",
"inputToOutputWeights");
3267 ValidateTensorDataTypesMatch(inputToForgetWeightsInfo, recurrentToForgetWeightsInfo, descriptorName,
3268 "inputToForgetWeights",
"recurrentToForgeteights");
3269 ValidateTensorDataTypesMatch(inputToForgetWeightsInfo, recurrentToCellWeightsInfo, descriptorName,
3270 "inputToForgetWeights",
"recurrentToCellWeights");
3271 ValidateTensorDataTypesMatch(inputToForgetWeightsInfo, recurrentToOutputWeightsInfo, descriptorName,
3272 "inputToForgetWeights",
"recurrentToOutputWeights");
3279 ValidatePointer(
m_CellBias, descriptorName,
"CellBias");
3288 ValidateDataTypes(forgetGateBiasInfo, biasSupportedTypes, descriptorName);
3290 ValidateTensorDataTypesMatch(forgetGateBiasInfo, cellBiasInfo, descriptorName,
3291 "forgetGateBias",
"cellBias");
3292 ValidateTensorDataTypesMatch(forgetGateBiasInfo, outputGateBiasInfo, descriptorName,
3293 "forgetGateBias",
"outputGateBias");
3301 if (!allCifgParamsPresentOrNot)
3304 ": InputToInputWeights, RecurrentToInputWeights and InputGateBias must either all be present "
3305 "(CIFG disabled) or not be present at all (CIFG enabled). m_Parameters.m_CifgEnabled should be "
3306 "set appropriately.");
3317 " RecurrentToInputWeights");
3323 ValidateTensorDataTypesMatch(inputToForgetWeightsInfo, inputToInputWeightsInfo, descriptorName,
3324 "inputToForgetWeights",
"inputToInputWeights");
3325 ValidateTensorDataTypesMatch(inputToForgetWeightsInfo, recurrentToInputWeightsInfo, descriptorName,
3326 "inputToForgetWeights",
"recurrentToInputWeights");
3327 ValidateTensorDataTypesMatch(forgetGateBiasInfo, inputGateBiasInfo, descriptorName,
3328 "forgetGateBias",
"inputGateBias");
3332 bool allPeepholeWeightsPresentOrNot =
3338 if (!allPeepholeWeightsPresentOrNot)
3341 ": CellToInputWeights, CellToForgetWeights and CellToOutputWeights should all be present (Peephole "
3342 "enabled) or not be present at all (Peephole disabled). CellToInputWeights should only be present "
3343 "when Peephole is enabled and CIFG is disabled. m_Parameters.m_PeepholeEnabled should be set "
3351 ValidateDataTypes(cellToForgetWeightsInfo, layerNormPeepholeWeightsSupportedTypes, descriptorName);
3355 ValidateTensorDataTypesMatch(cellToForgetWeightsInfo, cellToOutputWeightsInfo, descriptorName,
3356 "cellToForgetWeight",
"cellToOutputWeights");
3362 ValidateTensorDataTypesMatch(cellToForgetWeightsInfo, cellToInputWeightsInfo, descriptorName,
3363 "cellToForgetWeights",
"cellToInputWeights");
3368 bool allLayerNormWeightsPresentOrNot =
3374 if (!allLayerNormWeightsPresentOrNot)
3377 ": InputLayerNormWeights, ForgetLayerNormWeights, m_OutputLayerNormWeights "
3378 "and CellLayerNormWeights should all be present (Layer Norm enabled) or not "
3379 "be present at all (Layer Norm disabled). InputLayerNormWeights should "
3380 "only be present when Layer Norm is enabled and CIFG is disabled. "
3381 "m_Parameters.m_LayerNormEnabled should be set appropriately.");
3388 ValidateDataTypes(forgetLayerNormWeightsInfo, layerNormPeepholeWeightsSupportedTypes, descriptorName);
3392 ValidateTensorDataTypesMatch(forgetLayerNormWeightsInfo, cellLayerNormWeightsInfo, descriptorName,
3393 "forgetLayerNormWeights",
"cellLayerNormWeights");
3397 ValidateTensorDataTypesMatch(forgetLayerNormWeightsInfo, outputLayerNormWeightsInfo, descriptorName,
3398 "forgetLayerNormWeights",
"outputLayerNormWeights");
3404 ValidateTensorDataTypesMatch(forgetLayerNormWeightsInfo, inputLayerNormWeightsInfo, descriptorName,
3405 "forgetLayerNormWeights",
"inputLayerNormWeights");
3410 bool correctProjectionTensorsPresent =
3415 if (!correctProjectionTensorsPresent)
3418 ": If projection is enabled, ProjectionWeights should be present and "
3419 "ProjectionBias is optional. If projection is disabled, neither "
3420 "ProjectionWeights nor ProjectionBias should be present.");
3427 ValidateDataTypes(projectionWeightsInfo, weightsSupportedTypes, descriptorName);
3433 ValidateDataTypes(projectionBiasInfo, biasSupportedTypes, descriptorName);
3440 ": If projection is disabled, output quantization info (scale, offset) "
3441 "should match HiddenStateScale and HiddenStateZeroPoint.");
3448 const std::string descriptorName{
"QuantizedLstmQueueDescriptor"};
3451 ValidateNumInputs(workloadInfo, descriptorName, 3);
3452 ValidateNumOutputs(workloadInfo, descriptorName, 2);
3462 std::vector<DataType> inputOutputSupportedTypes =
3467 std::vector<DataType> cellStateSupportedTypes =
3472 std::vector<DataType> weightsSupportedTypes =
3477 std::vector<DataType> biasSupportedTypes =
3483 ValidateDataTypes(inputInfo, inputOutputSupportedTypes, descriptorName);
3484 ValidateDataTypes(cellStateInInfo, cellStateSupportedTypes, descriptorName);
3485 ValidateDataTypes(outputStateInInfo, inputOutputSupportedTypes, descriptorName);
3487 ValidateDataTypes(cellStateOutInfo, cellStateSupportedTypes, descriptorName);
3488 ValidateDataTypes(outputStateOutInfo, inputOutputSupportedTypes, descriptorName);
3491 ValidateTensorDataTypesMatch(inputInfo, outputStateInInfo, descriptorName,
"input",
"outputStateIn");
3492 ValidateTensorDataTypesMatch(outputStateInInfo, outputStateOutInfo, descriptorName,
3493 "outputStateIn",
"outputStateOut");
3494 ValidateTensorDataTypesMatch(cellStateInInfo, cellStateOutInfo, descriptorName,
"cellStateIn",
"cellStateOut");
3497 ValidateTensorQuantizationSpace(inputInfo, outputStateInInfo, descriptorName,
"input",
"outputStateIn");
3498 ValidateTensorQuantizationSpace(inputInfo, outputStateOutInfo, descriptorName,
"input",
"outputStateOut");
3499 ValidateTensorQuantizationSpace(cellStateInInfo, cellStateOutInfo, descriptorName,
"cellStateIn",
"cellStateOut");
3502 const uint32_t numBatches = inputInfo.
GetShape()[0];
3503 const uint32_t inputSize = inputInfo.
GetShape()[1];
3504 const uint32_t outputSize = cellStateInInfo.GetShape()[1];
3537 " RecurrentToForgetWeights");
3548 ValidateDataTypes(inputToInputWeightsInfo, weightsSupportedTypes, descriptorName);
3550 ValidateTensorDataTypesMatch(inputToInputWeightsInfo, inputToForgetWeightsInfo, descriptorName,
3551 "inputToInputWeights",
"inputToForgetWeights");
3552 ValidateTensorDataTypesMatch(inputToInputWeightsInfo, inputToCellWeightsInfo, descriptorName,
3553 "inputToInputWeights",
"inputToCellWeights");
3554 ValidateTensorDataTypesMatch(inputToInputWeightsInfo, inputToOutputWeightsInfo, descriptorName,
3555 "inputToInputWeights",
"inputToOutputWeights");
3557 ValidateTensorDataTypesMatch(inputToInputWeightsInfo, recurrentToInputWeightsInfo, descriptorName,
3558 "inputToInputWeights",
"recurrentToInputWeights");
3559 ValidateTensorDataTypesMatch(inputToInputWeightsInfo, recurrentToForgetWeightsInfo, descriptorName,
3560 "inputToInputWeights",
"recurrentToForgeteights");
3561 ValidateTensorDataTypesMatch(inputToInputWeightsInfo, recurrentToCellWeightsInfo, descriptorName,
3562 "inputToInputWeights",
"recurrentToCellWeights");
3563 ValidateTensorDataTypesMatch(inputToInputWeightsInfo, recurrentToOutputWeightsInfo, descriptorName,
3564 "inputToInputWeights",
"recurrentToOutputWeights");
3567 ValidateTensorQuantizationSpace(inputToInputWeightsInfo, inputToForgetWeightsInfo,
3568 descriptorName,
"inputToInputWeights",
"inputToForgetWeights");
3569 ValidateTensorQuantizationSpace(inputToInputWeightsInfo, inputToCellWeightsInfo,
3570 descriptorName,
"inputToInputWeights",
"inputToCellWeights");
3571 ValidateTensorQuantizationSpace(inputToInputWeightsInfo, inputToOutputWeightsInfo,
3572 descriptorName,
"inputToInputWeights",
"inputToOutputWeights");
3574 ValidateTensorQuantizationSpace(inputToInputWeightsInfo, recurrentToInputWeightsInfo,
3575 descriptorName,
"inputToInputWeights",
"recurrentToInputWeights");
3576 ValidateTensorQuantizationSpace(inputToInputWeightsInfo, recurrentToForgetWeightsInfo,
3577 descriptorName,
"inputToInputWeights",
"recurrentToForgetWeights");
3578 ValidateTensorQuantizationSpace(inputToInputWeightsInfo, recurrentToCellWeightsInfo,
3579 descriptorName,
"inputToInputWeights",
"recurrentToCellWeights");
3580 ValidateTensorQuantizationSpace(inputToInputWeightsInfo, recurrentToOutputWeightsInfo,
3581 descriptorName,
"inputToInputWeights",
"recurrentToOutputWeights");
3592 ValidatePointer(
m_CellBias, descriptorName,
"CellBias");
3601 ValidateDataTypes(inputGateBiasInfo, biasSupportedTypes, descriptorName);
3603 ValidateTensorDataTypesMatch(inputGateBiasInfo, forgetGateBiasInfo, descriptorName,
3604 "inputGateBias",
"forgetGateBias");
3605 ValidateTensorDataTypesMatch(inputGateBiasInfo, cellBiasInfo, descriptorName,
3606 "inputGateBias",
"cellBias");
3607 ValidateTensorDataTypesMatch(inputGateBiasInfo, outputGateBiasInfo, descriptorName,
3608 "inputGateBias",
"outputGateBias");
3611 ValidateBiasTensorQuantization(inputGateBiasInfo, inputToInputWeightsInfo, descriptorName);
3612 ValidateBiasTensorQuantization(forgetGateBiasInfo, inputToInputWeightsInfo, descriptorName);
3613 ValidateBiasTensorQuantization(cellBiasInfo, inputToInputWeightsInfo, descriptorName);
3614 ValidateBiasTensorQuantization(outputGateBiasInfo, inputToInputWeightsInfo, descriptorName);
3619 const std::string descriptorName{
"AbsQueueDescriptor"};
3621 ValidateNumInputs(workloadInfo, descriptorName, 1);
3622 ValidateNumOutputs(workloadInfo, descriptorName, 1);
3627 ValidateTensorShapesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
3629 std::vector<DataType> supportedTypes =
3640 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
3641 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
3646 const std::string descriptorName{
"SliceQueueDescriptor"};
3648 ValidateNumInputs(workloadInfo, descriptorName, 1);
3649 ValidateNumOutputs(workloadInfo, descriptorName, 1);
3654 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
3668 ": Length of begin offset descriptor must equal rank " + std::to_string(rank));
3673 ": Length of size descriptor must equal rank " + std::to_string(rank));
3678 for (
unsigned int i = 0u; i < rank; ++i)
3689 for(
unsigned int i = 0u; i < rank; ++i)
3694 std::to_string(i) +
" exceeds input size.");
3701 const std::string descriptorName{
"DepthToSpaceQueueDescriptor"};
3703 ValidateNumInputs(workloadInfo, descriptorName, 1);
3704 ValidateNumOutputs(workloadInfo, descriptorName, 1);
3712 std::vector<DataType> supportedTypes =
3723 ValidateDataTypes(inputInfo, supportedTypes, descriptorName);
3724 ValidateDataTypes(outputInfo, supportedTypes, descriptorName);
3726 ValidateTensorNumElementsMatch(inputInfo, outputInfo, descriptorName,
"input",
"output");
3734 const unsigned int wIndex = dimensionIndices.
GetWidthIndex();
3742 "must be divisible by block size.");
3749 "must be divisible by the square of block size." );
3755 const std::string descriptorName{
"ComparisonQueueDescriptor"};
3757 ValidateNumInputs(workloadInfo, descriptorName, 2);
3758 ValidateNumOutputs(workloadInfo, descriptorName, 1);
3764 ValidateBroadcastTensorShapesMatch(inputTensorInfo0,
3779 const std::string descriptorName{
"ElementwiseBinaryQueueDescriptor"};
3781 ValidateNumInputs(workloadInfo, descriptorName, 2);
3782 ValidateNumOutputs(workloadInfo, descriptorName, 1);
3788 std::vector<DataType> supportedTypes =
3799 ValidateDataTypes(inputTensorInfo0, supportedTypes, descriptorName);
3800 ValidateDataTypes(inputTensorInfo1, supportedTypes, descriptorName);
3802 ValidateTensorDataTypesMatch(inputTensorInfo0, outputTensorInfo, descriptorName,
"input",
"output");
3803 ValidateTensorDataTypesMatch(inputTensorInfo1, outputTensorInfo, descriptorName,
"input",
"output");
3808 const std::string descriptorName{
"ElementwiseUnaryQueueDescriptor"};
3810 ValidateNumInputs(workloadInfo, descriptorName, 1);
3811 ValidateNumOutputs(workloadInfo, descriptorName, 1);
3816 ValidateTensorShapesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
3818 std::vector<DataType> supportedTypes =
3829 std::vector<DataType> logicalSupportedTypes =
3836 ValidateDataTypes(inputTensorInfo, logicalSupportedTypes, descriptorName);
3840 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
3844 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
3849 const std::string descriptorName{
"RankQueueDescriptor"};
3851 ValidateNumInputs(workloadInfo, descriptorName, 1);
3852 ValidateNumOutputs(workloadInfo, descriptorName, 1);
3858 ValidateTensorNumElements(outputTensorInfo, descriptorName, 1,
"output");
3860 std::vector<DataType> supportedTypes =
3872 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
3878 const std::string descriptorName{
"LogicalBinaryQueueDescriptor"};
3880 ValidateNumInputs(workloadInfo, descriptorName, 2);
3881 ValidateNumOutputs(workloadInfo, descriptorName, 1);
3887 ValidateBroadcastTensorShapesMatch(inputTensorInfo0,
3912 const std::string descriptorName{
"ReduceQueueDescriptor"};
3914 ValidateNumInputs(workloadInfo, descriptorName, 1);
3915 ValidateNumOutputs(workloadInfo, descriptorName, 1);
3920 std::vector<DataType> supportedTypes =
3931 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
3932 ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName,
"input",
"output");
3939 const std::string descriptorName{
"UnidirectionalSequenceLstmQueueDescriptor"};
3951 std::vector<DataType> supportedTypes =
3958 ValidateDataTypes(workloadInfo.
m_InputTensorInfos[0], supportedTypes, descriptorName);
3972 unsigned int batchIndx = 0;
3973 unsigned int inputIndx = 1;
3974 uint32_t timeStep = 1;
3975 unsigned int timeIndx = 1;
3995 descriptorName +
" input_0");
3998 descriptorName +
" input_1");
4001 descriptorName +
" input_2");
4005 descriptorName +
" output_0");
4011 (n_cell * n_input),
"InputLayerNormWeights");
4016 (n_cell * n_input),
"InputToForgetWeights");
4020 (n_cell * n_input),
"InputToCellWeights");
4025 (n_cell * n_output),
"RecurrentToInputWeights");
4030 (n_cell * n_output),
"RecurrentToForgetWeights");
4034 (n_cell * n_output),
"RecurrentToCellWeights");
4042 if (!cifg_weights_all_or_none)
4045 "RecurrentToInputWeights must either both be present (regular LSTM) "
4046 "or both not present (CIFG-LSTM). In addition CifgEnable must be set "
4053 n_cell,
"CellToInputWeights");
4058 n_cell,
"CellToForgetWeights");
4063 n_cell,
"CellToOutputWeights");
4067 bool peephole_weights_all_or_none =
4072 if (!peephole_weights_all_or_none)
4090 "must be present.");
4093 n_cell,
"InputGateBias");
4099 ValidatePointer(
m_CellBias,
"Null pointer check",
"CellBias");
4108 (n_cell * n_output),
"ProjectionWeights");
4125 if (!projecton_tensors_consistent)
4158 "disabled but InputLayerNormWeights are not present");
4161 1, n_cell,
"InputLayerNormWeights");
4170 "ForgetLayerNormWeights");
4174 "OutputLayerNormWeights");
4178 "CellLayerNormWeights");
4184 "normalisation weights are present.");
4190 const std::string descriptorName{
"BatchMatMulDescriptor"};
4192 ValidateNumInputs(workloadInfo, descriptorName, 2);
4193 ValidateNumOutputs(workloadInfo, descriptorName, 1);
4204 std::vector<DataType> supportedTypes =
4214 ValidateDataTypes(inputXInfoBeforeParams, supportedTypes, descriptorName);
4215 ValidateDataTypes(inputYInfoBeforeParams, supportedTypes, descriptorName);
4216 ValidateDataTypes(outputInfo, supportedTypes, descriptorName);
4218 if ((inputXInfoBeforeParams.GetNumDimensions() < 2) ||
4219 (inputYInfoBeforeParams.GetNumDimensions() < 2))
4231 ": Invalid descriptor parameters - Transpose and Adjoint "
4232 "cannot both be true for a given input tensor.");
4239 inputXInfoBeforeParams.GetShape()));
4244 inputXInfoBeforeParams.GetShape());
4245 if(inputXInfoBeforeParams.GetShape()[axesToMul.first] !=
4246 inputXInfoBeforeParams.GetShape()[axesToMul.second])
4249 ": Adjoint is set to true for input tensor X, but the axes to be adjointed are not square." );
4252 inputXInfoAfterParams = inputXInfoBeforeParams;
4256 inputXInfoAfterParams = inputXInfoBeforeParams;
4264 inputYInfoBeforeParams.GetShape()));
4269 inputYInfoBeforeParams.GetShape());
4270 if(inputYInfoBeforeParams.GetShape()[axesToMul.first] !=
4271 inputYInfoBeforeParams.GetShape()[axesToMul.second])
4274 ": Adjoint is set to true for input tensor Y, but the axes to be adjointed are not square." );
4277 inputYInfoAfterParams = inputYInfoBeforeParams;
4281 inputYInfoAfterParams = inputYInfoBeforeParams;
4291 ": Input tensor X does not have the correct "
4292 "number of dimensions for the Data Layout that it has been assigned.");
4308 ": Input tensor Y does not have the correct "
4309 "number of dimensions for the Data Layout that it has been assigned.");
4321 inputYInfoBeforeParams.GetShape());
4323 if(inputXInfoAfterParams.
GetShape()[axesXToMul.second]
4324 != inputYInfoAfterParams.
GetShape()[axesYToMul.first])
4327 ": The final axis of input tensor X must be the same size as "
4328 "the second last axis of input tensor Y.");
4341 ": Invalid input tensor data layout combination.");
4349 ": Invalid input tensor data layout combination.");
4355 unsigned int outputTensorDimSize = std::max(inputXInfoAfterParams.
GetNumDimensions(),
4357 if(outputTensorDimSize-2 > 0)
4366 auto doAxisExtension = [&](std::vector<unsigned int> axisIndices,
TensorInfo& ti)
4368 auto sizeDiff = (outputTensorDimSize-2) - axisIndices.size();
4370 for(
unsigned int i = 0; i < sizeDiff; i++)
4372 axisIndices.insert(axisIndices.begin(), 1);
4375 for(
unsigned int i = 0; i < ti.GetNumDimensions(); i++)
4377 ti.GetShape()[i] = inputXInfoAfterParams.
GetShape()[i];
4386 doAxisExtension(axesXNotMul, tiXNotMul);
4387 doAxisExtension(axesYNotMul, tiYNotMul);
4395 ValidateBroadcastTensorShapesMatch(tiXNotMul,
4406 const std::string& descriptorName{
"TileQueueDescriptor"};
4408 ValidateNumInputs(workloadInfo, descriptorName, 1);
4409 ValidateNumOutputs(workloadInfo, descriptorName, 1);
4414 std::vector<DataType> supportedTypes =
4430 ": Multiples length is not same as the number of dimensions in Input.");
4433 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
4434 ValidateDataTypes(outputTensorInfo, supportedTypes, descriptorName);
4439 const std::string& descriptorName{
"BroadcastToQueueDescriptor"};
4441 ValidateNumInputs(workloadInfo, descriptorName, 1);
4442 ValidateNumOutputs(workloadInfo, descriptorName, 1);
4447 std::vector<DataType> supportedTypes =
4459 ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName);
4460 ValidateDataTypes(outputTensorInfo, supportedTypes, descriptorName);
4465 const std::string& descriptorName{
"ScatterQueueDescriptor"};
4467 ValidateNumInputs(workloadInfo, descriptorName, 3);
4468 ValidateNumOutputs(workloadInfo, descriptorName, 1);
4475 std::vector<DataType> supportedTypes =
4486 std::vector<DataType> indicesSupportedTypes =
4493 ValidateDataTypes(inputTensorInfo0, supportedTypes, descriptorName);
4497 ValidateDataTypes(inputTensorInfo0, indicesSupportedTypes, descriptorName);
4500 ValidateDataTypes(inputTensorInfo1, indicesSupportedTypes, descriptorName);
4501 ValidateDataTypes(inputTensorInfo2, supportedTypes, descriptorName);
4502 ValidateDataTypes(outputTensorInfo, supportedTypes, descriptorName);
const TensorInfo & GetTensorInfo() const
TensorShape GetShape() const override
Get the number of elements for each dimension ordered from slowest iterating dimension to fastest ite...
bool has_value() const noexcept
float GetQuantizationScale() const
unsigned int GetNumDimensions() const
bool IsTypeSpaceMatch(const TensorInfo &other) const
Check that the types are the same and, if quantize, that the quantization parameters are the same.
int32_t GetQuantizationOffset() const
unsigned int GetNumElements() const
const TensorShape & GetShape() const
Optional< unsigned int > GetQuantizationDim() const
std::vector< float > GetQuantizationScales() const
bool HasPerAxisQuantization() const
DataType GetDataType() const
bool HasMultipleQuantizationScales() const
unsigned int GetNumDimensions() const
Function that returns the tensor rank.
Provides access to the appropriate indexes for Channels, Height and Width based on DataLayout.
unsigned int GetWidthIndex() const
unsigned int GetHeightIndex() const
unsigned int GetChannelsIndex() const
Copyright (c) 2021 ARM Limited and Contributors.
constexpr const char * GetDataTypeName(DataType dataType)
DataType GetBiasDataType(DataType inputDataType)
constexpr bool IsQuantizedType()
constexpr bool IsQuantized8BitType(DataType dataType)
armnn::TensorShape Permuted(const armnn::TensorShape &srcShape, const armnn::PermutationVector &mappings)
unsigned int GetUnsignedAxis(const unsigned int inputDimension, const int axis)
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
int m_Axis
Axis to reduce across the input tensor.
void Validate(const WorkloadInfo &workloadInfo) const
bool m_AdjointX
Adjoint the slices of each input tensor Transpose and Adjoint can not both be set to true for the sam...
static std::pair< unsigned int, unsigned int > GetAxesToMul(DataLayout dataLayout, const TensorShape &tensorShape)
Static helper to get the two axes (for each input) for multiplication.
static PermutationVector GetPermuteVec(DataLayout dataLayout, const TensorShape &tensorShape)
Static helper to get the axes which will be transposed.
static std::vector< unsigned int > GetAxesNotMul(DataLayout dataLayout, const TensorShape &tensorShape)
Static helper to get the axes (for each input) that will not be multiplied together.
bool m_TransposeX
Transpose the slices of each input tensor Transpose and Adjoint can not both be set to true for the s...
DataLayout m_DataLayoutX
Data layout of each input tensor, such as NHWC/NDHWC (leave as default for arbitrary layout)
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
const ConstTensorHandle * m_Mean
const ConstTensorHandle * m_Variance
const ConstTensorHandle * m_Gamma
const ConstTensorHandle * m_Beta
std::vector< unsigned int > m_BlockShape
Block shape values.
std::vector< std::pair< unsigned int, unsigned int > > m_Crops
The values to crop from the input dimension.
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
std::vector< unsigned int > m_Origin
void Validate(const WorkloadInfo &workloadInfo) const
std::vector< ViewOrigin > m_ViewOrigins
void Validate(const WorkloadInfo &workloadInfo) const
const ConstTensorHandle * m_LayerOutput
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
uint32_t m_StrideY
Stride value when proceeding through input for the height dimension.
bool m_BiasEnabled
Enable/disable bias.
uint32_t m_StrideX
Stride value when proceeding through input for the width dimension.
void Validate(const WorkloadInfo &workloadInfo) const
uint32_t m_StrideZ
Stride value when proceeding through input for the depth dimension.
uint32_t m_StrideY
Stride value when proceeding through input for the height dimension.
bool m_BiasEnabled
Enable/disable bias.
uint32_t m_StrideX
Stride value when proceeding through input for the width dimension.
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
uint32_t m_DilationY
Dilation factor value for height dimension.
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
uint32_t m_DilationX
Dilation factor value for width dimension.
uint32_t m_StrideY
Stride value when proceeding through input for the height dimension.
bool m_BiasEnabled
Enable/disable bias.
uint32_t m_StrideX
Stride value when proceeding through input for the width dimension.
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
uint32_t m_NumClasses
Number of classes.
float m_NmsIouThreshold
Intersection over union threshold.
void Validate(const WorkloadInfo &workloadInfo) const
const ConstTensorHandle * m_Anchors
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
UnaryOperation m_Operation
Specifies the elementwiseUnary operation to execute.
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
float m_Min
Minimum value.
float m_Max
Maximum value.
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
bool m_BiasEnabled
Enable/disable bias.
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
bool m_PeepholeEnabled
Enable/disable peephole.
bool m_TimeMajor
Enable/disable time major.
bool m_LayerNormEnabled
Enable/disable layer normalization.
float m_ClippingThresCell
Clipping threshold value for the cell state.
bool m_ProjectionEnabled
Enable/disable the projection layer.
float m_ClippingThresProj
Clipping threshold value for the projection.
bool m_CifgEnabled
Enable/disable cifg (coupled input & forget gate).
void Validate(const WorkloadInfo &workloadInfo) const
const ConstTensorHandle * m_OutputLayerNormWeights
const ConstTensorHandle * m_InputToOutputWeights
const ConstTensorHandle * m_InputLayerNormWeights
const ConstTensorHandle * m_CellToForgetWeights
const ConstTensorHandle * m_RecurrentToInputWeights
const ConstTensorHandle * m_ForgetGateBias
const ConstTensorHandle * m_ProjectionWeights
const ConstTensorHandle * m_InputGateBias
const ConstTensorHandle * m_RecurrentToOutputWeights
const ConstTensorHandle * m_OutputGateBias
const ConstTensorHandle * m_CellBias
const ConstTensorHandle * m_InputToCellWeights
const ConstTensorHandle * m_CellToInputWeights
const ConstTensorHandle * m_CellToOutputWeights
const ConstTensorHandle * m_InputToForgetWeights
const ConstTensorHandle * m_InputToInputWeights
const ConstTensorHandle * m_RecurrentToCellWeights
const ConstTensorHandle * m_ProjectionBias
const ConstTensorHandle * m_ForgetLayerNormWeights
const ConstTensorHandle * m_RecurrentToForgetWeights
const ConstTensorHandle * m_CellLayerNormWeights
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
std::vector< unsigned int > m_Axis
Values for the dimensions to reduce.
bool m_KeepDims
Enable/disable keep dimensions. If true, then the reduced dimensions that are of length 1 are kept.
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
unsigned int GetConcatAxis() const
Get the concatenation axis value.
std::vector< std::pair< unsigned int, unsigned int > > m_PadList
Specifies the padding for input dimension.
void Validate(const WorkloadInfo &workloadInfo) const
PermutationVector m_DimMappings
Indicates how to translate tensor elements from a given source into the target destination,...
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
bool m_PeepholeEnabled
Enable/disable peephole.
int32_t m_HiddenStateZeroPoint
Hidden State zero point.
bool m_LayerNormEnabled
Enable/disable layer normalization.
bool m_ProjectionEnabled
Enable/disable the projection layer.
bool m_CifgEnabled
Enable/disable CIFG (coupled input & forget gate).
float m_HiddenStateScale
Hidden State quantization scale.
void Validate(const WorkloadInfo &workloadInfo) const
const ConstTensorHandle * m_OutputLayerNormWeights
const ConstTensorHandle * m_InputToOutputWeights
const ConstTensorHandle * m_InputLayerNormWeights
const ConstTensorHandle * m_CellToForgetWeights
const ConstTensorHandle * m_RecurrentToInputWeights
const ConstTensorHandle * m_ForgetGateBias
const ConstTensorHandle * m_ProjectionWeights
const ConstTensorHandle * m_InputGateBias
const ConstTensorHandle * m_RecurrentToOutputWeights
const ConstTensorHandle * m_OutputGateBias
const ConstTensorHandle * m_CellBias
const ConstTensorHandle * m_InputToCellWeights
const ConstTensorHandle * m_CellToInputWeights
const ConstTensorHandle * m_CellToOutputWeights
const ConstTensorHandle * m_InputToForgetWeights
const ConstTensorHandle * m_InputToInputWeights
const ConstTensorHandle * m_RecurrentToCellWeights
const ConstTensorHandle * m_ProjectionBias
const ConstTensorHandle * m_ForgetLayerNormWeights
const ConstTensorHandle * m_RecurrentToForgetWeights
const ConstTensorHandle * m_CellLayerNormWeights
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
const ConstTensorHandle * m_InputToOutputWeights
const ConstTensorHandle * m_RecurrentToInputWeights
const ConstTensorHandle * m_ForgetGateBias
const ConstTensorHandle * m_InputGateBias
const ConstTensorHandle * m_RecurrentToOutputWeights
const ConstTensorHandle * m_OutputGateBias
const ConstTensorHandle * m_CellBias
const ConstTensorHandle * m_InputToCellWeights
const ConstTensorHandle * m_InputToForgetWeights
const ConstTensorHandle * m_InputToInputWeights
const ConstTensorHandle * m_RecurrentToCellWeights
const ConstTensorHandle * m_RecurrentToForgetWeights
void ValidateTensorNumDimensions(const TensorInfo &tensor, std::string const &descName, unsigned int numDimensions, std::string const &tensorName) const
std::vector< ITensorHandle * > m_Inputs
std::vector< ITensorHandle * > m_Outputs
void ValidateInputsOutputs(const std::string &descName, unsigned int numExpectedIn, unsigned int numExpectedOut) const
void ValidateTensorNumDimNumElem(const TensorInfo &tensorInfo, unsigned int numDimension, unsigned int numElements, std::string const &tensorName) const
ArgMinMaxDescriptor m_Parameters
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
bool m_InputEnabled
Flag to show if input tensor is accepted.
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
std::vector< unsigned int > m_Begin
Beginning indices of the slice in each dimension.
std::vector< unsigned int > m_Size
Size of the slice in each dimension.
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
std::vector< unsigned int > m_BlockShape
Block shape value.
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
std::vector< std::pair< unsigned int, unsigned int > > m_PadList
Specifies the padding values for the input dimension: heightPad{top, bottom} widthPad{left,...
void Validate(const WorkloadInfo &workloadInfo) const
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
unsigned int m_BlockSize
Scalar specifying the input block size. It must be >= 1.
void Validate(const WorkloadInfo &workloadInfo) const
std::vector< unsigned int > m_Origin
void Validate(const WorkloadInfo &workloadInfo) const
std::vector< ViewOrigin > m_ViewOrigins
TensorShape m_InputShape
Required shape of all input tensors.
uint32_t m_Axis
0-based axis along which to stack the input tensors.
uint32_t m_NumInputs
Number of input tensors.
void Validate(const WorkloadInfo &workloadInfo) const
std::vector< int > m_Stride
Stride values for the input that will be sliced.
std::vector< int > m_Begin
Begin values for the input that will be sliced.
std::vector< int > m_End
End values for the input that will be sliced.
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
std::vector< uint32_t > m_Multiples
The vector to multiply the input shape by.
void Validate(const WorkloadInfo &workloadInfo) const
bool m_BiasEnabled
Enable/disable bias.
void Validate(const WorkloadInfo &workloadInfo) const
const ConstTensorHandle * m_Bias
const ConstTensorHandle * m_Weight
PermutationVector m_DimMappings
Indicates how to translate tensor elements from a given source into the target destination,...
void Validate(const WorkloadInfo &workloadInfo) const
void Validate(const WorkloadInfo &workloadInfo) const
const ConstTensorHandle * m_OutputLayerNormWeights
const ConstTensorHandle * m_InputToOutputWeights
const ConstTensorHandle * m_InputLayerNormWeights
const ConstTensorHandle * m_CellToForgetWeights
const ConstTensorHandle * m_RecurrentToInputWeights
const ConstTensorHandle * m_ForgetGateBias
const ConstTensorHandle * m_ProjectionWeights
const ConstTensorHandle * m_InputGateBias
const ConstTensorHandle * m_RecurrentToOutputWeights
const ConstTensorHandle * m_OutputGateBias
const ConstTensorHandle * m_CellBias
const ConstTensorHandle * m_InputToCellWeights
const ConstTensorHandle * m_CellToInputWeights
const ConstTensorHandle * m_CellToOutputWeights
const ConstTensorHandle * m_InputToForgetWeights
const ConstTensorHandle * m_InputToInputWeights
const ConstTensorHandle * m_RecurrentToCellWeights
const ConstTensorHandle * m_ProjectionBias
const ConstTensorHandle * m_ForgetLayerNormWeights
const ConstTensorHandle * m_RecurrentToForgetWeights
const ConstTensorHandle * m_CellLayerNormWeights
void Validate(const WorkloadInfo &workloadInfo) const
Contains information about TensorInfos of a layer.
std::vector< TensorInfo > m_OutputTensorInfos
std::vector< TensorInfo > m_InputTensorInfos