src/ngraph/runtime/cpu/builder/halide_generators.cppに、get_halide_generatorsメソッドが定義されています。
const std::unordered_map<std::type_index, std::function<Halide::Func(std::vector<Halide::Func>)>>& get_halide_generators() { const static std::unordered_map< std::type_index, std::function<Halide::Func(std::vector<Halide::Func>)>> generators{{TI(ngraph::op::Add), [](std::vector<Halide::Func> in) { Halide::Var x; Halide::Func func; func(x) = in[0](x) + in[1](x); return func; }},
のように、nGraph の各Op に対応した Halide のコードを生成しています。
現時点でサポートしている Halide の Op は、まだ、下記のものしかありません。ElementWiseなOpですね。
・ngraph::op::Add func(x) = in[0](x) + in[1](x); ・ngraph::op::Multiply func(x) = in[0](x) * in[1](x); ・ngraph::op::Negative func(x) = -in[0](x); ・ngraph::op::Abs func(x) = Halide::abs(in[0](x)); ・ngraph::op::Divide func(x) = in[0](x) / in[1](x); ・ngraph::op::Maximum func(x) = Halide::max(in[0](x), 0); ・ngraph::op::Minimum func(x) = Halide::min(in[0](x), 0); ・ngraph::op::Relu func(x) = Halide::max(in[0](x), 0);
Halide対応するために、CPU_ExternalFunction クラスに次のようなメソッドを追加しています。
#if defined(NGRAPH_HALIDE) std::unordered_map<std::string, Halide::Func>& get_halide_functions() { return halide_functions; } std::unordered_map<std::string, Halide::ImageParam>& get_subgraph_params() { return subgraph_params; } std::unordered_map<std::string, int>& get_subgraph_param_sizes() { return subgraph_param_sizes; } std::unordered_map<std::string, std::reference_wrapper<void*>>& get_subgraph_param_ptrs() { return subgraph_param_ptrs; } #endif
これに伴い、メンバーとして以下のものも追加しています。
#if defined(NGRAPH_HALIDE) std::unordered_map<std::string, Halide::Func> halide_functions; std::unordered_map<std::string, Halide::ImageParam> subgraph_params; std::unordered_map<std::string, int> subgraph_param_sizes; std::unordered_map<std::string, std::reference_wrapper<void*>> subgraph_param_ptrs; #endif
4日間で、nGraph の中でどのように Halide が使われているかを見てきました。
まだまだサポートされている Halide の Op は少ないようですが、これからどんどん対応 Op が増えていくんでしょうね。
まだまだサポートされている Halide の Op は少ないようですが、これからどんどん対応 Op が増えていくんでしょうね。