From bc7d93c88880e25cc4b4f88f06b83bb3fcc9a2e1 Mon Sep 17 00:00:00 2001
From: Yifan Zhao <yifanz16@illinois.edu>
Date: Wed, 20 Jan 2021 22:46:05 -0600
Subject: [PATCH] Fixed compilation of promise-targeted dnn benchmarks

---
 hpvm/test/dnn_benchmarks/CMakeLists.txt | 130 ++++++++++++++----------
 1 file changed, 76 insertions(+), 54 deletions(-)

diff --git a/hpvm/test/dnn_benchmarks/CMakeLists.txt b/hpvm/test/dnn_benchmarks/CMakeLists.txt
index 536a85f1a0..8547971313 100644
--- a/hpvm/test/dnn_benchmarks/CMakeLists.txt
+++ b/hpvm/test/dnn_benchmarks/CMakeLists.txt
@@ -48,63 +48,85 @@ set(HPVM_RT_PATH ${PROJECT_BINARY_DIR}/tools/hpvm/projects/hpvm-rt/hpvm-rt.ll)
 # Compile flags (clang++)
 set(CLANG_FLAGS -fno-exceptions -std=c++11 -O3)
 
-# Passes flags
+# All compilation uses HPVM_DEFAULT_PASSES, some can pick from HPVM_OPTIONAL_PASSES 
 set(
-  HPVM_OPT_PASSES
-  -load LLVMBuildDFG.so
-  -load LLVMInPlaceDFGAnalysis.so
-  -load LLVMDFG2LLVM_CUDNN.so
-  -load LLVMDFG2LLVM_CPU.so
-  -load LLVMClearDFG.so
-  -inplace -dfg2llvm-cudnn -dfg2llvm-cpu -clearDFG
+  HPVM_DEFAULT_PASSES
+  LLVMBuildDFG
+  LLVMInPlaceDFGAnalysis
+  LLVMDFG2LLVM_CPU
+  LLVMFuseHPVMTensorNodes
+  LLVMClearDFG
+  LLVMGenHPVM
 )
