Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brecht>2021-11-04 22:29:07 +0300
committerBrecht Van Lommel <brecht@blender.org>2021-11-04 22:34:21 +0300
commit4960ad420bcfd79db2884ec7a42c2bf01c1c2b85 (patch)
tree0d89983b58c5aca4c7fa254fc5e69ccb932160a6
parent36f5198282d3e91b11d9db488705a852377edd31 (diff)
Cycles: add code to check for supported HIP device architectures
RDNA2 only for now to be conservative, but testing more hardware is underway. Ref T92393 Differential Revision: https://developer.blender.org/D12958
-rw-r--r--intern/cycles/blender/addon/properties.py7
-rw-r--r--intern/cycles/device/hip/device.cpp8
-rw-r--r--intern/cycles/device/hip/device_impl.cpp19
-rw-r--r--intern/cycles/device/hip/util.h9
4 files changed, 30 insertions, 13 deletions
diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py
index 3c90ea07cc6..72b74b67ea5 100644
--- a/intern/cycles/blender/addon/properties.py
+++ b/intern/cycles/blender/addon/properties.py
@@ -1419,9 +1419,10 @@ class CyclesPreferences(bpy.types.AddonPreferences):
col.label(text="and NVIDIA driver version 470 or newer", icon='BLANK1')
elif device_type == 'HIP':
import sys
- col.label(text="Requires discrete AMD GPU with ??? architecture", icon='BLANK1')
- if sys.platform[:3] == "win":
- col.label(text="and AMD driver version ??? or newer", icon='BLANK1')
+ col.label(text="Requires discrete AMD GPU with RDNA2 architecture", icon='BLANK1')
+ # TODO: provide driver version info.
+ #if sys.platform[:3] == "win":
+ # col.label(text="and AMD driver version ??? or newer", icon='BLANK1')
return
for device in devices:
diff --git a/intern/cycles/device/hip/device.cpp b/intern/cycles/device/hip/device.cpp
index f71732d14bb..29304e50247 100644
--- a/intern/cycles/device/hip/device.cpp
+++ b/intern/cycles/device/hip/device.cpp
@@ -131,9 +131,9 @@ void device_hip_info(vector<DeviceInfo> &devices)
continue;
}
- int major;
- hipDeviceGetAttribute(&major, hipDeviceAttributeComputeCapabilityMajor, num);
- // TODO : (Arya) What is the last major version we are supporting?
+ if (!hipSupportsDevice(num)) {
+ continue;
+ }
DeviceInfo info;
@@ -141,7 +141,7 @@ void device_hip_info(vector<DeviceInfo> &devices)
info.description = string(name);
info.num = num;
- info.has_half_images = (major >= 3);
+ info.has_half_images = true;
info.has_nanovdb = true;
info.denoisers = 0;
diff --git a/intern/cycles/device/hip/device_impl.cpp b/intern/cycles/device/hip/device_impl.cpp
index a71fc4b888b..db93ecd8474 100644
--- a/intern/cycles/device/hip/device_impl.cpp
+++ b/intern/cycles/device/hip/device_impl.cpp
@@ -146,12 +146,18 @@ HIPDevice::~HIPDevice()
bool HIPDevice::support_device(const uint /*kernel_features*/)
{
- int major, minor;
- hipDeviceGetAttribute(&major, hipDeviceAttributeComputeCapabilityMajor, hipDevId);
- hipDeviceGetAttribute(&minor, hipDeviceAttributeComputeCapabilityMinor, hipDevId);
+ if (hipSupportsDevice(hipDevId)) {
+ return true;
+ }
+ else {
+ /* We only support Navi and above. */
+ hipDeviceProp_t props;
+ hipGetDeviceProperties(&props, hipDevId);
- // TODO : (Arya) What versions do we plan to support?
- return true;
+ set_error(string_printf("HIP backend requires AMD RDNA2 graphics card or up, but found %s.",
+ props.name));
+ return false;
+ }
}
bool HIPDevice::check_peer_access(Device *peer_device)
@@ -391,8 +397,9 @@ bool HIPDevice::load_kernels(const uint kernel_features)
return false;
/* check if GPU is supported */
- if (!support_device(kernel_features))
+ if (!support_device(kernel_features)) {
return false;
+ }
/* get kernel */
const char *kernel_name = "kernel";
diff --git a/intern/cycles/device/hip/util.h b/intern/cycles/device/hip/util.h
index 0db5174a3db..f3194ecaa77 100644
--- a/intern/cycles/device/hip/util.h
+++ b/intern/cycles/device/hip/util.h
@@ -58,6 +58,15 @@ const char *hipewCompilerPath();
int hipewCompilerVersion();
# endif /* WITH_HIP_DYNLOAD */
+static inline bool hipSupportsDevice(const int hipDevId)
+{
+ int major, minor;
+ hipDeviceGetAttribute(&major, hipDeviceAttributeComputeCapabilityMajor, hipDevId);
+ hipDeviceGetAttribute(&minor, hipDeviceAttributeComputeCapabilityMinor, hipDevId);
+
+ return (major > 10) || (major == 10 && minor >= 3);
+}
+
CCL_NAMESPACE_END
#endif /* WITH_HIP */