From ad2ed5b480c56feb094db0f390509b1fd35732b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20=C5=BByczy=C5=84ski?= Date: Sat, 5 Sep 2020 09:11:00 +0200 Subject: [PATCH] [IE CLDNN] Reduce performance drop fix (#2065) --- inference-engine/src/cldnn_engine/cldnn_engine.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/inference-engine/src/cldnn_engine/cldnn_engine.cpp b/inference-engine/src/cldnn_engine/cldnn_engine.cpp index 0aad0a11a39..954d49f22c2 100644 --- a/inference-engine/src/cldnn_engine/cldnn_engine.cpp +++ b/inference-engine/src/cldnn_engine/cldnn_engine.cpp @@ -88,20 +88,27 @@ InferenceEngine::ICNNNetwork::Ptr clDNNEngine::CloneAndTransformNetwork(const In } // Reduce node implementation with reduce along features performs better with Reshape->Pooling->Reshape pattern + // Reshape->Pooling->Reshape scenario is also more optimal in case when batch > 1 and network precission is FP16 if (auto redOp = std::dynamic_pointer_cast(node)) { auto reduction_axes = redOp->get_reduction_axes().to_vector(); bool reduce_along_f = redOp->get_reduction_axes().size() == 1 && std::count(reduction_axes.begin(), reduction_axes.end(), 1) != 0; - return !reduce_along_f; + bool fp16_batch_not_1 = redOp->get_element_type() == ngraph::element::f16 && redOp->input(0).get_shape()[0] != 1; + bool can_use_reduce = !reduce_along_f && !fp16_batch_not_1; + return can_use_reduce; } if (auto redOp = std::dynamic_pointer_cast(node)) { auto reduction_axes = redOp->get_reduction_axes().to_vector(); bool reduce_along_f = redOp->get_reduction_axes().size() == 1 && std::count(reduction_axes.begin(), reduction_axes.end(), 1) != 0; - return !reduce_along_f; + bool fp16_batch_not_1 = redOp->get_element_type() == ngraph::element::f16 && redOp->input(0).get_shape()[0] != 1; + bool can_use_reduce = !reduce_along_f && !fp16_batch_not_1; + return can_use_reduce; } if (auto redOp = std::dynamic_pointer_cast(node)) { auto reduction_axes = redOp->get_reduction_axes().to_vector(); bool reduce_along_f = redOp->get_reduction_axes().size() == 1 && std::count(reduction_axes.begin(), reduction_axes.end(), 1) != 0; - return !reduce_along_f; + bool fp16_batch_not_1 = redOp->get_element_type() == ngraph::element::f16 && redOp->input(0).get_shape()[0] != 1; + bool can_use_reduce = !reduce_along_f && !fp16_batch_not_1; + return can_use_reduce; } return std::dynamic_pointer_cast(node) ||