1 // Copyright (C) 2018 Intel Corporation
3 // SPDX-License-Identifier: Apache-2.0
6 #include "fallback_policy.h"
7 #include "hetero_device_loader.h"
8 #include "details/ie_cnn_network_iterator.hpp"
10 #include "ie_util_internal.hpp"
15 using namespace InferenceEngine;
17 void dla_layer_colorer(const CNNLayerPtr layer,
18 ordered_properties &printed_properties,
19 ordered_properties &node_properties) {
20 printed_properties.insert(printed_properties.begin(),
21 std::pair<std::string, std::string>("device", layer->affinity));
22 if (layer->affinity == "CPU") {
23 node_properties.emplace_back("fillcolor", "#5A5DF0");
24 } else if (layer->affinity == "FPGA") {
25 node_properties.emplace_back("fillcolor", "#20F608");
26 } else if (layer->affinity == "GPU") {
27 node_properties.emplace_back("fillcolor", "#F1F290");
29 node_properties.emplace_back("fillcolor", "#11F110");
34 FallbackPolicy::FallbackPolicy(std::map<std::string, InferenceEngine::IHeteroDeviceLoader::Ptr> &deviceLoaders,
36 _deviceLoaders(deviceLoaders),
37 _dumpDotFile(dumpDotFile) {
40 void FallbackPolicy::init(const std::string &config, const std::map<std::string, std::string> &allConfigs,
41 const std::vector<InferenceEngine::IExtensionPtr> &extensions) {
43 THROW_IE_EXCEPTION << "Cannot set affinity according to fallback policy because the order of devices was not initialized";
45 // parsing the string and splitting to tokens
46 std::string::size_type i = 0;
47 std::string::size_type idelimeter;
48 while ((idelimeter = config.find(',', i)) != std::string::npos) {
49 _fallbackDevices.push_back(config.substr(i, idelimeter - i));
52 _fallbackDevices.push_back(config.substr(i, config.length() - i));
54 for (auto d : _fallbackDevices) {
55 if (_deviceLoaders.find(d) == _deviceLoaders.end()) {
56 IHeteroDeviceLoader::Ptr loader;
57 loader = std::make_shared<HeteroDeviceLoader>(d);
58 HeteroDeviceLoader *pdl = dynamic_cast<HeteroDeviceLoader *>(loader.get());
59 pdl->initConfigs(allConfigs, extensions);
60 _deviceLoaders[d] = loader;
65 void FallbackPolicy::setAffinity(const std::map<std::string, std::string>& config, ICNNNetwork& network) {
66 std::map<std::string, QueryNetworkResult> queryResults;
67 // go oger devices, create appropriate plugins and
68 for (const auto &i : _fallbackDevices) {
70 _deviceLoaders[i]->QueryNetwork(i, network, config, r);
74 details::CNNNetworkIterator i(const_cast<ICNNNetwork *>(&network));
75 while (i != details::CNNNetworkIterator()) {
76 CNNLayer::Ptr layer = *i;
77 for (auto &&j : _fallbackDevices) {
78 auto &qr = queryResults[j];
79 if (qr.supportedLayers.find(layer->name) != qr.supportedLayers.end()) {
88 std::stringstream stream(std::stringstream::out);
89 stream << "hetero_affinity_" << network.getName() << ".dot";
91 std::ofstream file(stream.str().c_str());
92 saveGraphToDot(network, file, dla_layer_colorer);