Skip to content

[SYCL][Cmake] Redesign OpenCL dependencies #3485

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
Apr 30, 2021
11 changes: 1 addition & 10 deletions buildbot/configure.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,14 @@ def do_configure(args):
if not os.path.isdir(abs_obj_dir):
os.makedirs(abs_obj_dir)

llvm_external_projects = 'sycl;llvm-spirv;opencl-aot;libdevice;xpti;xptifw'
llvm_external_projects = 'sycl;llvm-spirv;opencl;opencl-aot;libdevice;xpti;xptifw'

llvm_dir = os.path.join(abs_src_dir, "llvm")
sycl_dir = os.path.join(abs_src_dir, "sycl")
spirv_dir = os.path.join(abs_src_dir, "llvm-spirv")
xpti_dir = os.path.join(abs_src_dir, "xpti")
xptifw_dir = os.path.join(abs_src_dir, "xptifw")
libdevice_dir = os.path.join(abs_src_dir, "libdevice")
ocl_header_dir = os.path.join(abs_obj_dir, "OpenCL-Headers")
icd_loader_lib = os.path.join(abs_obj_dir, "OpenCL-ICD-Loader", "build")
llvm_targets_to_build = 'X86'
llvm_enable_projects = 'clang;' + llvm_external_projects
libclc_targets_to_build = ''
Expand All @@ -34,7 +32,6 @@ def do_configure(args):
llvm_build_shared_libs = 'OFF'

sycl_enable_xpti_tracing = 'ON'
icd_loader_lib = os.path.join(icd_loader_lib, "libOpenCL.so" if platform.system() == 'Linux' else "OpenCL.lib")

# replace not append, so ARM ^ X86
if args.arm:
Expand Down Expand Up @@ -87,11 +84,6 @@ def do_configure(args):
"-DSYCL_ENABLE_XPTI_TRACING={}".format(sycl_enable_xpti_tracing)
]

if args.system_ocl:
cmake_cmd.extend([
"-DOpenCL_INCLUDE_DIR={}".format(ocl_header_dir),
"-DOpenCL_LIBRARY={}".format(icd_loader_lib)])

