From 8bbabf8720e1c56d3c8e70eaa5123bfd1248e532 Mon Sep 17 00:00:00 2001 From: Mang Guo Date: Fri, 11 Feb 2022 15:27:50 +0800 Subject: [PATCH] [CPU] Get interpolate scales input during interpolate node init if the input is Constant. (#10229) --- .../intel_cpu/src/nodes/mkldnn_interpolate_node.cpp | 13 ++++++++++++- .../intel_cpu/src/nodes/mkldnn_interpolate_node.h | 2 ++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/plugins/intel_cpu/src/nodes/mkldnn_interpolate_node.cpp b/src/plugins/intel_cpu/src/nodes/mkldnn_interpolate_node.cpp index 369702b0fe1..1b9c2c690f9 100644 --- a/src/plugins/intel_cpu/src/nodes/mkldnn_interpolate_node.cpp +++ b/src/plugins/intel_cpu/src/nodes/mkldnn_interpolate_node.cpp @@ -1881,6 +1881,12 @@ MKLDNNInterpolateNode::MKLDNNInterpolateNode(const std::shared_ptr interpAttrs.padEnd[i] = static_cast(interpAttr.pads_end[i]); } + const auto scalesNode = std::dynamic_pointer_cast(interp->get_input_node_shared_ptr(SCALES_ID)); + if (scalesNode) { + scales = scalesNode->cast_vector(); + isScaleConstant = true; + } + if (isAxesSpecified) { axes = std::dynamic_pointer_cast(interp->get_input_node_shared_ptr(AXES_ID))->cast_vector(); } else { @@ -2095,6 +2101,12 @@ void MKLDNNInterpolateNode::prepareParams() { const auto &srcDims = srcMemPtr->getStaticDims(); const auto &dstDims = dstMemPtr->getStaticDims(); + if (!isScaleConstant) { + const auto& scalesMem = getParentEdgesAtPort(SCALES_ID)[0]->getMemory(); + const float* scalesData = reinterpret_cast(scalesMem.GetPtr()); + scales.assign(scalesData, scalesData + scalesMem.getStaticDims()[0]); + } + std::vector dataScales = getScales(getPaddedInputShape(srcDims, interpAttrs.padBegin, interpAttrs.padEnd), dstDims); if (getOutputShapeAtPort(0).getRank() > 2 && (dataScales[0] != 1.f || dataScales[1] != 1.f)) { IE_THROW() << "Interpolate layer only supports resize on spatial dimensions(depth, height and width)"; @@ -2222,7 +2234,6 @@ SizeVector MKLDNNInterpolateNode::getPaddedInputShape(const VectorDims &srcDims, // scales is a required input, but should not use input scales when "size" case, which may added eps that lead to inaccurate result, recalculate scales instead. std::vector MKLDNNInterpolateNode::getScales(const VectorDims &srcDimPad, const VectorDims &dstDim) { const size_t dataRank = getInputShapeAtPort(DATA_ID).getRank(); - const float *scales = reinterpret_cast(getParentEdgesAtPort(SCALES_ID)[0]->getMemory().GetPtr()); std::vector fullScales(dataRank, 1.f); const size_t axesRank = axes.size(); for (size_t i = 0; i < axesRank; i++) { diff --git a/src/plugins/intel_cpu/src/nodes/mkldnn_interpolate_node.h b/src/plugins/intel_cpu/src/nodes/mkldnn_interpolate_node.h index 6cf276829cc..a4d49677cb4 100644 --- a/src/plugins/intel_cpu/src/nodes/mkldnn_interpolate_node.h +++ b/src/plugins/intel_cpu/src/nodes/mkldnn_interpolate_node.h @@ -243,6 +243,8 @@ private: bool isAxesSpecified = false; std::vector axes; + std::vector scales; + bool isScaleConstant = false; // 6 ptrs for each quantization, 2 ptrs for each depth_wise std::vector postOpsDataPtrs;