1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
12 #include <ie_icnn_network.hpp>
14 #include <vpu/model/base.hpp>
15 #include <vpu/model/edges.hpp>
16 #include <vpu/model/data.hpp>
17 #include <vpu/model/stage.hpp>
18 #include <vpu/utils/enums.hpp>
19 #include <vpu/utils/io.hpp>
20 #include <vpu/utils/dot_io.hpp>
21 #include <vpu/allocator.hpp>
29 // TODO: get rid of `cmxLimit`.
31 struct Resources final {
37 void printTo(std::ostream& os, const Resources& res);
38 void printTo(DotLabel& lbl, const Resources& res);
45 public EnableHandleFromThis<Model>,
46 public EnableCustomAttributes {
48 // Need to declare here to use decltype
50 mutable StageList _orderedStageList;
51 std::set<Stage, StageNode::StageNameCmp> _initialStages;
57 VPU_MODEL_ATTRIBUTE(std::string, name, std::string())
59 VPU_MODEL_ATTRIBUTE(int, batchSize, 1)
61 VPU_MODEL_ATTRIBUTE(InferenceEngine::NetworkStatsMap, nodesStats, {})
70 inline explicit Model(const std::string& name) :
71 _dataList(&DataNode::_posInModel),
72 _orderedStageList(&StageNode::_posInModel),
80 void setBatchSize(int batchSize);
82 inline void setNodesStats(const ie::NetworkStatsMap& stats) { _nodesStats = stats; }
89 const std::string& name,
90 const DataDesc& desc);
93 const std::string& name,
94 const DataDesc& desc);
97 const std::string& name,
99 const DataContent::Ptr& content);
102 const std::string& name,
103 const DataDesc& desc);
108 const Data& origData,
109 const std::string& postfix,
110 const DataDesc& newDesc = DataDesc(),
111 const DataContent::Ptr& newContent = nullptr);
117 template <class StageImpl>
119 const std::string& name,
121 const ie::CNNLayerPtr& origLayer,
122 const DataVector& inputs,
123 const DataVector& outputs);
125 Stage duplicateStage(
126 const std::string& name,
127 const Stage& origStage,
128 const DataVector& inputs,
129 const DataVector& outputs);
132 // Stage <-> Data edges
135 StageInput addStageInput(
139 StageOutput addStageOutput(
143 StageTempBuffer addTempBuffer(
145 const DataDesc& desc);
147 void replaceStageInput(
148 const StageInput& edge,
149 const Data& newInput);
151 void replaceStageOutput(
152 const StageOutput& edge,
153 const Data& newOutput);
156 // Stage <-> Stage edges
159 class InjectStageHelper final {
161 inline InjectStageHelper(InjectStageHelper&&) = default;
163 InjectStageHelper(const InjectStageHelper&) = delete;
164 InjectStageHelper& operator=(const InjectStageHelper&) = delete;
165 InjectStageHelper& operator=(InjectStageHelper&&) = delete;
167 ~InjectStageHelper();
169 InjectStageHelper& parentHW(const Stage& parent);
170 InjectStageHelper& childSW(const Stage& child);
172 InjectedStage done();
175 inline explicit InjectStageHelper(const Handle<Model>& model) : _model(model) {}
178 Handle<Model> _model;
186 inline InjectStageHelper injectStage() { return InjectStageHelper(handle_from_this()); }
188 void revertInjection(const InjectedStage& edge);
194 class DataEdgeHelper final {
196 inline DataEdgeHelper(DataEdgeHelper&&) = default;
198 DataEdgeHelper(const DataEdgeHelper&) = delete;
199 DataEdgeHelper& operator=(const DataEdgeHelper&) = delete;
200 DataEdgeHelper& operator=(DataEdgeHelper&&) = delete;
204 DataEdgeHelper& parent(const Data& parent);
205 DataEdgeHelper& child(const Data& child);
207 DataEdgeHelper& mode(SharedDataMode mode);
208 DataEdgeHelper& order(SharedDataOrder order);
210 DataEdgeHelper& offset(const DimValues& offset);
212 SharedAllocation done();
215 inline explicit DataEdgeHelper(const Handle<Model>& model) : _model(model) {}
218 Handle<Model> _model;
223 SharedDataMode _mode = SharedDataMode::ROI;
224 bool _modeSet = false;
226 SharedDataOrder _order = SharedDataOrder::ParentWritesToChild;
227 bool _orderSet = false;
230 bool _offsetSet = false;
235 inline DataEdgeHelper connectDatas() { return DataEdgeHelper(handle_from_this()); }
241 void disconnectStageDatas(const Stage& stage);
243 void removeStage(const Stage& stage);
245 void removeUnusedData(const Data& data);
253 // TODO: allow to override stage order.
254 void buildStageOrder() const;
260 inline int numDatas() const { return _dataPtrList.size(); }
261 inline auto datas() const -> decltype(contRange(_dataList)) {
262 return contRange(_dataList);
265 inline int numStages() const { return _stagePtrList.size(); }
266 inline auto initialStages() const -> decltype(contRange(_initialStages)) {
267 return contRange(_initialStages);
269 inline auto getStages() const -> decltype(contRange(_orderedStageList)) {
271 return contRange(_orderedStageList);
278 inline Allocator& getAllocator() { return _allocator; }
281 Stage addNewStageImpl(
282 const std::string& name,
284 const ie::CNNLayerPtr& origLayer,
285 const DataVector& inputs,
286 const DataVector& outputs,
287 const FuncRef<StagePtr()>& creator);
289 InjectedStage injectStageImpl(
293 SharedAllocation connectDatasImpl(
297 SharedDataOrder order,
298 const DimValues& offset);
302 StageMap<bool>& visitedMap) const;
305 DataPtrList _dataPtrList;
306 StagePtrList _stagePtrList;
308 StageInputPtrList _inEdgePtrList;
309 StageOutputPtrList _outEdgePtrList;
310 StageTempBufferPtrList _tempBufferEdgePtrList;
311 SharedAllocationPtrList _dataEdgePtrList;
312 InjectedStagePtrList _stageEdgePtrList;
314 Allocator _allocator;
316 mutable bool _resetStageOrder = true;
318 friend class InjectStageHelper;
319 friend class DataEdgeHelper;
322 template <class StageImpl>
323 inline Stage Model::addNewStage(
324 const std::string& name,
326 const ie::CNNLayerPtr& origLayer,
327 const DataVector& inputs,
328 const DataVector& outputs) {
329 return addNewStageImpl(
335 []() { return std::make_shared<StageImpl>(); });
342 AllocationResult runAllocator(
343 const Model::Ptr& model,
344 bool onlyCheckCMX = false);