Skip to content

Commit

Permalink
Attempt at cmakery for level-zero
Browse files Browse the repository at this point in the history
  • Loading branch information
therault committed Nov 16, 2023
1 parent e9271ff commit 97d0bf6
Show file tree
Hide file tree
Showing 4 changed files with 146 additions and 1 deletion.
19 changes: 18 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ set(CMAKE_INSTALL_CMAKEDIR "lib/cmake/ttg"
option(TTG_PARSEC_USE_BOOST_SERIALIZATION "Whether to select Boost serialization methods in PaRSEC backend" ON)
option(TTG_ENABLE_CUDA "Whether to TTG will look for CUDA" OFF)
option(TTG_ENABLE_HIP "Whether to TTG will look for HIP" OFF)
option(TTG_ENABLE_LEVEL_ZERO "Whether to TTG will look for LEVEL_ZERO" OFF)
option(TTG_EXAMPLES "Whether to build examples" OFF)
option(TTG_ENABLE_ASAN "Whether to enable address sanitizer" OFF)

Expand Down Expand Up @@ -134,8 +135,24 @@ if (TTG_ENABLE_HIP)
add_compile_definitions(${TTG_HIP_PLATFORM})
endif(TTG_ENABLE_HIP)

if (TTG_ENABLE_LEVEL_ZERO)
find_package(level-zero)
set(TTG_HAVE_LEVEL_ZERO ${LEVEL_ZERO_FOUND} CACHE BOOL "True if TTG provide support for Intel Level Zero")
if(TTG_HAVE_LEVEL_ZERO)
include_directories("${LEVEL_ZERO_INCLUDE_DIR}/level_zero/")
find_package(DPCPP)
if(DPCPP_EXECUTABLE)
set(TTG_HAVE_DPCPP TRUE CACHE BOOL "True if TTG knows how to compile DPCPP code")
message(STATUS "Found Intel level-zero ${LEVEL_ZERO_VERSION} in -I${LEVEL_ZERO_INCLUDE_DIR} / -L${LEVEL_ZERO_LIBRARY_DIR}")
message(STATUS "Found dpcpp in ${DPCPP_EXECUTABLE}")
else(DPCPP_EXECUTABLE)
set(TTG_HAVE_DPCPP FALSE CACHE BOOL "True if TTG knows how to compile DPCPP code")
endif(DPCPP_EXECUTABLE)
endif(TTG_HAVE_LEVEL_ZERO)
endif(TTG_ENABLE_LEVEL_ZERO)

set(_ttg_have_device FALSE)
if (TTG_HAVE_CUDA OR TTG_HAVE_HIP)
if (TTG_HAVE_CUDA OR TTG_HAVE_HIP OR TTG_HAVE_LEVEL_ZERO)
set(_ttg_have_device TRUE)
endif()
set(TTG_HAVE_DEVICE ${_ttg_have_device} CACHE BOOL "True if TTG has support for any device programming model")
Expand Down
43 changes: 43 additions & 0 deletions cmake/modules/FindDPCPP.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
if(DPCPP_EXECUTABLE)
get_filename_component( _dpcpp_path ${DPCPP_EXECUTABLE} PATH )
else(DPCPP_EXECUTABLE)
set(_dpcpp_path "")
endif(DPCPP_EXECUTABLE)
find_program( DPCPP_EXECUTABLE NAMES dpcpp HINTS ${_dpcpp_path} ENV PATH )
mark_as_advanced( DPCPP_EXECUTABLE )

if( DPCPP_EXECUTABLE )
execute_process(COMMAND ${DPCPP_EXECUTABLE} --version
RESULT_VARIABLE _res
OUTPUT_VARIABLE _out
ERROR_VARIABLE _err)
if( _res EQUAL 0 )
string(REGEX MATCH "([^\n]+)" _ ${_out})
message(STATUS "Found dpcpp: ${DPCPP_EXECUTABLE} version ${CMAKE_MATCH_1}")

get_filename_component( _dpcpp_dir ${DPCPP_EXECUTABLE} DIRECTORY )
get_filename_component( _dpcpp_lib_dir "${_dpcpp_dir}/../lib" ABSOLUTE )

find_library(SYCL_LIBRARY sycl HINTS "${_dpcpp_lib_dir}" "${SYCL_LIBRARY_DIR}" ENV "SYCL_LIBRARY_DIR")
if( SYCL_LIBRARY )
message(STATUS "SYCL library: ${SYCL_LIBRARY}")

get_filename_component( _dpcpp_inc_dir "${_dpcpp_dir}/../include" ABSOLUTE )
find_file(_sycl_include_file "sycl.hpp" HINTS "${_dpcpp_inc_dir}" "${_dpcpp_inc_dir}/sycl/CL" "${SYCL_INCLUDE_DIR}" ENV "SYCL_INCLUDE_DIR")
if(_sycl_include_file)
get_filename_component(SYCL_INCLUDE_DIR "${_sycl_include_file}" DIRECTORY)
message(STATUS "SYCL include dir: ${SYCL_INCLUDE_DIR}")
else(_sycl_include_file)
message(WARNING "Found DPC++, and SYCL library, but could not find SYCL include directory. Define SYCL_INCLUDE_DIR to enable DPC++ support")
set(DPCPP_EXECUTABLE OFF)
endif(_sycl_include_file)
else( SYCL_LIBRARY )
message(WARNING "Found DPC++, but did not find SYCL library. Define SYCL_LIBRARY_DIR to enable DPC++ support")
set(DPCPP_EXECUTABLE OFF)
endif( SYCL_LIBRARY )
else( _res EQUAL 0 )
set(DPCPP_EXECUTABLE OFF)
message(WARNING "${DPCPP_EXECUTABLE} does not work: 'dpcpp -v' returned ${_res}, with error ${_err}")
message(WARNING "dpc++ support is disabled, set DPCPP_EXECUTABLE to the path of dpcpp to enable DPC++ support, and/or fix your environment to run dpcpp")
endif( _res EQUAL 0 )
endif( DPCPP_EXECUTABLE )
81 changes: 81 additions & 0 deletions cmake/modules/Findlevel-zero.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
if(LEVEL_ZERO_FOUND)
if(TARGET level_zero::ze_loader)
message(STATUS "level-zero is found and TARGET level_zero::ze_loader is defined")
return()
endif(TARGET level_zero::ze_loader)

# If the user defines LEVEL_ZERO_INCLUDE_DIR and LEVEL_ZERO_LIBRARY_DIR, CMake's find_package declares that LEVEL_ZERO_FOUND is 1, but does not define the target.
check_library_exists("ze_loader" "zeInit" "${LEVEL_ZERO_LIBRARY_DIR}" LEVEL_ZERO_HAVE_ZE_LOADER)
check_include_file("${LEVEL_ZERO_INCLUDE_DIR}/level_zero/ze_api.h" LEVEL_ZERO_HAVE_ZE_API_H)
if(LEVEL_ZERO_HAVE_ZE_LOADER AND LEVEL_ZERO_HAVE_ZE_API_H)
message(STATUS "Defining level_zero::ze_loader target with interface ${LEVEL_ZERO_INCLUDE_DIR}/level_zero/ze_api.h and library ${LEVEL_ZERO_LIBRARY_DIR}/libze_loader.so")
add_library(level_zero::ze_loader UNKNOWN IMPORTED GLOBAL)
set_property(TARGET level_zero::ze_loader PROPERTY IMPORTED_LOCATION "${LEVEL_ZERO_LIBRARY_DIR}/libze_loader.so")
set_property(TARGET level_zero::ze_loader PROPERTY INTERFACE "${LEVEL_ZERO_INCLUDE_DIR}/level_zero/ze_api.h")
include_directories("${LEVEL_ZERO_INCLUDE_DIR}/")
return()
else(LEVEL_ZERO_HAVE_ZE_LOADER AND LEVEL_ZERO_HAVE_ZE_API_H)
if(NOT LEVEL_ZERO_HAVE_ZE_LOADER)
message(STATUS "LEVEL_ZERO_FOUND is set, but could not find ze_loader library in ${LEVEL_ZERO_LIBRARY_DIR}")
endif(NOT LEVEL_ZERO_HAVE_ZE_LOADER)
if(NOT LEVEL_ZERO_HAVE_ZE_API_H)
message(STATUS "LEVEL_ZERO_FOUND is set, but could not find level_zero/ze_api.h in ${LEVEL_ZERO_INCLUDE_DIR}")
endif(NOT LEVEL_ZERO_HAVE_ZE_API_H)
endif(LEVEL_ZERO_HAVE_ZE_LOADER AND LEVEL_ZERO_HAVE_ZE_API_H)
endif(LEVEL_ZERO_FOUND)

if(LEVEL_ZERO_ROOT_DIR)
message(STATUS "Trying to locate level-zero library and headers under ${LEVEL_ZERO_ROOT_DIR}")
find_library(ZE_LOADER_LIBRARY "ze_loader" HINTS "${LEVEL_ZERO_ROOT_DIR}/lib" "${LEVEL_ZERO_ROOT_DIR}/lib64" NO_DEFAULT_PATH)
find_path (LEVEL_ZERO_INCLUDE_DIR NAMES "level_zero/ze_api.h" PATHS "${LEVEL_ZERO_ROOT_DIR}/include" NO_DEFAULT_PATH)

if(ZE_LOADER_LIBRARY AND LEVEL_ZERO_INCLUDE_DIR)
get_filename_component(ZE_LOADER_LIBRARY_DIR ${ZE_LOADER_LIBRARY} DIRECTORY)
include(CheckLibraryExists)
check_library_exists("ze_loader" "zeInit" ${ZE_LOADER_LIBRARY_DIR} ZE_LOADER_HAVE_ZEINIT)

if(ZE_LOADER_HAVE_ZEINIT)
message(STATUS "Found ze_loader library in ${ZE_LOADER_LIBRARY} and level_zero/ze_api.h in ${LEVEL_ZERO_INCLUDE_DIR}")
add_library(level_zero::ze_loader UNKNOWN IMPORTED GLOBAL)
set_property(TARGET level_zero::ze_loader PROPERTY IMPORTED_LOCATION "${ZE_LOADER_LIBRARY}")
set_property(TARGET level_zero::ze_loader PROPERTY INTERFACE "${LEVEL_ZERO_INCLUDE_DIR}/level_zero/ze_api.h")
include_directories("${LEVEL_ZERO_INCLUDE_DIR}/")
set(LEVEL_ZERO_FOUND TRUE)
else(ZE_LOADER_HAVE_ZEINIT)
if(NOT ZE_LOADER_HAVE_ZEINIT)
message(WARNING "Found ze_loader library under ${ZE_LOADER_LIBRARY}, but could not find symbol zeInit in this library -- falling back to package config search")
endif(NOT ZE_LOADER_HAVE_ZEINIT)
endif(ZE_LOADER_HAVE_ZEINIT)
else(ZE_LOADER_LIBRARY AND LEVEL_ZERO_INCLUDE_DIR)
if(NOT ZE_LOADER_LIBRARY)
message(WARNING "Could not find ze_loader library under provided LEVEL_ZERO_ROOT_DIR='${LEVEL_ZERO_ROOT_DIR}' (tried subdirectories lib/ and lib64/) -- falling back to package config search")
endif(NOT ZE_LOADER_LIBRARY)
if(NOT LEVEL_ZERO_INCLUDE_DIR)
message(WARNING "Cound not find level_zero/ze_api.h under provided LEVEL_ZERO_ROOT_DIR=${LEVEL_ZERO_ROOT_DIR}' (tried subdirectory include) -- falling back to package config search")
endif(NOT LEVEL_ZERO_INCLUDE_DIR)
endif(ZE_LOADER_LIBRARY AND LEVEL_ZERO_INCLUDE_DIR)
endif(LEVEL_ZERO_ROOT_DIR)

if(NOT LEVEL_ZERO_FOUND)
find_package(PkgConfig QUIET)

if(PKG_CONFIG_FOUND)
pkg_check_modules(LEVEL_ZERO level-zero)
if(LEVEL_ZERO_FOUND)
pkg_get_variable(LEVEL_ZERO_LIBRARY_DIR level-zero libdir)
pkg_get_variable(LEVEL_ZERO_INCLUDE_DIR level-zero includedir)
#We double-check that the level-zero library is indeed where find_package claims it is
find_library(_PARSEC_ZE_LOADER_LIBRARY_FOUND ze_loader PATHS "${LEVEL_ZERO_LIBRARY_DIR}/libze_loader.so"
NO_DEFAULT_PATH NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_SYSTEM_PATH NO_CMAKE_INSTALL_PREFIX)
if( _PARSEC_ZE_LOADER_LIBRARY_FOUND )
add_library(level_zero::ze_loader UNKNOWN IMPORTED GLOBAL)
set_property(TARGET level_zero::ze_loader PROPERTY IMPORTED_LOCATION "${LEVEL_ZERO_LIBRARY_DIR}/libze_loader.so")
set_property(TARGET level_zero::ze_loader PROPERTY INTERFACE "${LEVEL_ZERO_INCLUDE_DIR}/level_zero/ze_api.h")
include_directories("${LEVEL_ZERO_INCLUDE_DIR}/")
else()
message(WARNING "level-zero was found in `${LEVEL_ZERO_LIBRARY_DIR}` and `${LEVEL_ZERO_INCLUDE_DIR}` according to pkg-config, but ze_loader library is not in `${LEVEL_ZERO_LIBRARY_DIR}/libze_loader.so`. Deactivating level-zero. Provide -DLEVEL_ZERO_ROOT_DIR to specify the location of level zero manually.")
set(LEVEL_ZERO_FOUND OFF CACHE BOOL "if level-zero was found" FORCE)
endif()
endif(LEVEL_ZERO_FOUND)
endif(PKG_CONFIG_FOUND)
endif(NOT LEVEL_ZERO_FOUND)
4 changes: 4 additions & 0 deletions ttg/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,10 @@ if (TTG_HAVE_HIPBLAS)
list(APPEND ttg-deps hip::host)
endif (TTG_HAVE_HIPBLAS)

if (TTG_HAVE_LEVEL_ZERO)
list(APPEND ttg-deps level_zero::ze_loader)
endif (TTG_HAVE_LEVEL_ZERO)

set(ttg-public-headers ${ttg-headers};${ttg-impl-headers};${ttg-base-headers};${ttg-util-headers};${ttg_device_headers})
if (NOT TTG_IGNORE_BUNDLED_EXTERNALS)
list(APPEND ttg-sources ${ttg-external-headers})
Expand Down

0 comments on commit 97d0bf6

Please sign in to comment.