This patch adds a new Cycles device with similar functionality to the existing GPU devices. Kernel compilation and runtime interaction happen via oneAPI DPC++ compiler and SYCL API. This implementation is primarly focusing on Intel® Arc™ GPUs and other future Intel GPUs. The first supported drivers are 101.1660 on Windows and 22.10.22597 on Linux. The necessary tools for compilation are: - A SYCL compiler such as oneAPI DPC++ compiler or https://github.com/intel/llvm - Intel® oneAPI Level Zero which is used for low level device queries: https://github.com/oneapi-src/level-zero - To optionally generate prebuilt graphics binaries: Intel® Graphics Compiler All are included in Linux precompiled libraries on svn: https://svn.blender.org/svnroot/bf-blender/trunk/lib The same goes for Windows precompiled binaries but for the graphics compiler, available as "Intel® Graphics Offline Compiler for OpenCL™ Code" from https://www.intel.com/content/www/us/en/developer/articles/tool/oneapi-standalone-components.html, for which path can be set as OCLOC_INSTALL_DIR. Being based on the open SYCL standard, this implementation could also be extended to run on other compatible non-Intel hardware in the future. Reviewed By: sergey, brecht Differential Revision: https://developer.blender.org/D15254 Co-authored-by: Nikita Sirgienko <nikita.sirgienko@intel.com> Co-authored-by: Stefan Werner <stefan.werner@intel.com>
89 lines
2.1 KiB
CMake
89 lines
2.1 KiB
CMake
# SPDX-License-Identifier: BSD-3-Clause
|
|
# Copyright 2021-2022 Intel Corporation
|
|
|
|
# - Find SYCL library
|
|
# Find the native SYCL header and libraries needed by oneAPI implementation
|
|
# This module defines
|
|
# SYCL_COMPILER, compiler which will be used for compilation of SYCL code
|
|
# SYCL_LIBRARY, libraries to link against in order to use SYCL.
|
|
# SYCL_INCLUDE_DIR, directories where SYCL headers can be found
|
|
# SYCL_ROOT_DIR, The base directory to search for SYCL files.
|
|
# This can also be an environment variable.
|
|
# SYCL_FOUND, If false, then don't try to use SYCL.
|
|
|
|
IF(NOT SYCL_ROOT_DIR AND NOT $ENV{SYCL_ROOT_DIR} STREQUAL "")
|
|
SET(SYCL_ROOT_DIR $ENV{SYCL_ROOT_DIR})
|
|
ENDIF()
|
|
|
|
SET(_sycl_search_dirs
|
|
${SYCL_ROOT_DIR}
|
|
/usr/lib
|
|
/usr/local/lib
|
|
/opt/intel/oneapi/compiler/latest/linux/
|
|
C:/Program\ Files\ \(x86\)/Intel/oneAPI/compiler/latest/windows
|
|
)
|
|
|
|
# Find DPC++ compiler.
|
|
# Since the compiler name is possibly conflicting with the system-wide
|
|
# CLang start with looking for either dpcpp or clang binary in the given
|
|
# list of search paths only. If that fails, try to look for a system-wide
|
|
# dpcpp binary.
|
|
FIND_PROGRAM(SYCL_COMPILER
|
|
NAMES
|
|
dpcpp
|
|
clang++
|
|
HINTS
|
|
${_sycl_search_dirs}
|
|
PATH_SUFFIXES
|
|
bin
|
|
NO_CMAKE_FIND_ROOT_PATH
|
|
NAMES_PER_DIR
|
|
)
|
|
|
|
# NOTE: No clang++ here so that we do not pick up a system-wide CLang
|
|
# compiler.
|
|
if(NOT SYCL_COMPILER)
|
|
FIND_PROGRAM(SYCL_COMPILER
|
|
NAMES
|
|
dpcpp
|
|
HINTS
|
|
${_sycl_search_dirs}
|
|
PATH_SUFFIXES
|
|
bin
|
|
)
|
|
endif()
|
|
|
|
FIND_LIBRARY(SYCL_LIBRARY
|
|
NAMES
|
|
sycl
|
|
HINTS
|
|
${_sycl_search_dirs}
|
|
PATH_SUFFIXES
|
|
lib64 lib
|
|
)
|
|
|
|
FIND_PATH(SYCL_INCLUDE_DIR
|
|
NAMES
|
|
CL/sycl.hpp
|
|
HINTS
|
|
${_sycl_search_dirs}
|
|
PATH_SUFFIXES
|
|
include
|
|
include/sycl
|
|
)
|
|
|
|
INCLUDE(FindPackageHandleStandardArgs)
|
|
|
|
FIND_PACKAGE_HANDLE_STANDARD_ARGS(SYCL DEFAULT_MSG SYCL_LIBRARY SYCL_INCLUDE_DIR)
|
|
|
|
IF(SYCL_FOUND)
|
|
get_filename_component(_SYCL_INCLUDE_PARENT_DIR ${SYCL_INCLUDE_DIR} DIRECTORY)
|
|
SET(SYCL_INCLUDE_DIR ${SYCL_INCLUDE_DIR} ${_SYCL_INCLUDE_PARENT_DIR})
|
|
ELSE()
|
|
SET(SYCL_SYCL_FOUND FALSE)
|
|
ENDIF()
|
|
|
|
MARK_AS_ADVANCED(
|
|
_SYCL_INCLUDE_PARENT_DIR
|
|
)
|