This change switches Cycles to an opensource HIP-RT library which
implements hardware ray-tracing. This library is now used on
both Windows and Linux. While there should be no noticeable changes
on Windows, on Linux this adds support for hardware ray-tracing on
AMD GPUs.
The majority of the change is typical platform code to add new
library to the dependency builder, and a change in the way how
ahead-of-time (AoT) kernels are compiled. There are changes in
Cycles itself, but they are rather straightforward: some APIs
changed in the opensource version of the library.
There are a couple of extra files which are needed for this to
work: hiprt02003_6.1_amd.hipfb and oro_compiled_kernels.hipfb.
There are some assumptions in the HIP-RT library about how they
are available. Currently they follow the same rule as AoT
kernels for oneAPI:
- On Windows they are next to blender.exe
- On Linux they are in the lib/ folder
Performance comparison on Ubuntu 22.04.5:
```
GPU: AMD Radeon PRO W7800
Driver: amdgpu-install_6.1.60103-1_all.deb
main hip-rt
attic 0.1414s 0.0932s
barbershop_interior 0.1563s 0.1258s
bistro 0.2134s 0.1597s
bmw27 0.0119s 0.0099s
classroom 0.1006s 0.0803s
fishy_cat 0.0248s 0.0178s
junkshop 0.0916s 0.0713s
koro 0.0589s 0.0720s
monster 0.0435s 0.0385s
pabellon 0.0543s 0.0391s
sponza 0.0223s 0.0180s
spring 0.1026s 1.5145s
victor 0.1901s 0.1239s
wdas_cloud 0.1153s 0.1125s
```
Co-authored-by: Brecht Van Lommel <brecht@blender.org>
Co-authored-by: Ray Molenkamp <github@lazydodo.com>
Co-authored-by: Sergey Sharybin <sergey@blender.org>
Pull Request: https://projects.blender.org/blender/blender/pulls/121050
113 lines
2.8 KiB
CMake
113 lines
2.8 KiB
CMake
# SPDX-FileCopyrightText: 2021 Blender Authors
|
|
#
|
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
# Find HIP compiler. This module defines
|
|
# HIP_HIPCC_EXECUTABLE, the full path to the hipcc executable
|
|
# HIP_VERSION, the HIP compiler version
|
|
# HIP_FOUND, if the HIP toolkit is found.
|
|
|
|
if(NOT (DEFINED HIP_ROOT_DIR))
|
|
set(HIP_ROOT_DIR "")
|
|
endif()
|
|
|
|
# If `HIP_ROOT_DIR` was defined in the environment, use it.
|
|
if(HIP_ROOT_DIR)
|
|
# Pass.
|
|
elseif(DEFINED ENV{HIP_ROOT_DIR})
|
|
set(HIP_ROOT_DIR $ENV{HIP_ROOT_DIR})
|
|
elseif(DEFINED ENV{HIP_PATH})
|
|
# Built-in environment variable from SDK.
|
|
set(HIP_ROOT_DIR $ENV{HIP_PATH})
|
|
endif()
|
|
|
|
set(_hip_SEARCH_DIRS
|
|
${HIP_ROOT_DIR}
|
|
/opt/rocm
|
|
/opt/rocm/hip
|
|
)
|
|
|
|
find_program(HIP_HIPCC_EXECUTABLE
|
|
NAMES
|
|
hipcc
|
|
HINTS
|
|
${_hip_SEARCH_DIRS}
|
|
PATH_SUFFIXES
|
|
bin
|
|
)
|
|
|
|
if(WIN32)
|
|
set(LINKER clang++)
|
|
else()
|
|
set(LINKER amdclang++)
|
|
endif()
|
|
|
|
find_program(HIP_LINKER_EXECUTABLE
|
|
NAMES
|
|
${LINKER}
|
|
HINTS
|
|
${_hip_SEARCH_DIRS}
|
|
PATH_SUFFIXES
|
|
bin
|
|
NO_DEFAULT_PATH
|
|
NO_CMAKE_PATH
|
|
)
|
|
|
|
|
|
if(HIP_HIPCC_EXECUTABLE)
|
|
set(HIP_VERSION_MAJOR 0)
|
|
set(HIP_VERSION_MINOR 0)
|
|
set(HIP_VERSION_PATCH 0)
|
|
|
|
if(WIN32)
|
|
set(_hipcc_executable ${HIP_HIPCC_EXECUTABLE}.bat)
|
|
else()
|
|
set(_hipcc_executable ${HIP_HIPCC_EXECUTABLE})
|
|
endif()
|
|
|
|
# Get version from the output.
|
|
execute_process(COMMAND ${_hipcc_executable} --version
|
|
OUTPUT_VARIABLE _hip_version_raw
|
|
ERROR_QUIET
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
|
|
# Parse parts.
|
|
if(_hip_version_raw MATCHES "HIP version: .*")
|
|
# Strip the HIP prefix and get list of individual version components.
|
|
string(REGEX REPLACE
|
|
".*HIP version: ([.0-9]+).*" "\\1"
|
|
_hip_semantic_version "${_hip_version_raw}")
|
|
string(REPLACE "." ";" _hip_version_parts "${_hip_semantic_version}")
|
|
list(LENGTH _hip_version_parts _num_hip_version_parts)
|
|
|
|
# Extract components into corresponding variables.
|
|
if(_num_hip_version_parts GREATER 0)
|
|
list(GET _hip_version_parts 0 HIP_VERSION_MAJOR)
|
|
endif()
|
|
if(_num_hip_version_parts GREATER 1)
|
|
list(GET _hip_version_parts 1 HIP_VERSION_MINOR)
|
|
endif()
|
|
if(_num_hip_version_parts GREATER 2)
|
|
list(GET _hip_version_parts 2 HIP_VERSION_PATCH)
|
|
endif()
|
|
|
|
# Unset temp variables.
|
|
unset(_num_hip_version_parts)
|
|
unset(_hip_semantic_version)
|
|
unset(_hip_version_parts)
|
|
endif()
|
|
|
|
# Construct full semantic version.
|
|
set(HIP_VERSION "${HIP_VERSION_MAJOR}.${HIP_VERSION_MINOR}.${HIP_VERSION_PATCH}")
|
|
set(HIP_VERSION_SHORT "${HIP_VERSION_MAJOR}.${HIP_VERSION_MINOR}")
|
|
unset(_hip_version_raw)
|
|
unset(_hipcc_executable)
|
|
endif()
|
|
|
|
include(FindPackageHandleStandardArgs)
|
|
find_package_handle_standard_args(HIP
|
|
REQUIRED_VARS HIP_HIPCC_EXECUTABLE
|
|
VERSION_VAR HIP_VERSION)
|
|
|
|
unset(_hip_SEARCH_DIRS)
|