From 2c80d8182a5da622f98a3f0f92f7180986e5af35 Mon Sep 17 00:00:00 2001
From: Yifan Zhao <yifanz16@illinois.edu>
Date: Thu, 1 Apr 2021 03:18:23 -0500
Subject: [PATCH] Switch to cmake for 2 out of 6 hpvm benchmarks

---
 hpvm/test/CMakeLists.txt                      |   8 ++
 hpvm/test/benchmarks/CMakeLists.txt           |  38 +++++
 hpvm/test/benchmarks/hpvm-cava/CMakeLists.txt |  22 +++
 hpvm/test/benchmarks/hpvm-cava/Makefile       | 131 ------------------
 hpvm/test/benchmarks/pipeline/CMakeLists.txt  |  13 ++
 hpvm/test/benchmarks/pipeline/Makefile        | 118 ----------------
 .../test/dnn_benchmarks/hpvm-c/CMakeLists.txt |   3 +-
 7 files changed, 82 insertions(+), 251 deletions(-)
 create mode 100644 hpvm/test/benchmarks/CMakeLists.txt
 create mode 100644 hpvm/test/benchmarks/hpvm-cava/CMakeLists.txt
 delete mode 100644 hpvm/test/benchmarks/hpvm-cava/Makefile
 create mode 100644 hpvm/test/benchmarks/pipeline/CMakeLists.txt
 delete mode 100644 hpvm/test/benchmarks/pipeline/Makefile

diff --git a/hpvm/test/CMakeLists.txt b/hpvm/test/CMakeLists.txt
index cb548b84dc..07024b6feb 100644
--- a/hpvm/test/CMakeLists.txt
+++ b/hpvm/test/CMakeLists.txt
@@ -1,5 +1,13 @@
 include(../cmake/TestFile.cmake)  # Generation of `.test` files in CMake
+
+# approxhpvm.py, clang and clang++ are used to compile benchmarks
+# in `benchmarks` and `dnn_benchmarks/hpvm-c`.
+set(APPROXHPVM_PY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/approxhpvm.py)
+set(CLANG_C ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/clang)
+set(CLANG_CXX ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/clang++)
+
 add_subdirectory(hpvm_pass)  # Passes test suite
+add_subdirectory(benchmarks)
 add_subdirectory(dnn_benchmarks/hpvm-c)  # HPVM-C DNN accuracy test suite
 add_subdirectory(dnn_benchmarks/tensor-rt-src)  # tensor_runtime DNN (build only, no tests)
 add_subdirectory(dnn_benchmarks/profiling)  # hpvm-profiler test suite
