1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
11 #include <cpp_interfaces/impl/ie_executable_network_thread_safe_default.hpp>
13 #include "ie_parallel.hpp"
14 #include "mkldnn_memory.h"
16 #include "perf_count.h"
17 #include "mkldnn_dims.h"
18 #include "mean_image.h"
19 #include "mkldnn_node.h"
20 #include "mkldnn_edge.h"
21 #include "mkldnn_extension_utils.h"
22 #include "mkldnn_streams.h"
24 namespace MKLDNNPlugin {
28 typedef std::shared_ptr<MKLDNNGraph> Ptr;
35 MKLDNNGraph(): status(NotReady), eng(mkldnn::engine(mkldnn::engine::kind::cpu, 0)) {}
42 return (GetStatus() == Ready);
45 void setConfig(const Config &cfg);
46 void setProperty(const std::map<std::string, std::string> &properties);
49 void getInputBlobs(InferenceEngine::BlobMap &in_map);
50 void getOutputBlobs(InferenceEngine::BlobMap &out_map);
52 void CreateGraph(const InferenceEngine::ICNNNetwork &network, const MKLDNNExtensionManager::Ptr& extMgr);
54 bool hasMeanImageFor(const std::string& name) {
55 return _meanImages.find(name) != _meanImages.end();
58 void PushInputData(const std::string& name, const InferenceEngine::Blob::Ptr &in);
59 void PullOutputData(InferenceEngine::BlobMap &out);
61 void Infer(int batch = -1);
63 std::vector<MKLDNNNodePtr>& GetNodes() {
67 std::vector<MKLDNNEdgePtr>& GetEdges() {
71 std::vector<MKLDNNNodePtr>& GetOutputNodes() {
75 mkldnn::engine getEngine() const {
79 void GetPerfData(std::map<std::string, InferenceEngine::InferenceEngineProfileInfo> &perfMap) const;
81 void RemoveDroppedNodes();
82 void RemoveDroppedEdges();
83 void DropNode(const MKLDNNNodePtr& node);
85 void CreateArena(int threads_per_stream) {
86 #if IE_THREAD == IE_THREAD_OMP
87 omp_set_num_threads(threads_per_stream);
88 #elif IE_THREAD == IE_THREAD_TBB
89 ptrArena = std::unique_ptr<tbb::task_arena>(new tbb::task_arena(threads_per_stream));
93 void CreateObserver(int _stream_id, int _threads_per_stream, int _pinning_step = 1) {
94 #if IE_THREAD == IE_THREAD_TBB
96 = std::unique_ptr<tbb::task_scheduler_observer>(
97 new pinning_observer(*ptrArena.get(), _stream_id, _threads_per_stream, _pinning_step));
99 cpu_set_t *process_mask = nullptr;
101 get_process_mask(ncpus, process_mask);
102 #if IE_THREAD == IE_THREAD_OMP
103 #pragma omp parallel for
104 for (int thread_index = 0; thread_index < _threads_per_stream; thread_index++) {
105 pin_thread_to_vacant_core(_stream_id * _threads_per_stream + thread_index, 1, ncpus, process_mask);
107 #elif IE_THREAD == IE_THREAD_SEQ
108 pin_thread_to_vacant_core(_stream_id * _threads_per_stream, 1, ncpus, process_mask);
110 CPU_FREE(process_mask);
114 InferenceEngine::ICNNNetwork::Ptr dump() const;
117 void VisitNode(MKLDNNNodePtr node, std::vector<MKLDNNNodePtr>& sortedNodes);
118 void SortTopologically();
120 void ForgetGraphData() {
122 eng = mkldnn::engine(mkldnn::engine::kind::cpu, 0);
133 MKLDNNMemoryPtr memWorkspace;
135 std::map<std::string, MKLDNNNodePtr> inputNodes;
136 std::vector<MKLDNNNodePtr> outputNodes;
137 std::vector<MKLDNNNodePtr> graphNodes;
138 std::vector<MKLDNNEdgePtr> graphEdges;
140 std::map<std::string, MeanImage> _meanImages;
142 #if IE_THREAD == IE_THREAD_TBB
143 std::unique_ptr<tbb::task_arena> ptrArena;
144 std::unique_ptr<tbb::task_scheduler_observer> ptrObserver;
148 void Replicate(const ICNNNetwork &network, const MKLDNNExtensionManager::Ptr& extMgr);
153 void AllocateWithReuse();
154 void CreatePrimitives();
156 void do_before(const std::string &dir, const MKLDNNNodePtr &node);
157 void do_after(const std::string &dir, const MKLDNNNodePtr &node);
159 friend class MKLDNNInferRequest;
160 friend class MKLDNNGraphlessInferRequest;
161 friend std::shared_ptr<InferenceEngine::ICNNNetwork> dump_graph_as_ie_net(const MKLDNNGraph &graph);
164 void dumpToDotFile(std::string file) const;
166 MKLDNNNodePtr parent;
167 InferenceEngine::CNNLayerPtr cnnLayer;
173 class MKLDNNExecNetwork: public InferenceEngine::ExecutableNetworkThreadSafeDefault {
175 typedef std::shared_ptr<MKLDNNExecNetwork> Ptr;
177 InferenceEngine::InferRequestInternal::Ptr CreateInferRequestImpl(InferenceEngine::InputsDataMap networkInputs,
178 InferenceEngine::OutputsDataMap networkOutputs) override;
180 void CreateInferRequest(InferenceEngine::IInferRequest::Ptr &asyncRequest) override;
182 MKLDNNExecNetwork(const InferenceEngine::ICNNNetwork &network, const Config &cfg,
183 const MKLDNNExtensionManager::Ptr& extMgr);
185 ~MKLDNNExecNetwork() {
187 extensionManager.reset();
190 void setProperty(const std::map<std::string, std::string> &properties);
192 void GetExecGraphInfo(InferenceEngine::ICNNNetwork::Ptr &graphPtr) override;
195 std::vector<MKLDNNGraph::Ptr> graphs;
196 MKLDNNExtensionManager::Ptr extensionManager;
198 bool CanProcessDynBatch(const InferenceEngine::ICNNNetwork &network) const;
201 } // namespace MKLDNNPlugin