Skip to content
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