Enable OpenMP with Apple Clang (Mac default compiler) (#5146)
* Add OpenMP as CMake target * Require CMake 3.12, to allow linking OpenMP target to objxgboost * Specify OpenMP compiler flag for CUDA host compiler * Require CMake 3.16+ if the OS is Mac OSX * Use AppleClang in Mac tests. * Update dmlc-core
This commit is contained in:
parent
f3d7877802
commit
9b0af6e882
@ -21,11 +21,11 @@ env:
|
|||||||
addons:
|
addons:
|
||||||
homebrew:
|
homebrew:
|
||||||
packages:
|
packages:
|
||||||
- gcc@9
|
- cmake
|
||||||
|
- libomp
|
||||||
- graphviz
|
- graphviz
|
||||||
- openssl
|
- openssl
|
||||||
- libgit2
|
- libgit2
|
||||||
- cmake
|
|
||||||
- wget
|
- wget
|
||||||
- r
|
- r
|
||||||
update: true
|
update: true
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
cmake_minimum_required(VERSION 3.3)
|
cmake_minimum_required(VERSION 3.12)
|
||||||
project(xgboost LANGUAGES CXX C VERSION 1.0.0)
|
project(xgboost LANGUAGES CXX C VERSION 1.0.0)
|
||||||
include(cmake/Utils.cmake)
|
include(cmake/Utils.cmake)
|
||||||
list(APPEND CMAKE_MODULE_PATH "${xgboost_SOURCE_DIR}/cmake/modules")
|
list(APPEND CMAKE_MODULE_PATH "${xgboost_SOURCE_DIR}/cmake/modules")
|
||||||
@ -9,9 +9,6 @@ if ((${CMAKE_VERSION} VERSION_GREATER 3.13) OR (${CMAKE_VERSION} VERSION_EQUAL 3
|
|||||||
endif ((${CMAKE_VERSION} VERSION_GREATER 3.13) OR (${CMAKE_VERSION} VERSION_EQUAL 3.13))
|
endif ((${CMAKE_VERSION} VERSION_GREATER 3.13) OR (${CMAKE_VERSION} VERSION_EQUAL 3.13))
|
||||||
|
|
||||||
message(STATUS "CMake version ${CMAKE_VERSION}")
|
message(STATUS "CMake version ${CMAKE_VERSION}")
|
||||||
if (MSVC)
|
|
||||||
cmake_minimum_required(VERSION 3.11)
|
|
||||||
endif (MSVC)
|
|
||||||
|
|
||||||
if (CMAKE_COMPILER_IS_GNUCC AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0)
|
if (CMAKE_COMPILER_IS_GNUCC AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0)
|
||||||
message(FATAL_ERROR "GCC version must be at least 5.0!")
|
message(FATAL_ERROR "GCC version must be at least 5.0!")
|
||||||
@ -80,14 +77,11 @@ endif (USE_AVX)
|
|||||||
|
|
||||||
#-- Sanitizer
|
#-- Sanitizer
|
||||||
if (USE_SANITIZER)
|
if (USE_SANITIZER)
|
||||||
# Older CMake versions have had troubles with Sanitizer
|
|
||||||
cmake_minimum_required(VERSION 3.12)
|
|
||||||
include(cmake/Sanitizer.cmake)
|
include(cmake/Sanitizer.cmake)
|
||||||
enable_sanitizers("${ENABLED_SANITIZERS}")
|
enable_sanitizers("${ENABLED_SANITIZERS}")
|
||||||
endif (USE_SANITIZER)
|
endif (USE_SANITIZER)
|
||||||
|
|
||||||
if (USE_CUDA)
|
if (USE_CUDA)
|
||||||
cmake_minimum_required(VERSION 3.12)
|
|
||||||
SET(USE_OPENMP ON CACHE BOOL "CUDA requires OpenMP" FORCE)
|
SET(USE_OPENMP ON CACHE BOOL "CUDA requires OpenMP" FORCE)
|
||||||
# `export CXX=' is ignored by CMake CUDA.
|
# `export CXX=' is ignored by CMake CUDA.
|
||||||
set(CMAKE_CUDA_HOST_COMPILER ${CMAKE_CXX_COMPILER})
|
set(CMAKE_CUDA_HOST_COMPILER ${CMAKE_CXX_COMPILER})
|
||||||
@ -99,6 +93,15 @@ if (USE_CUDA)
|
|||||||
message(STATUS "CUDA GEN_CODE: ${GEN_CODE}")
|
message(STATUS "CUDA GEN_CODE: ${GEN_CODE}")
|
||||||
endif (USE_CUDA)
|
endif (USE_CUDA)
|
||||||
|
|
||||||
|
if (USE_OPENMP)
|
||||||
|
if (APPLE)
|
||||||
|
# Require CMake 3.16+ on Mac OSX, as previous versions of CMake had trouble locating
|
||||||
|
# OpenMP on Mac. See https://github.com/dmlc/xgboost/pull/5146#issuecomment-568312706
|
||||||
|
cmake_minimum_required(VERSION 3.16)
|
||||||
|
endif (APPLE)
|
||||||
|
find_package(OpenMP REQUIRED)
|
||||||
|
endif (USE_OPENMP)
|
||||||
|
|
||||||
# dmlc-core
|
# dmlc-core
|
||||||
msvc_use_static_runtime()
|
msvc_use_static_runtime()
|
||||||
add_subdirectory(${xgboost_SOURCE_DIR}/dmlc-core)
|
add_subdirectory(${xgboost_SOURCE_DIR}/dmlc-core)
|
||||||
@ -146,11 +149,6 @@ endif (JVM_BINDINGS)
|
|||||||
|
|
||||||
#-- CLI for xgboost
|
#-- CLI for xgboost
|
||||||
add_executable(runxgboost ${xgboost_SOURCE_DIR}/src/cli_main.cc ${XGBOOST_OBJ_SOURCES})
|
add_executable(runxgboost ${xgboost_SOURCE_DIR}/src/cli_main.cc ${XGBOOST_OBJ_SOURCES})
|
||||||
# For cli_main.cc only
|
|
||||||
if (USE_OPENMP)
|
|
||||||
find_package(OpenMP REQUIRED)
|
|
||||||
target_compile_options(runxgboost PRIVATE ${OpenMP_CXX_FLAGS})
|
|
||||||
endif (USE_OPENMP)
|
|
||||||
|
|
||||||
target_include_directories(runxgboost
|
target_include_directories(runxgboost
|
||||||
PRIVATE
|
PRIVATE
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
cmake_minimum_required(VERSION 3.3)
|
cmake_minimum_required(VERSION 3.12)
|
||||||
find_package(xgboost REQUIRED)
|
find_package(xgboost REQUIRED)
|
||||||
add_executable(api-demo c-api-demo.c)
|
add_executable(api-demo c-api-demo.c)
|
||||||
target_link_libraries(api-demo xgboost::xgboost)
|
target_link_libraries(api-demo xgboost::xgboost)
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
Subproject commit 20676bbc413a7d1f0229ec32701743cd5c205360
|
Subproject commit 61bb900ff92545cd59b613331a38aff08577f318
|
||||||
@ -29,8 +29,6 @@ if (USE_CUDA)
|
|||||||
target_compile_definitions(objxgboost PRIVATE -DXGBOOST_USE_NVTX=1)
|
target_compile_definitions(objxgboost PRIVATE -DXGBOOST_USE_NVTX=1)
|
||||||
endif (USE_NVTX)
|
endif (USE_NVTX)
|
||||||
|
|
||||||
# OpenMP is mandatory for cuda version
|
|
||||||
find_package(OpenMP REQUIRED)
|
|
||||||
target_compile_options(objxgboost PRIVATE
|
target_compile_options(objxgboost PRIVATE
|
||||||
$<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=${OpenMP_CXX_FLAGS}>
|
$<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=${OpenMP_CXX_FLAGS}>
|
||||||
)
|
)
|
||||||
@ -78,17 +76,12 @@ if (XGBOOST_BUILTIN_PREFETCH_PRESENT)
|
|||||||
-DXGBOOST_BUILTIN_PREFETCH_PRESENT=1)
|
-DXGBOOST_BUILTIN_PREFETCH_PRESENT=1)
|
||||||
endif (XGBOOST_BUILTIN_PREFETCH_PRESENT)
|
endif (XGBOOST_BUILTIN_PREFETCH_PRESENT)
|
||||||
|
|
||||||
if (USE_OPENMP)
|
if (USE_OPENMP OR USE_CUDA) # CUDA requires OpenMP
|
||||||
find_package(OpenMP REQUIRED)
|
find_package(OpenMP REQUIRED)
|
||||||
if (OpenMP_CXX_FOUND OR OPENMP_FOUND)
|
list(APPEND SRC_LIBS OpenMP::OpenMP_CXX)
|
||||||
target_compile_options(objxgboost PRIVATE $<$<COMPILE_LANGUAGE:CXX>:${OpenMP_CXX_FLAGS}>)
|
set(LINKED_LIBRARIES_PRIVATE "${LINKED_LIBRARIES_PRIVATE};${SRC_LIBS}" PARENT_SCOPE)
|
||||||
if ((NOT OpenMP_CXX_LIBRARIES) AND (NOT MSVC)) # old CMake doesn't define this variable
|
target_link_libraries(objxgboost PRIVATE OpenMP::OpenMP_CXX)
|
||||||
set(OpenMP_CXX_LIBRARIES "gomp;pthread")
|
endif (USE_OPENMP OR USE_CUDA)
|
||||||
endif ((NOT OpenMP_CXX_LIBRARIES) AND (NOT MSVC))
|
|
||||||
list(APPEND SRC_LIBS ${OpenMP_CXX_LIBRARIES})
|
|
||||||
set(LINKED_LIBRARIES_PRIVATE "${LINKED_LIBRARIES_PRIVATE};${SRC_LIBS}" PARENT_SCOPE)
|
|
||||||
endif (OpenMP_CXX_FOUND OR OPENMP_FOUND)
|
|
||||||
endif (USE_OPENMP)
|
|
||||||
|
|
||||||
# For MSVC: Call msvc_use_static_runtime() once again to completely
|
# For MSVC: Call msvc_use_static_runtime() once again to completely
|
||||||
# replace /MD with /MT. See https://github.com/dmlc/xgboost/issues/4462
|
# replace /MD with /MT. See https://github.com/dmlc/xgboost/issues/4462
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
FROM ubuntu:18.04
|
FROM ubuntu:18.04
|
||||||
ARG CMAKE_VERSION=3.3
|
ARG CMAKE_VERSION=3.12
|
||||||
|
|
||||||
# Environment
|
# Environment
|
||||||
ENV DEBIAN_FRONTEND noninteractive
|
ENV DEBIAN_FRONTEND noninteractive
|
||||||
|
|||||||
@ -55,18 +55,12 @@ set_target_properties(
|
|||||||
testxgboost PROPERTIES
|
testxgboost PROPERTIES
|
||||||
CXX_STANDARD 11
|
CXX_STANDARD 11
|
||||||
CXX_STANDARD_REQUIRED ON)
|
CXX_STANDARD_REQUIRED ON)
|
||||||
if ((NOT OpenMP_CXX_LIBRARIES) AND (NOT MSVC)) # old CMake doesn't define this variable
|
|
||||||
set(OpenMP_CXX_LIBRARIES "gomp;pthread")
|
|
||||||
endif ((NOT OpenMP_CXX_LIBRARIES) AND (NOT MSVC))
|
|
||||||
target_link_libraries(testxgboost
|
target_link_libraries(testxgboost
|
||||||
PRIVATE
|
PRIVATE
|
||||||
${GTEST_LIBRARIES}
|
${GTEST_LIBRARIES}
|
||||||
${LINKED_LIBRARIES_PRIVATE}
|
${LINKED_LIBRARIES_PRIVATE}
|
||||||
${OpenMP_CXX_LIBRARIES})
|
OpenMP::OpenMP_CXX)
|
||||||
target_compile_definitions(testxgboost PRIVATE ${XGBOOST_DEFINITIONS})
|
target_compile_definitions(testxgboost PRIVATE ${XGBOOST_DEFINITIONS})
|
||||||
if (USE_OPENMP)
|
|
||||||
target_compile_options(testxgboost PRIVATE $<$<COMPILE_LANGUAGE:CXX>:${OpenMP_CXX_FLAGS}>)
|
|
||||||
endif (USE_OPENMP)
|
|
||||||
set_output_directory(testxgboost ${xgboost_BINARY_DIR})
|
set_output_directory(testxgboost ${xgboost_BINARY_DIR})
|
||||||
|
|
||||||
# This grouping organises source files nicely in visual studio
|
# This grouping organises source files nicely in visual studio
|
||||||
|
|||||||
@ -1,14 +1,18 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
cp make/travis.mk config.mk
|
|
||||||
make -f dmlc-core/scripts/packages.mk lz4
|
make -f dmlc-core/scripts/packages.mk lz4
|
||||||
|
|
||||||
if [ ${TRAVIS_OS_NAME} == "osx" ]; then
|
source $HOME/miniconda/bin/activate
|
||||||
echo 'USE_OPENMP=0' >> config.mk
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ${TASK} == "python_test" ]; then
|
if [ ${TASK} == "python_test" ]; then
|
||||||
make all || exit -1
|
set -e
|
||||||
|
# Build/test
|
||||||
|
rm -rf build
|
||||||
|
mkdir build && cd build
|
||||||
|
cmake .. -DUSE_OPENMP=ON -DCMAKE_VERBOSE_MAKEFILE=ON
|
||||||
|
make -j$(nproc)
|
||||||
|
cd ..
|
||||||
|
|
||||||
echo "-------------------------------"
|
echo "-------------------------------"
|
||||||
conda activate python3
|
conda activate python3
|
||||||
python --version
|
python --version
|
||||||
@ -42,8 +46,8 @@ if [ ${TASK} == "cmake_test" ]; then
|
|||||||
rm -rf build
|
rm -rf build
|
||||||
mkdir build && cd build
|
mkdir build && cd build
|
||||||
PLUGINS="-DPLUGIN_LZ4=ON -DPLUGIN_DENSE_PARSER=ON"
|
PLUGINS="-DPLUGIN_LZ4=ON -DPLUGIN_DENSE_PARSER=ON"
|
||||||
CC=gcc-9 CXX=g++-9 cmake .. -DGOOGLE_TEST=ON -DUSE_OPENMP=ON -DUSE_DMLC_GTEST=ON ${PLUGINS}
|
cmake .. -DCMAKE_VERBOSE_MAKEFILE=ON -DGOOGLE_TEST=ON -DUSE_OPENMP=ON -DUSE_DMLC_GTEST=ON ${PLUGINS}
|
||||||
make
|
make -j$(nproc)
|
||||||
./testxgboost
|
./testxgboost
|
||||||
cd ..
|
cd ..
|
||||||
rm -rf build
|
rm -rf build
|
||||||
|
|||||||
@ -4,11 +4,11 @@ if [ ${TASK} == "python_test" ]; then
|
|||||||
if [ ${TRAVIS_OS_NAME} == "osx" ]; then
|
if [ ${TRAVIS_OS_NAME} == "osx" ]; then
|
||||||
wget -O conda.sh https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-x86_64.sh
|
wget -O conda.sh https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-x86_64.sh
|
||||||
else
|
else
|
||||||
echo "We are no longer running Linux test on Travis."
|
echo "We are no longer running Linux test on Travis."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
bash conda.sh -b -p $HOME/miniconda
|
bash conda.sh -b -p $HOME/miniconda
|
||||||
export PATH="$HOME/miniconda/bin:$PATH"
|
source $HOME/miniconda/bin/activate
|
||||||
hash -r
|
hash -r
|
||||||
conda config --set always_yes yes --set changeps1 no
|
conda config --set always_yes yes --set changeps1 no
|
||||||
conda update -q conda
|
conda update -q conda
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user