From 044cb85050822297b674ed4a8e38bf249a8b039b Mon Sep 17 00:00:00 2001
From: Yifan Zhao <yifanz16@illinois.edu>
Date: Tue, 12 Jan 2021 06:25:18 -0600
Subject: [PATCH] Added cmake compilation for test/dnn_benchmarks

---
 hpvm/test/CMakeLists.txt                |  2 +
 hpvm/test/dnn_benchmarks/CMakeLists.txt | 84 +++++++++++++++++++++++++
 2 files changed, 86 insertions(+)
 create mode 100644 hpvm/test/dnn_benchmarks/CMakeLists.txt

diff --git a/hpvm/test/CMakeLists.txt b/hpvm/test/CMakeLists.txt
index fc9e3a030b..6f7ea59b01 100644
--- a/hpvm/test/CMakeLists.txt
+++ b/hpvm/test/CMakeLists.txt
@@ -160,3 +160,5 @@ add_lit_testsuites(HPVM ${CMAKE_CURRENT_SOURCE_DIR}
 add_custom_target(hpvm-check)
 add_dependencies(hpvm-check check-hpvm)
 set_target_properties(hpvm-check PROPERTIES FOLDER "Tests")
+
+add_subdirectory(dnn_benchmarks)
diff --git a/hpvm/test/dnn_benchmarks/CMakeLists.txt b/hpvm/test/dnn_benchmarks/CMakeLists.txt
new file mode 100644
index 0000000000..d0e349571f
--- /dev/null
+++ b/hpvm/test/dnn_benchmarks/CMakeLists.txt
@@ -0,0 +1,84 @@
+# Look for CUDA again (already done in hpvm-tensor-rt) so we can include its header
+# This is not the best practice,
+# but easier than having the tensor runtime tell us which CUDA it used.
+find_package(CUDA REQUIRED)
+
+get_filename_component(LLVM_BIN_DIR ${PROJECT_BINARY_DIR}/bin REALPATH)
+set(LLVM_CLANG_XX "${LLVM_BIN_DIR}/clang++")
+set(LLVM_OPT "${LLVM_BIN_DIR}/opt")
+set(LLVM_LINK "${LLVM_BIN_DIR}/llvm-link")
+
+# Directories to include
+set(HPVM_PROJECTS ${PROJECT_SOURCE_DIR}/tools/hpvm/projects)
+set(HPVM_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../benchmarks/include)
+set(TENSOR_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include)
+set(TENSOR_RT_INCLUDE_DIR ${HPVM_PROJECTS}/hpvm-tensor-rt/tensor_runtime/include)
+set(INCLUDES ${HPVM_INCLUDE_DIR} ${TENSOR_INCLUDE_DIR} ${TENSOR_RT_INCLUDE_DIR} ${CUDA_INCLUDE_DIRS})
+foreach(dir ${INCLUDES})
+  list(APPEND INCLUDE_COMPILER_STRINGS "-I${dir}")
+endforeach()
+
+# Built-in libraries to link
+list(APPEND LINKER_FLAGS -lpthread -lcudart -lcurand -lcudnn -lcublas -lcufft -lOpenCL -lstdc++fs -lomp)
+
+# The hpvm-rt runtime
+# This has to be explicitly set as hpvm-rt.ll is created in a custom_target
+# and does not export its file location.
+# Keep this in sync with hpvm/projects/hpvm-rt/CMakeLists.txt.
+set(HPVM_RT_PATH ${PROJECT_BINARY_DIR}/tools/hpvm/projects/hpvm-rt/hpvm-rt.ll)
+
+# Optimization flags
+set(
+  HPVM_OPT_PASSES
+  -load LLVMBuildDFG.so
+  -load LLVMInPlaceDFGAnalysis.so
+  -load LLVMDFG2LLVM_CUDNN.so
+  -load LLVMDFG2LLVM_CPU.so
+  -load LLVMClearDFG.so
+  -inplace -dfg2llvm-cpu -dfg2llvm-cudnn -clearDFG
+)
+
+# 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
+)
+
+file(GLOB entries ./benchmarks/*)
+set(test_targets "")
+foreach(entry ${entries})
+  if(IS_DIRECTORY ${entry} AND IS_DIRECTORY ${entry}/src)
+    file(GLOB src_files ${entry}/src/*.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})
+      add_custom_command(
+        OUTPUT "${target}.ll"
+        DEPENDS ${src_file}
+        COMMAND ${LLVM_CLANG_XX} ${INCLUDE_COMPILER_STRINGS} -emit-llvm -S -O1 ${src_file}
+          -o ${WORK_DIR}/${target}.ll
+      )
+      add_custom_command(
+        OUTPUT "${target}.opt.bc"
+        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 ${LLVM_CLANG_XX} ${WORK_DIR}/${target}_cudnn_linked.bc $<TARGET_FILE:tensor_runtime>
+          -o ${WORK_DIR}/${target}_cudnn_linked ${LINKER_FLAGS}
+      )
+      add_custom_target(${target} DEPENDS "${target}.opt.bc")
+      add_dependencies(${target} ${DEPEND})
+    endforeach()
+  endif()
+endforeach(entry)
+message(STATUS "List of test dnn benchmarks: ${test_targets}")
+
-- 
GitLab