Publishing 2019 R1.1 content and Myriad plugin sources (#162)
[platform/upstream/dldt.git] / inference-engine / src / vpu / graph_transformer / src / frontend / parse_data.cpp
1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
3 //
4
5 #include <vpu/frontend/frontend.hpp>
6
7 #include <memory>
8 #include <algorithm>
9 #include <set>
10
11 #include <vpu/compile_env.hpp>
12
13 namespace vpu {
14
15 void FrontEnd::parseInputAndOutputData(const Model::Ptr& model) {
16     VPU_PROFILE(parseInputAndOutputData);
17
18     const auto& env = CompileEnv::get();
19
20     //
21     // Parse network inputs
22     //
23
24     for (const auto& inputInfo : _ieNetworkParser.networkInputs) {
25         auto netInput = inputInfo.second;
26         IE_ASSERT(netInput != nullptr);
27
28         auto ieData = netInput->getInputData();
29         IE_ASSERT(ieData != nullptr);
30
31         DataDesc vpuDesc(ieData->getTensorDesc());
32         if (vpuDesc.numDims() >= 3) {
33             if (env.config.hwOptimization || env.config.forceLayout == ComputeLayout::NCHW) {
34                 vpuDesc.moveDim(Dim::C, 2);
35             } else {
36                 vpuDesc.moveDim(Dim::C, 0);
37             }
38         }
39
40         auto vpuData = model->addInputData(ieData->getName(), vpuDesc);
41         bindData(vpuData, ieData);
42     }
43
44     model->attrs().set<int>("numInputs", _ieNetworkParser.networkInputs.size());
45
46     //
47     // Parse network outputs
48     //
49
50     for (const auto& outputInfo : _ieNetworkParser.networkOutputs) {
51         auto ieData = outputInfo.second;
52         IE_ASSERT(ieData != nullptr);
53
54         DataDesc vpuDesc(ieData->getTensorDesc());
55         if (vpuDesc.numDims() >= 3) {
56             if (env.config.hwOptimization || env.config.forceLayout == ComputeLayout::NCHW) {
57                 vpuDesc.moveDim(Dim::C, 2);
58             } else {
59                 vpuDesc.moveDim(Dim::C, 0);
60             }
61         }
62
63         auto vpuData = model->addOutputData(ieData->getName(), vpuDesc);
64         bindData(vpuData, ieData);
65
66         if (_unbatchedOutputs.count(ieData) > 0) {
67             vpuData->attrs().set<bool>("unbatched", true);
68         }
69     }
70
71     model->attrs().set<int>("numOutputs", _ieNetworkParser.networkOutputs.size());
72
73     //
74     // Parse constant data
75     //
76
77     for (const auto& constInfo : _ieNetworkParser.constDatas) {
78         auto ieData = constInfo.first;
79         IE_ASSERT(ieData != nullptr);
80
81         auto ieBlob = constInfo.second;
82         IE_ASSERT(ieBlob != nullptr);
83
84         DataDesc vpuDesc(ieData->getTensorDesc());
85         vpuDesc.setType(DataType::FP16);
86
87         auto vpuData = model->addConstData(
88             ieData->getName(),
89             vpuDesc,
90             ieBlobContent(ieBlob));
91
92         // User might ask to return the output from Const layer.
93         if (auto vpuOutData = getVpuData(ieData)) {
94             IE_ASSERT(vpuOutData->usage() == DataUsage::Output);
95
96             _stageBuilder->addCopyStage(
97                 model,
98                 formatString("%s@return-const", vpuData->name()),
99                 nullptr,
100                 vpuData,
101                 vpuOutData);
102         }
103
104         bindData(vpuData, ieData);
105     }
106
107     //
108     // Add Copy stages after network outputs, if they are in the middle
109     //
110
111     for (const auto& outputInfo : _ieNetworkParser.networkOutputs) {
112         auto ieData = outputInfo.second;
113         IE_ASSERT(ieData != nullptr);
114
115         auto vpuData = getVpuData(ieData);
116         IE_ASSERT(vpuData != nullptr);
117
118         // It might be Const.
119         if (vpuData->usage() != DataUsage::Output)
120             continue;
121
122         // Convert stage will be added.
123         if (vpuData->desc().type() != DataType::FP16)
124             continue;
125
126         if (!ieData->getInputTo().empty()) {
127             auto vpuTempData = model->duplicateData(
128                 vpuData,
129                 "@intermediate",
130                 vpuData->desc());
131
132             _stageBuilder->addCopyStage(
133                 model,
134                 formatString("%s@copy-to-output", vpuData->name()),
135                 nullptr,
136                 vpuTempData,
137                 vpuData);
138
139             bindData(vpuTempData, ieData);
140         }
141     }
142 }
143
144 }  // namespace vpu