2026-01-28 06:16:04 +00:00

282 lines
12 KiB
CMake

# Compile all the inferencers across platform as a static library or an executable
# Some tricks we played here are that:
# 1. The static library will be fat, since it contains inferencers across platform; as a consumer of our lib,
# you are only supposed to use one of them, for example, CUDAInferencer;
# 2. Since we implement build() function only in each specific inplementation, the bin or shared library of the
# consumer will be small and only link codes of corresponding platform; for example, CUDAInferencer will not
# contain codes of CPUInferencer
# 3. We have automactic dectection of dependencies and dummy inferencers; for example, if you have CUDA installed,
# the target will compile the fully functionnal CUDAInferencer; otherwise, the target will compile a dummy
# CUDAInferencer which will crash when you create it and print "CUDA NOT FOUND ON CURRENT MACHINE"
# author: Nan Zhou, nanzhou at kneron dot us
#supportted cmake options: -DDISABLE_CUDA -DDISABLE_OPENBLAS
cmake_minimum_required(VERSION 3.10)
include(../piano/common_header_lib/common.cmake)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -std=c++17 -Xcompiler -fPIC -arch=sm_61")
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR})
set(FLOAT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/floating_point)
find_package(OpenMP)
#######################
### check options #####
#######################
option(DISABLE_CUDA "DISABLE CUDA RELATED CODE(THIS IS NEEDED IN A CUDA ENV)" OFF)
option(DISABLE_OPENBLAS "DISABLE OPENBLAS RELATED CODE(THIS IS NEEDED IN A OPENBLAS ENV)" OFF)
option(DISABLE_KPLUS "DISABLE KPLUS RELATED CODE(THIS IS NEEDED WHEN TARGET SYSTEM DOESNT PROVIDE LIBUSBDEV" OFF)
option(KNEREX_MODE "KNEREX_MODE for Dynasty" OFF)
IF(KNEREX_MODE)
ADD_DEFINITIONS(-DKNEREX_MODE)
ENDIF()
IF(NOT DISABLE_CUDA)
find_package(CUDA QUIET)
find_package(CUDNN QUIET)
ENDIF()
MESSAGE("cudnn version: " ${CUDNN_VERSION} ${CUDA_cudnn_LIBRARY})
IF(NOT DISABLE_OPENBLAS)
find_package(OpenBLAS QUIET)
IF(OpenBLAS_FOUND)
ADD_DEFINITIONS(-DOPENBLAS_FOUND)
ENDIF()
ENDIF()
IF(NOT DISABLE_KPLUS)
find_library(USB_LIB
NAMES usb-1.0 libusb-1.0
)
MESSAGE(STATUS "USB_LIB found as : " ${USB_LIB})
ADD_DEFINITIONS(-DUSBLIB_FOUND)
ELSE()
MESSAGE(STATUS "KPLUS inference will be disabled")
ENDIF()
IF (NOT ${PLATFORM} STREQUAL "ubuntu_x64")
ADD_DEFINITIONS(-DBUILD_CPU_ONLY)
ENDIF()
include(cmake/dynasty_safely_compile.cmake)
dynasty_safely_compile()
add_subdirectory(floating_point/base_operators)
#######################################################################
##### build ##########################################################
##### only build run_fix_infer/run_infer on ubuntun_x64 platform ####
#######################################################################
#this is the way to get a Linux executable to search for .sos in the directory ../lib as the executable.
#this will take effect in the link stage
set(CMAKE_INSTALL_RPATH "$ORIGIN/../lib/")
IF(CUDA_FOUND)
ADD_DEFINITIONS(-DCUDA_FOUND)
cuda_add_library(inferencer_lib STATIC ${DYNASTY_ALL_SRC})
ELSE()
add_library(inferencer_lib STATIC ${DYNASTY_ALL_SRC})
ENDIF()
target_link_libraries(inferencer_lib cpu_op ${DYNASTY_ALL_LIB} )
target_include_directories(inferencer_lib PRIVATE
${DYNASTY_ALL_INCLUDE}
)
IF (${PLATFORM} STREQUAL "ubuntu_x64")
add_executable(run_inferencer ${FLOAT_DIR}/src/run_inferencer.cpp )
add_executable(run_fix_inference dynamic_fixed_point/src/run_fix_inference.cpp)
target_link_libraries(run_inferencer inferencer_lib cpu_op ${DSP_ALL_LIB} ${DYNASTY_ALL_LIB} ${MYSTERY_LIB} )
target_include_directories(run_inferencer PUBLIC ${DYNASTY_ALL_INCLUDE} )
target_link_libraries(run_fix_inference inferencer_lib cpu_op ${DSP_ALL_LIB} ${DYNASTY_ALL_LIB} ${MYSTERY_LIB})
target_include_directories(run_fix_inference PUBLIC ${DYNASTY_ALL_INCLUDE})
ENDIF()
set(CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_SOURCE_DIR})
add_subdirectory(test)
add_subdirectory(E2ESimulator)
##################################
#### Installation ###########
##################################
IF (${PLATFORM} STREQUAL "ubuntu_x64")
install(TARGETS run_inferencer
PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_WRITE GROUP_READ WORLD_EXECUTE WORLD_READ WORLD_WRITE
RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/release/bin
)
install(TARGETS run_fix_inference
PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_WRITE GROUP_READ WORLD_EXECUTE WORLD_READ WORLD_WRITE
RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/release/bin
)
install(TARGETS inferencer_integration_tests
PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_WRITE GROUP_READ WORLD_EXECUTE WORLD_READ WORLD_WRITE
RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/release/bin
)
ENDIF()
set(dynasty_headers )
list(APPEND dynasty_headers dynamic_fixed_point/include/generic/KnerexInferencer.h)
list(APPEND dynasty_headers ${FLOAT_DIR}/include/inferencer/PianoInferencer.h)
list(APPEND dynasty_headers ${FLOAT_DIR}/include/inferencer/AbstractInferencer.h)
list(APPEND dynasty_headers ../piano/common_header_lib/include/io/JsonIO.h)
list(APPEND dynasty_headers ${FLOAT_DIR}/include/io/ONNXIO.h)
list(APPEND dynasty_headers ${FLOAT_DIR}/include/io/UnixFileManager.h)
set_target_properties(inferencer_lib PROPERTIES
PUBLIC_HEADER "${dynasty_headers}"
)
install(FILES ${MSFT_GPU_LIB}
PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_WRITE GROUP_READ WORLD_EXECUTE WORLD_READ WORLD_WRITE
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/lib)
install(FILES ${PROTOBUF}
PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_WRITE GROUP_READ WORLD_EXECUTE WORLD_READ WORLD_WRITE
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/lib)
install(FILES ${KPLUS_LIB}
PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_WRITE GROUP_READ WORLD_EXECUTE WORLD_READ WORLD_WRITE
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/lib)
install(FILES ${LIBZIP_LIB}
PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_WRITE GROUP_READ WORLD_EXECUTE WORLD_READ WORLD_WRITE
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/lib)
install(FILES ${ZLIB_LIB}
PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_WRITE GROUP_READ WORLD_EXECUTE WORLD_READ WORLD_WRITE
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/lib)
install(TARGETS ${DSP_ALL_LIB} ${MYSTERY_LIB} ${PIANO_LIB}
PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_WRITE GROUP_READ WORLD_EXECUTE WORLD_READ WORLD_WRITE
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/lib)
install(TARGETS inferencer_lib
PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_WRITE GROUP_READ WORLD_EXECUTE WORLD_READ WORLD_WRITE
ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/release/lib
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_PREFIX}/release/include)
install(TARGETS cpu_op
PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_WRITE GROUP_READ WORLD_EXECUTE WORLD_READ WORLD_WRITE
ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/release/lib
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_PREFIX}/release/include)
install(FILES dynamic_fixed_point/include/generic/InferencerPImpl.h
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/include
RENAME GenericInferencer.h)
install(FILES dynamic_fixed_point/include/kl520/InferencerImplWrapperFactory.h
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/include
RENAME KL520WrapperFactory.h)
install(FILES dynamic_fixed_point/include/kl720/InferencerImplWrapperFactory.h
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/include
RENAME KL720WrapperFactory.h)
install(FILES dynamic_fixed_point/include/kl530/InferencerImplWrapperFactory.h
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/include
RENAME KL530WrapperFactory.h)
install(FILES dynamic_fixed_point/include/kl630/InferencerImplWrapperFactory.h
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/include
RENAME KL630WrapperFactory.h)
install(FILES dynamic_fixed_point/include/kl730/InferencerImplWrapperFactory.h
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/include
RENAME KL730WrapperFactory.h)
install(FILES dynamic_fixed_point/include/kl540/InferencerImplWrapperFactory.h
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/include
RENAME KL540WrapperFactory.h)
install(FILES ${FLOAT_DIR}/base_operators/include/Operators_imp.h
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/include
)
install(FILES ${FLOAT_DIR}/base_operators/include/C_Tensor.h
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/include
)
install(FILES ${FLOAT_DIR}/base_operators/include/DepthSpace_imp.h
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/include
)
install(FILES ${FLOAT_DIR}/base_operators/include/ElementBinaryOp_imp.h
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/include
)
install(FILES ${FLOAT_DIR}/base_operators/include/ElementUnaryOp_imp.h
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/include
)
install(FILES ${FLOAT_DIR}/base_operators/include/Gather_imp.h
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/include
)
install(FILES ${FLOAT_DIR}/base_operators/include/KneronOp_imp.h
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/include
)
install(FILES ${FLOAT_DIR}/base_operators/include/Gemm_imp.h
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/include
)
install(FILES ${FLOAT_DIR}/base_operators/include/OtherOp_imp.h
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/include
)
install(FILES ${FLOAT_DIR}/base_operators/include/Pool_imp.h
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/include
)
install(FILES ${FLOAT_DIR}/base_operators/include/Random_imp.h
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/include
)
install(FILES ${FLOAT_DIR}/base_operators/include/Reduce_imp.h
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/include
)
install(FILES ${FLOAT_DIR}/base_operators/include/Resize_imp.h
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/include
)
install(FILES ${FLOAT_DIR}/base_operators/include/RNN_imp.h
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/include
)
install(FILES ${FLOAT_DIR}/base_operators/include/Mystery_imp.h
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/include
)
install(FILES ${FLOAT_DIR}/floating_point/include/cpu/InferencerPImpl.h
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/include
RENAME CPUInferencer.h)
install(FILES ${FLOAT_DIR}/floating_point/include/msft-gpu/InferencerPImpl.h
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/include/msft-gpu/
)
install(FILES ${FLOAT_DIR}/floating_point/include/msft-gpu/MSFTInferencer.h
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/include/msft-gpu/
RENAME MSFTInferencer.h)
install(FILES ${FLOAT_DIR}/floating_point/include/msft/MSFTInferencer.h
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/include/msft/
RENAME MSFTInferencer.h)
install(FILES ${FLOAT_DIR}/KneronPlus/include/KplusInferencer.h
${FLOAT_DIR}/KneronPlus/include/KplusInferencerPImpl.h
${FLOAT_DIR}/KneronPlus/include/KplusPlatform.h
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/include)
install(FILES ../piano/common_header_lib/external/include/kplus/kp_struct.h
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/include/kplus)
install(FILES ${FLOAT_DIR}/floating_point/include/msft-gpu/InferencerPImpl.h
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/include
RENAME MSFTInferencerGPU.h)
install(FILES ${FLOAT_DIR}/floating_point/include/cpu/mystery.h
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/include
RENAME mystery.h)
install(FILES ../piano/common_header_lib/include/tensor/tensor.h
DESTINATION ${CMAKE_INSTALL_PREFIX}/release/include)
#INSTALL(CODE "execute_process( \
# COMMAND ${CMAKE_COMMAND} -E create_symlink \
# ${CMAKE_INSTALL_PREFIX}/release/lib/libinferencer_lib_${CMAKE_BUILD_TYPE}.a \
# ${CMAKE_INSTALL_PREFIX}/release/lib/libinferencer_lib.a \
# )")
cmake_print_variables(CMAKE_BUILD_TYPE PLATFORM USE_CXX11_ABI BUILD_DSP BUILD_IOS BUILD_KNEREX OPENMP_FOUND CUDA_FOUND OpenBLAS_FOUND DISABLE_KPLUS)