From 0746f47e8a86442e6c0c8084f5d4f9f27d0abcd7 Mon Sep 17 00:00:00 2001 From: Alexander Chaiko Date: Thu, 16 Jul 2020 10:54:24 +0200 Subject: [PATCH] [IE CLDNN] Adjustment of layouts to choose optimal deconvolution (#781) --- .../thirdparty/clDNN/src/layout_optimizer.cpp | 9 ++++++++- inference-engine/thirdparty/clDNN/src/program.cpp | 7 ++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/inference-engine/thirdparty/clDNN/src/layout_optimizer.cpp b/inference-engine/thirdparty/clDNN/src/layout_optimizer.cpp index ca2c2537376..d8d1a385648 100644 --- a/inference-engine/thirdparty/clDNN/src/layout_optimizer.cpp +++ b/inference-engine/thirdparty/clDNN/src/layout_optimizer.cpp @@ -753,7 +753,14 @@ layout layout_optimizer::get_expected_layout(layout const& current_layout, } else if (_optimization_attributes.b_fs_yx_fsv16_network && deconvolution_b_fs_yx_fsv16_opt(current_layout, output_or_weights_layout, prim)) { expected_tensor = current_layout.size; - expected_format = cldnn::format::b_fs_yx_fsv16; + auto input_tensor = node.get_dependency(0).get_output_layout().size; + int input_features = input_tensor.feature[0]; + int output_features = expected_tensor.feature[0]; + float r = float(input_features * output_features) / (align_to(input_features, 16) * align_to(output_features, 16)); + if (r > 0.5f) + expected_format = cldnn::format::b_fs_yx_fsv16; + else + expected_format = cldnn::format::bfyx; } return layout(expected_data_type, expected_format, expected_tensor); } diff --git a/inference-engine/thirdparty/clDNN/src/program.cpp b/inference-engine/thirdparty/clDNN/src/program.cpp index 58658af625b..2a1733c7781 100644 --- a/inference-engine/thirdparty/clDNN/src/program.cpp +++ b/inference-engine/thirdparty/clDNN/src/program.cpp @@ -1164,11 +1164,12 @@ void program_impl::set_layout_optimizer_attributes(layout_optimizer& lo) { prim.type() != cldnn::mutable_data::type_id()) can_use_fsv16 = false; - // WA to keep bfyx_f16 layout disabled for some topologies where it leads to regressions. - // Detects if given crop layer is located in the very beginning of the graph. + // WA to keep fsv16 layout disabled for some topologies where it leads to regressions. + // For reshape bfy*x is preferred, as fsv16 introduces extra reorders if (prim.type() == cldnn::crop::type_id()) { - if (!prim.get_dependencies()[0]->is_type() || !prim.get_dependencies()[0]->get_dependencies()[0]->is_input()) + if (prim.get_dependencies()[0]->is_type() || prim.get_dependencies()[0]->is_type()) { can_use_fsv16 = false; + } } if (prim.is_in_data_flow() &&