[Bf-blender-cvs] [766d4303724] cycles_oneapi: CMake: Build oneAPI kernel via add_custom_command()

Stefan Werner noreply at git.blender.org
Mon Apr 4 09:56:54 CEST 2022


Commit: 766d4303724a36cc82e02bd05bd4dea9167d8446
Author: Stefan Werner
Date:   Sun Apr 3 23:44:08 2022 +0200
Branches: cycles_oneapi
https://developer.blender.org/rB766d4303724a36cc82e02bd05bd4dea9167d8446

CMake: Build oneAPI kernel via add_custom_command()

Bringing Linux and Windows calls to dpcpp compiler closer together.
Addtionally moving oneAPI DLL to scripts/addons/cycles/lib.

===================================================================

M	build_files/cmake/platform/platform_unix.cmake
M	intern/cycles/cmake/external_libs.cmake
M	intern/cycles/device/CMakeLists.txt
M	intern/cycles/device/oneapi/device.cpp
M	intern/cycles/device/oneapi/device_impl.h
M	intern/cycles/device/oneapi/queue.h
D	intern/cycles/device/oneapi/sycl.h
D	intern/cycles/device/oneapi/util.cpp
D	intern/cycles/device/oneapi/util.h
M	intern/cycles/kernel/CMakeLists.txt
D	intern/cycles/kernel/device/oneapi/CMakeLists.txt
M	intern/cycles/kernel/device/oneapi/kernel.h
D	intern/cycles/kernel/device/oneapi/vs2019_aot_config_file.props.cmake
D	intern/cycles/kernel/device/oneapi/vs2019_config_file.props.cmake
M	source/creator/CMakeLists.txt

===================================================================

diff --git a/build_files/cmake/platform/platform_unix.cmake b/build_files/cmake/platform/platform_unix.cmake
index cc168476d5d..3be468daccc 100644
--- a/build_files/cmake/platform/platform_unix.cmake
+++ b/build_files/cmake/platform/platform_unix.cmake
@@ -268,6 +268,13 @@ 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()
+endif()
+
 if(WITH_OPENVDB)
   find_package_wrapper(OpenVDB)
   find_package_wrapper(Blosc)
diff --git a/intern/cycles/cmake/external_libs.cmake b/intern/cycles/cmake/external_libs.cmake
index 483b2365658..5d507c1599a 100644
--- a/intern/cycles/cmake/external_libs.cmake
+++ b/intern/cycles/cmake/external_libs.cmake
@@ -72,7 +72,7 @@ if(CYCLES_STANDALONE_REPOSITORY)
     _set_default(TBB_ROOT_DIR "${_cycles_lib_dir}/tbb")
     _set_default(TIFF_ROOT "${_cycles_lib_dir}/tiff")
     _set_default(ZLIB_ROOT "${_cycles_lib_dir}/zlib")
-    _set_default(LEVEL_ZERO_ROOT_DIR "${_cycles_lib_dir}/level_zero")
+    _set_default(LEVEL_ZERO_ROOT_DIR "${_cycles_lib_dir}/level-zero")
 
     # Ignore system libraries
     set(CMAKE_IGNORE_PATH "${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES};${CMAKE_SYSTEM_INCLUDE_PATH};${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES};${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES}")
diff --git a/intern/cycles/device/CMakeLists.txt b/intern/cycles/device/CMakeLists.txt
index ea7005ab254..efc6a514ba1 100644
--- a/intern/cycles/device/CMakeLists.txt
+++ b/intern/cycles/device/CMakeLists.txt
@@ -84,15 +84,12 @@ set(SRC_HIP
 )
 
 set(SRC_ONEAPI
-  oneapi/sycl.h
   oneapi/device_impl.cpp
   oneapi/device_impl.h
   oneapi/device.cpp
   oneapi/device.h
   oneapi/queue.cpp
   oneapi/queue.h
-  oneapi/util.cpp
-  oneapi/util.h
 )
 
 set(SRC_DUMMY
@@ -175,135 +172,6 @@ if(WITH_CYCLES_DEVICE_HIP AND WITH_HIP_DYNLOAD)
   )
 endif()
 