-
-# Manually specify dependencies because we're not using cmake "normally"
-list(
-  APPEND DEPEND
-  clang opt llvm-link  # LLVM binaries
-  hpvm-rt.ll  # HPVM runtime
-  LLVMGenHPVM LLVMBuildDFG LLVMInPlaceDFGAnalysis LLVMDFG2LLVM_CUDNN LLVMDFG2LLVM_CPU LLVMClearDFG # Passes
+set(
+  HPVM_OPTIONAL_PASSES
+  LLVMDFG2LLVM_CUDNN
+  LLVMDFG2LLVM_WrapperAPI
 )
+# Manually specify dependencies because we're not using cmake "normally"
+list(APPEND DEPEND clang opt llvm-link hpvm-rt.ll ${HPVM_DEFAULT_PASSES} ${HPVM_OPTIONAL_PASSES})
 
-file(GLOB entries ./benchmarks/*)
-set(test_targets "")
-foreach(entry ${entries})
-  if(IS_DIRECTORY ${entry})
-    file(GLOB src_files ${entry}/*.cpp)
-    foreach(src_file ${src_files})
-      get_filename_component(target "${src_file}" NAME_WE)
-      set(target "test_${target}")
-      list(APPEND test_targets ${target})
+set(WORK_DIR ${CMAKE_CURRENT_BINARY_DIR})
+set(test_compile_targets "")
+function(compile_single_benchmark target src_file extra_passes extra_dfg_flags)
+  foreach(pass ${HPVM_DEFAULT_PASSES} ${extra_passes})
+    list(APPEND LOAD_FILE_FLAGS "-load" "${pass}.so")
+  endforeach()
+  set(
+    HPVM_PASSES ${LOAD_FILE_FLAGS}
+    -buildDFG -inplace -hpvm-fuse ${extra_dfg_flags} -dfg2llvm-cpu -clearDFG
+  )
 
-      set(WORK_DIR ${CMAKE_CURRENT_BINARY_DIR})
-      add_custom_command(
-        OUTPUT "${target}.ll" DEPENDS ${src_file}
-        COMMAND ${CMAKE_CXX_COMPILER} ${INCLUDE_COMPILER_STRINGS} ${CLANG_FLAGS} -emit-llvm -S ${src_file}
-          -o ${WORK_DIR}/${target}.ll
-      )
-      add_custom_command(
-        OUTPUT
-          "${WORK_DIR}/${target}.hpvm.ll"
-          "${WORK_DIR}/${target}_cudnn.bc"
-          "${WORK_DIR}/${target}_cudnn_linked.bc"
-          "${WORK_DIR}/${target}_cudnn_linked"
-        DEPENDS "${target}.ll"
-        COMMAND ${LLVM_OPT} -load LLVMGenHPVM.so -genhpvm -globaldce -S ${WORK_DIR}/${target}.ll
-          -o ${WORK_DIR}/${target}.hpvm.ll
-        COMMAND ${LLVM_OPT} ${HPVM_OPT_PASSES} ${WORK_DIR}/${target}.hpvm.ll
-          -o ${WORK_DIR}/${target}_cudnn.bc
-        COMMAND ${LLVM_LINK} ${WORK_DIR}/${target}_cudnn.bc ${HPVM_RT_PATH}
-          -o ${WORK_DIR}/${target}_cudnn_linked.bc
-        COMMAND ${CMAKE_CXX_COMPILER}
-          ${WORK_DIR}/${target}_cudnn_linked.bc
-          $<TARGET_FILE:tensor_runtime> $<TARGET_FILE:gpu_profiler> $<TARGET_FILE:promise_profiler>
-          -o ${WORK_DIR}/${target} ${LINKER_FLAGS}
-      )
-      add_custom_target(${target} DEPENDS "${WORK_DIR}/${target}_cudnn_linked")
-      add_dependencies(${target} ${DEPEND})
-    endforeach()
-  endif()
-endforeach(entry)
-message(STATUS "List of test dnn benchmarks: ${test_targets}")
+  add_custom_command(
+    OUTPUT "${WORK_DIR}/${target}.ll" DEPENDS ${src_file}
+    COMMAND ${CMAKE_CXX_COMPILER} ${INCLUDE_COMPILER_STRINGS} ${CLANG_FLAGS} -emit-llvm -S ${src_file}
+      -o ${WORK_DIR}/${target}.ll
+  )
+  add_custom_command(
+    OUTPUT "${WORK_DIR}/${target}.hpvm.ll" DEPENDS "${WORK_DIR}/${target}.ll"
+    COMMAND ${LLVM_OPT} -load LLVMGenHPVM.so -genhpvm -globaldce -S ${WORK_DIR}/${target}.ll
+      -o ${WORK_DIR}/${target}.hpvm.ll
+  )
+  add_custom_command(
+    OUTPUT "${WORK_DIR}/${target}.llvm.ll" DEPENDS "${WORK_DIR}/${target}.hpvm.ll"
+    COMMAND ${LLVM_OPT} ${HPVM_PASSES} -S ${WORK_DIR}/${target}.hpvm.ll
+      -o ${WORK_DIR}/${target}.llvm.ll
+  )
+  add_custom_command(
+    OUTPUT "${WORK_DIR}/${target}.linked.bc" DEPENDS "${WORK_DIR}/${target}.llvm.ll"
+    COMMAND ${LLVM_LINK} ${WORK_DIR}/${target}.llvm.ll ${HPVM_RT_PATH}
+      -o ${WORK_DIR}/${target}.linked.bc
+  )
+  add_custom_command(
+    OUTPUT "${WORK_DIR}/${target}" DEPENDS "${WORK_DIR}/${target}.linked.bc"
+    COMMAND ${CMAKE_CXX_COMPILER}
+      ${WORK_DIR}/${target}.linked.bc
+      $<TARGET_FILE:tensor_runtime> $<TARGET_FILE:gpu_profiler> $<TARGET_FILE:promise_profiler>
+      -o ${WORK_DIR}/${target} ${LINKER_FLAGS}
+  )
+  add_custom_target(${target} DEPENDS "${WORK_DIR}/${target}")
+  add_dependencies(${target} ${DEPEND})
 
+  set(test_compile_targets ${test_compile_targets} ${target} PARENT_SCOPE)
+endfunction(compile_single_benchmark)
+
+file(GLOB entries ./benchmarks/*)
+foreach(dir ${entries})
+  get_filename_component(dirname "${dir}" NAME)
+  compile_single_benchmark(
+    "test_${dirname}" ${dir}/${dirname}.cpp LLVMDFG2LLVM_CUDNN -dfg2llvm-cudnn
+  )
+  set(
+    loop_extra_flags
+    -dfg2llvm-wrapperapi
+      -quantization-levels-filename=${dir}/data/quant_ranges_rt.txt
+      -configuration-inputs-filename=${dir}/data/tuner_confs.txt
+  )
+  compile_single_benchmark(
+    "test_${dirname}_loop" ${dir}/${dirname}_loop.cpp
+    LLVMDFG2LLVM_WrapperAPI "${loop_extra_flags}"
+  )
+endforeach(dir)
+message(STATUS "List of test dnn benchmarks: ${test_compile_targets}")
+add_custom_target(dnn_benchmarks DEPENDS ${test_compile_targets})
+message(STATUS "Target name for compiling all dnn benchmarks: dnn_benchmarks")
-- 
GitLab