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:
Philip Hyunsu Cho 2019-12-26 00:53:12 -08:00 committed by Jiaming Yuan
parent f3d7877802
commit 9b0af6e882
9 changed files with 34 additions and 45 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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