diff --git a/hpvm/test/CMakeLists.txt b/hpvm/test/CMakeLists.txt index fc9e3a030be07c2d4655859e5e24962f9b594a74..6f7ea59b011d9f58804a6ad06d32faee272bbb7e 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 0000000000000000000000000000000000000000..d0e349571f9b4e01afae1938b66bcd1ea8386272 --- /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}") +