diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-01-05 01:29:06 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-01-13 04:40:09 +0300 |
commit | 30a0459f2cfeeefcc27a1234e392f6dda51d8031 (patch) | |
tree | aa5d244106d772b288e3f55eb734e767eae69dc6 | |
parent | 2ca933f45773348b6da0f53942b5c25bc3ada3a4 (diff) |
Fix T53692: OpenCL multi GPU rendering not using all GPUs.
Ensure each OpenCL device has a unique ID even if the hardware ID is not
unique for some reason.
-rw-r--r-- | intern/cycles/device/device_opencl.cpp | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/intern/cycles/device/device_opencl.cpp b/intern/cycles/device/device_opencl.cpp index 681b8214b03..721198e1598 100644 --- a/intern/cycles/device/device_opencl.cpp +++ b/intern/cycles/device/device_opencl.cpp @@ -22,6 +22,7 @@ #include "util/util_foreach.h" #include "util/util_logging.h" +#include "util/util_set.h" CCL_NAMESPACE_BEGIN @@ -79,7 +80,9 @@ void device_opencl_info(vector<DeviceInfo>& devices) OpenCLInfo::get_usable_devices(&usable_devices); /* Devices are numbered consecutively across platforms. */ int num_devices = 0; + set<string> unique_ids; foreach(OpenCLPlatformDevice& platform_device, usable_devices) { + /* Compute unique ID for persistent user preferences. */ const string& platform_name = platform_device.platform_name; const cl_device_type device_type = platform_device.device_type; const string& device_name = platform_device.device_name; @@ -87,7 +90,15 @@ void device_opencl_info(vector<DeviceInfo>& devices) if(hardware_id == "") { hardware_id = string_printf("ID_%d", num_devices); } + string id = string("OPENCL_") + platform_name + "_" + device_name + "_" + hardware_id; + /* Hardware ID might not be unique, add device number in that case. */ + if(unique_ids.find(id) != unique_ids.end()) { + id += string_printf("_ID_%d", num_devices); + } + unique_ids.insert(id); + + /* Create DeviceInfo. */ DeviceInfo info; info.type = DEVICE_OPENCL; info.description = string_remove_trademark(string(device_name)); @@ -98,7 +109,7 @@ void device_opencl_info(vector<DeviceInfo>& devices) info.pack_images = true; info.use_split_kernel = OpenCLInfo::kernel_use_split(platform_name, device_type); - info.id = string("OPENCL_") + platform_name + "_" + device_name + "_" + hardware_id; + info.id = id; devices.push_back(info); num_devices++; } |