From bd3e02d0837ab4262e0aec6dea0d9b9079a04337 Mon Sep 17 00:00:00 2001 From: Maksim Kutakov Date: Tue, 2 Feb 2021 13:33:15 +0300 Subject: [PATCH] Prefer TailC format over others if I8 preciosn is used. --- .../src/mkldnn_plugin/mkldnn_extension_utils.cpp | 10 ++++++++++ .../src/mkldnn_plugin/mkldnn_extension_utils.h | 3 +++ .../src/mkldnn_plugin/nodes/mkldnn_concat_node.cpp | 6 ++++++ 3 files changed, 19 insertions(+) diff --git a/inference-engine/src/mkldnn_plugin/mkldnn_extension_utils.cpp b/inference-engine/src/mkldnn_plugin/mkldnn_extension_utils.cpp index 797e49834ac163..2b237798bf779a 100644 --- a/inference-engine/src/mkldnn_plugin/mkldnn_extension_utils.cpp +++ b/inference-engine/src/mkldnn_plugin/mkldnn_extension_utils.cpp @@ -134,6 +134,16 @@ PartialBlkDesc PartialBlkDesc::makeCBlocked(const InferenceEngine::SizeVector &d return res; } + +PartialBlkDesc PartialBlkDesc::makeTailC(const InferenceEngine::SizeVector &dims) { + PartialBlkDesc res = makePlain(dims); + if (dims.size() > 2) { + auto itr = res.outer_order.begin() + 1; + std::rotate(itr, itr + 1, res.outer_order.end()); + } + return res; +} + PartialBlkDesc PartialBlkDesc::extractFrom(const InferenceEngine::TensorDesc &desc) { if (desc.getLayout() == InferenceEngine::ANY) THROW_IE_EXCEPTION << "Cannot extract partial blocked descriptor for `ANY` layout"; diff --git a/inference-engine/src/mkldnn_plugin/mkldnn_extension_utils.h b/inference-engine/src/mkldnn_plugin/mkldnn_extension_utils.h index 26fc09c92de36b..95e14a7afa2cb3 100644 --- a/inference-engine/src/mkldnn_plugin/mkldnn_extension_utils.h +++ b/inference-engine/src/mkldnn_plugin/mkldnn_extension_utils.h @@ -59,6 +59,9 @@ class PartialBlkDesc { /** Construct blocked Channel PartialBlkDesc based on dims information */ static PartialBlkDesc makeCBlocked(const InferenceEngine::SizeVector &dims, size_t block_size); + /** Construct per Channel PartialBlkDesc based on dims information */ + static PartialBlkDesc makeTailC(const InferenceEngine::SizeVector &dims); + /** Compare operators. Allow to use it as key for std::map */ bool operator == (const PartialBlkDesc& it) const; bool operator < (const PartialBlkDesc& it) const; diff --git a/inference-engine/src/mkldnn_plugin/nodes/mkldnn_concat_node.cpp b/inference-engine/src/mkldnn_plugin/nodes/mkldnn_concat_node.cpp index d2f28c9ee03cca..8a021790bed95c 100644 --- a/inference-engine/src/mkldnn_plugin/nodes/mkldnn_concat_node.cpp +++ b/inference-engine/src/mkldnn_plugin/nodes/mkldnn_concat_node.cpp @@ -239,6 +239,12 @@ void MKLDNNConcatNode::selectOptimalPrimitiveDescriptor() { if (it.second > maxCount) { maxCount = it.second; convertTo = it.first; + } else if (it.second == maxCount) { + if (outputPrecision == Precision::I8 || outputPrecision == Precision::U8) { + if (it.first == PartialBlkDesc::makeTailC(getChildEdgeAt(0)->getDims().ToSizeVector())) { + convertTo = it.first; + } + } } }