1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
5 #include "mkldnn_extension_utils.h"
9 using namespace mkldnn;
10 using namespace MKLDNNPlugin;
12 uint8_t MKLDNNExtensionUtils::sizeOfDataType(mkldnn::memory::data_type dataType) {
14 case mkldnn::memory::data_type::f32:
16 case mkldnn::memory::data_type::s32:
18 case mkldnn::memory::data_type::s16:
20 case mkldnn::memory::data_type::s8:
22 case mkldnn::memory::data_type::u8:
24 case mkldnn::memory::data_type::bin:
26 case mkldnn::memory::data_type::data_undef:
30 THROW_IE_EXCEPTION << "Unsupported data type.";
34 memory::data_type MKLDNNExtensionUtils::IEPrecisionToDataType(InferenceEngine::Precision prec) {
36 case InferenceEngine::Precision::FP32:
38 case InferenceEngine::Precision::I32:
40 case InferenceEngine::Precision::I16:
42 case InferenceEngine::Precision::I8:
44 case InferenceEngine::Precision::U8:
46 case InferenceEngine::Precision::BIN:
50 THROW_IE_EXCEPTION << "The plugin does not support " << prec.name();
55 InferenceEngine::Precision MKLDNNExtensionUtils::DataTypeToIEPrecision(memory::data_type dataType) {
58 return InferenceEngine::Precision(InferenceEngine::Precision::FP32);
60 return InferenceEngine::Precision::I32;
62 return InferenceEngine::Precision::I16;
64 return InferenceEngine::Precision::I8;
66 return InferenceEngine::Precision::U8;
68 return InferenceEngine::Precision::BIN;
71 THROW_IE_EXCEPTION << "Unsupported data type.";
76 InferenceEngine::TensorDesc MKLDNNExtensionUtils::getUninitTensorDesc(const InferenceEngine::TensorDesc &desc) {
77 std::vector<size_t> notInitArr;
78 std::vector<size_t> zeroArr;
79 for (size_t i = 0; i < desc.getBlockingDesc().getBlockDims().size(); i++) {
80 notInitArr.push_back(std::numeric_limits<size_t>::max());
83 // MKLDNN doesn't support offset_padding_to_data[i] != 0 (assert(src_d_blk.offset_padding_to_data[d] == 0);)
84 return desc.getLayout() == InferenceEngine::Layout::ANY ? desc :
85 InferenceEngine::TensorDesc(desc.getPrecision(), desc.getDims(),
86 {desc.getBlockingDesc().getBlockDims(), desc.getBlockingDesc().getOrder(),
87 std::numeric_limits<size_t>::max(), zeroArr, notInitArr});
90 bool MKLDNNExtensionUtils::initTensorsAreEqual(InferenceEngine::TensorDesc desc1, InferenceEngine::TensorDesc desc2) {
91 if (desc1.getDims() != desc2.getDims() || desc1.getPrecision() != desc2.getPrecision())
93 if (desc1.getLayout() == InferenceEngine::Layout::ANY || desc2.getLayout() == InferenceEngine::Layout::ANY)
95 bool batch1 = desc1.getDims()[0] == 1;
96 const auto& in1Block = desc1.getBlockingDesc();
97 const auto& in2Block = desc2.getBlockingDesc();
98 size_t uninitNum = std::numeric_limits<size_t>::max();
99 if (in1Block.getBlockDims().size() != in2Block.getBlockDims().size())
101 for (size_t i = 0; i < in1Block.getBlockDims().size(); i++) {
102 if (in1Block.getBlockDims()[i] != in2Block.getBlockDims()[i] &&
103 in1Block.getBlockDims()[i] != uninitNum && in2Block.getBlockDims()[i] != uninitNum)
105 if (in1Block.getOffsetPaddingToData()[i] != in2Block.getOffsetPaddingToData()[i] &&
106 in1Block.getOffsetPaddingToData()[i] != uninitNum && in2Block.getOffsetPaddingToData()[i] != uninitNum)
108 if (i >= batch1 && in1Block.getStrides()[i] != in2Block.getStrides()[i] &&
109 in1Block.getStrides()[i] != uninitNum && in2Block.getStrides()[i] != uninitNum)
111 if (in1Block.getOrder()[i] != in2Block.getOrder()[i] &&
112 in1Block.getOrder()[i] != uninitNum && in2Block.getOrder()[i] != uninitNum)
115 return !(in1Block.getOffsetPadding() != in2Block.getOffsetPadding() &&
116 in1Block.getOffsetPadding() != uninitNum && in2Block.getOffsetPadding() != uninitNum);