1*bf2c3715SXin Li#.rst: 2*bf2c3715SXin Li# FindTriSYCL 3*bf2c3715SXin Li#--------------- 4*bf2c3715SXin Li# 5*bf2c3715SXin Li# TODO : insert Copyright and licence 6*bf2c3715SXin Li 7*bf2c3715SXin Li######################### 8*bf2c3715SXin Li# FindTriSYCL.cmake 9*bf2c3715SXin Li######################### 10*bf2c3715SXin Li# 11*bf2c3715SXin Li# Tools for finding and building with TriSYCL. 12*bf2c3715SXin Li# 13*bf2c3715SXin Li# User must define TRISYCL_INCLUDE_DIR pointing to the triSYCL 14*bf2c3715SXin Li# include directory. 15*bf2c3715SXin Li# 16*bf2c3715SXin Li# Latest version of this file can be found at: 17*bf2c3715SXin Li# https://github.com/triSYCL/triSYCL 18*bf2c3715SXin Li 19*bf2c3715SXin Li# Requite CMake version 3.5 or higher 20*bf2c3715SXin Licmake_minimum_required (VERSION 3.5) 21*bf2c3715SXin Li 22*bf2c3715SXin Li# Check that a supported host compiler can be found 23*bf2c3715SXin Liif(CMAKE_COMPILER_IS_GNUCXX) 24*bf2c3715SXin Li # Require at least gcc 5.4 25*bf2c3715SXin Li if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.4) 26*bf2c3715SXin Li message(FATAL_ERROR 27*bf2c3715SXin Li "host compiler - Not found! (gcc version must be at least 5.4)") 28*bf2c3715SXin Li else() 29*bf2c3715SXin Li message(STATUS "host compiler - gcc ${CMAKE_CXX_COMPILER_VERSION}") 30*bf2c3715SXin Li endif() 31*bf2c3715SXin Lielseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") 32*bf2c3715SXin Li # Require at least clang 3.9 33*bf2c3715SXin Li if (${CMAKE_CXX_COMPILER_VERSION} VERSION_LESS 3.9) 34*bf2c3715SXin Li message(FATAL_ERROR 35*bf2c3715SXin Li "host compiler - Not found! (clang version must be at least 3.9)") 36*bf2c3715SXin Li else() 37*bf2c3715SXin Li message(STATUS "host compiler - clang ${CMAKE_CXX_COMPILER_VERSION}") 38*bf2c3715SXin Li endif() 39*bf2c3715SXin Lielse() 40*bf2c3715SXin Li message(WARNING 41*bf2c3715SXin Li "host compiler - Not found! (triSYCL supports GCC and Clang)") 42*bf2c3715SXin Liendif() 43*bf2c3715SXin Li 44*bf2c3715SXin Li#triSYCL options 45*bf2c3715SXin Lioption(TRISYCL_OPENMP "triSYCL multi-threading with OpenMP" ON) 46*bf2c3715SXin Lioption(TRISYCL_OPENCL "triSYCL OpenCL interoperability mode" OFF) 47*bf2c3715SXin Lioption(TRISYCL_NO_ASYNC "triSYCL use synchronous kernel execution" OFF) 48*bf2c3715SXin Lioption(TRISYCL_DEBUG "triSCYL use debug mode" OFF) 49*bf2c3715SXin Lioption(TRISYCL_DEBUG_STRUCTORS "triSYCL trace of object lifetimes" OFF) 50*bf2c3715SXin Lioption(TRISYCL_TRACE_KERNEL "triSYCL trace of kernel execution" OFF) 51*bf2c3715SXin Li 52*bf2c3715SXin Limark_as_advanced(TRISYCL_OPENMP) 53*bf2c3715SXin Limark_as_advanced(TRISYCL_OPENCL) 54*bf2c3715SXin Limark_as_advanced(TRISYCL_NO_ASYNC) 55*bf2c3715SXin Limark_as_advanced(TRISYCL_DEBUG) 56*bf2c3715SXin Limark_as_advanced(TRISYCL_DEBUG_STRUCTORS) 57*bf2c3715SXin Limark_as_advanced(TRISYCL_TRACE_KERNEL) 58*bf2c3715SXin Li 59*bf2c3715SXin Li#triSYCL definitions 60*bf2c3715SXin Liset(CL_SYCL_LANGUAGE_VERSION 220 CACHE STRING 61*bf2c3715SXin Li "Host language version to be used by trisYCL (default is: 220)") 62*bf2c3715SXin Liset(TRISYCL_CL_LANGUAGE_VERSION 220 CACHE STRING 63*bf2c3715SXin Li "Device language version to be used by trisYCL (default is: 220)") 64*bf2c3715SXin Li# triSYCL now requires c++17 65*bf2c3715SXin Liset(CMAKE_CXX_STANDARD 17) 66*bf2c3715SXin Liset(CXX_STANDARD_REQUIRED ON) 67*bf2c3715SXin Li 68*bf2c3715SXin Li 69*bf2c3715SXin Li# Find OpenCL package 70*bf2c3715SXin Liinclude(CMakeFindDependencyMacro) 71*bf2c3715SXin Liif(TRISYCL_OPENCL) 72*bf2c3715SXin Li find_dependency(OpenCL REQUIRED) 73*bf2c3715SXin Li if(UNIX) 74*bf2c3715SXin Li set(BOOST_COMPUTE_INCPATH /usr/include/compute CACHE PATH 75*bf2c3715SXin Li "Path to Boost.Compute headers (default is: /usr/include/compute)") 76*bf2c3715SXin Li endif() 77*bf2c3715SXin Liendif() 78*bf2c3715SXin Li 79*bf2c3715SXin Li# Find OpenMP package 80*bf2c3715SXin Liif(TRISYCL_OPENMP) 81*bf2c3715SXin Li find_dependency(OpenMP REQUIRED) 82*bf2c3715SXin Liendif() 83*bf2c3715SXin Li 84*bf2c3715SXin Li# Find Boost 85*bf2c3715SXin Lifind_dependency(Boost 1.58 REQUIRED COMPONENTS chrono log) 86*bf2c3715SXin Li 87*bf2c3715SXin Li# If debug or trace we need boost log 88*bf2c3715SXin Liif(TRISYCL_DEBUG OR TRISYCL_DEBUG_STRUCTORS OR TRISYCL_TRACE_KERNEL) 89*bf2c3715SXin Li set(LOG_NEEDED ON) 90*bf2c3715SXin Lielse() 91*bf2c3715SXin Li set(LOG_NEEDED OFF) 92*bf2c3715SXin Liendif() 93*bf2c3715SXin Li 94*bf2c3715SXin Lifind_dependency(Threads REQUIRED) 95*bf2c3715SXin Li 96*bf2c3715SXin Li# Find triSYCL directory 97*bf2c3715SXin Liif (TRISYCL_INCLUDES AND TRISYCL_LIBRARIES) 98*bf2c3715SXin Li set(TRISYCL_FIND_QUIETLY TRUE) 99*bf2c3715SXin Liendif () 100*bf2c3715SXin Li 101*bf2c3715SXin Lifind_path(TRISYCL_INCLUDE_DIR 102*bf2c3715SXin Li NAMES sycl.hpp 103*bf2c3715SXin Li PATHS $ENV{TRISYCLDIR} $ENV{TRISYCLDIR}/include ${INCLUDE_INSTALL_DIR} 104*bf2c3715SXin Li PATH_SUFFIXES triSYCL 105*bf2c3715SXin Li) 106*bf2c3715SXin Li 107*bf2c3715SXin Liinclude(FindPackageHandleStandardArgs) 108*bf2c3715SXin Lifind_package_handle_standard_args(TriSYCL DEFAULT_MSG 109*bf2c3715SXin Li TRISYCL_INCLUDE_DIR) 110*bf2c3715SXin Li 111*bf2c3715SXin Liif(NOT TRISYCL_INCLUDE_DIR) 112*bf2c3715SXin Li message(FATAL_ERROR 113*bf2c3715SXin Li "triSYCL include directory - Not found! (please set TRISYCL_INCLUDE_DIR") 114*bf2c3715SXin Lielse() 115*bf2c3715SXin Li message(STATUS "triSYCL include directory - Found ${TRISYCL_INCLUDE_DIR}") 116*bf2c3715SXin Liendif() 117*bf2c3715SXin Li 118*bf2c3715SXin Liinclude(CMakeParseArguments) 119*bf2c3715SXin Li####################### 120*bf2c3715SXin Li# add_sycl_to_target 121*bf2c3715SXin Li####################### 122*bf2c3715SXin Lifunction(add_sycl_to_target) 123*bf2c3715SXin Li set(options) 124*bf2c3715SXin Li set(one_value_args 125*bf2c3715SXin Li TARGET 126*bf2c3715SXin Li ) 127*bf2c3715SXin Li set(multi_value_args 128*bf2c3715SXin Li SOURCES 129*bf2c3715SXin Li ) 130*bf2c3715SXin Li cmake_parse_arguments(ADD_SYCL_ARGS 131*bf2c3715SXin Li "${options}" 132*bf2c3715SXin Li "${one_value_args}" 133*bf2c3715SXin Li "${multi_value_args}" 134*bf2c3715SXin Li ${ARGN} 135*bf2c3715SXin Li ) 136*bf2c3715SXin Li 137*bf2c3715SXin Li # Add include directories to the "#include <>" paths 138*bf2c3715SXin Li target_include_directories (${ADD_SYCL_ARGS_TARGET} PUBLIC 139*bf2c3715SXin Li ${TRISYCL_INCLUDE_DIR} 140*bf2c3715SXin Li ${Boost_INCLUDE_DIRS} 141*bf2c3715SXin Li $<$<BOOL:${TRISYCL_OPENCL}>:${OpenCL_INCLUDE_DIRS}> 142*bf2c3715SXin Li $<$<BOOL:${TRISYCL_OPENCL}>:${BOOST_COMPUTE_INCPATH}>) 143*bf2c3715SXin Li 144*bf2c3715SXin Li # Link dependencies 145*bf2c3715SXin Li target_link_libraries(${ADD_SYCL_ARGS_TARGET} 146*bf2c3715SXin Li $<$<BOOL:${TRISYCL_OPENCL}>:${OpenCL_LIBRARIES}> 147*bf2c3715SXin Li Threads::Threads 148*bf2c3715SXin Li $<$<BOOL:${LOG_NEEDED}>:Boost::log> 149*bf2c3715SXin Li Boost::chrono) 150*bf2c3715SXin Li 151*bf2c3715SXin Li # Compile definitions 152*bf2c3715SXin Li target_compile_definitions(${ADD_SYCL_ARGS_TARGET} PUBLIC 153*bf2c3715SXin Li EIGEN_SYCL_TRISYCL 154*bf2c3715SXin Li $<$<BOOL:${TRISYCL_NO_ASYNC}>:TRISYCL_NO_ASYNC> 155*bf2c3715SXin Li $<$<BOOL:${TRISYCL_OPENCL}>:TRISYCL_OPENCL> 156*bf2c3715SXin Li $<$<BOOL:${TRISYCL_DEBUG}>:TRISYCL_DEBUG> 157*bf2c3715SXin Li $<$<BOOL:${TRISYCL_DEBUG_STRUCTORS}>:TRISYCL_DEBUG_STRUCTORS> 158*bf2c3715SXin Li $<$<BOOL:${TRISYCL_TRACE_KERNEL}>:TRISYCL_TRACE_KERNEL> 159*bf2c3715SXin Li $<$<BOOL:${LOG_NEEDED}>:BOOST_LOG_DYN_LINK>) 160*bf2c3715SXin Li 161*bf2c3715SXin Li # C++ and OpenMP requirements 162*bf2c3715SXin Li target_compile_options(${ADD_SYCL_ARGS_TARGET} PUBLIC 163*bf2c3715SXin Li ${TRISYCL_COMPILE_OPTIONS} 164*bf2c3715SXin Li $<$<BOOL:${TRISYCL_OPENMP}>:${OpenMP_CXX_FLAGS}>) 165*bf2c3715SXin Li 166*bf2c3715SXin Li if(${TRISYCL_OPENMP} AND (NOT WIN32)) 167*bf2c3715SXin Li # Does not support generator expressions 168*bf2c3715SXin Li set_target_properties(${ADD_SYCL_ARGS_TARGET} 169*bf2c3715SXin Li PROPERTIES 170*bf2c3715SXin Li LINK_FLAGS ${OpenMP_CXX_FLAGS}) 171*bf2c3715SXin Li endif() 172*bf2c3715SXin Li 173*bf2c3715SXin Liendfunction() 174