if args.l0_headers and args.l0_loader:
cmake_cmd.extend([
"-DL0_INCLUDE_DIR={}".format(args.l0_headers),
Expand Down Expand Up @@ -150,7 +142,6 @@ def main():
parser.add_argument("--arm", action='store_true', help="build ARM support rather than x86")
parser.add_argument("--no-assertions", action='store_true', help="build without assertions")
parser.add_argument("--docs", action='store_true', help="build Doxygen documentation")
parser.add_argument("--system-ocl", action='store_true', help="use OpenCL deps from system (no download)")
parser.add_argument("--no-werror", action='store_true', help="Don't treat warnings as errors")
parser.add_argument("--shared-libs", action='store_true', help="Build shared libraries")
parser.add_argument("--cmake-opt", action='append', help="Additional CMake option not configured via script parameters")
Expand Down
71 changes: 71 additions & 0 deletions opencl/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
cmake_minimum_required(VERSION 3.14)

include(FetchContent)

# Repo URLs

set(OCL_HEADERS_REPO
"https://github.com/KhronosGroup/OpenCL-Headers.git")
set(OCL_LOADER_REPO
"https://github.com/KhronosGroup/OpenCL-ICD-Loader.git")

# Repo tags/hashes

set(OCL_HEADERS_TAG 23710f1b99186065c1768fc3098ba681adc0f253)
set(OCL_LOADER_TAG 5f8249691ec8c25775789498951f8e9eb62c201d)

# OpenCL Headers
if(NOT OpenCL_HEADERS)
message(STATUS "Will fetch OpenCL headers from github.com")

FetchContent_Declare(ocl-headers
GIT_REPOSITORY ${OCL_HEADERS_REPO}
GIT_TAG ${OCL_HEADERS_TAG}
)
else()
message(STATUS "OpenCL headers are added manually ${OpenCL_HEADERS}")

FetchContent_Declare(ocl-headers
URL ${OpenCL_HEADERS}
)
endif()

FetchContent_MakeAvailable(ocl-headers)
FetchContent_GetProperties(ocl-headers)
set(OpenCL_INCLUDE_DIR
${ocl-headers_SOURCE_DIR} CACHE PATH "Path to OpenCL Headers")

target_compile_definitions(Headers INTERFACE -DCL_TARGET_OPENCL_VERSION=220)
add_library(OpenCL-Headers ALIAS Headers)

# OpenCL Library (ICD Loader)

# Set OPENCL_ICD_LOADER_HEADERS_DIR, as prerequisite for ICD build
set(OPENCL_ICD_LOADER_HEADERS_DIR
${OpenCL_INCLUDE_DIR} CACHE PATH "Path to OpenCL Headers")

# LLVM build sets this OFF by default, but we need OpenCL to be built as shared
# library.
set(BUILD_SHARED_LIBS ON)

if(NOT OpenCL_LIBRARY_SRC)
message(STATUS "Will fetch OpenCL ICD Loader from github.com")

FetchContent_Declare(ocl-icd
GIT_REPOSITORY ${OCL_LOADER_REPO}
GIT_TAG ${OCL_LOADER_TAG}
)
else()
# TODO: add possibility to use prebuilt OpenCL library rather than building
# together with llvm.
message(STATUS
"OpenCL ICD Loader sources added manually ${OpenCL_LIBRARY_SRC}")

FetchContent_Declare(ocl-icd
URL ${OpenCL_LIBRARY_SRC}
)
endif()

FetchContent_MakeAvailable(ocl-icd)
add_library(OpenCL-ICD ALIAS OpenCL)

144 changes: 18 additions & 126 deletions sycl/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -71,130 +71,22 @@ set(SYCL_INCLUDE_DIR "include")
set(SYCL_INCLUDE_BUILD_DIR ${LLVM_BINARY_DIR}/${SYCL_INCLUDE_DIR})
set(SYCL_INCLUDE_DEPLOY_DIR ${CMAKE_INSTALL_PREFIX}/${SYCL_INCLUDE_DIR})

# Find OpenCL headers and libraries installed in the system and use them to
# build SYCL runtime.
# WARNING: use with caution, building SYCL runtime with OpenCL implementation
# instead of Khronos ICD loader might cause build and/or portability issues.
option(OpenCL_BUILD_WITH_SYSTEM_SDK "Build SYCL with OpenCL coming from the build system" OFF)

if( (OpenCL_INCLUDE_DIR AND OpenCL_LIBRARY) OR OpenCL_BUILD_WITH_SYSTEM_SDK)
find_package(OpenCL)
add_llvm_external_project(opencl)
list(FIND LLVM_ENABLE_PROJECTS opencl OPENCL_FOUND)
if(OPENCL_FOUND EQUAL -1)
message(FATAL_ERROR "opencl external project required but not found.")
endif()

include(ExternalProject)

# By default, whenever cmake is re-run, the external project's sources will be
# updated, which might be annoying - let's have a possibility to disable that as
# not every external project which is used here is being updated often
# Single toggle to control all external projects
option(SYCL_EXTERNAL_PROJECTS_SKIP_AUTO_UPDATE
"Perform automatic update step for external projects (OpenCL Headers, OpenCL ICD, etc.)" OFF)
# More precise controls for each particular external project are documented
# near each ExternalProject_Add

if( NOT OpenCL_INCLUDE_DIRS )
message(STATUS "OpenCL_INCLUDE_DIRS is missing. Will try to download OpenCL headers from github.com")
set(OpenCL_INCLUDE_DIRS "${CMAKE_CURRENT_BINARY_DIR}/OpenCL/inc")
if (NOT DEFINED SYCL_EP_OCL_HEADERS_SKIP_AUTO_UPDATE)
set(SYCL_EP_OCL_HEADERS_SKIP_AUTO_UPDATE ${SYCL_EXTERNAL_PROJECTS_SKIP_AUTO_UPDATE})
endif()
ExternalProject_Add(ocl-headers
GIT_REPOSITORY https://github.com/KhronosGroup/OpenCL-Headers.git
GIT_TAG 23710f1b99186065c1768fc3098ba681adc0f253
UPDATE_DISCONNECTED ${SYCL_EP_OCL_HEADERS_SKIP_AUTO_UPDATE}
SOURCE_DIR ${OpenCL_INCLUDE_DIRS}
CONFIGURE_COMMAND ""
BUILD_COMMAND ${CMAKE_COMMAND} -E copy_directory ${OpenCL_INCLUDE_DIRS}/CL ${SYCL_INCLUDE_BUILD_DIR}/sycl/CL
INSTALL_COMMAND ""
STEP_TARGETS build
COMMENT "Downloading OpenCL headers."
LOG_DOWNLOAD 1
LOG_UPDATE 1
LOG_BUILD 1
)
add_definitions(-DCL_TARGET_OPENCL_VERSION=220)
else()
add_custom_target( ocl-headers ALL
DEPENDS ${OpenCL_INCLUDE_DIRS}
COMMAND ${CMAKE_COMMAND} -E copy_directory ${OpenCL_INCLUDE_DIRS}/CL ${SYCL_INCLUDE_BUILD_DIR}/sycl/CL
COMMENT "Copying OpenCL headers ..."
)
endif()
# Copy OpenCL Headers into sycl headers build directory
# Compiler does automatic lookup bin/../include based on clang binary location,
# e.g. when run LIT tests
file(COPY ${OpenCL_INCLUDE_DIR}/CL
DESTINATION ${SYCL_INCLUDE_BUILD_DIR}/sycl)

if( NOT OpenCL_LIBRARIES )
message(STATUS "OpenCL_LIBRARIES is missing. Will try to download OpenCL ICD Loader from github.com")
if(MSVC)
set(OpenCL_LIBRARIES
"${LLVM_LIBRARY_OUTPUT_INTDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}OpenCL${CMAKE_STATIC_LIBRARY_SUFFIX}")
list(APPEND AUX_CMAKE_FLAGS -DOPENCL_ICD_LOADER_REQUIRE_WDK=OFF)
else()
set(OpenCL_LIBRARIES
"${LLVM_LIBRARY_OUTPUT_INTDIR}/${CMAKE_SHARED_LIBRARY_PREFIX}OpenCL${CMAKE_SHARED_LIBRARY_SUFFIX}")
endif()
if (CMAKE_C_COMPILER)
list(APPEND AUX_CMAKE_FLAGS -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER})
endif()
if (CMAKE_CXX_COMPILER)
list(APPEND AUX_CMAKE_FLAGS -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER})
endif()
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/icd_build)
set(OpenCL_ICD_LOADER_SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/OpenCL/icd")
if (NOT DEFINED SYCL_EP_OCL_ICD_SKIP_AUTO_UPDATE)
set(SYCL_EP_OCL_ICD_SKIP_AUTO_UPDATE ${SYCL_EXTERNAL_PROJECTS_SKIP_AUTO_UPDATE})
endif()
ExternalProject_Add(ocl-icd
GIT_REPOSITORY https://github.com/KhronosGroup/OpenCL-ICD-Loader.git
GIT_TAG 5f8249691ec8c25775789498951f8e9eb62c201d
UPDATE_DISCONNECTED ${SYCL_EP_OCL_ICD_SKIP_AUTO_UPDATE}
SOURCE_DIR ${OpenCL_ICD_LOADER_SOURCE_DIR}
BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/icd_build"
INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/icd_install"
CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}
-DOPENCL_ICD_LOADER_HEADERS_DIR=${OpenCL_INCLUDE_DIRS}
-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
-DCMAKE_INSTALL_LIBDIR:PATH=lib${LLVM_LIBDIR_SUFFIX}
${AUX_CMAKE_FLAGS}
STEP_TARGETS configure,build,install
DEPENDS ocl-headers
BUILD_BYPRODUCTS ${OpenCL_LIBRARIES}
LOG_DOWNLOAD 1
LOG_UPDATE 1
LOG_CONFIGURE 1
LOG_BUILD 1
LOG_INSTALL 1
)
ExternalProject_Add_Step(ocl-icd llvminstall
COMMAND ${CMAKE_COMMAND} -E copy_directory <INSTALL_DIR>/ ${LLVM_BINARY_DIR}
COMMENT "Installing ocl-icd into the LLVM binary directory"
DEPENDEES install
)
# Optionally install the ICD library along with LLVM.
option(OpenCL_INSTALL_KHRONOS_ICD_LOADER
"Install the Khronos ICD Loader built as part of LLVM" OFF)
if (OpenCL_INSTALL_KHRONOS_ICD_LOADER)
install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/icd_install/"
DESTINATION "."
COMPONENT opencl-icd
)
endif()
else()
file(GLOB ICD_LOADER_SRC "${OpenCL_LIBRARIES}*")
file(COPY ${ICD_LOADER_SRC} DESTINATION ${LLVM_LIBRARY_OUTPUT_INTDIR})
add_custom_target(ocl-icd DEPENDS ${OpenCL_LIBRARIES} COMMENT "Copying OpenCL ICD Loader ...")
endif()

