/* * Copyright (c) Qualcomm Innovation Center, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include namespace executorch { namespace backends { namespace qnn { std::unique_ptr CreateQuantizationParamWrapper( const Qnn_Tensor_t& tensor) { std::unique_ptr quantize_param_wrapper; auto& quantization = QNN_TENSOR_VER_PTR(tensor)->quantizeParams; if (quantization.quantizationEncoding == QNN_QUANTIZATION_ENCODING_UNDEFINED) { quantize_param_wrapper = std::make_unique(); } else if ( quantization.quantizationEncoding == QNN_QUANTIZATION_ENCODING_AXIS_SCALE_OFFSET) { std::vector scale_offset( quantization.axisScaleOffsetEncoding.scaleOffset, quantization.axisScaleOffsetEncoding.scaleOffset + quantization.axisScaleOffsetEncoding.numScaleOffsets); quantize_param_wrapper = std::make_unique( quantization.axisScaleOffsetEncoding.axis, scale_offset); } else if ( quantization.quantizationEncoding == QNN_QUANTIZATION_ENCODING_BW_AXIS_SCALE_OFFSET) { std::vector scales( quantization.bwAxisScaleOffsetEncoding.scales, quantization.bwAxisScaleOffsetEncoding.scales + quantization.bwAxisScaleOffsetEncoding.numElements); std::vector offsets( quantization.bwAxisScaleOffsetEncoding.offsets, quantization.bwAxisScaleOffsetEncoding.offsets + quantization.bwAxisScaleOffsetEncoding.numElements); quantize_param_wrapper = std::make_unique( quantization.bwAxisScaleOffsetEncoding.bitwidth, quantization.bwAxisScaleOffsetEncoding.axis, quantization.bwAxisScaleOffsetEncoding.numElements, scales, offsets); } else if ( quantization.quantizationEncoding == QNN_QUANTIZATION_ENCODING_BW_SCALE_OFFSET) { quantize_param_wrapper = std::make_unique( quantization.bwScaleOffsetEncoding.bitwidth, quantization.bwScaleOffsetEncoding.scale, quantization.bwScaleOffsetEncoding.offset); } else if ( quantization.quantizationEncoding == QNN_QUANTIZATION_ENCODING_SCALE_OFFSET) { quantize_param_wrapper = std::make_unique( quantization.scaleOffsetEncoding.scale, quantization.scaleOffsetEncoding.offset); } else if ( quantization.quantizationEncoding == QNN_QUANTIZATION_ENCODING_BLOCKWISE_EXPANSION) { int ch_axis = quantization.blockwiseExpansion->axis; int ele_sz = quantization.blockwiseExpansion->blockScaleStorageType == QNN_BLOCKWISE_EXPANSION_BITWIDTH_SCALE_STORAGE_16 ? 2 : 1; size_t block_scales_sz = quantization.blockwiseExpansion->numBlocksPerAxis * QNN_TENSOR_VER_PTR(tensor)->dimensions[ch_axis] * ele_sz; std::vector scale_offsets( quantization.blockwiseExpansion->scaleOffsets, quantization.blockwiseExpansion->scaleOffsets + QNN_TENSOR_VER_PTR(tensor)->dimensions[ch_axis]); quantize_param_wrapper = std::make_unique( quantization.blockwiseExpansion->axis, scale_offsets, quantization.blockwiseExpansion->numBlocksPerAxis, quantization.blockwiseExpansion->blockScaleBitwidth, quantization.blockwiseExpansion->blockScaleStorageType, quantization.blockwiseExpansion->blocksScale8, block_scales_sz); } else { QNN_EXECUTORCH_LOG_ERROR( "Unknown the encoding of quantization: %d", quantization.quantizationEncoding); } return quantize_param_wrapper; } } // namespace qnn } // namespace backends } // namespace executorch