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