diff --git a/hpvm/test/benchmarks/CMakeLists.txt b/hpvm/test/benchmarks/CMakeLists.txt
new file mode 100644
index 0000000000..2c226aefd5
--- /dev/null
+++ b/hpvm/test/benchmarks/CMakeLists.txt
@@ -0,0 +1,38 @@
+macro(hpvm_compile_util_sources compiler_flags util_srcs language_mode)
+  # "Returns" ${util_bitcodes}, a list of paths to generated bitcode (.ll) files
+  foreach(src ${util_srcs})
+    set(src_path ${CMAKE_CURRENT_SOURCE_DIR}/${src})
+    get_filename_component(src_name ${src_path} NAME)
+    set(output_path ${CMAKE_CURRENT_BINARY_DIR}/${src_name}.ll)
+    add_custom_command(
+        OUTPUT ${output_path}
+        COMMAND ${CLANG_C} -x${language_mode}
+          ${compiler_flags} ${src_path} -emit-llvm -S -o ${output_path}
+        DEPENDS ${src_path}
+    )
+    list(APPEND util_bitcodes ${output_path})
+  endforeach()
+endmacro()
+
+function(add_hpvm_benchmark
+  target_name output_bin_name all_flags language_mode
+  main_src util_bitcodes
+)
+  set(output_bin_path ${CMAKE_CURRENT_BINARY_DIR}/${output_bin_name})
+  set(main_src_path ${CMAKE_CURRENT_SOURCE_DIR}/${main_src})
+  if(util_bitcodes)
+    set(bitcodes_arg -b ${util_bitcodes})
+  else()
+    set(bitcodes_arg "")
+  endif()
+  add_custom_command(
+    OUTPUT ${output_bin_path}
+    COMMAND ${APPROXHPVM_PY} ${all_flags} -x${language_mode}
+      ${bitcodes_arg} -- ${main_src_path} ${output_bin_path}
+    DEPENDS ${main_src_path} ${util_bitcodes} approxhpvm.py
+  )
+  add_custom_target(${target_name} DEPENDS ${output_bin_path})
+endfunction(add_hpvm_benchmark)
+
+add_subdirectory(hpvm-cava)
+add_subdirectory(pipeline)
diff --git a/hpvm/test/benchmarks/hpvm-cava/CMakeLists.txt b/hpvm/test/benchmarks/hpvm-cava/CMakeLists.txt
new file mode 100644
index 0000000000..57e3bd3f33
--- /dev/null
+++ b/hpvm/test/benchmarks/hpvm-cava/CMakeLists.txt
@@ -0,0 +1,22 @@
+set(other_srcs src/load_cam_model.c src/cam_pipe_utility.c src/utility.c)
+set(
+  compiler_flags
+  # Insanity warning: only -O1 works for this benchmark.
+  -O1 -I ${CMAKE_CURRENT_SOURCE_DIR}/src
+  -DDMA_MODE -DDMA_INTERFACE_V3
+)
+
+# Sets ${util_bitcodes}
+hpvm_compile_util_sources("${compiler_flags}" "${other_srcs}" "c")
+
+set(all_flags_cpu ${compiler_flags} "-DDEVICE=CPU_TARGET" "-lpthread")
+add_hpvm_benchmark(
+  "hpvm_cava_cpu" "hpvm-cava-cpu" "${all_flags_cpu}" "c"
+  src/main.c "${util_bitcodes}"
+)
+
+set(all_flags_gpu ${compiler_flags} "-DDEVICE=GPU_TARGET" "--opencl" "-lpthread")
+add_hpvm_benchmark(
+  "hpvm_cava_gpu" "hpvm-cava-gpu" "${all_flags_gpu}" "c"
+  src/main.c "${util_bitcodes}"
+)
diff --git a/hpvm/test/benchmarks/hpvm-cava/Makefile b/hpvm/test/benchmarks/hpvm-cava/Makefile
deleted file mode 100644
index 58dfa72aac..0000000000
--- a/hpvm/test/benchmarks/hpvm-cava/Makefile
+++ /dev/null
@@ -1,131 +0,0 @@
-# This Makefile compiles the HPVM-CAVA pilot project. 
-# It builds HPVM-related dependencies, then the native camera pipeline ISP code.
-#
-# Paths to some dependencies (e.g., HPVM, LLVM) must exist in Makefile.config,
-# which can be copied from Makefile.config.example for a start.
-
-CONFIG_FILE := ../include/Makefile.config
-
-ifeq ($(wildcard $(CONFIG_FILE)),)
-    $(error $(CONFIG_FILE) not found. See $(CONFIG_FILE).example)
-endif
-include $(CONFIG_FILE)
-
-# Compiler Flags
-
-LFLAGS += -lm -lrt
-
-ifeq ($(TARGET),)
-    TARGET = gpu
-endif
-
-# Build dirs
-SRC_DIR = src/
-CAM_PIPE_SRC_DIR = $(SRC_DIR)
-BUILD_DIR = build/$(TARGET)
-CURRENT_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
-
-
-INCLUDES += -I$(SRC_DIR) -I$(CAM_PIPE_SRC_DIR)
-ifneq ($(CONFUSE_ROOT),)
-  INCLUDES += -I$(CONFUSE_ROOT)/include
-  LFLAGS += -L$(CONFUSE_ROOT)/lib
-endif
-
-EXE = cava-hpvm-$(TARGET)
-
-LFLAGS += -pthread
-
-## BEGIN HPVM MAKEFILE
-LANGUAGE=hpvm
-SRCDIR_OBJS=load_cam_model.ll cam_pipe_utility.ll utility.ll
-OBJS_SRC=src/load_cam_model.c src/cam_pipe_utility.c src/utility.c
-HPVM_OBJS=main.hpvm.ll
-APP = $(EXE)
-APP_CUDALDFLAGS=-lm -lstdc++
-APP_CFLAGS= $(INCLUDES) -DDMA_MODE -DDMA_INTERFACE_V3
-APP_CXXFLAGS=-ffast-math -O0 -I/opt/opencv/include
-APP_LDFLAGS=$(LFLAGS)
-
-CFLAGS = -O1 $(APP_CFLAGS) $(PLATFORM_CFLAGS)
-OBJS_CFLAGS = -O1 $(APP_CFLAGS) $(PLATFORM_CFLAGS)
-CXXFLAGS = $(APP_CXXFLAGS) $(PLATFORM_CXXFLAGS)
-LDFLAGS= $(APP_LDFLAGS) $(PLATFORM_LDFLAGS)
-
-HPVM_RT_PATH = $(LLVM_BUILD_DIR)/tools/hpvm/projects/hpvm-rt
-
-HPVM_RT_LIB = $(HPVM_RT_PATH)/hpvm-rt.bc
-
-
-TESTGEN_OPTFLAGS = -load LLVMGenHPVM.so -genhpvm -globaldce
-
-ifeq ($(TARGET),seq)
-  DEVICE = CPU_TARGET
-  HPVM_OPTFLAGS = -load LLVMBuildDFG.so -load LLVMDFG2LLVM_CPU.so -load LLVMClearDFG.so -dfg2llvm-cpu -clearDFG
-  HPVM_OPTFLAGS += -hpvm-timers-cpu
-else
-  DEVICE = GPU_TARGET
-  HPVM_OPTFLAGS = -load LLVMBuildDFG.so -load LLVMLocalMem.so -load LLVMDFG2LLVM_OpenCL.so -load LLVMDFG2LLVM_CPU.so -load LLVMClearDFG.so -localmem -dfg2llvm-opencl -dfg2llvm-cpu -clearDFG
-  HPVM_OPTFLAGS += -hpvm-timers-cpu -hpvm-timers-ptx
-endif
-  TESTGEN_OPTFLAGS += -hpvm-timers-gen
-
-CFLAGS += -DDEVICE=$(DEVICE)
-CXXFLAGS += -DDEVICE=$(DEVICE)
-
-# Add BUILDDIR as a prefix to each element of $1
-INBUILDDIR=$(addprefix $(BUILD_DIR)/,$(1))
-
-.PRECIOUS: $(BUILD_DIR)/%.ll
-
-OBJS = $(call INBUILDDIR,$(SRCDIR_OBJS))
-TEST_OBJS = $(call INBUILDDIR,$(HPVM_OBJS))
-KERNEL = $(TEST_OBJS).kernels.ll
-
-ifeq ($(TARGET),gpu)
-  KERNEL_OCL = $(TEST_OBJS).kernels.cl
-endif
-
-HOST_LINKED = $(BUILD_DIR)/$(APP).linked.ll
-HOST = $(BUILD_DIR)/$(APP).host.ll
-
-ifeq ($(OPENCL_PATH),)
-FAILSAFE=no_opencl
-else 
-FAILSAFE=
-endif
-
-# Targets
-
-default: $(FAILSAFE) $(BUILD_DIR) $(KERNEL_OCL) $(EXE)
-
-clean :
-	if [ -f $(EXE) ]; then rm $(EXE); fi
-	if [ -f DataflowGraph.dot ]; then rm DataflowGraph.dot*; fi
-	if [ -d $(BUILD_DIR) ]; then rm -rf $(BUILD_DIR); fi
-
-$(KERNEL_OCL) : $(KERNEL)
-	$(OCLBE) $< -o $@
-
-$(EXE) : $(HOST_LINKED)
-	$(CXX) -O3 $(LDFLAGS) $< -o $@
-
-$(HOST_LINKED) : $(HOST) $(OBJS) $(HPVM_RT_LIB)
-	$(LLVM_LINK) $^ -S -o $@
-
-$(HOST) $(KERNEL): $(BUILD_DIR)/$(HPVM_OBJS)
-	$(OPT) $(HPVM_OPTFLAGS) -S $< -o $(HOST)
-
-$(BUILD_DIR):
-	mkdir -p $(BUILD_DIR)
-
-$(BUILD_DIR)/%.ll : $(SRC_DIR)/%.c
-	$(CC) $(OBJS_CFLAGS) -emit-llvm -S -o $@ $<
-
-$(BUILD_DIR)/main.ll : $(SRC_DIR)/main.c
-	$(CC) $(CFLAGS) -emit-llvm -S -o $@ $<
-
-$(BUILD_DIR)/main.hpvm.ll : $(BUILD_DIR)/main.ll
-	$(OPT) $(TESTGEN_OPTFLAGS) $< -S -o $@
-
-## END HPVM MAKEFILE
diff --git a/hpvm/test/benchmarks/pipeline/CMakeLists.txt b/hpvm/test/benchmarks/pipeline/CMakeLists.txt
new file mode 100644
index 0000000000..84cb2d85af
--- /dev/null
+++ b/hpvm/test/benchmarks/pipeline/CMakeLists.txt
@@ -0,0 +1,13 @@
+find_package(OpenCV 2)
+if(${OpenCV_FOUND})
+  set(
+    all_flags
+    -O3 -I${OpenCV_INCLUDE_DIRS}
+    -ffast-math -fno-lax-vector-conversions -fno-vectorize -fno-slp-vectorize
+    -lpthread
+  )
+  add_hpvm_benchmark("pipeline_cpu" "pipeline-cpu" "${all_flags}" "c++" src/main.cc "")
+  add_hpvm_benchmark("pipeline_gpu" "pipeline-gpu" "${all_flags};--opencl" "c++" src/main.cc "")
+else()
+  message(WARNING "opencv-2 not found; not compiling HPVM benchmark 'pipeline'.")
+endif()
diff --git a/hpvm/test/benchmarks/pipeline/Makefile b/hpvm/test/benchmarks/pipeline/Makefile
deleted file mode 100644
index 8a55393f24..0000000000
--- a/hpvm/test/benchmarks/pipeline/Makefile
+++ /dev/null
@@ -1,118 +0,0 @@
-# This Makefile compiles the HPVM-pipeline test.
-# It builds HPVM-related dependencies, then the native camera pipeline ISP code.
-#
-# Paths to some dependencies (e.g., HPVM, LLVM) must exist in Makefile.config,
-# which can be copied from Makefile.config.example for a start.
-
-CONFIG_FILE := ../include/Makefile.config
-
-ifeq ($(wildcard $(CONFIG_FILE)),)
-    $(error $(CONFIG_FILE) not found. See $(CONFIG_FILE).example)
-endif
-include $(CONFIG_FILE)
-
-# Compiler Flags
-
-LFLAGS += -lm -lrt
-
-ifeq ($(TARGET),)
-    TARGET = gpu
-endif
-
-# Build dirs
-SRC_DIR = src/
-BUILD_DIR = build/$(TARGET)
-CURRENT_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
-
-EXE = pipeline-$(TARGET)
-
-INCLUDES += -I$(SRC_DIR)
-
-## BEGIN HPVM MAKEFILE
-SRCDIR_OBJS=
-HPVM_OBJS=main.hpvm.ll
-APP = $(EXE)
-APP_CFLAGS += $(INCLUDES) -ffast-math -O3 -fno-lax-vector-conversions -fno-vectorize -fno-slp-vectorize
-APP_CXXFLAGS += $(INCLUDES) -ffast-math -O3 -fno-lax-vector-conversions -fno-vectorize -fno-slp-vectorize
-APP_LDFLAGS=`pkg-config opencv --libs`
-
-CFLAGS = $(APP_CFLAGS) $(PLATFORM_CFLAGS)
-OBJS_CFLAGS = $(APP_CFLAGS) $(PLATFORM_CFLAGS)
-CXXFLAGS = $(APP_CXXFLAGS) $(PLATFORM_CXXFLAGS)
-LDFLAGS= $(APP_LDFLAGS) $(PLATFORM_LDFLAGS)
-
-HPVM_RT_PATH = $(LLVM_BUILD_DIR)/tools/hpvm/projects/hpvm-rt
-HPVM_RT_LIB = $(HPVM_RT_PATH)/hpvm-rt.bc
-
-TESTGEN_OPTFLAGS = -load LLVMGenHPVM.so -genhpvm -globaldce
-
-ifeq ($(TARGET),seq)
-  DEVICE = CPU_TARGET
-  HPVM_OPTFLAGS = -load LLVMBuildDFG.so -load LLVMDFG2LLVM_CPU.so -load LLVMClearDFG.so -dfg2llvm-cpu -clearDFG
-  HPVM_OPTFLAGS += -hpvm-timers-cpu
-else
-  DEVICE = GPU_TARGET
-  HPVM_OPTFLAGS = -load LLVMBuildDFG.so -load LLVMLocalMem.so -load LLVMDFG2LLVM_OpenCL.so -load LLVMDFG2LLVM_CPU.so -load LLVMClearDFG.so -localmem -dfg2llvm-opencl -dfg2llvm-cpu -clearDFG
-  HPVM_OPTFLAGS += -hpvm-timers-cpu -hpvm-timers-ptx
-endif
-  TESTGEN_OPTFLAGS += -hpvm-timers-gen
-
-CFLAGS += -DDEVICE=$(DEVICE)
-CXXFLAGS += -DDEVICE=$(DEVICE)
-
-# Add BUILDDIR as a prefix to each element of $1
-INBUILDDIR=$(addprefix $(BUILD_DIR)/,$(1))
-
-.PRECIOUS: $(BUILD_DIR)/%.ll
-
-OBJS = $(call INBUILDDIR,$(SRCDIR_OBJS))
-TEST_OBJS = $(call INBUILDDIR,$(HPVM_OBJS))
-KERNEL = $(TEST_OBJS).kernels.ll
-
-ifeq ($(TARGET),seq)
-else
-  KERNEL_OCL = $(TEST_OBJS).kernels.cl
-endif
-
-HOST_LINKED = $(BUILD_DIR)/$(APP).linked.ll
-HOST = $(BUILD_DIR)/$(APP).host.ll
-
-ifeq ($(OPENCL_PATH),)
-FAILSAFE=no_opencl
-else 
-FAILSAFE=
-endif
-
-# Targets
-default: $(FAILSAFE) $(BUILD_DIR) $(KERNEL_OCL) $(EXE)
-
-clean :
-	if [ -f $(EXE) ]; then rm $(EXE); fi
-	if [ -f DataflowGraph.dot ]; then rm DataflowGraph.dot*; fi
-	if [ -d $(BUILD_DIR) ]; then rm -rf $(BUILD_DIR); fi
-
-$(KERNEL_OCL) : $(KERNEL)
-	$(OCLBE) $< -o $@
-
-$(EXE) : $(HOST_LINKED)
-	$(CXX) -O3 $(LDFLAGS) $< -o $@
-
-$(HOST_LINKED) : $(HOST) $(OBJS) $(HPVM_RT_LIB)
-	$(LLVM_LINK) $^ -S -o $@
-
-$(HOST) $(KERNEL): $(BUILD_DIR)/$(HPVM_OBJS)
-	$(OPT) $(HPVM_OPTFLAGS) -S $< -o $(HOST)
-
-$(BUILD_DIR):
-	mkdir -p $(BUILD_DIR)
-
-$(BUILD_DIR)/%.ll : $(SRC_DIR)/%.cc
-	$(CC) $(OBJS_CFLAGS) -emit-llvm -S -o $@ $<
-
-$(BUILD_DIR)/main.ll : $(SRC_DIR)/main.cc
-	$(CC) $(CXXFLAGS) -emit-llvm -S -o $@ $<
-
-$(BUILD_DIR)/main.hpvm.ll : $(BUILD_DIR)/main.ll
-	$(OPT) $(TESTGEN_OPTFLAGS) $< -S -o $@
-
-## END HPVM MAKEFILE
diff --git a/hpvm/test/dnn_benchmarks/hpvm-c/CMakeLists.txt b/hpvm/test/dnn_benchmarks/hpvm-c/CMakeLists.txt
index c3fa67b760..35c460e0cd 100644
--- a/hpvm/test/dnn_benchmarks/hpvm-c/CMakeLists.txt
+++ b/hpvm/test/dnn_benchmarks/hpvm-c/CMakeLists.txt
@@ -1,5 +1,4 @@
-# First get approxhpvm.py which we then use to compile benchmarks.
-get_filename_component(APPROXHPVM_PY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/approxhpvm.py REALPATH)
+# APPROXHPVM_PY is defined in ../../
 
 # Each source file contains a @MODEL_PARAMS_DIR@ waiting to be filled in.
 set(MODEL_PARAMS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../model_params/")
-- 
GitLab