From a02992f1313811c9905e44dc95a0aee31d707f67 Mon Sep 17 00:00:00 2001 From: Xavier Hallade Date: Wed, 29 Jun 2022 12:58:04 +0200 Subject: Cycles: Add support for rendering on Intel GPUs using oneAPI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Co-authored-by: Stefan Werner --- build_files/cmake/Modules/FindLevelZero.cmake | 56 ++++++++++++++++ build_files/cmake/Modules/FindSYCL.cmake | 88 +++++++++++++++++++++++++ build_files/cmake/config/blender_release.cmake | 11 +++- build_files/cmake/platform/platform_unix.cmake | 18 +++++ build_files/cmake/platform/platform_win32.cmake | 3 + 5 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 build_files/cmake/Modules/FindLevelZero.cmake create mode 100644 build_files/cmake/Modules/FindSYCL.cmake (limited to 'build_files/cmake') 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) -- cgit v1.2.3