set(OPENCL_INCLUDE "${OpenCL_INCLUDE_DIRS}")

add_library (OpenCL-Headers INTERFACE)
add_library (OpenCL::Headers ALIAS OpenCL-Headers)
target_include_directories(OpenCL-Headers
INTERFACE ${OPENCL_INCLUDE}
)
install(DIRECTORY ${OPENCL_INCLUDE}/CL
DESTINATION ${SYCL_INCLUDE_DEPLOY_DIR}/sycl
COMPONENT opencl-headers
)
# Include OpenCL Headers into final bundle.
install(DIRECTORY ${OpenCL_INCLUDE_DIR}/CL
DESTINATION ${SYCL_INCLUDE_DEPLOY_DIR}/sycl
COMPONENT OpenCL-Headers)

option(SYCL_BUILD_PI_CUDA
"Enables the CUDA backend for the Plugin Interface" OFF)
Expand All @@ -207,13 +99,13 @@ string(TIMESTAMP __SYCL_COMPILER_VERSION "%Y%m%d")
set(version_header "${sycl_inc_dir}/CL/sycl/version.hpp")
configure_file("${version_header}.in" "${version_header}")

# Copy SYCL headers
# Copy SYCL headers from sources to build directory
add_custom_target(sycl-headers ALL
COMMAND ${CMAKE_COMMAND} -E copy_directory ${sycl_inc_dir}/sycl ${SYCL_INCLUDE_BUILD_DIR}/sycl
COMMAND ${CMAKE_COMMAND} -E copy_directory ${sycl_inc_dir}/CL ${SYCL_INCLUDE_BUILD_DIR}/sycl/CL
COMMENT "Copying SYCL headers ...")

