37{
39 auto backend_resolver = std::make_unique<compiler::BackendResolver>();
40
41
42 std::vector<const backend::Backend *> backend_order;
43 for (auto &&backend_id : _options.backend_list)
44 {
45 auto backend = resolveBackend(backend_id);
46 if (backend)
47 backend_order.push_back(backend);
48 }
49 if (backend_order.size() == 0)
50 throw std::runtime_error{"No loaded backends available."};
51
52
53 std::unordered_map<ir::OpCode, backend::Backend *> op_type_map;
54 for (const auto &[op_code, backend_name] : manual_options.opcode_to_backend)
55 {
57 }
58
60 auto itr = op_type_map.find(operation.opcode());
61 if (itr != op_type_map.end())
62 {
63 backend_resolver->setBackend(index, itr->second);
64 }
65 });
66
67
68 for (const auto &[key, val] : manual_options.index_to_backend)
69 {
70 try
71 {
72 graph.operations().at(key);
74 }
75 catch (...)
76 {
77 VERBOSE(ManualScheduler) <<
"Invalid value while OperationIndex to Backend mapping : @" << key
78 << " -> \"" << val << "\"" << std::endl;
79 }
80 }
81
82
83 std::unordered_map<const backend::Backend *, std::unique_ptr<backend::ValidatorBase>> validators;
84 for (auto &&backend : backend_order)
85 {
86
87
88 if (backend->config()->id() == "train")
89 continue;
90
91 validators.emplace(backend, backend->validator(graph));
92 }
93
95 if (!backend_resolver->hasBackend(index))
96 {
97 for (auto backend : backend_order)
98 {
99
100
101
102 if (backend->config()->id() == "train")
103 {
104 backend_resolver->setBackend(index, backend);
105 break;
106 }
107
108 if (validators[backend]->supported(op))
109 {
110 backend_resolver->setBackend(index, backend);
111 break;
112 }
113 }
114 if (!backend_resolver->hasBackend(index))
115 throw std::runtime_error{"No backend found for operation @" +
116 std::to_string(index.value())};
117 }
118 });
119
120
123 VERBOSE(ManualScheduler) << "backend for " << index << ": " << backend.config()->id()
124 << std::endl;
125 }));
126
127 return backend_resolver;
128}
static BackendManager & get()
#define VERBOSE(name, lv)
KnobTrait< K >::ValueType get(void)
::onert::util::Index< uint32_t, OperationIndexTag > OperationIndex
#define WHEN_LOG_ENABLED(METHOD)
ManualSchedulerOptions manual_scheduler_options