123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- #.rst:
- # FindTriSYCL
- #---------------
- #
- # TODO : insert Copyright and licence
- #########################
- # FindTriSYCL.cmake
- #########################
- #
- # Tools for finding and building with TriSYCL.
- #
- # User must define TRISYCL_INCLUDE_DIR pointing to the triSYCL
- # include directory.
- #
- # Latest version of this file can be found at:
- # https://github.com/triSYCL/triSYCL
- # Requite CMake version 3.5 or higher
- cmake_minimum_required (VERSION 3.5)
- # Check that a supported host compiler can be found
- if(CMAKE_COMPILER_IS_GNUCXX)
- # Require at least gcc 5.4
- if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.4)
- message(FATAL_ERROR
- "host compiler - Not found! (gcc version must be at least 5.4)")
- else()
- message(STATUS "host compiler - gcc ${CMAKE_CXX_COMPILER_VERSION}")
- endif()
- elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
- # Require at least clang 3.9
- if (${CMAKE_CXX_COMPILER_VERSION} VERSION_LESS 3.9)
- message(FATAL_ERROR
- "host compiler - Not found! (clang version must be at least 3.9)")
- else()
- message(STATUS "host compiler - clang ${CMAKE_CXX_COMPILER_VERSION}")
- endif()
- else()
- message(WARNING
- "host compiler - Not found! (triSYCL supports GCC and Clang)")
- endif()
- #triSYCL options
- option(TRISYCL_OPENMP "triSYCL multi-threading with OpenMP" ON)
- option(TRISYCL_OPENCL "triSYCL OpenCL interoperability mode" OFF)
- option(TRISYCL_NO_ASYNC "triSYCL use synchronous kernel execution" OFF)
- option(TRISYCL_DEBUG "triSCYL use debug mode" OFF)
- option(TRISYCL_DEBUG_STRUCTORS "triSYCL trace of object lifetimes" OFF)
- option(TRISYCL_TRACE_KERNEL "triSYCL trace of kernel execution" OFF)
- mark_as_advanced(TRISYCL_OPENMP)
- mark_as_advanced(TRISYCL_OPENCL)
- mark_as_advanced(TRISYCL_NO_ASYNC)
- mark_as_advanced(TRISYCL_DEBUG)
- mark_as_advanced(TRISYCL_DEBUG_STRUCTORS)
- mark_as_advanced(TRISYCL_TRACE_KERNEL)
- #triSYCL definitions
- set(CL_SYCL_LANGUAGE_VERSION 220 CACHE STRING
- "Host language version to be used by trisYCL (default is: 220)")
- set(TRISYCL_CL_LANGUAGE_VERSION 220 CACHE STRING
- "Device language version to be used by trisYCL (default is: 220)")
- # triSYCL now requires c++17
- set(CMAKE_CXX_STANDARD 17)
- set(CXX_STANDARD_REQUIRED ON)
- # Find OpenCL package
- include(CMakeFindDependencyMacro)
- if(TRISYCL_OPENCL)
- find_dependency(OpenCL REQUIRED)
- if(UNIX)
- set(BOOST_COMPUTE_INCPATH /usr/include/compute CACHE PATH
- "Path to Boost.Compute headers (default is: /usr/include/compute)")
- endif()
- endif()
- # Find OpenMP package
- if(TRISYCL_OPENMP)
- find_dependency(OpenMP REQUIRED)
- endif()
- # Find Boost
- find_dependency(Boost 1.58 REQUIRED COMPONENTS chrono log)
- # If debug or trace we need boost log
- if(TRISYCL_DEBUG OR TRISYCL_DEBUG_STRUCTORS OR TRISYCL_TRACE_KERNEL)
- set(LOG_NEEDED ON)
- else()
- set(LOG_NEEDED OFF)
- endif()
- find_dependency(Threads REQUIRED)
- # Find triSYCL directory
- if (TRISYCL_INCLUDES AND TRISYCL_LIBRARIES)
- set(TRISYCL_FIND_QUIETLY TRUE)
- endif ()
- find_path(TRISYCL_INCLUDE_DIR
- NAMES sycl.hpp
- PATHS $ENV{TRISYCLDIR} $ENV{TRISYCLDIR}/include ${INCLUDE_INSTALL_DIR}
- PATH_SUFFIXES triSYCL
- )
- include(FindPackageHandleStandardArgs)
- find_package_handle_standard_args(TriSYCL DEFAULT_MSG
- TRISYCL_INCLUDE_DIR)
- if(NOT TRISYCL_INCLUDE_DIR)
- message(FATAL_ERROR
- "triSYCL include directory - Not found! (please set TRISYCL_INCLUDE_DIR")
- else()
- message(STATUS "triSYCL include directory - Found ${TRISYCL_INCLUDE_DIR}")
- endif()
- include(CMakeParseArguments)
- #######################
- # add_sycl_to_target
- #######################
- function(add_sycl_to_target)
- set(options)
- set(one_value_args
- TARGET
- )
- set(multi_value_args
- SOURCES
- )
- cmake_parse_arguments(ADD_SYCL_ARGS
- "${options}"
- "${one_value_args}"
- "${multi_value_args}"
- ${ARGN}
- )
- # Add include directories to the "#include <>" paths
- target_include_directories (${ADD_SYCL_ARGS_TARGET} PUBLIC
- ${TRISYCL_INCLUDE_DIR}
- ${Boost_INCLUDE_DIRS}
- $<$<BOOL:${TRISYCL_OPENCL}>:${OpenCL_INCLUDE_DIRS}>
- $<$<BOOL:${TRISYCL_OPENCL}>:${BOOST_COMPUTE_INCPATH}>)
- # Link dependencies
- target_link_libraries(${ADD_SYCL_ARGS_TARGET}
- $<$<BOOL:${TRISYCL_OPENCL}>:${OpenCL_LIBRARIES}>
- Threads::Threads
- $<$<BOOL:${LOG_NEEDED}>:Boost::log>
- Boost::chrono)
- # Compile definitions
- target_compile_definitions(${ADD_SYCL_ARGS_TARGET} PUBLIC
- EIGEN_SYCL_TRISYCL
- $<$<BOOL:${TRISYCL_NO_ASYNC}>:TRISYCL_NO_ASYNC>
- $<$<BOOL:${TRISYCL_OPENCL}>:TRISYCL_OPENCL>
- $<$<BOOL:${TRISYCL_DEBUG}>:TRISYCL_DEBUG>
- $<$<BOOL:${TRISYCL_DEBUG_STRUCTORS}>:TRISYCL_DEBUG_STRUCTORS>
- $<$<BOOL:${TRISYCL_TRACE_KERNEL}>:TRISYCL_TRACE_KERNEL>
- $<$<BOOL:${LOG_NEEDED}>:BOOST_LOG_DYN_LINK>)
- # C++ and OpenMP requirements
- target_compile_options(${ADD_SYCL_ARGS_TARGET} PUBLIC
- ${TRISYCL_COMPILE_OPTIONS}
- $<$<BOOL:${TRISYCL_OPENMP}>:${OpenMP_CXX_FLAGS}>)
- if(${TRISYCL_OPENMP} AND (NOT WIN32))
- # Does not support generator expressions
- set_target_properties(${ADD_SYCL_ARGS_TARGET}
- PROPERTIES
- LINK_FLAGS ${OpenMP_CXX_FLAGS})
- endif()
- endfunction()
|