-# Build kernel here for linking with device below
-if (WITH_CYCLES_DEVICE_ONEAPI)
-  include(ExternalProject)
-
-  add_definitions(-DWITH_ONEAPI)
-  if (WITH_CYCLES_ONEAPI_SYCL_HOST_ENABLED)
-    add_definitions(-DWITH_ONEAPI_SYCL_HOST_ENABLED)
-  endif()
-  set(oneapi_kernel_library_filename ${CMAKE_SHARED_LIBRARY_PREFIX}cycles_kernel_oneapi${CMAKE_SHARED_LIBRARY_SUFFIX})
-
-  # Pass a lot of include directories
-  get_property(CORRECT_CYCLES_INCLUDE_DIRS DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES)
-  string(REPLACE ";" "&" CORRECT_CYCLES_INCLUDE_DIRS_ESCAPED "${CORRECT_CYCLES_INCLUDE_DIRS}")
-
-  # Get sycl library directory
-  get_filename_component(SYCL_LIBRARY_DIR "${SYCL_LIBRARY}" DIRECTORY)
-
-  set (ONEAPI_KERNEL_BUILD_TYPE ${CMAKE_BUILD_TYPE})
-  if (WITH_CYCLES_ONEAPI_BINARIES AND NOT GENERATOR_IS_MULTI_CONFIG)
-    #NOTE(sirginko) Disable this, when GPU AOT will work with Debug information (for Debug and RelWithDebInfo builds)
-    message(STATUS "Change ONEAPI_KERNEL_BUILD_TYPE value from \"${ONEAPI_KERNEL_BUILD_TYPE}\" to \"Release\", because other builds don't work for GPU AOT yet")
-    set(ONEAPI_KERNEL_BUILD_TYPE "Release")
-  endif()
-
-  if (GENERATOR_IS_MULTI_CONFIG AND CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
-    set(ONEAPI_KERNEL_CMAKE_GENERATOR_TOOLSET "Intel(R) oneAPI DPC++ Compiler 2022")
-    ExternalProject_Add(
-      oneapi_kernel
-      DOWNLOAD_COMMAND ""
-      SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../kernel/device/oneapi
-      CMAKE_ARGS
-      -DCMAKE_CXX_COMPILER:STRING=${SYCL_DPCPP_COMPILER}
-      -DCMAKE_GENERATOR_TOOLSET=${ONEAPI_KERNEL_CMAKE_GENERATOR_TOOLSET}
-      -DWITH_CYCLES_ONEAPI_BINARIES:BOOL=${WITH_CYCLES_ONEAPI_BINARIES}
-      -DCYCLES_ONEAPI_SYCL_TARGET:STRING=${CYCLES_ONEAPI_SYCL_TARGET}
-      -DCYCLES_ONEAPI_AOT_TARGETS:STRING=${CYCLES_ONEAPI_AOT_TARGETS}
-      -DCYCLES_ONEAPI_GPU_COMPILATION_OPTIONS:STRING=${CYCLES_ONEAPI_GPU_COMPILATION_OPTIONS}
-      -DWITH_CYCLES_ONEAPI_SYCL_HOST_ENABLED:BOOL=${WITH_CYCLES_ONEAPI_SYCL_HOST_ENABLED}
-      -DWITH_NANOVDB:BOOL=${WITH_NANOVDB}
-      -DNANOVDB_INCLUDE_DIR=${NANOVDB_INCLUDE_DIR}
-      -DSYCL_INCLUDE_DIR=${SYCL_INCLUDE_DIR}
-      -DSYCL_LIBRARY_DIR=${SYCL_LIBRARY_DIR}
-      -DLEVEL_ZERO_LIBRARY=${LEVEL_ZERO_LIBRARY}
-      -DLEVEL_ZERO_INCLUDE_DIR=${LEVEL_ZERO_INCLUDE_DIR}
-      -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=TRUE
-      -DCYCLES_INCLUDE_DIRS_ESCAPED:STRING=${CORRECT_CYCLES_INCLUDE_DIRS_ESCAPED}&${CMAKE_CURRENT_SOURCE_DIR}/..
-      -DORIGINALCMAKE_CXX_COMPILER_ID=${CMAKE_CXX_COMPILER_ID}
-      INSTALL_COMMAND ""
-      BUILD_ALWAYS TRUE
-      STEP_TARGETS build
-      EXCLUDE_FROM_ALL TRUE
-    )
-  else()
-    ExternalProject_Add(
-      oneapi_kernel
-      DOWNLOAD_COMMAND ""
-      SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../kernel/device/oneapi
-      CMAKE_ARGS
-      -DCMAKE_BUILD_TYPE:STRING=${ONEAPI_KERNEL_BUILD_TYPE}
-      -DWITH_CYCLES_ONEAPI_BINARIES:BOOL=${WITH_CYCLES_ONEAPI_BINARIES}
-      -DCYCLES_ONEAPI_SYCL_TARGET:STRING=${CYCLES_ONEAPI_SYCL_TARGET}
-      -DCYCLES_ONEAPI_AOT_TARGETS:STRING=${CYCLES_ONEAPI_AOT_TARGETS}
-      -DWITH_CYCLES_ONEAPI_SYCL_HOST_ENABLED:BOOL=${WITH_CYCLES_ONEAPI_SYCL_HOST_ENABLED}
-      -DWITH_NANOVDB:BOOL=${WITH_NANOVDB}
-      -DNANOVDB_INCLUDE_DIR=${NANOVDB_INCLUDE_DIR}
-      -DCMAKE_CXX_COMPILER:STRING=${SYCL_DPCPP_COMPILER}
-      -DSYCL_INCLUDE_DIR=${SYCL_INCLUDE_DIR}
-      -DSYCL_LIBRARY_DIR=${SYCL_LIBRARY_DIR}
-      -DLEVEL_ZERO_LIBRARY=${LEVEL_ZERO_LIBRARY}
-      -DLEVEL_ZERO_INCLUDE_DIR=${LEVEL_ZERO_INCLUDE_DIR}
-      -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=TRUE
-      -DCYCLES_INCLUDE_DIRS_ESCAPED:STRING=${CORRECT_CYCLES_INCLUDE_DIRS_ESCAPED}&${CMAKE_CURRENT_SOURCE_DIR}/..
-      -DORIGINALCMAKE_CXX_COMPILER_ID=${CMAKE_CXX_COMPILER_ID}
-      INSTALL_COMMAND ""
-      BUILD_ALWAYS TRUE
-      STEP_TARGETS build
-      EXCLUDE_FROM_ALL TRUE
-    )
-  endif()
-
-  ExternalProject_Get_Property(oneapi_kernel binary_dir)
-
-  if (GENERATOR_IS_MULTI_CONFIG AND CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
-    # make intermediate copy of the DLL since we can't use generator expression in delayed_install
-    add_custom_command(TARGET oneapi_kernel-build POST_BUILD
-      COMMAND "${CMAKE_COMMAND}" -E copy_if_different
-        "${binary_dir}/$<CONFIG>/${oneapi_kernel_library_filename}"
-        "${binary_dir}/${oneapi_kernel_library_filename}"
-    )
-  endif()
-
-  # The idea of using device as library, is that we compile device cpp files with oneAPI implementation code and then use
-  # the code via common C++ interface from .h files. So the rest of the project can be compiled with g++/clang/msbuild
-  add_library(cycles_kernel_oneapi SHARED IMPORTED)
-
-  if (GENERATOR_IS_MULTI_CONFIG AND CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
-    string(REPLACE ".dll" ".lib" oneapi_kernel_library_filename_lib ${oneapi_kernel_library_filename})
-    set_target_properties(cycles_kernel_oneapi PROPERTIES
-	    POSITION_INDEPENDENT_CODE ON
-    )
-    foreach(CONFIGURATION IN ITEMS ${CMAKE_CONFIGURATION_TYPES})
- 	    string(TOUPPER ${CONFIGURATION} CONFIG)
-      set_target_properties(cycles_kernel_oneapi PROPERTIES
- 	      IMPORTED_LOCATION_${CONFIG} "${binary_dir}/${CONFIGURATION}/${oneapi_kernel_library_filename}"
- 		    IMPORTED_IMPLIB_${CONFIG} "${binary_dir}/${CONFIGURATION}/${oneapi_kernel_library_filename_lib}"
- 	    )
-    endforeach()
-  else()
-    set_target_properties(cycles_kernel_oneapi PROPERTIES
-        IMPORTED_LOCATION ${binary_dir}/${oneapi_kernel_library_filename}
-        POSITION_INDEPENDENT_CODE ON
-    )
-  endif()
-
-  if (GENERATOR_IS_MULTI_CONFIG AND CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
-    if(WITH_BLENDER)
-      set(CYCLES_DEVICE_ONEAPI_SHARED_LIBRARY_CYCLES_PATH "${binary_dir}/$<CONFIG>/${oneapi_kernel_library_filename}" CACHE INTERNAL "")
-    endif()
-  else()
-    delayed_install(${binary_dir} "${oneapi_kernel_library_filename}" ${CYCLES_INSTALL_PATH}/source/kernel/kernels/oneapi)
-    if(WITH_BLENDER)
-      set(CYCLES_DEVICE_ONEAPI_SHARED_LIBRARY_CYCLES_PATH "${CYCLES_INSTALL_PATH}/source/kernel/kernels/oneapi/${oneapi_kernel_library_filename}" CACHE INTERNAL "")
-    endif()
-  endif()
-
-  add_dependencies(cycles_kernel_oneapi oneapi_kernel-build)
-endif()
-#]]
-
 add_definitions(${GL_DEFINITIONS})
 
 if(WITH_CYCLES_DEVICE_CUDA)
@@ -324,6 +192,9 @@ if(WITH_CYCLES_DEVICE_METAL)
     ${SRC_METAL}
   )
 endif()
+if (WITH_CYCLES_DEVICE_ONEAPI)
+  add_definitions(-DWITH_ONEAPI)
+endif()
 
 if(WITH_OPENIMAGEDENOISE)
   list(APPEND LIB
@@ -334,16 +205,6 @@ endif()
 include_directories(${INC})
 include_directories(SYSTEM ${INC_SYS})
 
-if (WITH_CYCLES_DEVICE_ONEAPI)
-  include_directories(SYSTEM ${SYCL_INCLUDE_DIR}/sycl ${SYCL_INCLUDE_DIR})
-  get_filename_component(SYCL_LIBRARY_DIR "${SYCL_LIBRARY}" DIRECTORY)
-  if (GENERATOR_IS_MULTI_CONFIG AND CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
-    link_libraries("${SYCL_LIBRARY_DIR}/sycl$<$<CONFIG:Debug>:d>${CMAKE_LINK_LIBRARY_SUFFIX}")
-  else()
-    link_libraries(${SYCL_LIBRARY})
-  endif()
-endif()
-
 cycles_add_library(cycles_device "${LIB}" ${SRC})
 
 if(WITH_CYCLES_DEVICE_ONEAPI)
diff --git a/intern/cycles/device/oneapi/device.cpp b/intern/cycles/device/oneapi/device.cpp
index ffdb79534ee..9677a631815 100644
--- a/intern/cycles/device/oneapi/device.cpp
+++ b/intern/cycles/device/oneapi/device.cpp
@@ -8,9 +8,8 @@
 #ifdef WITH_ONEAPI
 #  include "device/device.h"
 #  include "device/oneapi/device_impl.h"
-#  include "device/oneapi/sycl.h"
-#  include "device/oneapi/util.h"
 
+#  include "util/path.h"
 #  include "util/string.h"
 
 #  ifdef __linux__
@@ -26,12 +25,12 @@ static oneAPIDLLInterface oneapi_dll;
 
 #ifdef _WIN32
 #  define LOAD_SYCL_SHARED_LIBRARY() (void *)(LoadLibrary(TEXT("sycl.dll")))
-#  define LOAD_ONEAPI_SHARED_LIBRARY() (void *)(LoadLibrary(TEXT("cycles_kernel_oneapi.dll")))
+#  define LOAD_ONEAPI_SHARED_LIBRARY(path) (void *)(LoadLibrary(path))
 #  define FREE_SHARED_LIBRARY(handle) FreeLibrary((HMODULE)handle)
 #  define GET_SHARED_LIBRARY_SYMBOL(handle, name) GetProcAddress((HMODULE)handle, name)
 #elif __linux__
 #  define LOAD_SYCL_SHARED_LIBRARY() dlopen("libsycl.so", RTL

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list