Vengineerの戯言

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

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


  世界で一番、「Halide」の情報が集まっているのは、
  下記のURLのあたしのブログの「Halide/Tiramisu」のカテゴリーですよ。
  みなさん、ブックマークしましょう!((笑))


で、今日は、Intel nGraph Library 中でどのように、Halideが使われているかをソースコードを追ってみます。

nGraph でHalideが使われていることは、

2017年10月10日のブログ、Intel Nervana GraphのロードマップでIntegration Stageとして、点々に囲まれたものとして、チラッと登場。

そして、2018年11月28日のブログ、Intel nGraph Compiler stackでは、Suggraph APIとして、Halideが利用できるようなったことをお伝えしました。

今秋の月曜日から金曜日までの4日間で、Halideがどのように使われているのかを調べていきます。
まだサポートし始めたばかりなので、これからコードはどんどん変わっていくと思いますが、。。。

さあ、始めましょう。

まずは、nGraph にて、Halide が使えるようにするには、cmake を実行時に、-DNGRAPH_HALIDE=ON にする必要があります
CMakeLists.txtとの
if (NGRAPH_HALIDE)
    message(WARNING "Halide build system integration is currently using an older LLVM release \
                     and is not expected to work across most build environments. Consider \
                     disabling it till this message goes away")
    include(cmake/external_halide.cmake)
endif()
の部分にあるように、現時点では、まだまだよと。。

Halideのビルドに関しては、cmake/external_halide.cmakeにて設定が行われています。

また、下記のように、Halide関連を取り込んでいます。
if (NGRAPH_HALIDE)
    set(SRC
        ${SRC}
        builder/halide_op.cpp
        builder/loop_kernel.cpp
        builder/halide_generators.cpp
        pass/halide_subgraph_extraction.cpp
        )
endif()

if (NGRAPH_CPU_ENABLE)
......
    if (NGRAPH_HALIDE)
        target_compile_definitions(cpu_backend PRIVATE "NGRAPH_HALIDE")
        ExternalProject_Get_Property(ext_halide BINARY_DIR)
        target_include_directories(cpu_backend SYSTEM PRIVATE ${BINARY_DIR}/include)
        target_link_libraries(cpu_backend PRIVATE ${BINARY_DIR}/lib/libHalide.a libhalidellvm)
        add_dependencies(cpu_backend ext_halide)
    endif()
......
endif()

最初に呼ばれるのは、CPUのregister_common_passesメソッドにて登録されている、
#if defined(NGRAPH_HALIDE)
    REGISTER_KNOBBED_PASS(HalideSubgraphExtraction, true, ngraph::runtime::cpu::pass);
#endif
HalideSubgraphExtractionです。

HalideSubgraphExtraction は、src/ngraph/runtime/cpu/pass/halide_subgraph_extraction.hppで下記のように宣言されています。

                class HalideSubgraphExtraction : public ngraph::pass::FunctionPass
                {
                public:
                    HalideSubgraphExtraction() {}
                    bool run_on_function(std::shared_ptr<ngraph::Function> function) override;
                };


今日は、ここまで。。