# 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)