1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
5 #include <vpu/frontend/frontend.hpp>
11 #include <vpu/compile_env.hpp>
15 void FrontEnd::parseInputAndOutputData(const Model::Ptr& model) {
16 VPU_PROFILE(parseInputAndOutputData);
18 const auto& env = CompileEnv::get();
21 // Parse network inputs
24 for (const auto& inputInfo : _ieNetworkParser.networkInputs) {
25 auto netInput = inputInfo.second;
26 IE_ASSERT(netInput != nullptr);
28 auto ieData = netInput->getInputData();
29 IE_ASSERT(ieData != nullptr);
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);
36 vpuDesc.moveDim(Dim::C, 0);
40 auto vpuData = model->addInputData(ieData->getName(), vpuDesc);
41 bindData(vpuData, ieData);
44 model->attrs().set<int>("numInputs", _ieNetworkParser.networkInputs.size());
47 // Parse network outputs
50 for (const auto& outputInfo : _ieNetworkParser.networkOutputs) {
51 auto ieData = outputInfo.second;
52 IE_ASSERT(ieData != nullptr);
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);
59 vpuDesc.moveDim(Dim::C, 0);
63 auto vpuData = model->addOutputData(ieData->getName(), vpuDesc);
64 bindData(vpuData, ieData);
66 if (_unbatchedOutputs.count(ieData) > 0) {
67 vpuData->attrs().set<bool>("unbatched", true);
71 model->attrs().set<int>("numOutputs", _ieNetworkParser.networkOutputs.size());
74 // Parse constant data
77 for (const auto& constInfo : _ieNetworkParser.constDatas) {
78 auto ieData = constInfo.first;
79 IE_ASSERT(ieData != nullptr);
81 auto ieBlob = constInfo.second;
82 IE_ASSERT(ieBlob != nullptr);
84 auto ieDesc = ieData->getTensorDesc();
86 if (ieDesc.getPrecision() != ie::Precision::FP16) {
87 if (ieDesc.getPrecision() != ie::Precision::FP32 || !env.config.allowFP32Models) {
88 VPU_THROW_EXCEPTION << "Unsupported precision " << ieDesc.getPrecision() << "for data " << ieData->getName();
92 DataDesc vpuDesc(ieDesc);
93 vpuDesc.setType(DataType::FP16);
95 auto vpuData = model->addConstData(
98 ieBlobContent(ieBlob));
100 // User might ask to return the output from Const layer.
101 if (auto vpuOutData = getVpuData(ieData)) {
102 IE_ASSERT(vpuOutData->usage() == DataUsage::Output);
104 _stageBuilder->addCopyStage(
106 formatString("%s@return-const", vpuData->name()),
112 bindData(vpuData, ieData);
116 // Add Copy stages after network outputs, if they are in the middle
119 for (const auto& outputInfo : _ieNetworkParser.networkOutputs) {
120 auto ieData = outputInfo.second;
121 IE_ASSERT(ieData != nullptr);
123 auto vpuData = getVpuData(ieData);
124 IE_ASSERT(vpuData != nullptr);
126 // It might be Const.
127 if (vpuData->usage() != DataUsage::Output)
130 // Convert stage will be added.
131 if (vpuData->desc().type() != DataType::FP16)
134 if (!ieData->getInputTo().empty()) {
135 auto vpuTempData = model->duplicateData(
140 _stageBuilder->addCopyStage(
142 formatString("%s@copy-to-output", vpuData->name()),
147 bindData(vpuTempData, ieData);