Vengineerの戯言

人生は短いけど、長いです。人生を楽しみましょう!

Intel nGraph で Halide はどのように使われているか?(その4)



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 が増えていくんでしょうね。