Files
lammps/lib/kokkos/cmake/kokkos.cmake
2017-07-31 10:34:21 -06:00

1203 lines
44 KiB
CMake

# Set which Kokkos backend to use.
set(KOKKOS_ENABLE_CUDA OFF CACHE BOOL "Use Kokkos CUDA backend")
set(KOKKOS_ENABLE_OPENMP ON CACHE BOOL "Use Kokkos OpenMP backend")
set(KOKKOS_ENABLE_PTHREAD OFF CACHE BOOL "Use Kokkos Pthreads backend")
set(KOKKOS_ENABLE_QTHREADS OFF CACHE BOOL "Use Kokkos Qthreads backend")
set(KOKKOS_ENABLE_SERIAL ON CACHE BOOL "Use Kokkos Serial backend")
# List of possible host architectures.
list(APPEND KOKKOS_HOST_ARCH_LIST
None # No architecture optimization
AMDAVX # AMD chip
ARMv80 # ARMv8.0 Compatible CPU
ARMv81 # ARMv8.1 Compatible CPU
ARMv8-ThunderX # ARMv8 Cavium ThunderX CPU
SNB # Intel Sandy/Ivy Bridge CPUs
HSW # Intel Haswell CPUs
BDW # Intel Broadwell Xeon E-class CPUs
SKX # Intel Sky Lake Xeon E-class HPC CPUs (AVX512)
KNC # Intel Knights Corner Xeon Phi
KNL # Intel Knights Landing Xeon Phi
BGQ # IBM Blue Gene Q
Power7 # IBM POWER7 CPUs
Power8 # IBM POWER8 CPUs
Power9 # IBM POWER9 CPUs
)
# Setting this variable to a value other than "None" can improve host
# performance by turning on architecture specific code.
set(KOKKOS_HOST_ARCH "None" CACHE STRING "Optimize for specific host architecture.")
set_property(CACHE KOKKOS_HOST_ARCH PROPERTY STRINGS ${KOKKOS_HOST_ARCH_LIST})
# List of possible GPU architectures.
list(APPEND KOKKOS_GPU_ARCH_LIST
None # No architecture optimization
Kepler # NVIDIA Kepler default (generation CC 3.5)
Kepler30 # NVIDIA Kepler generation CC 3.0
Kepler32 # NVIDIA Kepler generation CC 3.2
Kepler35 # NVIDIA Kepler generation CC 3.5
Kepler37 # NVIDIA Kepler generation CC 3.7
Maxwell # NVIDIA Maxwell default (generation CC 5.0)
Maxwell50 # NVIDIA Maxwell generation CC 5.0
Maxwell52 # NVIDIA Maxwell generation CC 5.2
Maxwell53 # NVIDIA Maxwell generation CC 5.3
Pascal60 # NVIDIA Pascal generation CC 6.0
Pascal61 # NVIDIA Pascal generation CC 6.1
)
# Setting this variable to a value other than "None" can improve GPU
# performance by turning on architecture specific code.
set(KOKKOS_GPU_ARCH "None" CACHE STRING "Optimize for specific GPU architecture.")
set_property(CACHE KOKKOS_GPU_ARCH PROPERTY STRINGS ${KOKKOS_GPU_ARCH_LIST})
set(KOKKOS_SEPARATE_LIBS OFF CACHE BOOL "OFF = kokkos. ON = kokkoscore, kokkoscontainers, and kokkosalgorithms.")
# Enable hwloc library.
set(KOKKOS_ENABLE_HWLOC OFF CACHE BOOL "Enable hwloc for better process placement.")
set(KOKKOS_HWLOC_DIR "" CACHE PATH "Location of hwloc library.")
# Enable memkind library.
set(KOKKOS_ENABLE_MEMKIND OFF CACHE BOOL "Enable memkind.")
set(KOKKOS_MEMKIND_DIR "" CACHE PATH "Location of memkind library.")
set(KOKKOS_ENABLE_LIBRT OFF CACHE BOOL "Enable librt for more precise timer.")
# Enable debugging.
set(KOKKOS_DEBUG OFF CACHE BOOL "Enable debugging in Kokkos.")
# Enable profiling.
set(KOKKOS_ENABLE_PROFILING ON CACHE BOOL "Enable profiling.")
# Enable aggressive vectorization.
set(KOKKOS_ENABLE_AGGRESSIVE_VECTORIZATION OFF CACHE BOOL "Enable aggressive vectorization.")
# Qthreads options.
set(KOKKOS_QTHREADS_DIR "" CACHE PATH "Location of Qthreads library.")
# CUDA options.
set(KOKKOS_CUDA_DIR "" CACHE PATH "Location of CUDA library. Defaults to where nvcc installed.")
set(KOKKOS_ENABLE_CUDA_LDG_INTRINSIC OFF CACHE BOOL "Enable CUDA LDG.")
set(KOKKOS_ENABLE_CUDA_UVM OFF CACHE BOOL "Enable CUDA unified virtual memory.")
set(KOKKOS_ENABLE_CUDA_RELOCATABLE_DEVICE_CODE OFF CACHE BOOL "Enable relocatable device code for CUDA.")
set(KOKKOS_ENABLE_CUDA_LAMBDA ON CACHE BOOL "Enable lambdas for CUDA.")
################################### FUNCTIONS ##################################
# Sets the following compiler variables that are analogous to the CMAKE_*
# versions. We add the ability to detect NVCC (really nvcc_wrapper).
# KOKKOS_CXX_COMPILER
# KOKKOS_CXX_COMPILER_ID
# KOKKOS_CXX_COMPILER_VERSION
#
# Also verifies the compiler version meets the minimum required by Kokkos.
function(set_kokkos_cxx_compiler)
# Since CMake doesn't recognize the nvcc compiler until 3.8, we use our own
# version of the CMake variables and detect nvcc ourselves. Initially set to
# the CMake variable values.
set(INTERNAL_CXX_COMPILER ${CMAKE_CXX_COMPILER})
set(INTERNAL_CXX_COMPILER_ID ${CMAKE_CXX_COMPILER_ID})
set(INTERNAL_CXX_COMPILER_VERSION ${CMAKE_CXX_COMPILER_VERSION})
# Check if the compiler is nvcc (which really means nvcc_wrapper).
execute_process(COMMAND ${INTERNAL_CXX_COMPILER} --version
COMMAND grep nvcc
COMMAND wc -l
OUTPUT_VARIABLE INTERNAL_HAVE_COMPILER_NVCC
OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REGEX REPLACE "^ +" ""
INTERNAL_HAVE_COMPILER_NVCC ${INTERNAL_HAVE_COMPILER_NVCC})
if(INTERNAL_HAVE_COMPILER_NVCC)
# Set the compiler id to nvcc. We use the value used by CMake 3.8.
set(INTERNAL_CXX_COMPILER_ID NVIDIA)
# Set nvcc's compiler version.
execute_process(COMMAND ${INTERNAL_CXX_COMPILER} --version
COMMAND grep release
OUTPUT_VARIABLE INTERNAL_CXX_COMPILER_VERSION
OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REGEX MATCH "[0-9]+\.[0-9]+\.[0-9]+$"
INTERNAL_CXX_COMPILER_VERSION ${INTERNAL_CXX_COMPILER_VERSION})
endif()
# Enforce the minimum compilers supported by Kokkos.
set(KOKKOS_MESSAGE_TEXT "Compiler not supported by Kokkos. Required compiler versions:")
set(KOKKOS_MESSAGE_TEXT "${KOKKOS_MESSAGE_TEXT}\n Clang 3.5.2 or higher")
set(KOKKOS_MESSAGE_TEXT "${KOKKOS_MESSAGE_TEXT}\n GCC 4.7.2 or higher")
set(KOKKOS_MESSAGE_TEXT "${KOKKOS_MESSAGE_TEXT}\n Intel 14.0.4 or higher")
set(KOKKOS_MESSAGE_TEXT "${KOKKOS_MESSAGE_TEXT}\n NVCC 7.0.28 or higher")
set(KOKKOS_MESSAGE_TEXT "${KOKKOS_MESSAGE_TEXT}\n PGI 17.1 or higher\n")
if(INTERNAL_CXX_COMPILER_ID STREQUAL Clang)
if(INTERNAL_CXX_COMPILER_VERSION VERSION_LESS 3.5.2)
message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}")
endif()
elseif(INTERNAL_CXX_COMPILER_ID STREQUAL GNU)
if(INTERNAL_CXX_COMPILER_VERSION VERSION_LESS 4.7.2)
message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}")
endif()
elseif(INTERNAL_CXX_COMPILER_ID STREQUAL Intel)
if(INTERNAL_CXX_COMPILER_VERSION VERSION_LESS 14.0.4)
message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}")
endif()
elseif(INTERNAL_CXX_COMPILER_ID STREQUAL NVIDIA)
if(INTERNAL_CXX_COMPILER_VERSION VERSION_LESS 7.0.28)
message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}")
endif()
elseif(INTERNAL_CXX_COMPILER_ID STREQUAL PGI)
if(INTERNAL_CXX_COMPILER_VERSION VERSION_LESS 17.1)
message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}")
endif()
endif()
# Enforce that extensions are turned off for nvcc_wrapper.
if(INTERNAL_CXX_COMPILER_ID STREQUAL NVIDIA)
if(NOT DEFINED CMAKE_CXX_EXTENSIONS OR CMAKE_CXX_EXTENSIONS STREQUAL ON)
message(FATAL_ERROR "NVCC doesn't support C++ extensions. Set CMAKE_CXX_EXTENSIONS to OFF in your CMakeLists.txt.")
endif()
endif()
if(KOKKOS_ENABLE_CUDA)
# Enforce that the compiler can compile CUDA code.
if(INTERNAL_CXX_COMPILER_ID STREQUAL Clang)
if(INTERNAL_CXX_COMPILER_VERSION VERSION_LESS 4.0.0)
message(FATAL_ERROR "Compiling CUDA code directly with Clang requires version 4.0.0 or higher.")
endif()
elseif(NOT INTERNAL_CXX_COMPILER_ID STREQUAL NVIDIA)
message(FATAL_ERROR "Invalid compiler for CUDA. The compiler must be nvcc_wrapper or Clang.")
endif()
endif()
set(KOKKOS_CXX_COMPILER ${INTERNAL_CXX_COMPILER} PARENT_SCOPE)
set(KOKKOS_CXX_COMPILER_ID ${INTERNAL_CXX_COMPILER_ID} PARENT_SCOPE)
set(KOKKOS_CXX_COMPILER_VERSION ${INTERNAL_CXX_COMPILER_VERSION} PARENT_SCOPE)
endfunction()
# Transitively enforces that the appropriate CXX standard compile flags (C++11
# or above) are added to targets that use the Kokkos library. Compile features
# are used if possible. Otherwise, the appropriate flags are added to
# KOKKOS_CXX_FLAGS. Values set by the user to CMAKE_CXX_STANDARD and
# CMAKE_CXX_EXTENSIONS are honored.
function(set_kokkos_compiler_standard)
# The following table lists the versions of CMake that supports CXX_STANDARD
# and the CXX compile features for different compilers. The versions are
# based on CMake documentation, looking at CMake code, and verifying by
# testing with specific CMake versions.
#
# COMPILER CXX_STANDARD Compile Features
# ---------------------------------------------------------------
# Clang 3.1 3.1
# GNU 3.1 3.2
# AppleClang 3.2 3.2
# Intel 3.6 3.6
# Cray No No
# PGI No No
# XL No No
#
# For compiling CUDA code using nvcc_wrapper, we will use the host compiler's
# flags for turning on C++11. Since for compiler ID and versioning purposes
# CMake recognizes the host compiler when calling nvcc_wrapper, this just
# works. Both NVCC and nvcc_wrapper only recognize '-std=c++11' which means
# that we can only use host compilers for CUDA builds that use those flags.
# It also means that extensions (gnu++11) can't be turned on for CUDA builds.
# Check if we can use compile features.
if(NOT KOKKOS_CXX_COMPILER_ID STREQUAL NVIDIA)
if(CMAKE_CXX_COMPILER_ID STREQUAL Clang)
if(NOT CMAKE_VERSION VERSION_LESS 3.1)
set(INTERNAL_USE_COMPILE_FEATURES ON)
endif()
elseif(CMAKE_CXX_COMPILER_ID STREQUAL AppleClang OR CMAKE_CXX_COMPILER_ID STREQUAL GNU)
if(NOT CMAKE_VERSION VERSION_LESS 3.2)
set(INTERNAL_USE_COMPILE_FEATURES ON)
endif()
elseif(CMAKE_CXX_COMPILER_ID STREQUAL Intel)
if(NOT CMAKE_VERSION VERSION_LESS 3.6)
set(INTERNAL_USE_COMPILE_FEATURES ON)
endif()
endif()
endif()
if(INTERNAL_USE_COMPILE_FEATURES)
# Use the compile features aspect of CMake to transitively cause C++ flags
# to populate to user code.
# I'm using a hack by requiring features that I know force the lowest version
# of the compilers we want to support. Clang 3.3 and later support all of
# the C++11 standard. With CMake 3.8 and higher, we could switch to using
# cxx_std_11.
set(KOKKOS_CXX11_FEATURES
cxx_nonstatic_member_init # Forces GCC 4.7 or later and Intel 14.0 or later.
PARENT_SCOPE
)
else()
# CXX compile features are not yet implemented for this combination of
# compiler and version of CMake.
if(CMAKE_CXX_COMPILER_ID STREQUAL AppleClang)
# Versions of CMAKE before 3.2 don't support CXX_STANDARD or C++ compile
# features for the AppleClang compiler. Set compiler flags transitively
# here such that they trickle down to a call to target_compile_options().
# The following two blocks of code were copied from
# /Modules/Compiler/AppleClang-CXX.cmake from CMake 3.7.2 and then
# modified.
if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.0)
set(INTERNAL_CXX11_STANDARD_COMPILE_OPTION "-std=c++11")
set(INTERNAL_CXX11_EXTENSION_COMPILE_OPTION "-std=gnu++11")
endif()
if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 6.1)
set(INTERNAL_CXX14_STANDARD_COMPILE_OPTION "-std=c++14")
set(INTERNAL_CXX14_EXTENSION_COMPILE_OPTION "-std=gnu++14")
elseif(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.1)
# AppleClang 5.0 knows this flag, but does not set a __cplusplus macro
# greater than 201103L.
set(INTERNAL_CXX14_STANDARD_COMPILE_OPTION "-std=c++1y")
set(INTERNAL_CXX14_EXTENSION_COMPILE_OPTION "-std=gnu++1y")
endif()
elseif(CMAKE_CXX_COMPILER_ID STREQUAL Intel)
# Versions of CMAKE before 3.6 don't support CXX_STANDARD or C++ compile
# features for the Intel compiler. Set compiler flags transitively here
# such that they trickle down to a call to target_compile_options().
# The following three blocks of code were copied from
# /Modules/Compiler/Intel-CXX.cmake from CMake 3.7.2 and then modified.
if("x${CMAKE_CXX_SIMULATE_ID}" STREQUAL "xMSVC")
set(_std -Qstd)
set(_ext c++)
else()
set(_std -std)
set(_ext gnu++)
endif()
if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 15.0.2)
set(INTERNAL_CXX14_STANDARD_COMPILE_OPTION "${_std}=c++14")
# TODO: There is no gnu++14 value supported; figure out what to do.
set(INTERNAL_CXX14_EXTENSION_COMPILE_OPTION "${_std}=c++14")
elseif(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 15.0.0)
set(INTERNAL_CXX14_STANDARD_COMPILE_OPTION "${_std}=c++1y")
# TODO: There is no gnu++14 value supported; figure out what to do.
set(INTERNAL_CXX14_EXTENSION_COMPILE_OPTION "${_std}=c++1y")
endif()
if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 13.0)
set(INTERNAL_CXX11_STANDARD_COMPILE_OPTION "${_std}=c++11")
set(INTERNAL_CXX11_EXTENSION_COMPILE_OPTION "${_std}=${_ext}11")
elseif(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 12.1)
set(INTERNAL_CXX11_STANDARD_COMPILE_OPTION "${_std}=c++0x")
set(INTERNAL_CXX11_EXTENSION_COMPILE_OPTION "${_std}=${_ext}0x")
endif()
elseif(CMAKE_CXX_COMPILER_ID STREQUAL Cray)
# CMAKE doesn't support CXX_STANDARD or C++ compile features for the Cray
# compiler. Set compiler options transitively here such that they trickle
# down to a call to target_compile_options().
set(INTERNAL_CXX11_STANDARD_COMPILE_OPTION "-hstd=c++11")
set(INTERNAL_CXX11_EXTENSION_COMPILE_OPTION "-hstd=c++11")
set(INTERNAL_CXX14_STANDARD_COMPILE_OPTION "-hstd=c++11")
set(INTERNAL_CXX14_EXTENSION_COMPILE_OPTION "-hstd=c++11")
elseif(CMAKE_CXX_COMPILER_ID STREQUAL PGI)
# CMAKE doesn't support CXX_STANDARD or C++ compile features for the PGI
# compiler. Set compiler options transitively here such that they trickle
# down to a call to target_compile_options().
set(INTERNAL_CXX11_STANDARD_COMPILE_OPTION "--c++11")
set(INTERNAL_CXX11_EXTENSION_COMPILE_OPTION "--c++11")
set(INTERNAL_CXX14_STANDARD_COMPILE_OPTION "--c++11")
set(INTERNAL_CXX14_EXTENSION_COMPILE_OPTION "--c++11")
elseif(CMAKE_CXX_COMPILER_ID STREQUAL XL)
# CMAKE doesn't support CXX_STANDARD or C++ compile features for the XL
# compiler. Set compiler options transitively here such that they trickle
# down to a call to target_compile_options().
set(INTERNAL_CXX11_STANDARD_COMPILE_OPTION "-std=c++11")
set(INTERNAL_CXX11_EXTENSION_COMPILE_OPTION "-std=c++11")
set(INTERNAL_CXX14_STANDARD_COMPILE_OPTION "-std=c++11")
set(INTERNAL_CXX14_EXTENSION_COMPILE_OPTION "-std=c++11")
else()
# Assume GNU. CMAKE_CXX_STANDARD is handled correctly by CMake 3.1 and
# above for this compiler. If the user explicitly requests a C++
# standard, CMake takes care of it. If not, transitively require C++11.
if(NOT CMAKE_CXX_STANDARD)
set(INTERNAL_CXX11_STANDARD_COMPILE_OPTION ${CMAKE_CXX11_STANDARD_COMPILE_OPTION})
set(INTERNAL_CXX11_EXTENSION_COMPILE_OPTION ${CMAKE_CXX11_EXTENSION_COMPILE_OPTION})
endif()
endif()
# Set the C++ standard info for Kokkos respecting user set values for
# CMAKE_CXX_STANDARD and CMAKE_CXX_EXTENSIONS.
if(CMAKE_CXX_STANDARD EQUAL 14)
if(DEFINED CMAKE_CXX_EXTENSIONS AND CMAKE_CXX_EXTENSIONS STREQUAL OFF)
set(INTERNAL_CXX_FLAGS ${INTERNAL_CXX14_STANDARD_COMPILE_OPTION})
else()
set(INTERNAL_CXX_FLAGS ${INTERNAL_CXX14_EXTENSION_COMPILE_OPTION})
endif()
elseif(CMAKE_CXX_STANDARD EQUAL 11)
if(DEFINED CMAKE_CXX_EXTENSIONS AND CMAKE_CXX_EXTENSIONS STREQUAL OFF)
set(INTERNAL_CXX_FLAGS ${INTERNAL_CXX11_STANDARD_COMPILE_OPTION})
else()
set(INTERNAL_CXX_FLAGS ${INTERNAL_CXX11_EXTENSION_COMPILE_OPTION})
endif()
else()
# The user didn't explicitly request a standard, transitively require
# C++11 respecting CMAKE_CXX_EXTENSIONS.
if(DEFINED CMAKE_CXX_EXTENSIONS AND CMAKE_CXX_EXTENSIONS STREQUAL OFF)
set(INTERNAL_CXX_FLAGS ${INTERNAL_CXX11_STANDARD_COMPILE_OPTION})
else()
set(INTERNAL_CXX_FLAGS ${INTERNAL_CXX11_EXTENSION_COMPILE_OPTION})
endif()
endif()
set(KOKKOS_CXX_FLAGS ${INTERNAL_CXX_FLAGS} PARENT_SCOPE)
endif()
endfunction()
########################## COMPILER AND FEATURE CHECKS #########################
# TODO: We are assuming that nvcc_wrapper is using g++ as the host compiler.
# Should we allow the user the option to change this? The host compiler
# for nvcc_wrapper can be set via the NVCC_WRAPPER_DEFAULT_COMPILER
# environment variable or by passing a different host compiler with the
# -ccbin flag.
# TODO: Fully add CUDA support for Clang.
set_kokkos_cxx_compiler()
set_kokkos_compiler_standard()
######################### INITIALIZE INTERNAL VARIABLES ########################
# Add Kokkos' modules to CMake's module path.
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${Kokkos_SOURCE_DIR}/cmake/Modules/")
# Start with all global variables set to false. This guarantees correct
# results with changes and multiple configures.
set(KOKKOS_HAVE_CUDA OFF CACHE INTERNAL "")
set(KOKKOS_USE_CUDA_UVM OFF CACHE INTERNAL "")
set(KOKKOS_HAVE_CUDA_RDC OFF CACHE INTERNAL "")
set(KOKKOS_HAVE_CUDA_LAMBDA OFF CACHE INTERNAL "")
set(KOKKOS_CUDA_CLANG_WORKAROUND OFF CACHE INTERNAL "")
set(KOKKOS_HAVE_OPENMP OFF CACHE INTERNAL "")
set(KOKKOS_HAVE_PTHREAD OFF CACHE INTERNAL "")
set(KOKKOS_HAVE_QTHREADS OFF CACHE INTERNAL "")
set(KOKKOS_HAVE_SERIAL OFF CACHE INTERNAL "")
set(KOKKOS_HAVE_HWLOC OFF CACHE INTERNAL "")
set(KOKKOS_ENABLE_HBWSPACE OFF CACHE INTERNAL "")
set(KOKKOS_HAVE_DEBUG OFF CACHE INTERNAL "")
set(KOKKOS_ENABLE_DEBUG_BOUNDS_CHECK OFF CACHE INTERNAL "")
set(KOKKOS_ENABLE_ISA_X86_64 OFF CACHE INTERNAL "")
set(KOKKOS_ENABLE_ISA_KNC OFF CACHE INTERNAL "")
set(KOKKOS_ENABLE_ISA_POWERPCLE OFF CACHE INTERNAL "")
set(KOKKOS_ARCH_ARMV80 OFF CACHE INTERNAL "")
set(KOKKOS_ARCH_ARMV81 OFF CACHE INTERNAL "")
set(KOKKOS_ARCH_ARMV8_THUNDERX OFF CACHE INTERNAL "")
set(KOKKOS_ARCH_AVX OFF CACHE INTERNAL "")
set(KOKKOS_ARCH_AVX2 OFF CACHE INTERNAL "")
set(KOKKOS_ARCH_AVX512MIC OFF CACHE INTERNAL "")
set(KOKKOS_ARCH_AVX512XEON OFF CACHE INTERNAL "")
set(KOKKOS_ARCH_KNC OFF CACHE INTERNAL "")
set(KOKKOS_ARCH_POWER8 OFF CACHE INTERNAL "")
set(KOKKOS_ARCH_POWER9 OFF CACHE INTERNAL "")
set(KOKKOS_ARCH_KEPLER OFF CACHE INTERNAL "")
set(KOKKOS_ARCH_KEPLER30 OFF CACHE INTERNAL "")
set(KOKKOS_ARCH_KEPLER32 OFF CACHE INTERNAL "")
set(KOKKOS_ARCH_KEPLER35 OFF CACHE INTERNAL "")
set(KOKKOS_ARCH_KEPLER37 OFF CACHE INTERNAL "")
set(KOKKOS_ARCH_MAXWELL OFF CACHE INTERNAL "")
set(KOKKOS_ARCH_MAXWELL50 OFF CACHE INTERNAL "")
set(KOKKOS_ARCH_MAXWELL52 OFF CACHE INTERNAL "")
set(KOKKOS_ARCH_MAXWELL53 OFF CACHE INTERNAL "")
set(KOKKOS_ARCH_PASCAL OFF CACHE INTERNAL "")
set(KOKKOS_ARCH_PASCAL60 OFF CACHE INTERNAL "")
set(KOKKOS_ARCH_PASCAL61 OFF CACHE INTERNAL "")
############################## SET BACKEND OPTIONS #############################
# Make sure at least one backend is selected.
if(NOT KOKKOS_ENABLE_CUDA AND NOT KOKKOS_ENABLE_OPENMP AND NOT KOKKOS_ENABLE_PTHREAD AND NOT KOKKOS_ENABLE_QTHREADS AND NOT KOKKOS_ENABLE_SERIAL)
message(FATAL_ERROR "Must set one of KOKKOS_ENABLE_CUDA, KOKKOS_ENABLE_OPENMP, KOKKOS_ENABLE_PTHREAD, KOKKOS_ENABLE_QTHREADS, or KOKKOS_ENABLE_SERIAL")
endif()
# Only one of OpenMP, Pthreads, and Qthreads can be set.
set(KOKKOS_MESSAGE_TEXT "Only one of KOKKOS_ENABLE_OPENMP, KOKKOS_ENABLE_PTHREAD, and KOKKOS_ENABLE_QTHREADS can be selected")
if(KOKKOS_ENABLE_OPENMP AND KOKKOS_ENABLE_PTHREAD)
message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}")
elseif(KOKKOS_ENABLE_OPENMP AND KOKKOS_ENABLE_QTHREADS)
message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}")
elseif(KOKKOS_ENABLE_PTHREAD AND KOKKOS_ENABLE_QTHREADS)
message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}")
endif()
# Get source files.
file(GLOB KOKKOS_CORE_SRCS core/src/impl/*.cpp)
file(GLOB KOKKOS_CONTAINERS_SRCS containers/src/impl/*.cpp)
# Set options if using CUDA backend.
if(KOKKOS_ENABLE_CUDA)
if(KOKKOS_CUDA_DIR)
set(CUDA_TOOLKIT_ROOT_DIR ${KOKKOS_CUDA_DIR})
endif()
find_package(CUDA)
if(NOT CUDA_FOUND)
if(KOKKOS_CUDA_DIR)
message(FATAL_ERROR "Couldn't find CUDA in default locations, and KOKKOS_CUDA_DIR points to an invalid installation.")
else()
message(FATAL_ERROR "Couldn't find CUDA in default locations. Set KOKKOS_CUDA_DIR.")
endif()
endif()
list(APPEND KOKKOS_INCLUDE_DIRS ${CUDA_INCLUDE_DIRS})
list(APPEND KOKKOS_LD_FLAGS -L${CUDA_TOOLKIT_ROOT_DIR}/lib64)
list(APPEND KOKKOS_LIBS cudart cuda)
set(KOKKOS_HAVE_CUDA ON CACHE INTERNAL "")
file(GLOB KOKKOS_CUDA_SRCS core/src/Cuda/*.cpp)
list(APPEND KOKKOS_CORE_SRCS ${KOKKOS_CUDA_SRCS})
# Set CUDA UVM if requested.
if(KOKKOS_ENABLE_CUDA_UVM)
set(KOKKOS_USE_CUDA_UVM ON CACHE INTERNAL "")
endif()
# Set CUDA relocatable device code if requested.
if(KOKKOS_ENABLE_CUDA_RELOCATABLE_DEVICE_CODE)
set(KOKKOS_HAVE_CUDA_RDC ON CACHE INTERNAL "")
list(APPEND KOKKOS_CXX_FLAGS --relocatable-device-code=true)
list(APPEND KOKKOS_LD_FLAGS --relocatable-device-code=true)
endif()
# Set CUDA lambda if requested.
if(KOKKOS_ENABLE_CUDA_LAMBDA)
set(KOKKOS_HAVE_CUDA_LAMBDA ON CACHE INTERNAL "")
if(KOKKOS_CXX_COMPILER_ID STREQUAL NVIDIA)
if(KOKKOS_CXX_COMPILER_VERSION VERSION_LESS 7.5)
message(FATAL_ERROR "CUDA lambda support requires CUDA 7.5 or higher. Disable it or use a 7.5 or later compiler.")
else()
list(APPEND KOKKOS_CXX_FLAGS -expt-extended-lambda)
endif()
endif()
endif()
# Set Clang specific options.
if(KOKKOS_CXX_COMPILER_ID STREQUAL Clang)
list(APPEND KOKKOS_CXX_FLAGS --cuda-path=${CUDA_TOOLKIT_ROOT_DIR})
set(KOKKOS_CUDA_CLANG_WORKAROUND ON CACHE INTERNAL "")
# Force CUDA_LDG_INTRINSIC on when using Clang.
set(KOKKOS_ENABLE_CUDA_LDG_INTRINSIC ON CACHE BOOL "Enable CUDA LDG." FORCE)
endif()
endif()
# Set options if using OpenMP backend.
if(KOKKOS_ENABLE_OPENMP)
find_package(OpenMP REQUIRED)
if(OPENMP_FOUND)
if(KOKKOS_CXX_COMPILER_ID STREQUAL NVIDIA)
list(APPEND KOKKOS_CXX_FLAGS -Xcompiler)
endif()
list(APPEND KOKKOS_CXX_FLAGS ${OpenMP_CXX_FLAGS})
list(APPEND KOKKOS_LD_FLAGS ${OpenMP_CXX_FLAGS})
endif()
set(KOKKOS_HAVE_OPENMP ON CACHE INTERNAL "")
file(GLOB KOKKOS_OPENMP_SRCS core/src/OpenMP/*.cpp)
list(APPEND KOKKOS_CORE_SRCS ${KOKKOS_OPENMP_SRCS})
endif()
# Set options if using Pthreads backend.
if(KOKKOS_ENABLE_PTHREAD)
find_package(Threads REQUIRED)
list(APPEND KOKKOS_LIBS Threads::Threads)
set(KOKKOS_HAVE_PTHREAD ON CACHE INTERNAL "")
file(GLOB KOKKOS_PTHREAD_SRCS core/src/Threads/*.cpp)
list(APPEND KOKKOS_CORE_SRCS ${KOKKOS_PTHREAD_SRCS})
endif()
# Set options if using Qthreads backend.
if(KOKKOS_ENABLE_QTHREADS)
if(KOKKOS_QTHREADS_DIR)
list(APPEND CMAKE_PREFIX_PATH ${KOKKOS_QTHREADS_DIR})
endif()
find_package(Qthreads)
if(NOT QTHREADS_FOUND)
if(KOKKOS_QTHREADS_DIR)
message(FATAL_ERROR "Couldn't find Qthreads in default locations, and KOKKOS_QTHREADS_DIR points to an invalid installation.")
else()
message(FATAL_ERROR "Couldn't find Qthreads in default locations. Set KOKKOS_QTHREADS_DIR.")
endif()
endif()
list(APPEND KOKKOS_INCLUDE_DIRS ${QTHREADS_INCLUDE_DIR})
list(APPEND KOKKOS_LIBS ${QTHREADS_LIBRARIES})
set(KOKKOS_HAVE_QTHREADS ON CACHE INTERNAL "")
file(GLOB KOKKOS_QTHREADS_SRCS core/src/Threads/*.cpp)
list(APPEND KOKKOS_CORE_SRCS ${KOKKOS_QTHREADS_SRCS})
if(KOKKOS_QTHREADS_DIR)
list(REMOVE_AT CMAKE_PREFIX_PATH -1)
endif()
endif()
# Set options if using Serial backend.
if(KOKKOS_ENABLE_SERIAL)
set(KOKKOS_HAVE_SERIAL ON CACHE INTERNAL "")
else()
# Remove serial source files.
list(REMOVE_ITEM KOKKOS_CORE_SRCS
"${Kokkos_SOURCE_DIR}/core/src/impl/Kokkos_Serial.cpp"
"${Kokkos_SOURCE_DIR}/core/src/impl/Kokkos_Serial_Task.cpp")
endif()
########################### SET ARCHITECTURE OPTIONS ###########################
# Make sure the host architecture option is valid. Need to verify in case user
# passes the option via the command line.
list(FIND KOKKOS_HOST_ARCH_LIST "${KOKKOS_HOST_ARCH}" KOKKOS_VALID_HOST_ARCH)
if(KOKKOS_VALID_HOST_ARCH EQUAL -1)
set(KOKKOS_ARCH_TEXT "\n ${KOKKOS_HOST_ARCH_LIST}")
string(REPLACE ";" "\n " KOKKOS_ARCH_TEXT "${KOKKOS_ARCH_TEXT}")
set(KOKKOS_MESSAGE_TEXT "Invalid architecture for KOKKOS_HOST_ARCH: '${KOKKOS_HOST_ARCH}'")
set(KOKKOS_MESSAGE_TEXT "${KOKKOS_MESSAGE_TEXT}\n Choices:${KOKKOS_ARCH_TEXT}\n")
message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}")
endif()
# Make sure the GPU architecture option is valid. Need to verify in case user
# passes the option via the command line.
list(FIND KOKKOS_GPU_ARCH_LIST "${KOKKOS_GPU_ARCH}" KOKKOS_VALID_GPU_ARCH)
if(KOKKOS_VALID_GPU_ARCH EQUAL -1)
set(KOKKOS_ARCH_TEXT "\n ${KOKKOS_GPU_ARCH_LIST}")
string(REPLACE ";" "\n " KOKKOS_ARCH_TEXT "${KOKKOS_ARCH_TEXT}")
set(KOKKOS_MESSAGE_TEXT "Invalid architecture for KOKKOS_GPU_ARCH: '${KOKKOS_GPU_ARCH}'")
set(KOKKOS_MESSAGE_TEXT "${KOKKOS_MESSAGE_TEXT}\n Choices:${KOKKOS_ARCH_TEXT}\n")
message(FATAL_ERROR "${KOKKOS_MESSAGE_TEXT}")
endif()
# Decide what ISA level we are able to support.
if(KOKKOS_HOST_ARCH STREQUAL SNB OR KOKKOS_HOST_ARCH STREQUAL HSW OR KOKKOS_HOST_ARCH STREQUAL BDW OR
KOKKOS_HOST_ARCH STREQUAL SKX OR KOKKOS_HOST_ARCH STREQUAL KNL)
set(KOKKOS_ENABLE_ISA_X86_64 ON CACHE INTERNAL "")
endif()
if(KOKKOS_HOST_ARCH STREQUAL KNC)
set(KOKKOS_ENABLE_ISA_KNC ON CACHE INTERNAL "")
endif()
if(KOKKOS_HOST_ARCH STREQUAL Power8 OR KOKKOS_HOST_ARCH STREQUAL Power9)
set(KOKKOS_ENABLE_ISA_POWERPCLE ON CACHE INTERNAL "")
endif()
# Add host architecture options.
if(KOKKOS_HOST_ARCH STREQUAL ARMv80)
set(KOKKOS_ARCH_ARMV80 ON CACHE INTERNAL "")
if(KOKKOS_CXX_COMPILER_ID STREQUAL Cray)
elseif(KOKKOS_CXX_COMPILER_ID STREQUAL PGI)
else()
list(APPEND KOKKOS_CXX_FLAGS -march=armv8-a)
list(APPEND KOKKOS_LD_FLAGS -march=armv8-a)
endif()
elseif(KOKKOS_HOST_ARCH STREQUAL ARMv81)
set(KOKKOS_ARCH_ARMV81 ON CACHE INTERNAL "")
if(KOKKOS_CXX_COMPILER_ID STREQUAL Cray)
elseif(KOKKOS_CXX_COMPILER_ID STREQUAL PGI)
else()
list(APPEND KOKKOS_CXX_FLAGS -march=armv8.1-a)
list(APPEND KOKKOS_LD_FLAGS -march=armv8.1-a)
endif()
elseif(KOKKOS_HOST_ARCH STREQUAL ARMv8-ThunderX)
set(KOKKOS_ARCH_ARMV80 ON CACHE INTERNAL "")
set(KOKKOS_ARCH_ARMV8_THUNDERX ON CACHE INTERNAL "")
if(KOKKOS_CXX_COMPILER_ID STREQUAL Cray)
elseif(KOKKOS_CXX_COMPILER_ID STREQUAL PGI)
else()
list(APPEND KOKKOS_CXX_FLAGS -march=armv8-a -mtune=thunderx)
list(APPEND KOKKOS_LD_FLAGS -march=armv8-a -mtune=thunderx)
endif()
elseif(KOKKOS_HOST_ARCH STREQUAL SNB OR KOKKOS_HOST_ARCH STREQUAL AMDAVX)
set(KOKKOS_ARCH_AVX ON CACHE INTERNAL "")
if(KOKKOS_CXX_COMPILER_ID STREQUAL Intel)
list(APPEND KOKKOS_CXX_FLAGS -mavx)
list(APPEND KOKKOS_LD_FLAGS -mavx)
elseif(KOKKOS_CXX_COMPILER_ID STREQUAL Cray)
elseif(KOKKOS_CXX_COMPILER_ID STREQUAL PGI)
list(APPEND KOKKOS_CXX_FLAGS -tp=sandybridge)
list(APPEND KOKKOS_LD_FLAGS -tp=sandybridge)
else()
list(APPEND KOKKOS_CXX_FLAGS -mavx)
list(APPEND KOKKOS_LD_FLAGS -mavx)
endif()
elseif(KOKKOS_HOST_ARCH STREQUAL HSW OR KOKKOS_HOST_ARCH STREQUAL BDW)
set(KOKKOS_ARCH_AVX2 ON CACHE INTERNAL "")
if(KOKKOS_CXX_COMPILER_ID STREQUAL Intel)
list(APPEND KOKKOS_CXX_FLAGS -xCORE-AVX2)
list(APPEND KOKKOS_LD_FLAGS -xCORE-AVX2)
elseif(KOKKOS_CXX_COMPILER_ID STREQUAL Cray)
elseif(KOKKOS_CXX_COMPILER_ID STREQUAL PGI)
list(APPEND KOKKOS_CXX_FLAGS -tp=haswell)
list(APPEND KOKKOS_LD_FLAGS -tp=haswell)
else()
list(APPEND KOKKOS_CXX_FLAGS -march=core-avx2 -mtune=core-avx2)
list(APPEND KOKKOS_LD_FLAGS -march=core-avx2 -mtune=core-avx2)
endif()
elseif(KOKKOS_HOST_ARCH STREQUAL KNL)
set(KOKKOS_ARCH_AVX512MIC ON CACHE INTERNAL "")
if(KOKKOS_CXX_COMPILER_ID STREQUAL Intel)
list(APPEND KOKKOS_CXX_FLAGS -xMIC-AVX512)
list(APPEND KOKKOS_LD_FLAGS -xMIC-AVX512)
elseif(KOKKOS_CXX_COMPILER_ID STREQUAL Cray)
elseif(KOKKOS_CXX_COMPILER_ID STREQUAL PGI)
else()
list(APPEND KOKKOS_CXX_FLAGS -march=knl)
list(APPEND KOKKOS_LD_FLAGS -march=knl)
endif()
elseif(KOKKOS_HOST_ARCH STREQUAL SKX)
set(KOKKOS_ARCH_AVX512XEON ON CACHE INTERNAL "")
if(KOKKOS_CXX_COMPILER_ID STREQUAL Intel)
list(APPEND KOKKOS_CXX_FLAGS -xCORE-AVX512)
list(APPEND KOKKOS_LD_FLAGS -xCORE-AVX512)
elseif(KOKKOS_CXX_COMPILER_ID STREQUAL Cray)
elseif(KOKKOS_CXX_COMPILER_ID STREQUAL PGI)
else()
list(APPEND KOKKOS_CXX_FLAGS -march=skylake-avx512)
list(APPEND KOKKOS_LD_FLAGS -march=skylake-avx512)
endif()
elseif(KOKKOS_HOST_ARCH STREQUAL KNC)
set(KOKKOS_ARCH_KNC ON CACHE INTERNAL "")
list(APPEND KOKKOS_CXX_FLAGS -mmic)
list(APPEND KOKKOS_LD_FLAGS -mmic)
elseif(KOKKOS_HOST_ARCH STREQUAL Power8)
set(KOKKOS_ARCH_POWER8 ON CACHE INTERNAL "")
if(KOKKOS_CXX_COMPILER_ID STREQUAL PGI)
else()
list(APPEND KOKKOS_CXX_FLAGS -mcpu=power8 -mtune=power8)
list(APPEND KOKKOS_LD_FLAGS -mcpu=power8 -mtune=power8)
endif()
elseif(KOKKOS_HOST_ARCH STREQUAL Power9)
set(KOKKOS_ARCH_POWER9 ON CACHE INTERNAL "")
if(KOKKOS_CXX_COMPILER_ID STREQUAL PGI)
else()
list(APPEND KOKKOS_CXX_FLAGS -mcpu=power9 -mtune=power9)
list(APPEND KOKKOS_LD_FLAGS -mcpu=power9 -mtune=power9)
endif()
endif()
# Add GPU architecture options.
if(KOKKOS_ENABLE_CUDA)
if(KOKKOS_CXX_COMPILER_ID STREQUAL NVIDIA)
set(KOKKOS_GPU_ARCH_FLAG -arch)
elseif(KOKKOS_CXX_COMPILER_ID STREQUAL Clang)
list(APPEND KOKKOS_CXX_FLAGS -x cuda)
set(KOKKOS_GPU_ARCH_FLAG --cuda-gpu-arch)
endif()
if(KOKKOS_GPU_ARCH STREQUAL Kepler30)
set(KOKKOS_ARCH_KEPLER ON CACHE INTERNAL "")
set(KOKKOS_ARCH_KEPLER30 ON CACHE INTERNAL "")
set(KOKKOS_GPU_ARCH_FLAG ${KOKKOS_GPU_ARCH_FLAG}=sm_30)
elseif(KOKKOS_GPU_ARCH STREQUAL Kepler32)
set(KOKKOS_ARCH_KEPLER ON CACHE INTERNAL "")
set(KOKKOS_ARCH_KEPLER32 ON CACHE INTERNAL "")
set(KOKKOS_GPU_ARCH_FLAG ${KOKKOS_GPU_ARCH_FLAG}=sm_32)
elseif(KOKKOS_GPU_ARCH STREQUAL Kepler35 OR KOKKOS_GPU_ARCH STREQUAL Kepler)
set(KOKKOS_ARCH_KEPLER ON CACHE INTERNAL "")
set(KOKKOS_ARCH_KEPLER35 ON CACHE INTERNAL "")
set(KOKKOS_GPU_ARCH_FLAG ${KOKKOS_GPU_ARCH_FLAG}=sm_35)
elseif(KOKKOS_GPU_ARCH STREQUAL Kepler37)
set(KOKKOS_ARCH_KEPLER ON CACHE INTERNAL "")
set(KOKKOS_ARCH_KEPLER37 ON CACHE INTERNAL "")
set(KOKKOS_GPU_ARCH_FLAG ${KOKKOS_GPU_ARCH_FLAG}=sm_37)
elseif(KOKKOS_GPU_ARCH STREQUAL Maxwell50 OR KOKKOS_GPU_ARCH STREQUAL Maxwell)
set(KOKKOS_ARCH_MAXWELL ON CACHE INTERNAL "")
set(KOKKOS_ARCH_MAXWELL50 ON CACHE INTERNAL "")
set(KOKKOS_GPU_ARCH_FLAG ${KOKKOS_GPU_ARCH_FLAG}=sm_50)
elseif(KOKKOS_GPU_ARCH STREQUAL Maxwell52)
set(KOKKOS_ARCH_MAXWELL ON CACHE INTERNAL "")
set(KOKKOS_ARCH_MAXWELL52 ON CACHE INTERNAL "")
set(KOKKOS_GPU_ARCH_FLAG ${KOKKOS_GPU_ARCH_FLAG}=sm_52)
elseif(KOKKOS_GPU_ARCH STREQUAL Maxwell53)
set(KOKKOS_ARCH_MAXWELL ON CACHE INTERNAL "")
set(KOKKOS_ARCH_MAXWELL53 ON CACHE INTERNAL "")
set(KOKKOS_GPU_ARCH_FLAG ${KOKKOS_GPU_ARCH_FLAG}=sm_53)
elseif(KOKKOS_GPU_ARCH STREQUAL Pascal60)
set(KOKKOS_ARCH_PASCAL ON CACHE INTERNAL "")
set(KOKKOS_ARCH_PASCAL60 ON CACHE INTERNAL "")
set(KOKKOS_GPU_ARCH_FLAG ${KOKKOS_GPU_ARCH_FLAG}=sm_60)
elseif(KOKKOS_GPU_ARCH STREQUAL Pascal61)
set(KOKKOS_ARCH_PASCAL ON CACHE INTERNAL "")
set(KOKKOS_ARCH_PASCAL61 ON CACHE INTERNAL "")
set(KOKKOS_GPU_ARCH_FLAG ${KOKKOS_GPU_ARCH_FLAG}=sm_61)
endif()
if(NOT KOKKOS_GPU_ARCH STREQUAL None)
list(APPEND KOKKOS_CXX_FLAGS ${KOKKOS_GPU_ARCH_FLAG})
if(KOKKOS_CXX_COMPILER_ID STREQUAL NVIDIA)
list(APPEND KOKKOS_LD_FLAGS ${KOKKOS_GPU_ARCH_FLAG})
endif()
endif()
endif()
############################### SET OTHER OPTIONS ##############################
# Set options if using hwloc.
if(KOKKOS_ENABLE_HWLOC)
if(KOKKOS_HWLOC_DIR)
list(APPEND CMAKE_PREFIX_PATH ${KOKKOS_HWLOC_DIR})
endif()
find_package(HWLOC)
if(NOT HWLOC_FOUND)
if(KOKKOS_HWLOC_DIR)
message(FATAL_ERROR "Couldn't find HWLOC in default locations, and KOKKOS_HWLOC_DIR points to an invalid installation.")
else()
message(FATAL_ERROR "Couldn't find HWLOC in default locations. Set KOKKOS_HWLOC_DIR.")
endif()
endif()
list(APPEND KOKKOS_INCLUDE_DIRS ${HWLOC_INCLUDE_DIR})
list(APPEND KOKKOS_LIBS ${HWLOC_LIBRARIES})
set(KOKKOS_HAVE_HWLOC ON CACHE INTERNAL "")
if(KOKKOS_HWLOC_DIR)
list(REMOVE_AT CMAKE_PREFIX_PATH -1)
endif()
endif()
# Set options if using memkind.
if(KOKKOS_ENABLE_MEMKIND)
if(KOKKOS_MEMKIND_DIR)
list(APPEND CMAKE_PREFIX_PATH ${KOKKOS_MEMKIND_DIR})
endif()
find_package(Memkind)
if(NOT MEMKIND_FOUND)
if(KOKKOS_MEMKIND_DIR)
message(FATAL_ERROR "Couldn't find Memkind in default locations, and KOKKOS_MEMKIND_DIR points to an invalid installation.")
else()
message(FATAL_ERROR "Couldn't find Memkind in default locations. Set KOKKOS_MEMKIND_DIR.")
endif()
endif()
set(KOKKOS_ENABLE_HBWSPACE ON CACHE INTERNAL "")
list(APPEND KOKKOS_INCLUDE_DIRS ${MEMKIND_INCLUDE_DIR})
list(APPEND KOKKOS_LIBS ${MEMKIND_LIBRARIES})
if(KOKKOS_MEMKIND_DIR)
list(REMOVE_AT CMAKE_PREFIX_PATH -1)
endif()
else()
# Remove HBW source file.
list(REMOVE_ITEM KOKKOS_CORE_SRCS
"${Kokkos_SOURCE_DIR}/core/src/impl/Kokkos_HBWSpace.cpp")
endif()
# Set options if using librt.
if(KOKKOS_ENABLE_LIBRT)
list(APPEND KOKKOS_LIBS rt)
endif()
# Set debugging if requested.
if(KOKKOS_DEBUG)
set(KOKKOS_HAVE_DEBUG ON CACHE INTERNAL "")
set(KOKKOS_ENABLE_DEBUG_BOUNDS_CHECK ON CACHE INTERNAL "")
if(KOKKOS_CXX_COVIDIA)
list(APPEND KOKKOS_CXX_FLAGS -lineinfo)
endif()
list(APPEND KOKKOS_CXX_FLAGS -g)
list(APPEND KOKKOS_LD_FLAGS -g)
endif()
# Set profiling if requested.
if(KOKKOS_ENABLE_PROFILING)
list(APPEND KOKKOS_LIBS dl)
else()
# Remove profiling source file.
list(REMOVE_ITEM KOKKOS_CORE_SRCS
"${Kokkos_SOURCE_DIR}/core/src/impl/Kokkos_Profiling_Interface.cpp")
endif()
# Use GCC toolchain with Clang.
if(KOKKOS_CXX_COMPILER_ID STREQUAL Clang AND NOT APPLE)
find_program(KOKKOS_GCC_PATH g++)
if(NOT KOKKOS_GCC_PATH)
message(FATAL_ERROR "Can't find GCC path to get toolchain for Clang.")
endif()
string(REPLACE "/bin/g++" "" KOKKOS_GCC_PATH ${KOKKOS_GCC_PATH})
list(APPEND KOKKOS_CXX_FLAGS --gcc-toolchain=${KOKKOS_GCC_PATH})
list(APPEND KOKKOS_LD_FLAGS --gcc-toolchain=${KOKKOS_GCC_PATH})
endif()
############################ Detect if submodule ###############################
#
# With thanks to StackOverflow:
# http://stackoverflow.com/questions/25199677/how-to-detect-if-current-scope-has-a-parent-in-cmake
#
get_directory_property(HAS_PARENT PARENT_DIRECTORY)
if(HAS_PARENT)
message(STATUS "Submodule build")
SET(KOKKOS_HEADER_DIR "include/kokkos")
else()
message(STATUS "Standalone build")
SET(KOKKOS_HEADER_DIR "include")
endif()
############################ PRINT CONFIGURE STATUS ############################
message(STATUS "")
message(STATUS "****************** Kokkos Settings ******************")
message(STATUS "Execution Spaces")
if(KOKKOS_ENABLE_CUDA)
message(STATUS " Device Parallel: Cuda")
else()
message(STATUS " Device Parallel: None")
endif()
if(KOKKOS_ENABLE_OPENMP)
message(STATUS " Host Parallel: OpenMP")
elseif(KOKKOS_ENABLE_PTHREAD)
message(STATUS " Host Parallel: Pthread")
elseif(KOKKOS_ENABLE_QTHREADS)
message(STATUS " Host Parallel: Qthreads")
else()
message(STATUS " Host Parallel: None")
endif()
if(KOKKOS_ENABLE_SERIAL)
message(STATUS " Host Serial: Serial")
else()
message(STATUS " Host Serial: None")
endif()
message(STATUS "")
message(STATUS "Architectures")
message(STATUS " Host Architecture: ${KOKKOS_HOST_ARCH}")
message(STATUS " Device Architecture: ${KOKKOS_GPU_ARCH}")
message(STATUS "")
message(STATUS "Enabled options")
if(KOKKOS_SEPARATE_LIBS)
message(STATUS " KOKKOS_SEPARATE_LIBS")
endif()
if(KOKKOS_ENABLE_HWLOC)
message(STATUS " KOKKOS_ENABLE_HWLOC")
endif()
if(KOKKOS_ENABLE_MEMKIND)
message(STATUS " KOKKOS_ENABLE_MEMKIND")
endif()
if(KOKKOS_DEBUG)
message(STATUS " KOKKOS_DEBUG")
endif()
if(KOKKOS_ENABLE_PROFILING)
message(STATUS " KOKKOS_ENABLE_PROFILING")
endif()
if(KOKKOS_ENABLE_AGGRESSIVE_VECTORIZATION)
message(STATUS " KOKKOS_ENABLE_AGGRESSIVE_VECTORIZATION")
endif()
if(KOKKOS_ENABLE_CUDA)
if(KOKKOS_ENABLE_CUDA_LDG_INTRINSIC)
message(STATUS " KOKKOS_ENABLE_CUDA_LDG_INTRINSIC")
endif()
if(KOKKOS_ENABLE_CUDA_UVM)
message(STATUS " KOKKOS_ENABLE_CUDA_UVM")
endif()
if(KOKKOS_ENABLE_CUDA_RELOCATABLE_DEVICE_CODE)
message(STATUS " KOKKOS_ENABLE_CUDA_RELOCATABLE_DEVICE_CODE")
endif()
if(KOKKOS_ENABLE_CUDA_LAMBDA)
message(STATUS " KOKKOS_ENABLE_CUDA_LAMBDA")
endif()
if(KOKKOS_CUDA_DIR)
message(STATUS " KOKKOS_CUDA_DIR: ${KOKKOS_CUDA_DIR}")
endif()
endif()
if(KOKKOS_QTHREADS_DIR)
message(STATUS " KOKKOS_QTHREADS_DIR: ${KOKKOS_QTHREADS_DIR}")
endif()
if(KOKKOS_HWLOC_DIR)
message(STATUS " KOKKOS_HWLOC_DIR: ${KOKKOS_HWLOC_DIR}")
endif()
if(KOKKOS_MEMKIND_DIR)
message(STATUS " KOKKOS_MEMKIND_DIR: ${KOKKOS_MEMKIND_DIR}")
endif()
message(STATUS "*****************************************************")
message(STATUS "")
################################ SET UP PROJECT ################################
configure_file(
${Kokkos_SOURCE_DIR}/core/cmake/KokkosCore_config.h.in
${Kokkos_BINARY_DIR}/KokkosCore_config.h
)
SET(INSTALL_LIB_DIR lib CACHE PATH "Installation directory for libraries")
SET(INSTALL_BIN_DIR bin CACHE PATH "Installation directory for executables")
SET(INSTALL_INCLUDE_DIR ${KOKKOS_HEADER_DIR} CACHE PATH
"Installation directory for header files")
IF(WIN32 AND NOT CYGWIN)
SET(DEF_INSTALL_CMAKE_DIR CMake)
ELSE()
SET(DEF_INSTALL_CMAKE_DIR lib/CMake/Kokkos)
ENDIF()
SET(INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR} CACHE PATH
"Installation directory for CMake files")
# Make relative paths absolute (needed later on)
FOREACH(p LIB BIN INCLUDE CMAKE)
SET(var INSTALL_${p}_DIR)
IF(NOT IS_ABSOLUTE "${${var}}")
SET(${var} "${CMAKE_INSTALL_PREFIX}/${${var}}")
ENDIF()
ENDFOREACH()
# set up include-directories
SET (Kokkos_INCLUDE_DIRS
${Kokkos_SOURCE_DIR}/core/src
${Kokkos_SOURCE_DIR}/containers/src
${Kokkos_SOURCE_DIR}/algorithms/src
${Kokkos_BINARY_DIR} # to find KokkosCore_config.h
${KOKKOS_INCLUDE_DIRS}
)
# pass include dirs back to parent scope
SET(Kokkos_INCLUDE_DIRS_RET ${Kokkos_INCLUDE_DIRS} PARENT_SCOPE)
INCLUDE_DIRECTORIES(${Kokkos_INCLUDE_DIRS})
IF(KOKKOS_SEPARATE_LIBS)
# kokkoscore
ADD_LIBRARY(
kokkoscore
${KOKKOS_CORE_SRCS}
)
target_compile_options(
kokkoscore
PUBLIC ${KOKKOS_CXX_FLAGS}
)
target_compile_features(
kokkoscore
PUBLIC ${KOKKOS_CXX11_FEATURES}
)
# Install the kokkoscore library
INSTALL (TARGETS kokkoscore
ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
)
# Install the kokkoscore headers
INSTALL (DIRECTORY
${Kokkos_SOURCE_DIR}/core/src/
DESTINATION ${KOKKOS_HEADER_DIR}
FILES_MATCHING PATTERN "*.hpp"
)
# Install KokkosCore_config.h header
INSTALL (FILES
${Kokkos_BINARY_DIR}/KokkosCore_config.h
DESTINATION ${KOKKOS_HEADER_DIR}
)
TARGET_LINK_LIBRARIES(
kokkoscore
${KOKKOS_LD_FLAGS}
${KOKKOS_LIBS}
)
# kokkoscontainers
ADD_LIBRARY(
kokkoscontainers
${KOKKOS_CONTAINERS_SRCS}
)
TARGET_LINK_LIBRARIES(
kokkoscontainers
kokkoscore
)
# Install the kokkocontainers library
INSTALL (TARGETS kokkoscontainers
ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
# Install the kokkoscontainers headers
INSTALL (DIRECTORY
${Kokkos_SOURCE_DIR}/containers/src/
DESTINATION ${KOKKOS_HEADER_DIR}
FILES_MATCHING PATTERN "*.hpp"
)
# kokkosalgorithms - Build as interface library since no source files.
ADD_LIBRARY(
kokkosalgorithms
INTERFACE
)
target_include_directories(
kokkosalgorithms
INTERFACE ${Kokkos_SOURCE_DIR}/algorithms/src
)
TARGET_LINK_LIBRARIES(
kokkosalgorithms
INTERFACE kokkoscore
)
# Install the kokkoalgorithms library
INSTALL (TARGETS kokkosalgorithms
ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
# Install the kokkosalgorithms headers
INSTALL (DIRECTORY
${Kokkos_SOURCE_DIR}/algorithms/src/
DESTINATION ${KOKKOS_INSTALL_INDLUDE_DIR}
FILES_MATCHING PATTERN "*.hpp"
)
SET (Kokkos_LIBRARIES_NAMES kokkoscore kokkoscontainers kokkosalgorithms)
ELSE()
# kokkos
ADD_LIBRARY(
kokkos
${KOKKOS_CORE_SRCS}
${KOKKOS_CONTAINERS_SRCS}
)
target_compile_options(
kokkos
PUBLIC ${KOKKOS_CXX_FLAGS}
)
target_compile_features(
kokkos
PUBLIC ${KOKKOS_CXX11_FEATURES}
)
TARGET_LINK_LIBRARIES(
kokkos
${KOKKOS_LD_FLAGS}
${KOKKOS_LIBS}
)
# Install the kokkos library
INSTALL (TARGETS kokkos
EXPORT KokkosTargets
ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
# Install the kokkos headers
INSTALL (DIRECTORY
EXPORT KokkosTargets
${Kokkos_SOURCE_DIR}/core/src/
DESTINATION ${KOKKOS_HEADER_DIR}
FILES_MATCHING PATTERN "*.hpp"
)
INSTALL (DIRECTORY
EXPORT KokkosTargets
${Kokkos_SOURCE_DIR}/containers/src/
DESTINATION ${KOKKOS_HEADER_DIR}
FILES_MATCHING PATTERN "*.hpp"
)
INSTALL (DIRECTORY
EXPORT KokkosTargets
${Kokkos_SOURCE_DIR}/algorithms/src/
DESTINATION ${KOKKOS_HEADER_DIR}
FILES_MATCHING PATTERN "*.hpp"
)
INSTALL (FILES
${Kokkos_BINARY_DIR}/KokkosCore_config.h
DESTINATION ${KOKKOS_HEADER_DIR}
)
include_directories(${Kokkos_BINARY_DIR})
include_directories(${Kokkos_SOURCE_DIR}/core/src)
include_directories(${Kokkos_SOURCE_DIR}/containers/src)
include_directories(${Kokkos_SOURCE_DIR}/algorithms/src)
SET (Kokkos_LIBRARIES_NAMES kokkos)
endif()
# Add all targets to the build-tree export set
export(TARGETS ${Kokkos_LIBRARIES_NAMES}
FILE "${Kokkos_BINARY_DIR}/KokkosTargets.cmake")
# Export the package for use from the build-tree
# (this registers the build-tree with a global CMake-registry)
export(PACKAGE Kokkos)
# Create the KokkosConfig.cmake and KokkosConfigVersion files
file(RELATIVE_PATH REL_INCLUDE_DIR "${INSTALL_CMAKE_DIR}"
"${INSTALL_INCLUDE_DIR}")
# ... for the build tree
set(CONF_INCLUDE_DIRS "${Kokkos_SOURCE_DIR}" "${Kokkos_BINARY_DIR}")
configure_file(${Kokkos_SOURCE_DIR}/cmake/KokkosConfig.cmake.in
"${Kokkos_BINARY_DIR}/KokkosConfig.cmake" @ONLY)
# ... for the install tree
set(CONF_INCLUDE_DIRS "\${Kokkos_CMAKE_DIR}/${REL_INCLUDE_DIR}")
configure_file(${Kokkos_SOURCE_DIR}/cmake/KokkosConfig.cmake.in
"${Kokkos_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/KokkosConfig.cmake" @ONLY)
# Install the KokkosConfig.cmake and KokkosConfigVersion.cmake
install(FILES
"${Kokkos_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/KokkosConfig.cmake"
DESTINATION "${INSTALL_CMAKE_DIR}")
# Install the export set for use with the install-tree
INSTALL(EXPORT KokkosTargets DESTINATION
"${INSTALL_CMAKE_DIR}")