diff options
author | Xavier Hallade <xavier.hallade@intel.com> | 2022-06-29 13:58:04 +0300 |
---|---|---|
committer | Xavier Hallade <xavier.hallade@intel.com> | 2022-06-29 13:58:04 +0300 |
commit | a02992f1313811c9905e44dc95a0aee31d707f67 (patch) | |
tree | 2d1f59524e2a298bb530ad578a2d2b9e2c4a1432 /build_files/cmake | |
parent | 302b04a5a3fc0e767ac784424f78ce2edf5d2844 (diff) |
Cycles: Add support for rendering on Intel GPUs using oneAPI
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>
Diffstat (limited to 'build_files/cmake')
-rw-r--r-- | build_files/cmake/Modules/FindLevelZero.cmake | 56 | ||||
-rw-r--r-- | build_files/cmake/Modules/FindSYCL.cmake | 88 | ||||
-rw-r--r-- | build_files/cmake/config/blender_release.cmake | 11 | ||||
-rw-r--r-- | build_files/cmake/platform/platform_unix.cmake | 18 | ||||
-rw-r--r-- | build_files/cmake/platform/platform_win32.cmake | 3 |
5 files changed, 175 insertions, 1 deletions
diff --git a/build_files/cmake/Modules/FindLevelZero.cmake b/build_files/cmake/Modules/FindLevelZero.cmake new file mode 100644 index 00000000000..a60d8ba9978 --- /dev/null +++ b/build_files/cmake/Modules/FindLevelZero.cmake @@ -0,0 +1,56 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright 2021-2022 Intel Corporation + +# - Find Level Zero library +# Find Level Zero headers and libraries needed by oneAPI implementation +# This module defines +# LEVEL_ZERO_LIBRARY, libraries to link against in order to use L0. +# LEVEL_ZERO_INCLUDE_DIR, directories where L0 headers can be found. +# LEVEL_ZERO_ROOT_DIR, The base directory to search for L0 files. +# This can also be an environment variable. +# LEVEL_ZERO_FOUND, If false, then don't try to use L0. + +IF(NOT LEVEL_ZERO_ROOT_DIR AND NOT $ENV{LEVEL_ZERO_ROOT_DIR} STREQUAL "") + SET(LEVEL_ZERO_ROOT_DIR $ENV{LEVEL_ZERO_ROOT_DIR}) +ENDIF() + +SET(_level_zero_search_dirs + ${LEVEL_ZERO_ROOT_DIR} + /usr/lib + /usr/local/lib +) + +FIND_LIBRARY(_LEVEL_ZERO_LIBRARY + NAMES + ze_loader + HINTS + ${_level_zero_search_dirs} + PATH_SUFFIXES + lib64 lib +) + +FIND_PATH(_LEVEL_ZERO_INCLUDE_DIR + NAMES + level_zero/ze_api.h + HINTS + ${_level_zero_search_dirs} + PATH_SUFFIXES + include +) + +INCLUDE(FindPackageHandleStandardArgs) + +FIND_PACKAGE_HANDLE_STANDARD_ARGS(LevelZero DEFAULT_MSG _LEVEL_ZERO_LIBRARY _LEVEL_ZERO_INCLUDE_DIR) + +IF(LevelZero_FOUND) + SET(LEVEL_ZERO_LIBRARY ${_LEVEL_ZERO_LIBRARY}) + SET(LEVEL_ZERO_INCLUDE_DIR ${_LEVEL_ZERO_INCLUDE_DIR} ${_LEVEL_ZERO_INCLUDE_PARENT_DIR}) + SET(LEVEL_ZERO_FOUND TRUE) +ELSE() + SET(LEVEL_ZERO_FOUND FALSE) +ENDIF() + +MARK_AS_ADVANCED( + LEVEL_ZERO_LIBRARY + LEVEL_ZERO_INCLUDE_DIR +) diff --git a/build_files/cmake/Modules/FindSYCL.cmake b/build_files/cmake/Modules/FindSYCL.cmake new file mode 100644 index 00000000000..ac90cbfbe43 --- /dev/null +++ b/build_files/cmake/Modules/FindSYCL.cmake @@ -0,0 +1,88 @@ +# 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 +) diff --git a/build_files/cmake/config/blender_release.cmake b/build_files/cmake/config/blender_release.cmake index 8ece5eec39e..42759fec7cc 100644 --- a/build_files/cmake/config/blender_release.cmake +++ b/build_files/cmake/config/blender_release.cmake @@ -70,7 +70,8 @@ if(NOT WIN32) set(WITH_JACK ON CACHE BOOL "" FORCE) endif() if(WIN32) - set(WITH_WASAPI ON CACHE BOOL "" FORCE) + set(WITH_WASAPI ON CACHE BOOL "" FORCE) + set(WITH_CYCLES_DEVICE_ONEAPI ON CACHE BOOL "" FORCE) endif() if(UNIX AND NOT APPLE) set(WITH_DOC_MANPAGE ON CACHE BOOL "" FORCE) @@ -78,6 +79,11 @@ if(UNIX AND NOT APPLE) set(WITH_PULSEAUDIO ON CACHE BOOL "" FORCE) set(WITH_X11_XINPUT ON CACHE BOOL "" FORCE) set(WITH_X11_XF86VMODE ON CACHE BOOL "" FORCE) + + # Disable oneAPI on Linux for the time being. + # The AoT compilation takes too long to be used officially in the buildbot CI/CD and the JIT + # compilation has ABI compatibility issues when running builds made on centOS on Ubuntu. + set(WITH_CYCLES_DEVICE_ONEAPI OFF CACHE BOOL "" FORCE) endif() if(NOT APPLE) set(WITH_XR_OPENXR ON CACHE BOOL "" FORCE) @@ -86,4 +92,7 @@ if(NOT APPLE) set(WITH_CYCLES_CUDA_BINARIES ON CACHE BOOL "" FORCE) set(WITH_CYCLES_CUBIN_COMPILER OFF CACHE BOOL "" FORCE) set(WITH_CYCLES_HIP_BINARIES ON CACHE BOOL "" FORCE) + + # Disable AoT kernels compilations until buildbot can deliver them in a reasonabel time. + set(WITH_CYCLES_ONEAPI_BINARIES OFF CACHE BOOL "" FORCE) endif() diff --git a/build_files/cmake/platform/platform_unix.cmake b/build_files/cmake/platform/platform_unix.cmake index 2d003f276e8..dff860d9876 100644 --- a/build_files/cmake/platform/platform_unix.cmake +++ b/build_files/cmake/platform/platform_unix.cmake @@ -38,9 +38,15 @@ if(EXISTS ${LIBDIR}) message(STATUS "Using pre-compiled LIBDIR: ${LIBDIR}") file(GLOB LIB_SUBDIRS ${LIBDIR}/*) + # Ignore Mesa software OpenGL libraries, they are not intended to be # linked against but to optionally override at runtime. list(REMOVE_ITEM LIB_SUBDIRS ${LIBDIR}/mesa) + + # Ignore DPC++ as it contains its own copy of LLVM/CLang which we do + # not need to be ever discovered for the Blender linking. + list(REMOVE_ITEM LIB_SUBDIRS ${LIBDIR}/dpcpp) + # NOTE: Make sure "proper" compiled zlib comes first before the one # which is a part of OpenCollada. They have different ABI, and we # do need to use the official one. @@ -271,6 +277,18 @@ if(WITH_CYCLES AND WITH_CYCLES_OSL) endif() endif() +if(WITH_CYCLES_DEVICE_ONEAPI) + set(CYCLES_LEVEL_ZERO ${LIBDIR}/level-zero CACHE PATH "Path to Level Zero installation") + if(EXISTS ${CYCLES_LEVEL_ZERO} AND NOT LEVEL_ZERO_ROOT_DIR) + set(LEVEL_ZERO_ROOT_DIR ${CYCLES_LEVEL_ZERO}) + endif() + + set(CYCLES_SYCL ${LIBDIR}/dpcpp CACHE PATH "Path to DPC++ and SYCL installation") + if(EXISTS ${CYCLES_SYCL} AND NOT SYCL_ROOT_DIR) + set(SYCL_ROOT_DIR ${CYCLES_SYCL}) + endif() +endif() + if(WITH_OPENVDB) find_package_wrapper(OpenVDB) find_package_wrapper(Blosc) diff --git a/build_files/cmake/platform/platform_win32.cmake b/build_files/cmake/platform/platform_win32.cmake index 40c25abd585..7e272ea26b0 100644 --- a/build_files/cmake/platform/platform_win32.cmake +++ b/build_files/cmake/platform/platform_win32.cmake @@ -950,3 +950,6 @@ endif() set(ZSTD_INCLUDE_DIRS ${LIBDIR}/zstd/include) set(ZSTD_LIBRARIES ${LIBDIR}/zstd/lib/zstd_static.lib) + +set(LEVEL_ZERO_ROOT_DIR ${LIBDIR}/level_zero) +set(SYCL_ROOT_DIR ${LIBDIR}/dpcpp) |