1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
5 #include <gtest/gtest.h>
6 #include <gmock/gmock-spec-builders.h>
7 #include "mkldnn_plugin/mkldnn_graph.h"
9 #include "test_graph.hpp"
11 #include <ie_iextension.h>
12 #include <ie_plugin_config.hpp>
13 #include <mock_error_listener.hpp>
14 #include <mkldnn_plugin/mkldnn_extension_mngr.h>
15 #include "tests_common.hpp"
17 #include <ext_list.hpp>
19 using namespace ::testing;
21 using namespace mkldnn;
23 class FakeGenericPrimitiveImpl : public InferenceEngine::ILayerExecImpl {
25 InferenceEngine::StatusCode getSupportedConfigurations(std::vector<InferenceEngine::LayerConfig>& conf, InferenceEngine::ResponseDesc *resp) noexcept override {
26 return InferenceEngine::OK;
28 InferenceEngine::StatusCode init(InferenceEngine::LayerConfig& config, InferenceEngine::ResponseDesc *resp) noexcept override {
29 return InferenceEngine::OK;
31 InferenceEngine::StatusCode execute(std::vector<InferenceEngine::Blob::Ptr>& inputs, std::vector<InferenceEngine::Blob::Ptr>& outputs, InferenceEngine::ResponseDesc *resp) noexcept override {
32 return InferenceEngine::NOT_IMPLEMENTED;
36 class FakeGenericPrimitiveFactory : public InferenceEngine::ILayerImplFactory {
38 // set output shapes by input shapes.
39 InferenceEngine::StatusCode getShapes(const std::vector<InferenceEngine::TensorDesc>& inShapes,
40 std::vector<InferenceEngine::TensorDesc>& outShapes,
41 InferenceEngine::ResponseDesc *resp) noexcept override {
42 return InferenceEngine::NOT_IMPLEMENTED;
44 // First implementation has more priority than next
45 InferenceEngine::StatusCode getImplementations(std::vector<InferenceEngine::ILayerImpl::Ptr>& impls, InferenceEngine::ResponseDesc *resp) noexcept override {
46 impls.push_back(InferenceEngine::ILayerImpl::Ptr(new FakeGenericPrimitiveImpl()));
47 return InferenceEngine::OK;
51 class DoublePrimitiveImpl : public InferenceEngine::ILayerExecImpl {
53 DoublePrimitiveImpl(const InferenceEngine::CNNLayer *layer) {
54 cnnLayer = const_cast<InferenceEngine::CNNLayer *>(layer);
56 InferenceEngine::StatusCode getSupportedConfigurations(std::vector<InferenceEngine::LayerConfig>& conf, InferenceEngine::ResponseDesc *resp) noexcept override {
57 InferenceEngine::LayerConfig config;
58 config.dynBatchSupport = true;
59 if (cnnLayer->outData.size() != 1 && cnnLayer->insData.size() != 1)
60 return InferenceEngine::GENERAL_ERROR;
61 InferenceEngine::DataConfig cfg;
64 InferenceEngine::SizeVector order;
65 for(size_t i = 0; i < cnnLayer->outData[0]->getTensorDesc().getDims().size(); i++) {
68 cfg.desc = InferenceEngine::TensorDesc(cnnLayer->outData[0]->getTensorDesc().getPrecision(),
69 cnnLayer->outData[0]->getTensorDesc().getDims(),
70 {cnnLayer->outData[0]->getTensorDesc().getDims(), order});
71 config.outConfs.push_back(cfg);
72 config.inConfs.push_back(cfg);
73 conf.push_back(config);
74 return InferenceEngine::OK;
76 InferenceEngine::StatusCode init(InferenceEngine::LayerConfig& config, InferenceEngine::ResponseDesc *resp) noexcept override {
77 for(auto input : config.inConfs) {
78 if (input.inPlace < 0)
79 return InferenceEngine::GENERAL_ERROR;
81 return InferenceEngine::GENERAL_ERROR;
83 for(auto output : config.outConfs) {
85 return InferenceEngine::GENERAL_ERROR;
87 return InferenceEngine::OK;
89 InferenceEngine::StatusCode execute(std::vector<InferenceEngine::Blob::Ptr>& inputs, std::vector<InferenceEngine::Blob::Ptr>& outputs, InferenceEngine::ResponseDesc *resp) noexcept override {
90 const float *src_data = inputs[0]->buffer();
91 float *dst_data = outputs[0]->buffer();
92 if (src_data != dst_data)
93 return InferenceEngine::GENERAL_ERROR;
95 size_t data_size = inputs[0]->size();
96 for (size_t i = 0; i < data_size; i++) {
97 dst_data[i] = src_data[i]*2;
99 return InferenceEngine::OK;
103 InferenceEngine::CNNLayer* cnnLayer;
106 class ConstPrimitiveImpl : public InferenceEngine::ILayerExecImpl {
108 ConstPrimitiveImpl(const InferenceEngine::CNNLayer *layer) {
109 cnnLayer = const_cast<InferenceEngine::CNNLayer *>(layer);
111 InferenceEngine::StatusCode getSupportedConfigurations(std::vector<InferenceEngine::LayerConfig>& conf, InferenceEngine::ResponseDesc *resp) noexcept override {
112 InferenceEngine::LayerConfig config;
113 config.dynBatchSupport = 0;
114 if (cnnLayer->outData.size() != 1 && cnnLayer->insData.size() != 1)
115 return InferenceEngine::GENERAL_ERROR;
116 InferenceEngine::DataConfig cfg;
118 // Cannot be in-place because memory will change a memory.
120 InferenceEngine::SizeVector order;
121 for(size_t i = 0; i < cnnLayer->outData[0]->getTensorDesc().getDims().size(); i++) {
124 cfg.desc = InferenceEngine::TensorDesc(cnnLayer->outData[0]->getTensorDesc().getPrecision(),
125 cnnLayer->outData[0]->getTensorDesc().getDims(),
126 {cnnLayer->outData[0]->getTensorDesc().getDims(), order});
127 config.outConfs.push_back(cfg);
128 config.inConfs.push_back(cfg);
129 conf.push_back(config);
130 return InferenceEngine::OK;
132 InferenceEngine::StatusCode init(InferenceEngine::LayerConfig& config, InferenceEngine::ResponseDesc *resp) noexcept override {
133 if (config.dynBatchSupport)
134 return InferenceEngine::NOT_IMPLEMENTED;
135 for(auto input : config.inConfs) {
136 if (input.inPlace >= 0)
137 return InferenceEngine::GENERAL_ERROR;
139 return InferenceEngine::GENERAL_ERROR;
141 for(auto output : config.outConfs) {
142 if (output.inPlace >= 0)
143 return InferenceEngine::GENERAL_ERROR;
144 if (!output.constant)
145 return InferenceEngine::GENERAL_ERROR;
147 return InferenceEngine::OK;
149 InferenceEngine::StatusCode execute(std::vector<InferenceEngine::Blob::Ptr>& inputs, std::vector<InferenceEngine::Blob::Ptr>& outputs, InferenceEngine::ResponseDesc *resp) noexcept override {
150 float *dst_data = outputs[0]->buffer();
152 size_t data_size = outputs[0]->size();
153 for (size_t i = 0; i < data_size; i++) {
154 dst_data[i] = (dst_data[i] + 1)*2;
156 return InferenceEngine::OK;
160 InferenceEngine::CNNLayer *cnnLayer;
163 class ConstPrimitiveFactory : public InferenceEngine::ILayerImplFactory {
165 ConstPrimitiveFactory(const InferenceEngine::CNNLayer *layer) {
166 cnnLayer = const_cast<InferenceEngine::CNNLayer *>(layer);
168 // set output shapes by input shapes.
169 InferenceEngine::StatusCode getShapes(const std::vector<InferenceEngine::TensorDesc>& inShapes, std::vector<InferenceEngine::TensorDesc>& outShapes, InferenceEngine::ResponseDesc *resp) noexcept override {
170 outShapes.push_back(inShapes[0]);
171 return InferenceEngine::OK;
173 // First implementation has more priority than next
174 InferenceEngine::StatusCode getImplementations(std::vector<InferenceEngine::ILayerImpl::Ptr>& impls, InferenceEngine::ResponseDesc *resp) noexcept override {
175 impls.push_back(InferenceEngine::ILayerImpl::Ptr(new ConstPrimitiveImpl(cnnLayer)));
176 return InferenceEngine::OK;
180 InferenceEngine::CNNLayer * cnnLayer;
183 class DoublePrimitiveFactory : public InferenceEngine::ILayerImplFactory {
185 DoublePrimitiveFactory(const InferenceEngine::CNNLayer *layer) {
186 cnnLayer = const_cast<InferenceEngine::CNNLayer *>(layer);
188 // set output shapes by input shapes.
189 InferenceEngine::StatusCode getShapes(const std::vector<InferenceEngine::TensorDesc>& inShapes, std::vector<InferenceEngine::TensorDesc>& outShapes, InferenceEngine::ResponseDesc *resp) noexcept override {
190 outShapes.push_back(inShapes[0]);
191 return InferenceEngine::OK;
193 // First implementation has more priority than next
194 InferenceEngine::StatusCode getImplementations(std::vector<InferenceEngine::ILayerImpl::Ptr>& impls, InferenceEngine::ResponseDesc *resp) noexcept override {
195 impls.push_back(InferenceEngine::ILayerImpl::Ptr(new DoublePrimitiveImpl(cnnLayer)));
196 return InferenceEngine::OK;
200 InferenceEngine::CNNLayer * cnnLayer;
203 class TwoDifferentOutputsImpl : public InferenceEngine::ILayerExecImpl {
205 TwoDifferentOutputsImpl(const InferenceEngine::CNNLayer *layer) {
206 cnnLayer = const_cast<InferenceEngine::CNNLayer *>(layer);
208 InferenceEngine::StatusCode getSupportedConfigurations(std::vector<InferenceEngine::LayerConfig>& conf, InferenceEngine::ResponseDesc *resp) noexcept override {
209 InferenceEngine::LayerConfig config;
210 config.dynBatchSupport = 0;
211 if (cnnLayer->outData.size() != 2 && cnnLayer->insData.size() != 1)
212 return InferenceEngine::GENERAL_ERROR;
213 InferenceEngine::DataConfig cfg;
214 cfg.constant = false;
216 InferenceEngine::SizeVector order;
217 for(size_t i = 0; i < cnnLayer->outData[0]->getTensorDesc().getDims().size(); i++) {
220 cfg.desc = InferenceEngine::TensorDesc(cnnLayer->outData[0]->getTensorDesc().getPrecision(),
221 cnnLayer->outData[0]->getTensorDesc().getDims(),
222 {cnnLayer->outData[0]->getTensorDesc().getDims(), order});
223 config.outConfs.push_back(cfg);
224 cfg.desc = InferenceEngine::TensorDesc(cnnLayer->outData[1]->getTensorDesc().getPrecision(),
225 cnnLayer->outData[1]->getTensorDesc().getDims(),
226 {cnnLayer->outData[1]->getTensorDesc().getDims(), order});
227 config.outConfs.push_back(cfg);
228 cfg.desc = InferenceEngine::TensorDesc(cnnLayer->insData[0].lock()->getTensorDesc().getPrecision(),
229 cnnLayer->insData[0].lock()->getTensorDesc().getDims(),
230 {cnnLayer->insData[0].lock()->getTensorDesc().getDims(), order});
231 config.inConfs.push_back(cfg);
232 conf.push_back(config);
233 return InferenceEngine::OK;
235 InferenceEngine::StatusCode init(InferenceEngine::LayerConfig& config, InferenceEngine::ResponseDesc *resp) noexcept override {
236 if (config.dynBatchSupport)
237 return InferenceEngine::NOT_IMPLEMENTED;
238 for(auto input : config.inConfs) {
239 if (input.inPlace >= 0)
240 return InferenceEngine::GENERAL_ERROR;
242 return InferenceEngine::GENERAL_ERROR;
244 for(auto output : config.outConfs) {
245 if (output.inPlace >= 0)
246 return InferenceEngine::GENERAL_ERROR;
248 return InferenceEngine::GENERAL_ERROR;
250 return InferenceEngine::OK;
252 InferenceEngine::StatusCode execute(std::vector<InferenceEngine::Blob::Ptr>& inputs, std::vector<InferenceEngine::Blob::Ptr>& outputs, InferenceEngine::ResponseDesc *resp) noexcept override {
253 const float *src_data = inputs[0]->buffer();
254 float *dst_data0 = outputs[0]->buffer();
255 float *dst_data1 = outputs[1]->buffer();
257 size_t out_data_size0 = outputs[0]->size();
258 size_t out_data_size1 = outputs[1]->size();
259 for (size_t i = 0; i < out_data_size0; i++) {
260 dst_data0[i] = (*(src_data++))*2;
263 for (size_t i = 0; i < out_data_size1; i++) {
264 dst_data1[i] = (*(src_data++))*3;
266 return InferenceEngine::OK;
270 InferenceEngine::CNNLayer* cnnLayer;
273 class TwoDifferentOutputsFactory : public InferenceEngine::ILayerImplFactory {
275 TwoDifferentOutputsFactory(const InferenceEngine::CNNLayer *layer) {
276 cnnLayer = const_cast<InferenceEngine::CNNLayer *>(layer);
278 // set output shapes by input shapes.
279 InferenceEngine::StatusCode getShapes(const std::vector<InferenceEngine::TensorDesc>& inShapes, std::vector<InferenceEngine::TensorDesc>& outShapes, InferenceEngine::ResponseDesc *resp) noexcept override {
280 return InferenceEngine::NOT_IMPLEMENTED;
282 // First implementation has more priority than next
283 InferenceEngine::StatusCode getImplementations(std::vector<InferenceEngine::ILayerImpl::Ptr>& impls, InferenceEngine::ResponseDesc *resp) noexcept override {
284 impls.push_back(InferenceEngine::ILayerImpl::Ptr(new TwoDifferentOutputsImpl(cnnLayer)));
285 return InferenceEngine::OK;
289 InferenceEngine::CNNLayer * cnnLayer;
292 class CustomConcatImpl : public InferenceEngine::ILayerImpl {
294 CustomConcatImpl(const InferenceEngine::CNNLayer *layer) {
295 cnnLayer = const_cast<InferenceEngine::CNNLayer *>(layer);
297 InferenceEngine::StatusCode getSupportedConfigurations(std::vector<InferenceEngine::LayerConfig>& conf, InferenceEngine::ResponseDesc *resp) noexcept override {
298 InferenceEngine::LayerConfig config;
299 config.dynBatchSupport = 0;
300 if (cnnLayer->outData.size() != 1 && cnnLayer->insData.size() != 2)
301 return InferenceEngine::GENERAL_ERROR;
302 InferenceEngine::DataConfig cfg;
303 cfg.constant = false;
305 InferenceEngine::SizeVector order;
306 for(size_t i = 0; i < cnnLayer->outData[0]->getTensorDesc().getDims().size(); i++) {
309 cfg.desc = InferenceEngine::TensorDesc(cnnLayer->outData[0]->getTensorDesc().getPrecision(),
310 cnnLayer->outData[0]->getTensorDesc().getDims(),
311 {cnnLayer->outData[0]->getTensorDesc().getDims(), order});
312 config.outConfs.push_back(cfg);
314 InferenceEngine::SizeVector dims = cnnLayer->insData[0].lock()->getTensorDesc().getDims();
315 cfg.desc = InferenceEngine::TensorDesc(cnnLayer->insData[0].lock()->getTensorDesc().getPrecision(),
316 dims, {dims, order});
317 size_t dataSize = std::accumulate(std::begin(dims), std::end(dims), (size_t) 1, std::multiplies<size_t>());
318 config.inConfs.push_back(cfg);
319 cfg.desc = InferenceEngine::TensorDesc(cnnLayer->insData[1].lock()->getTensorDesc().getPrecision(),
320 cnnLayer->insData[1].lock()->getTensorDesc().getDims(),
321 {cnnLayer->insData[1].lock()->getTensorDesc().getDims(), order,
323 config.inConfs.push_back(cfg);
324 conf.push_back(config);
325 return InferenceEngine::OK;
327 InferenceEngine::StatusCode init(InferenceEngine::LayerConfig& config, InferenceEngine::ResponseDesc *resp) noexcept override {
328 if (config.dynBatchSupport)
329 return InferenceEngine::NOT_IMPLEMENTED;
330 for(auto input : config.inConfs) {
331 if (input.inPlace < 0)
332 return InferenceEngine::GENERAL_ERROR;
334 return InferenceEngine::GENERAL_ERROR;
336 for(auto output : config.outConfs) {
337 if (output.inPlace >= 0)
338 return InferenceEngine::GENERAL_ERROR;
340 return InferenceEngine::GENERAL_ERROR;
342 return InferenceEngine::OK;
345 InferenceEngine::CNNLayer * cnnLayer;
348 class CustomConcatFactory : public InferenceEngine::ILayerImplFactory {
350 CustomConcatFactory(const InferenceEngine::CNNLayer *layer) {
351 cnnLayer = const_cast<InferenceEngine::CNNLayer *>(layer);
353 // set output shapes by input shapes.
354 InferenceEngine::StatusCode getShapes(const std::vector<InferenceEngine::TensorDesc>& inShapes, std::vector<InferenceEngine::TensorDesc>& outShapes, InferenceEngine::ResponseDesc *resp) noexcept override {
355 return InferenceEngine::NOT_IMPLEMENTED;
357 // First implementation has more priority than next
358 InferenceEngine::StatusCode getImplementations(std::vector<InferenceEngine::ILayerImpl::Ptr>& impls, InferenceEngine::ResponseDesc *resp) noexcept override {
359 impls.push_back(InferenceEngine::ILayerImpl::Ptr(new CustomConcatImpl(cnnLayer)));
360 return InferenceEngine::OK;
364 InferenceEngine::CNNLayer * cnnLayer;
367 class CustomSplitImpl : public InferenceEngine::ILayerImpl {
369 CustomSplitImpl(const InferenceEngine::CNNLayer *layer) {
370 cnnLayer = const_cast<InferenceEngine::CNNLayer *>(layer);
372 InferenceEngine::StatusCode getSupportedConfigurations(std::vector<InferenceEngine::LayerConfig>& conf, InferenceEngine::ResponseDesc *resp) noexcept override {
373 InferenceEngine::LayerConfig config;
374 config.dynBatchSupport = 0;
375 if (cnnLayer->outData.size() != 2 && cnnLayer->insData.size() != 1)
376 return InferenceEngine::GENERAL_ERROR;
377 InferenceEngine::DataConfig cfg;
378 cfg.constant = false;
380 InferenceEngine::SizeVector order;
381 for(size_t i = 0; i < cnnLayer->outData[0]->getTensorDesc().getDims().size(); i++) {
384 cfg.desc = InferenceEngine::TensorDesc(cnnLayer->outData[0]->getTensorDesc().getPrecision(),
385 cnnLayer->outData[0]->getTensorDesc().getDims(),
386 {cnnLayer->outData[0]->getTensorDesc().getDims(), order});
387 config.outConfs.push_back(cfg);
388 size_t dataSize = std::accumulate(std::begin(cnnLayer->outData[0]->getTensorDesc().getDims()),
389 std::end(cnnLayer->outData[0]->getTensorDesc().getDims()),
390 (size_t) 1, std::multiplies<size_t>());
391 cfg.desc = InferenceEngine::TensorDesc(cnnLayer->outData[1]->getTensorDesc().getPrecision(),
392 cnnLayer->outData[1]->getTensorDesc().getDims(),
393 {cnnLayer->outData[1]->getTensorDesc().getDims(), order, dataSize});
394 config.outConfs.push_back(cfg);
396 cfg.desc = InferenceEngine::TensorDesc(cnnLayer->insData[0].lock()->getTensorDesc().getPrecision(),
397 cnnLayer->insData[0].lock()->getTensorDesc().getDims(),
398 {cnnLayer->insData[0].lock()->getTensorDesc().getDims(), order});
399 config.inConfs.push_back(cfg);
400 conf.push_back(config);
401 return InferenceEngine::OK;
403 InferenceEngine::StatusCode init(InferenceEngine::LayerConfig& config, InferenceEngine::ResponseDesc *resp) noexcept override {
404 if (config.dynBatchSupport)
405 return InferenceEngine::NOT_IMPLEMENTED;
406 for(auto input : config.inConfs) {
408 return InferenceEngine::GENERAL_ERROR;
410 return InferenceEngine::GENERAL_ERROR;
412 for(auto output : config.outConfs) {
414 return InferenceEngine::GENERAL_ERROR;
416 return InferenceEngine::OK;
419 InferenceEngine::CNNLayer * cnnLayer;
422 class CustomSplitFactory : public InferenceEngine::ILayerImplFactory {
424 CustomSplitFactory(const InferenceEngine::CNNLayer *layer) {
425 cnnLayer = const_cast<InferenceEngine::CNNLayer *>(layer);
427 // set output shapes by input shapes.
428 InferenceEngine::StatusCode getShapes(const std::vector<InferenceEngine::TensorDesc>& inShapes, std::vector<InferenceEngine::TensorDesc>& outShapes, InferenceEngine::ResponseDesc *resp) noexcept override {
429 return InferenceEngine::NOT_IMPLEMENTED;
431 // First implementation has more priority than next
432 InferenceEngine::StatusCode getImplementations(std::vector<InferenceEngine::ILayerImpl::Ptr>& impls, InferenceEngine::ResponseDesc *resp) noexcept override {
433 impls.push_back(InferenceEngine::ILayerImpl::Ptr(new CustomSplitImpl(cnnLayer)));
434 return InferenceEngine::OK;
438 InferenceEngine::CNNLayer * cnnLayer;
440 using fake_ext_factory = std::function<InferenceEngine::ILayerImplFactory*(const InferenceEngine::CNNLayer *)>;
442 class FakeExtensionFabric : public InferenceEngine::IExtension {
444 FakeExtensionFabric() {
445 factories["CustomNewConvolution"] = [](const InferenceEngine::CNNLayer * cnnLayer) -> InferenceEngine::ILayerImplFactory* { return new FakeGenericPrimitiveFactory(); };
446 factories["NewDoubleLayer"] = [](const InferenceEngine::CNNLayer * cnnLayer) -> InferenceEngine::ILayerImplFactory* { return new DoublePrimitiveFactory(cnnLayer); };
447 factories["NewTwoDifferentOutputs"] = [](const InferenceEngine::CNNLayer * cnnLayer) -> InferenceEngine::ILayerImplFactory* { return new TwoDifferentOutputsFactory(cnnLayer); };
448 factories["ConstPrim"] = [](const InferenceEngine::CNNLayer * cnnLayer) -> InferenceEngine::ILayerImplFactory* { return new ConstPrimitiveFactory(cnnLayer); };
449 factories["CustomInPlaceConcat"] = [](const InferenceEngine::CNNLayer * cnnLayer) -> InferenceEngine::ILayerImplFactory* { return new CustomConcatFactory(cnnLayer); };
450 factories["CustomInPlaceSplit"] = [](const InferenceEngine::CNNLayer * cnnLayer) -> InferenceEngine::ILayerImplFactory* { return new CustomSplitFactory(cnnLayer); };
453 virtual ~FakeExtensionFabric() {
457 void GetVersion(const InferenceEngine::Version *&versionInfo) const noexcept override {}
458 void SetLogCallback(InferenceEngine::IErrorListener &listener) noexcept override {}
459 void Unload() noexcept override {}
460 void Release() noexcept override {
463 InferenceEngine::StatusCode getPrimitiveTypes(char**& types, unsigned int& size, InferenceEngine::ResponseDesc* resp) noexcept override {
464 types = new char *[factories.size()];
466 for (auto it = factories.begin(); it != factories.end(); it++, count ++) {
467 types[count] = new char[it->first.size() + 1];
468 std::copy(it->first.begin(), it->first.end(), types[count]);
469 types[count][it->first.size() ] = '\0';
471 return InferenceEngine::OK;
473 InferenceEngine::StatusCode getFactoryFor(InferenceEngine::ILayerImplFactory *&factory,
474 const InferenceEngine::CNNLayer *cnnLayer,
475 InferenceEngine::ResponseDesc *resp) noexcept override {
476 if (factories.find(cnnLayer->type) == factories.end()) {
477 std::string errorMsg = std::string("Factory for ") + cnnLayer->type + " wasn't found!";
478 errorMsg.copy(resp->msg, sizeof(resp->msg) - 1);
479 return InferenceEngine::NOT_FOUND;
481 factory = factories[cnnLayer->type](cnnLayer);
482 return InferenceEngine::OK;
485 InferenceEngine::StatusCode getShapeInferImpl(InferenceEngine::IShapeInferImpl::Ptr& impl, const char* type,
486 InferenceEngine::ResponseDesc* resp) noexcept override {
487 return InferenceEngine::NOT_IMPLEMENTED;
491 std::map<std::string, fake_ext_factory> factories;
494 class MKLDNNGraphGenericTests: public TestsCommon {
496 virtual void SetUp() {
497 TestsCommon::SetUp();
498 extension.reset(new FakeExtensionFabric());
500 std::shared_ptr<InferenceEngine::IExtension> extension;
503 TEST_F(MKLDNNGraphGenericTests, canGetPrimitiveDescriptorsList) {
504 MKLDNNPlugin::MKLDNNExtensionManager::Ptr extMgr(new MKLDNNPlugin::MKLDNNExtensionManager());
505 extMgr->AddExtension(extension);
506 std::shared_ptr<MKLDNNPlugin::MKLDNNNode> node;
507 InferenceEngine::DataPtr dataPtr;
508 dataPtr.reset(new InferenceEngine::Data("test", {1, 3, 4, 5}, InferenceEngine::Precision::FP32, InferenceEngine::Layout::NCHW));
509 InferenceEngine::CNNLayerPtr layerPtr;
510 layerPtr.reset(new InferenceEngine::CNNLayer({"name", "CustomNewConvolution", InferenceEngine::Precision::FP32}));
511 layerPtr->outData.push_back(dataPtr);
513 mkldnn::engine eng(mkldnn::engine(mkldnn::engine::kind::cpu, 0));
514 node.reset(MKLDNNPlugin::MKLDNNNode::CreateNode(layerPtr, eng, extMgr));
515 ASSERT_EQ(MKLDNNPlugin::Type::Generic, node->getType());
517 ASSERT_NO_THROW(node->getSupportedDescriptors());
520 template <typename data_t>
521 void ref_double(const InferenceEngine::TBlob<data_t> &src, InferenceEngine::TBlob<data_t> &dst) {
522 const data_t *src_data = src.readOnly();
523 data_t *dst_data = dst.data();
525 for (int i=0; i < src.size(); i++)
526 dst_data[i] = src_data[i]*2;
529 template <typename data_t>
530 void ref_double_batch1(const InferenceEngine::TBlob<data_t> &src, InferenceEngine::TBlob<data_t> &dst) {
531 const data_t *src_data = src.readOnly();
532 data_t *dst_data = dst.data();
534 for (int i= 0; i < src.size() / 2; i++)
535 dst_data[i] = src_data[i]*2;
537 for (int i= src.size() / 2; i < src.size(); i++)
541 template <typename data_t>
542 void ref_twoDifferent(const InferenceEngine::TBlob<data_t> &src, InferenceEngine::TBlob<data_t> &dst1, InferenceEngine::TBlob<data_t> &dst2) {
543 const data_t *src_data = src.readOnly();
544 data_t *dst_data1 = dst1.data();
545 data_t *dst_data2 = dst2.data();
547 for (int i=0; i < dst1.size(); i++)
548 dst_data1[i] = (*(src_data++))*2;
550 for (int i=0; i < dst2.size(); i++)
551 dst_data2[i] = (*(src_data++))*6;
554 TEST_F(MKLDNNGraphGenericTests, DontCreateGPUGenericPrimitive) {
555 std::string model = R"V0G0N(
556 <Net Name="DoubleLayer_Only" version="2" precision="FP32" batch="1">
558 <layer name="in1" type="Input" precision="FP32" id="0">
568 <layer name="gpulayer" id="1" type="CustomGPUConvolution" precision="FP32">
588 <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
592 MKLDNNPlugin::MKLDNNExtensionManager::Ptr extMgr(new MKLDNNPlugin::MKLDNNExtensionManager());
593 extMgr->AddExtension(extension);
595 InferenceEngine::CNNNetReader net_reader;
596 ASSERT_NO_THROW(net_reader.ReadNetwork(model.data(), model.length()));
598 MKLDNNGraphTestClass graph;
599 ASSERT_THROW(graph.CreateGraph(net_reader.getNetwork(), extMgr), InferenceEngine::details::InferenceEngineException);
602 TEST_F(MKLDNNGraphGenericTests, ExecuteConstGenericPrimitive) {
603 std::string model = R"V0G0N(
604 <Net Name="DoubleLayer_Only" version="2" precision="FP32" batch="1">
606 <layer name="in1" type="Input" precision="FP32" id="0">
616 <layer name="const_layer" id="1" type="ConstPrim" precision="FP32">
636 <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
640 MKLDNNPlugin::MKLDNNExtensionManager::Ptr extMgr(new MKLDNNPlugin::MKLDNNExtensionManager());
641 extMgr->AddExtension(extension);
643 InferenceEngine::CNNNetReader net_reader;
644 ASSERT_NO_THROW(net_reader.ReadNetwork(model.data(), model.length()));
646 MKLDNNGraphTestClass graph;
647 graph.CreateGraph(net_reader.getNetwork(), extMgr);
649 InferenceEngine::SizeVector dims_src = {1, 3, 5, 5};
651 InferenceEngine::Blob::Ptr src =
652 InferenceEngine::make_shared_blob<float, const InferenceEngine::SizeVector>(InferenceEngine::Precision::FP32, InferenceEngine::NCHW, dims_src);
654 fill_data(src->buffer(), src->size());
656 InferenceEngine::TBlob<float>* srcPtr = dynamic_cast<InferenceEngine::TBlob<float>*>(src.get());
658 if (srcPtr == nullptr)
659 FAIL() << "Cannot cast blob to TBlob<float>.";
661 InferenceEngine::BlobMap srcs;
662 srcs.insert(std::pair<std::string, InferenceEngine::Blob::Ptr>("in1", src));
664 InferenceEngine::OutputsDataMap out;
665 out = net_reader.getNetwork().getOutputsInfo();
666 InferenceEngine::BlobMap outputBlobs;
668 std::pair<std::string, InferenceEngine::DataPtr> item = *out.begin();
670 InferenceEngine::TBlob<float>::Ptr output;
671 output = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc());
673 outputBlobs[item.first] = output;
675 graph.Infer(srcs, outputBlobs);
676 graph.Infer(srcs, outputBlobs);
678 InferenceEngine::TBlob<float> dst_ref(item.second->getTensorDesc());
681 float * dst_data = dst_ref.buffer();
682 for (size_t i = 0; i < dst_ref.size(); i++) {
686 compare(*output, dst_ref);
689 TEST_F(MKLDNNGraphGenericTests, ExecuteGenericPrimitive) {
690 std::string model = R"V0G0N(
691 <Net Name="DoubleLayer_Only" version="2" precision="FP32" batch="1">
693 <layer name="in1" type="Input" precision="FP32" id="0">
703 <layer name="double_layer" id="1" type="NewDoubleLayer" precision="FP32">
723 <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
727 MKLDNNPlugin::MKLDNNExtensionManager::Ptr extMgr(new MKLDNNPlugin::MKLDNNExtensionManager());
728 extMgr->AddExtension(extension);
730 InferenceEngine::CNNNetReader net_reader;
731 ASSERT_NO_THROW(net_reader.ReadNetwork(model.data(), model.length()));
733 MKLDNNGraphTestClass graph;
734 graph.CreateGraph(net_reader.getNetwork(), extMgr);
736 InferenceEngine::SizeVector dims_src = {1, 3, 5, 5};
738 InferenceEngine::Blob::Ptr src =
739 InferenceEngine::make_shared_blob<float, const InferenceEngine::SizeVector>(InferenceEngine::Precision::FP32, InferenceEngine::NCHW, dims_src);
741 fill_data(src->buffer(), src->size());
743 InferenceEngine::TBlob<float>* srcPtr = dynamic_cast<InferenceEngine::TBlob<float>*>(src.get());
745 if (srcPtr == nullptr)
746 FAIL() << "Cannot cast blob to TBlob<float>.";
748 InferenceEngine::BlobMap srcs;
749 srcs.insert(std::pair<std::string, InferenceEngine::Blob::Ptr>("in1", src));
751 InferenceEngine::OutputsDataMap out;
752 out = net_reader.getNetwork().getOutputsInfo();
753 InferenceEngine::BlobMap outputBlobs;
755 std::pair<std::string, InferenceEngine::DataPtr> item = *out.begin();
757 InferenceEngine::TBlob<float>::Ptr output;
758 output = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc());
760 outputBlobs[item.first] = output;
762 graph.Infer(srcs, outputBlobs);
764 InferenceEngine::TBlob<float> dst_ref(item.second->getTensorDesc());
767 ref_double(*srcPtr, dst_ref);
769 compare(*output, dst_ref);
772 TEST_F(MKLDNNGraphGenericTests, ExecuteGenericPrimitiveWithTwoOutputs) {
773 std::string model = R"V0G0N(
774 <Net Name="DoubleLayer_Only" version="2" precision="FP32" batch="1">
776 <layer name="in1" type="Input" precision="FP32" id="0">
786 <layer name="two_diff_layer" id="1" type="NewTwoDifferentOutputs" precision="FP32">
810 <layer name="power" id="3" type="Power" precision="FP32">
811 <power_data power="1" scale="2" shift="0"/>
829 <layer name="con" id="2" type="Concat" precision="FP32">
830 <concat_data axis="1"/>
856 <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
857 <edge from-layer="1" from-port="2" to-layer="2" to-port="4"/>
858 <edge from-layer="1" from-port="3" to-layer="3" to-port="1"/>
859 <edge from-layer="3" from-port="2" to-layer="2" to-port="5"/>
863 MKLDNNPlugin::MKLDNNExtensionManager::Ptr extMgr(new MKLDNNPlugin::MKLDNNExtensionManager());
864 extMgr->AddExtension(extension);
866 InferenceEngine::CNNNetReader net_reader;
867 ASSERT_NO_THROW(net_reader.ReadNetwork(model.data(), model.length()));
869 MKLDNNGraphTestClass graph;
870 graph.CreateGraph(net_reader.getNetwork(), extMgr);
872 InferenceEngine::SizeVector dims_src = {1, 3, 5, 5};
874 InferenceEngine::Blob::Ptr src =
875 InferenceEngine::make_shared_blob<float, const InferenceEngine::SizeVector>(InferenceEngine::Precision::FP32, InferenceEngine::NCHW, dims_src);
878 float * data_src = src->buffer();
879 for (size_t i = 0; i < src->size(); i++)
881 auto * srcPtr = dynamic_cast<InferenceEngine::TBlob<float>*>(src.get());
883 if (srcPtr == nullptr)
884 FAIL() << "Cannot cast blob to TBlob<float>.";
886 InferenceEngine::BlobMap srcs;
887 srcs.insert(std::pair<std::string, InferenceEngine::Blob::Ptr>("in1", src));
889 InferenceEngine::OutputsDataMap out;
890 out = net_reader.getNetwork().getOutputsInfo();
891 InferenceEngine::BlobMap outputBlobs;
893 auto it = out.begin();
895 std::pair<std::string, InferenceEngine::DataPtr> item = *it;
896 InferenceEngine::DataPtr data1 = item.second;
898 InferenceEngine::TensorDesc outputDesc1 = item.second->getTensorDesc();
899 InferenceEngine::TBlob<float>::Ptr output1;
900 output1 = InferenceEngine::make_shared_blob<float>(outputDesc1);
902 outputBlobs[item.first] = output1;
904 graph.Infer(srcs, outputBlobs);
906 float * data = outputBlobs.begin()->second->buffer();
907 for (size_t i = 0; i < 25; i++) {
911 for (size_t i = 0; i < 50; i++) {
917 TEST_F(MKLDNNGraphGenericTests, ExecuteGenericInPlaceConcat) {
918 std::string model = R"V0G0N(
919 <Net Name="CustomConcat_Only" version="2" precision="FP32" batch="1">
921 <layer name="in1" type="Input" precision="FP32" id="0">
931 <layer name="in2" type="Input" precision="FP32" id="1">
941 <layer name="con" id="2" type="CustomInPlaceConcat" precision="FP32">
967 <edge from-layer="0" from-port="0" to-layer="2" to-port="1"/>
968 <edge from-layer="1" from-port="0" to-layer="2" to-port="2"/>
972 MKLDNNPlugin::MKLDNNExtensionManager::Ptr extMgr(new MKLDNNPlugin::MKLDNNExtensionManager());
973 extMgr->AddExtension(extension);
975 InferenceEngine::CNNNetReader net_reader;
976 ASSERT_NO_THROW(net_reader.ReadNetwork(model.data(), model.length()));
978 MKLDNNGraphTestClass graph;
979 graph.CreateGraph(net_reader.getNetwork(), extMgr);
981 InferenceEngine::SizeVector dims_src1 = {1, 3, 5, 5};
983 InferenceEngine::Blob::Ptr src1 =
984 InferenceEngine::make_shared_blob<float, const InferenceEngine::SizeVector>(InferenceEngine::Precision::FP32, InferenceEngine::NCHW, dims_src1);
987 float * data_src1 = src1->buffer();
988 for (size_t i = 0; i < src1->size(); i++)
991 InferenceEngine::SizeVector dims_src2 = {1, 2, 5, 5};
993 InferenceEngine::Blob::Ptr src2 =
994 InferenceEngine::make_shared_blob<float, const InferenceEngine::SizeVector>(InferenceEngine::Precision::FP32, InferenceEngine::NCHW, dims_src2);
997 float * data_src2 = src2->buffer();
998 for (size_t i = 0; i < src2->size(); i++)
1001 InferenceEngine::BlobMap srcs;
1002 srcs.insert(std::pair<std::string, InferenceEngine::Blob::Ptr>("in1", src1));
1003 srcs.insert(std::pair<std::string, InferenceEngine::Blob::Ptr>("in2", src2));
1005 InferenceEngine::OutputsDataMap out;
1006 out = net_reader.getNetwork().getOutputsInfo();
1007 InferenceEngine::BlobMap outputBlobs;
1009 auto it = out.begin();
1011 std::pair<std::string, InferenceEngine::DataPtr> item = *it;
1013 InferenceEngine::TensorDesc outputDesc1 = item.second->getTensorDesc();
1014 InferenceEngine::TBlob<float>::Ptr output1;
1015 output1 = InferenceEngine::make_shared_blob<float>(outputDesc1);
1016 output1->allocate();
1017 outputBlobs[item.first] = output1;
1019 graph.Infer(srcs, outputBlobs);
1021 float * data = outputBlobs.begin()->second->buffer();
1022 for (size_t i = 0; i < 75; i++) {
1023 ASSERT_EQ(*data, 1);
1026 for (size_t i = 0; i < 50; i++) {
1027 ASSERT_EQ(*data, 2);
1032 TEST_F(MKLDNNGraphGenericTests, ExecuteGenericInPlaceSplit) {
1033 std::string model = R"V0G0N(
1034 <net name="ConcatOnly" version="2" precision="FP32" batch="1">
1036 <layer name="in1" type="Input" precision="FP32" id="1">
1046 <layer name="split" id="2" type="CustomInPlaceSplit" precision="FP32">
1070 <layer name="power1" id="3" type="Power" precision="FP32">
1071 <power_data power="1" scale="1" shift="3"/>
1089 <layer name="power2" id="4" type="Power" precision="FP32">
1090 <power_data power="1" scale="1" shift="2"/>
1110 <edge from-layer="1" from-port="1" to-layer="2" to-port="1"/>
1111 <edge from-layer="2" from-port="2" to-layer="3" to-port="1"/>
1112 <edge from-layer="2" from-port="3" to-layer="4" to-port="1"/>
1116 MKLDNNPlugin::MKLDNNExtensionManager::Ptr extMgr(new MKLDNNPlugin::MKLDNNExtensionManager());
1117 extMgr->AddExtension(extension);
1119 InferenceEngine::CNNNetReader net_reader;
1120 ASSERT_NO_THROW(net_reader.ReadNetwork(model.data(), model.length()));
1122 MKLDNNGraphTestClass graph;
1123 graph.CreateGraph(net_reader.getNetwork(), extMgr);
1125 InferenceEngine::SizeVector dims_src = {1, 4, 4, 4};
1127 InferenceEngine::Blob::Ptr src =
1128 InferenceEngine::make_shared_blob<float, const InferenceEngine::SizeVector>(InferenceEngine::Precision::FP32, InferenceEngine::NCHW, dims_src);
1131 float * data_src = src->buffer();
1132 for (size_t i = 0; i < src->size(); i++) {
1133 if (i < src->size() / 2)
1139 InferenceEngine::BlobMap srcs;
1140 srcs.insert(std::pair<std::string, InferenceEngine::Blob::Ptr>("in1", src));
1142 InferenceEngine::OutputsDataMap out;
1143 out = net_reader.getNetwork().getOutputsInfo();
1144 InferenceEngine::BlobMap outputBlobs;
1145 auto it = out.begin();
1147 std::pair<std::string, InferenceEngine::DataPtr> item = *it;
1149 InferenceEngine::TBlob<float>::Ptr output1;
1150 output1 = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc());
1151 output1->allocate();
1152 outputBlobs[item.first] = output1;
1155 InferenceEngine::TBlob<float>::Ptr output2;
1156 output2 = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc());
1157 output2->allocate();
1158 outputBlobs[item.first] = output2;
1160 graph.Infer(srcs, outputBlobs);
1162 float * data = output1->buffer();
1163 for (size_t i = 0; i < output1->size(); i++) {
1164 ASSERT_EQ(*data, 4);
1167 data = output2->buffer();
1168 for (size_t i = 0; i < output2->size(); i++) {
1169 ASSERT_EQ(*data, 4);
1174 TEST_F(MKLDNNGraphGenericTests, ExecuteGenericPrimitiveWithDynamicBatch) {
1175 std::string model = R"V0G0N(
1176 <Net Name="DoubleLayer_Only" version="2" precision="FP32" batch="2">
1178 <layer name="in1" type="Input" precision="FP32" id="0">
1188 <layer name="double_layer" id="1" type="NewDoubleLayer" precision="FP32">
1208 <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
1212 MKLDNNPlugin::MKLDNNExtensionManager::Ptr extMgr(new MKLDNNPlugin::MKLDNNExtensionManager());
1213 extMgr->AddExtension(extension);
1215 InferenceEngine::CNNNetReader net_reader;
1216 ASSERT_NO_THROW(net_reader.ReadNetwork(model.data(), model.length()));
1218 MKLDNNGraphTestClass graph;
1219 graph.CreateGraph(net_reader.getNetwork(), extMgr);
1221 InferenceEngine::SizeVector dims_src = {2, 3, 5, 5};
1223 InferenceEngine::Blob::Ptr src =
1224 InferenceEngine::make_shared_blob<float, const InferenceEngine::SizeVector>(InferenceEngine::Precision::FP32, InferenceEngine::NCHW, dims_src);
1226 fill_data(src->buffer(), src->size());
1228 InferenceEngine::TBlob<float>* srcPtr = dynamic_cast<InferenceEngine::TBlob<float>*>(src.get());
1230 if (srcPtr == nullptr)
1231 FAIL() << "Cannot cast blob to TBlob<float>.";
1233 InferenceEngine::BlobMap srcs;
1234 srcs.insert(std::pair<std::string, InferenceEngine::Blob::Ptr>("in1", src));
1236 InferenceEngine::OutputsDataMap out;
1237 out = net_reader.getNetwork().getOutputsInfo();
1238 InferenceEngine::BlobMap outputBlobs;
1240 std::pair<std::string, InferenceEngine::DataPtr> item = *out.begin();
1242 InferenceEngine::TBlob<float>::Ptr output;
1243 output = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc());
1245 outputBlobs[item.first] = output;
1247 float *dstData = output->data();
1249 for (size_t i = 0; i < output->size(); i++) {
1253 graph.Infer(srcs, outputBlobs);
1255 InferenceEngine::TBlob<float> dst_ref(item.second->getTensorDesc());
1258 ref_double(*srcPtr, dst_ref);
1260 compare(*output, dst_ref);
1262 graph.setProperty({{InferenceEngine::PluginConfigParams::KEY_DYN_BATCH_LIMIT, "1"}});
1264 for (size_t i = 0; i < output->size(); i++) {
1268 graph.Infer(srcs, outputBlobs);
1270 InferenceEngine::TBlob<float> dst_ref2(item.second->getTensorDesc());
1271 dst_ref2.allocate();
1273 ref_double_batch1(*srcPtr, dst_ref2);
1275 compare(*output, dst_ref2);
1278 TEST_F(MKLDNNGraphGenericTests, ExecuteNotInLineGRN) {
1279 std::string model = R"V0G0N(
1280 <net name="default" version="2" batch="1">
1282 <layer name="data" type="Input" precision="FP32" id="0">
1292 <layer name="norm_8x_grn" type="GRN" precision="FP32" id="1">
1311 <layer name="norm_4x_grn" type="GRN" precision="FP32" id="2">
1330 <layer name="merge_4x_8x_concat" type="Concat" precision="FP32" id="3">
1331 <concat_data axis="1"/>
1357 <edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
1358 <edge from-layer="0" from-port="0" to-layer="2" to-port="3"/>
1359 <edge from-layer="1" from-port="2" to-layer="3" to-port="5"/>
1360 <edge from-layer="2" from-port="4" to-layer="3" to-port="6"/>
1363 InferenceEngine::Extension cpuExt(make_so_name("cpu_extension"));
1364 MKLDNNPlugin::MKLDNNExtensionManager::Ptr extMgr(new MKLDNNPlugin::MKLDNNExtensionManager());
1366 extMgr->AddExtension(InferenceEngine::IExtensionPtr(&cpuExt, [](InferenceEngine::IExtension*){}));
1368 InferenceEngine::CNNNetReader net_reader;
1369 ASSERT_NO_THROW(net_reader.ReadNetwork(model.data(), model.length()));
1371 MKLDNNGraphTestClass graph;
1372 graph.CreateGraph(net_reader.getNetwork(), extMgr);
1374 InferenceEngine::SizeVector dims_src = {1, 3, 2, 2};
1376 InferenceEngine::Blob::Ptr src =
1377 InferenceEngine::make_shared_blob<float, const InferenceEngine::SizeVector>(InferenceEngine::Precision::FP32, InferenceEngine::NCHW, dims_src);
1379 fill_data(src->buffer(), src->size());
1381 InferenceEngine::TBlob<float>* srcPtr = dynamic_cast<InferenceEngine::TBlob<float>*>(src.get());
1383 if (srcPtr == nullptr)
1384 FAIL() << "Cannot cast blob to TBlob<float>.";
1386 InferenceEngine::BlobMap srcs;
1387 srcs.insert(std::pair<std::string, InferenceEngine::Blob::Ptr>("data", src));
1389 InferenceEngine::OutputsDataMap out;
1390 out = net_reader.getNetwork().getOutputsInfo();
1391 InferenceEngine::BlobMap outputBlobs;
1393 std::pair<std::string, InferenceEngine::DataPtr> item = *out.begin();
1395 InferenceEngine::TBlob<float>::Ptr output;
1396 output = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc());
1398 outputBlobs[item.first] = output;
1400 graph.Infer(srcs, outputBlobs);
1402 std::vector<float> refDst = {0.000f, 0.503f, 0.659f, 0.117f, -0.474f, -0.573f, -0.202f, 0.545f, 0.619f, 0.246f,
1403 0.000f, 0.000f, 0.000f, 0.503f, 0.659f, 0.117f, -0.474f, -0.573f, -0.202f, 0.545f,
1404 0.619f, 0.246f, 0.000f, 0.000f};
1406 InferenceEngine::TBlob<float>::Ptr dstOut = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc(), refDst.data());
1408 compare(*output, *dstOut);
1411 TEST_F(MKLDNNGraphGenericTests, ExecuteInLineGRN) {
1412 std::string model = R"V0G0N(
1413 <net name="default" version="2" batch="1">
1415 <layer name="data1" type="Input" precision="FP32" id="0">
1425 <layer name="data2" type="Input" precision="FP32" id="1">
1435 <layer name="norm_8x_grn" type="GRN" precision="FP32" id="2">
1454 <layer name="norm_4x_grn" type="GRN" precision="FP32" id="3">
1473 <layer name="merge_4x_8x_concat" type="Concat" precision="FP32" id="4">
1474 <concat_data axis="1"/>
1500 <edge from-layer="0" from-port="0" to-layer="2" to-port="1"/>
1501 <edge from-layer="1" from-port="0" to-layer="3" to-port="3"/>
1502 <edge from-layer="2" from-port="2" to-layer="4" to-port="5"/>
1503 <edge from-layer="3" from-port="4" to-layer="4" to-port="6"/>
1507 InferenceEngine::Extension cpuExt(make_so_name("cpu_extension"));
1508 MKLDNNPlugin::MKLDNNExtensionManager::Ptr extMgr(new MKLDNNPlugin::MKLDNNExtensionManager());
1509 extMgr->AddExtension(InferenceEngine::IExtensionPtr(&cpuExt, [](InferenceEngine::IExtension*){}));
1511 InferenceEngine::CNNNetReader net_reader;
1512 ASSERT_NO_THROW(net_reader.ReadNetwork(model.data(), model.length()));
1514 MKLDNNGraphTestClass graph;
1515 graph.CreateGraph(net_reader.getNetwork(), extMgr);
1517 InferenceEngine::SizeVector dims_src = {1, 3, 2, 2};
1519 InferenceEngine::Blob::Ptr src1 =
1520 InferenceEngine::make_shared_blob<float, const InferenceEngine::SizeVector>(InferenceEngine::Precision::FP32, InferenceEngine::NCHW, dims_src);
1522 fill_data(src1->buffer(), src1->size());
1524 InferenceEngine::Blob::Ptr src2 =
1525 InferenceEngine::make_shared_blob<float, const InferenceEngine::SizeVector>(InferenceEngine::Precision::FP32, InferenceEngine::NCHW, dims_src);
1527 fill_data(src2->buffer(), src2->size());
1529 InferenceEngine::BlobMap srcs;
1530 srcs.insert(std::pair<std::string, InferenceEngine::Blob::Ptr>("data1", src1));
1531 srcs.insert(std::pair<std::string, InferenceEngine::Blob::Ptr>("data2", src2));
1533 InferenceEngine::OutputsDataMap out;
1534 out = net_reader.getNetwork().getOutputsInfo();
1535 InferenceEngine::BlobMap outputBlobs;
1537 std::pair<std::string, InferenceEngine::DataPtr> item = *out.begin();
1539 InferenceEngine::TBlob<float>::Ptr output;
1540 output = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc());
1542 outputBlobs[item.first] = output;
1544 graph.Infer(srcs, outputBlobs);
1546 std::vector<float> refDst = {0.000f, 0.503f, 0.659f, 0.117f, -0.474f, -0.573f, -0.202f, 0.545f, 0.619f, 0.246f,
1547 0.000f, 0.000f, 0.000f, 0.503f, 0.659f, 0.117f, -0.474f, -0.573f, -0.202f, 0.545f,
1548 0.619f, 0.246f, 0.000f, 0.000f};
1550 InferenceEngine::TBlob<float>::Ptr dstOut = InferenceEngine::make_shared_blob<float>(item.second->getTensorDesc(), refDst.data());
1552 compare(*output, *dstOut);