# Configure SYCL headers
# Copy SYCL headers from sources to install directory
install(DIRECTORY "${sycl_inc_dir}/sycl" DESTINATION ${SYCL_INCLUDE_DEPLOY_DIR} COMPONENT sycl-headers)
install(DIRECTORY "${sycl_inc_dir}/CL" DESTINATION ${SYCL_INCLUDE_DEPLOY_DIR}/sycl COMPONENT sycl-headers)

Expand Down Expand Up @@ -353,7 +245,7 @@ set( SYCL_TOOLCHAIN_DEPLOY_COMPONENTS
sycl-post-link
sycl-ls
clang-resource-headers
opencl-headers
OpenCL-Headers
sycl-headers
sycl-headers-extras
sycl
Expand All @@ -363,8 +255,8 @@ set( SYCL_TOOLCHAIN_DEPLOY_COMPONENTS
${XPTIFW_LIBS}
)

if(OpenCL_INSTALL_KHRONOS_ICD_LOADER AND TARGET ocl-icd)
list(APPEND SYCL_TOOLCHAIN_DEPLOY_COMPONENTS opencl-icd)
if(OpenCL_INSTALL_KHRONOS_ICD_LOADER AND TARGET OpenCL-ICD)
list(APPEND SYCL_TOOLCHAIN_DEPLOY_COMPONENTS OpenCL-ICD)
endif()

if(SYCL_BUILD_PI_CUDA)
Expand Down
14 changes: 6 additions & 8 deletions sycl/plugins/cuda/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ find_package(CUDA 10.1 REQUIRED)
add_library(cudadrv SHARED IMPORTED GLOBAL)

set_target_properties(
cudadrv PROPERTIES
cudadrv PROPERTIES
IMPORTED_LOCATION ${CUDA_CUDA_LIBRARY}
INTERFACE_INCLUDE_DIRECTORIES ${CUDA_INCLUDE_DIRS}
)
Expand All @@ -22,22 +22,20 @@ add_library(pi_cuda SHARED
"pi_cuda.cpp"
)

add_dependencies(pi_cuda
ocl-headers
)

add_dependencies(sycl-toolchain pi_cuda)

set_target_properties(pi_cuda PROPERTIES LINKER_LANGUAGE CXX)

target_include_directories(pi_cuda
PRIVATE
${sycl_inc_dir}
PUBLIC
${CUDA_INCLUDE_DIRS}
)

target_link_libraries(pi_cuda PUBLIC OpenCL-Headers cudadrv)
target_link_libraries(pi_cuda
PRIVATE
OpenCL-Headers
cudadrv
)

add_common_options(pi_cuda)

Expand Down
18 changes: 13 additions & 5 deletions sycl/plugins/level_zero/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@ if (NOT DEFINED LEVEL_ZERO_LIBRARY OR NOT DEFINED LEVEL_ZERO_INCLUDE_DIR)
if (NOT DEFINED SYCL_EP_LEVEL_ZERO_LOADER_SKIP_AUTO_UPDATE)
set(SYCL_EP_LEVEL_ZERO_LOADER_SKIP_AUTO_UPDATE ${SYCL_EXTERNAL_PROJECTS_SKIP_AUTO_UPDATE})
endif()

#TODO: Replace ExternalProject with FetchContent for better maintainance and
# cmake files simplification
include(ExternalProject)
if (WIN32)
set(LEVEL_ZERO_LOADER_SOURCE_VERSION v1.0.16)
else()
Expand All @@ -35,7 +39,6 @@ if (NOT DEFINED LEVEL_ZERO_LIBRARY OR NOT DEFINED LEVEL_ZERO_INCLUDE_DIR)
INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/level_zero_loader_install"
CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}
-DOpenCL_INCLUDE_DIR=${OpenCL_INCLUDE_DIRS}
-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
-DCMAKE_INSTALL_LIBDIR:PATH=lib${LLVM_LIBDIR_SUFFIX}
${AUX_CMAKE_FLAGS}
Expand All @@ -45,7 +48,7 @@ if (NOT DEFINED LEVEL_ZERO_LIBRARY OR NOT DEFINED LEVEL_ZERO_INCLUDE_DIR)
LOG_BUILD 1
LOG_INSTALL 1
STEP_TARGETS configure,build,install
DEPENDS ocl-headers
DEPENDS OpenCL-Headers
BUILD_BYPRODUCTS ${LEVEL_ZERO_LOADER}
)
ExternalProject_Add_Step(level-zero-loader llvminstall
Expand Down Expand Up @@ -96,8 +99,8 @@ target_include_directories(LevelZeroLoader-Headers
INTERFACE "${LEVEL_ZERO_INCLUDE_DIR}"
)


include_directories("${sycl_inc_dir}")
include_directories(${OPENCL_INCLUDE})

add_library(pi_level_zero SHARED
"${sycl_inc_dir}/CL/sycl/detail/pi.h"
Expand Down Expand Up @@ -130,9 +133,14 @@ endif()
if (TARGET level-zero-loader)
add_dependencies(pi_level_zero level-zero-loader)
endif()
add_dependencies(sycl-toolchain pi_level_zero)

target_link_libraries(pi_level_zero PRIVATE "${LEVEL_ZERO_LOADER}")
add_dependencies(sycl-toolchain pi_level_zero)
target_link_libraries(pi_level_zero
PRIVATE
"${LEVEL_ZERO_LOADER}"
OpenCL-Headers
)

if (UNIX)
target_link_libraries(pi_level_zero PRIVATE pthread)
endif()
Expand Down
Loading