世界で一番、「Halide」の情報が集まっているのは、 下記のURLのあたしのブログの「Halide/Tiramisu」のカテゴリーですよ。 みなさん、ブックマークしましょう!((笑))
nGraph でHalideが使われていることは、
2017年10月10日のブログ、Intel Nervana GraphのロードマップでIntegration Stageとして、点々に囲まれたものとして、チラッと登場。
今秋の月曜日から金曜日までの4日間で、Halideがどのように使われているのかを調べていきます。
まだサポートし始めたばかりなので、これからコードはどんどん変わっていくと思いますが、。。。
まだサポートし始めたばかりなので、これからコードはどんどん変わっていくと思いますが、。。。
さあ、始めましょう。
まずは、nGraph にて、Halide が使えるようにするには、cmake を実行時に、-DNGRAPH_HALIDE=ON にする必要があります。
CMakeLists.txtとの
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; };
今日は、ここまで。。