[CPU] Fixed Eltwise node endless loop in case nthreads = 1 (#3008)
authorGorokhov Dmitriy <dmitry.gorokhov@intel.com>
Tue, 10 Nov 2020 07:56:22 +0000 (10:56 +0300)
committerGitHub <noreply@github.com>
Tue, 10 Nov 2020 07:56:22 +0000 (10:56 +0300)
inference-engine/src/mkldnn_plugin/nodes/mkldnn_eltwise_node.cpp
inference-engine/tests/functional/plugin/cpu/shared_tests_instances/single_layer_tests/eltwise.cpp

index 2bffe17..f815068 100644 (file)
@@ -1213,13 +1213,17 @@ void MKLDNNEltwiseNode::createPrimitive() {
         fullWorkAmount *= dims_out[i];
     }
 
+    isDynBatchEnabled = config.dynBatchSupport;
+
     size_t minimalConcurrency = parallel_get_max_threads();
     size_t minimalJitWorkAmount = 256;
     size_t currentJitWorkAmount = dims_out[dims_out.size() - 1];
     int collapsedDims = 0;
     if (canUseOptimizedImpl) {
         bool hasDifferentDims = false;
-        while (currentJitWorkAmount < minimalJitWorkAmount) {
+        while (currentJitWorkAmount < minimalJitWorkAmount && currentJitWorkAmount < fullWorkAmount &&
+               // we shouldn't collapse batch dimension in case dynamic batch is enabled
+               (!isDynBatchEnabled || (config.outConfs[0].desc.getBlockingDesc().getBlockDims().size() - collapsedDims > 2))) {
             if (dims_out.size() - collapsedDims - 2 < 0)
                 break;
 
@@ -1271,7 +1275,6 @@ void MKLDNNEltwiseNode::createPrimitive() {
         }
     }
 
-    isDynBatchEnabled = config.dynBatchSupport;
     batchDimIdx = tensorRank - config.outConfs[0].desc.getBlockingDesc().getBlockDims().size() + collapsedDims;
     schedulerWorkAmount = fullWorkAmount / dims_out[dims_out.size() - 1];
 
index 9b20c89..75ada84 100644 (file)
@@ -64,4 +64,36 @@ const auto multiply_params = ::testing::Combine(
         ::testing::Values(additional_config));
 
 INSTANTIATE_TEST_CASE_P(smoke_CompareWithRefs, EltwiseLayerTest, multiply_params, EltwiseLayerTest::getTestCaseName);
+
+
+std::vector<std::vector<std::vector<size_t>>> inShapesSingleThread = {
+        {{1, 2, 3, 4}},
+        {{2, 2, 2, 2}},
+        {{2, 1, 2, 1, 2, 2}}
+};
+
+std::vector<ngraph::helpers::EltwiseTypes> eltwiseOpTypesSingleThread = {
+        ngraph::helpers::EltwiseTypes::ADD,
+        ngraph::helpers::EltwiseTypes::POWER,
+};
+
+std::map<std::string, std::string> additional_config_single_thread = {
+        {"CPU_THREADS_NUM", "1"}
+};
+
+const auto single_thread_params = ::testing::Combine(
+        ::testing::ValuesIn(inShapesSingleThread),
+        ::testing::ValuesIn(eltwiseOpTypesSingleThread),
+        ::testing::ValuesIn(secondaryInputTypes),
+        ::testing::ValuesIn(opTypes),
+        ::testing::ValuesIn(netPrecisions),
+        ::testing::Values(InferenceEngine::Precision::UNSPECIFIED),
+        ::testing::Values(InferenceEngine::Precision::UNSPECIFIED),
+        ::testing::Values(InferenceEngine::Layout::ANY),
+        ::testing::Values(CommonTestUtils::DEVICE_CPU),
+        ::testing::Values(additional_config_single_thread));
+
+INSTANTIATE_TEST_CASE_P(smoke_SingleThread, EltwiseLayerTest, single_thread_params, EltwiseLayerTest::getTestCaseName);
+
+
 }  // namespace
\ No newline at end of file