[CPU] Fixed quantization post op memory leak (#2101)
authorGorokhov Dmitriy <dmitry.gorokhov@intel.com>
Wed, 9 Sep 2020 15:59:37 +0000 (18:59 +0300)
committerGitHub <noreply@github.com>
Wed, 9 Sep 2020 15:59:37 +0000 (18:59 +0300)
inference-engine/src/mkldnn_plugin/nodes/mkldnn_quantize_node.cpp
inference-engine/src/mkldnn_plugin/nodes/mkldnn_quantize_node.h
inference-engine/thirdparty/mkl-dnn

index 17521f2..e2dfe0d 100644 (file)
@@ -525,7 +525,17 @@ void MKLDNNQuantizeNode::execute(mkldnn::stream strm) {
 }
 
 void MKLDNNQuantizeNode::appendPostOps(mkldnn::post_ops& ops) {
-    ops.append_quantization(quantizeAlgorithm , cropLow, cropHigh, inputScale, inputShift, outputScale, outputShift);
+    if (!isPostOpDataInitialized) {
+        isPostOpDataInitialized = true;
+        cropLowData.set(cropLow.size(), 1 << 1, &cropLow[0]);
+        cropHighData.set(cropHigh.size(), 1 << 1, &cropHigh[0]);
+        inputScaleData.set(inputScale.size(), 1 << 1, &inputScale[0]);
+        inputShiftData.set(inputShift.size(), 1 << 1, &inputShift[0]);
+        outputScaleData.set(outputScale.size(), 1 << 1, &outputScale[0]);
+        outputShiftData.set(outputShift.size(), 1 << 1, &outputShift[0]);
+    }
+
+    ops.append_quantization(quantizeAlgorithm, &cropLowData, &cropHighData, &inputScaleData, &inputShiftData, &outputScaleData, &outputShiftData);
 }
 
 bool MKLDNNQuantizeNode::created() const {
index 13f6713..af68cfd 100644 (file)
@@ -10,6 +10,7 @@
 #include <memory>
 #include <vector>
 #include <utility>
+#include <primitive_attr.hpp>
 
 namespace MKLDNNPlugin {
 
@@ -41,12 +42,12 @@ public:
     const std::vector<float>& getOutputScale() const { return outputScale; }
     const std::vector<float>& getOutputShift() const { return outputShift; }
 
-    void setCropLow(std::vector<float> newCropLow) { cropLow = std::move(newCropLow); }
-    void setCropHigh(std::vector<float> newCropHigh) { cropHigh = std::move(newCropHigh); }
-    void setInputScale(std::vector<float> newInputScale) { inputScale = std::move(newInputScale); }
-    void setInputShift(std::vector<float> newInputShift) { inputShift = std::move(newInputShift); }
-    void setOutputScale(std::vector<float> newOutputScale) { outputScale = std::move(newOutputScale); }
-    void setOutputShift(std::vector<float> newOutputShift) { outputShift = std::move(newOutputShift); }
+    void setCropLow(std::vector<float> newCropLow) { cropLow = std::move(newCropLow); isPostOpDataInitialized = false; }
+    void setCropHigh(std::vector<float> newCropHigh) { cropHigh = std::move(newCropHigh); isPostOpDataInitialized = false; }
+    void setInputScale(std::vector<float> newInputScale) { inputScale = std::move(newInputScale); isPostOpDataInitialized = false; }
+    void setInputShift(std::vector<float> newInputShift) { inputShift = std::move(newInputShift); isPostOpDataInitialized = false; }
+    void setOutputScale(std::vector<float> newOutputScale) { outputScale = std::move(newOutputScale); isPostOpDataInitialized = false;}
+    void setOutputShift(std::vector<float> newOutputShift) { outputShift = std::move(newOutputShift); isPostOpDataInitialized = false; }
 
     bool isInputLowBroadcast() const { return isInputLowBroadcasted; }
     bool isInputHighBroadcast() const { return isInputHighBroadcasted; }
@@ -74,6 +75,15 @@ private:
     std::vector<float> outputScale;
     std::vector<float> outputShift;
 
+    // mkldnn style post ops data representation
+    bool isPostOpDataInitialized = false;
+    mkldnn::impl::shifts_t<float> cropLowData;
+    mkldnn::impl::shifts_t<float> cropHighData;
+    mkldnn::impl::scales_t inputScaleData;
+    mkldnn::impl::shifts_t<float> inputShiftData;
+    mkldnn::impl::scales_t outputScaleData;
+    mkldnn::impl::shifts_t<float> outputShiftData;
+
     bool isInputLowBroadcasted = false;
     bool isInputHighBroadcasted = false;
     bool isOutputLowBroadcasted = false;
index 683bea6..6547f0b 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 683bea673b4e510eb150e4b338aeeeb366ba17f6
+Subproject commit 6547f0b6aac2725bd4e36197e19fb1a6f2ee2f51