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);