* [WIP] Extract prediction into separate interface * Add copyright, fix linter errors * Add predictor to amalgamation * Fix documentation * Move prediction cache into predictor, add GBTreeModel * Updated predictor doc comments
162 lines
4.4 KiB
CMake
162 lines
4.4 KiB
CMake
cmake_minimum_required (VERSION 3.2)
|
|
project(xgboost)
|
|
include(cmake/Utils.cmake)
|
|
find_package(OpenMP)
|
|
|
|
set_default_configuration_release()
|
|
msvc_use_static_runtime()
|
|
|
|
# Options
|
|
option(PLUGIN_UPDATER_GPU "Build GPU accelerated tree construction plugin")
|
|
option(JVM_BINDINGS "Build JVM bindings" OFF)
|
|
option(GOOGLE_TEST "Build google tests" OFF)
|
|
set(GPU_COMPUTE_VER 35;50;52;60;61 CACHE STRING
|
|
"Space separated list of compute versions to be built against")
|
|
|
|
|
|
# Compiler flags
|
|
set(CMAKE_CXX_STANDARD 11)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
|
|
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
|
if(MSVC)
|
|
# Multithreaded compilation
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
|
|
else()
|
|
# Correct error for GCC 5 and cuda
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_MWAITXINTRIN_H_INCLUDED -D_FORCE_INLINES")
|
|
# Performance
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -funroll-loops")
|
|
endif()
|
|
|
|
include_directories (
|
|
${PROJECT_SOURCE_DIR}/include
|
|
${PROJECT_SOURCE_DIR}/dmlc-core/include
|
|
${PROJECT_SOURCE_DIR}/rabit/include
|
|
)
|
|
|
|
file(GLOB_RECURSE SOURCES
|
|
src/*.cc
|
|
src/*.h
|
|
include/*.h
|
|
)
|
|
# Only add main function for executable target
|
|
list(REMOVE_ITEM SOURCES ${PROJECT_SOURCE_DIR}/src/cli_main.cc)
|
|
|
|
|
|
# rabit
|
|
# TODO: Create rabit cmakelists.txt
|
|
set(RABIT_SOURCES
|
|
rabit/src/allreduce_base.cc
|
|
rabit/src/allreduce_robust.cc
|
|
rabit/src/engine.cc
|
|
rabit/src/c_api.cc
|
|
)
|
|
set(RABIT_EMPTY_SOURCES
|
|
rabit/src/engine_empty.cc
|
|
rabit/src/c_api.cc
|
|
)
|
|
if(MINGW)
|
|
# build a dummy rabit library
|
|
add_library(rabit STATIC ${RABIT_EMPTY_SOURCES})
|
|
else()
|
|
add_library(rabit STATIC ${RABIT_SOURCES})
|
|
endif()
|
|
|
|
|
|
# dmlc-core
|
|
add_subdirectory(dmlc-core)
|
|
set(LINK_LIBRARIES dmlccore rabit)
|
|
|
|
|
|
# GPU Plugin
|
|
file(GLOB_RECURSE CUDA_SOURCES
|
|
plugin/updater_gpu/src/*.cu
|
|
plugin/updater_gpu/src/*.cuh
|
|
)
|
|
if(PLUGIN_UPDATER_GPU)
|
|
find_package(CUDA 7.5 REQUIRED)
|
|
cmake_minimum_required(VERSION 3.5)
|
|
|
|
include_directories(
|
|
nccl/src
|
|
cub
|
|
)
|
|
|
|
set(GENCODE_FLAGS "")
|
|
format_gencode_flags("${GPU_COMPUTE_VER}" GENCODE_FLAGS)
|
|
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS};--expt-extended-lambda;${GENCODE_FLAGS};-lineinfo;")
|
|
if(NOT MSVC)
|
|
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS};-Xcompiler -fPIC; -std=c++11")
|
|
endif()
|
|
|
|
add_subdirectory(nccl)
|
|
cuda_add_library(gpuxgboost ${CUDA_SOURCES} STATIC)
|
|
target_link_libraries(gpuxgboost nccl)
|
|
list(APPEND LINK_LIBRARIES gpuxgboost)
|
|
list(APPEND SOURCES plugin/updater_gpu/src/register_updater_gpu.cc)
|
|
endif()
|
|
|
|
add_library(objxgboost OBJECT ${SOURCES})
|
|
|
|
# Executable
|
|
add_executable(runxgboost $<TARGET_OBJECTS:objxgboost> src/cli_main.cc)
|
|
set_target_properties(runxgboost PROPERTIES
|
|
OUTPUT_NAME xgboost
|
|
)
|
|
set_output_directory(runxgboost ${PROJECT_SOURCE_DIR})
|
|
target_link_libraries(runxgboost ${LINK_LIBRARIES})
|
|
|
|
# Shared library
|
|
add_library(xgboost SHARED $<TARGET_OBJECTS:objxgboost>)
|
|
target_link_libraries(xgboost ${LINK_LIBRARIES})
|
|
set_output_directory(xgboost ${PROJECT_SOURCE_DIR}/lib)
|
|
if(MINGW)
|
|
# remove the 'lib' prefix to conform to windows convention for shared library names
|
|
set_target_properties(xgboost PROPERTIES PREFIX "")
|
|
endif()
|
|
|
|
#Ensure these two targets do not build simultaneously, as they produce outputs with conflicting names
|
|
add_dependencies(xgboost runxgboost)
|
|
|
|
# JVM
|
|
if(JVM_BINDINGS)
|
|
find_package(JNI QUIET REQUIRED)
|
|
|
|
include_directories(${JNI_INCLUDE_DIRS} jvm-packages/xgboost4j/src/native)
|
|
|
|
add_library(xgboost4j SHARED
|
|
$<TARGET_OBJECTS:objxgboost>
|
|
jvm-packages/xgboost4j/src/native/xgboost4j.cpp)
|
|
set_output_directory(xgboost4j ${PROJECT_SOURCE_DIR}/lib)
|
|
target_link_libraries(xgboost4j
|
|
${LINK_LIBRARIES}
|
|
${JAVA_JVM_LIBRARY})
|
|
endif()
|
|
|
|
# Test
|
|
if(GOOGLE_TEST)
|
|
enable_testing()
|
|
find_package(GTest REQUIRED)
|
|
|
|
file(GLOB_RECURSE TEST_SOURCES "tests/cpp/*.cc")
|
|
auto_source_group("${TEST_SOURCES}")
|
|
include_directories(${GTEST_INCLUDE_DIRS})
|
|
|
|
if(PLUGIN_UPDATER_GPU)
|
|
file(GLOB_RECURSE CUDA_TEST_SOURCES "plugin/updater_gpu/test/cpp/*.cu")
|
|
cuda_compile(CUDA_TEST_OBJS ${CUDA_TEST_SOURCES})
|
|
else()
|
|
set(CUDA_TEST_OBJS "")
|
|
endif()
|
|
|
|
add_executable(testxgboost ${TEST_SOURCES} ${CUDA_TEST_OBJS} $<TARGET_OBJECTS:objxgboost>)
|
|
set_output_directory(testxgboost ${PROJECT_SOURCE_DIR})
|
|
target_link_libraries(testxgboost ${GTEST_BOTH_LIBRARIES} ${LINK_LIBRARIES})
|
|
|
|
add_test(TestXGBoost testxgboost)
|
|
endif()
|
|
|
|
# Group sources
|
|
auto_source_group("${SOURCES}")
|