Fixing potential issues with automatic splitting of accelerators for NUMA.

This commit is contained in:
W. Michael Brown
2022-10-06 20:48:02 -07:00
parent e9f39f85d2
commit a6a39d47e1

View File

@ -482,6 +482,7 @@ int UCL_Device::set_platform(int pid) {
_num_devices = 0;
for (int i=0; i<num_unpart; i++) {
cl_uint num_subdevices = 1;
cl_device_id *subdevice_list = device_list + i;
#ifdef CL_VERSION_1_2
cl_device_affinity_domain adomain;
@ -494,25 +495,29 @@ int UCL_Device::set_platform(int pid) {
props[0]=CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN;
props[1]=CL_DEVICE_AFFINITY_DOMAIN_NUMA;
props[2]=0;
cl_int err = CL_SUCCESS;
if (adomain & CL_DEVICE_AFFINITY_DOMAIN_NUMA)
CL_SAFE_CALL(clCreateSubDevices(device_list[i], props, 0, NULL,
&num_subdevices));
if (num_subdevices > 1) {
cl_device_id *subdevice_list = new cl_device_id[num_subdevices];
CL_SAFE_CALL(clCreateSubDevices(device_list[i], props, num_subdevices,
subdevice_list, &num_subdevices));
for (cl_uint j=0; j<num_subdevices; j++) {
_cl_devices.push_back(device_list[i]);
add_properties(device_list[i]);
_num_devices++;
err = clCreateSubDevices(device_list[i], props, 0, NULL,
&num_subdevices);
if (err == CL_SUCCESS && num_subdevices > 1) {
subdevice_list = new cl_device_id[num_subdevices];
err = clCreateSubDevices(device_list[i], props, num_subdevices,
subdevice_list, &num_subdevices);
if (err != CL_SUCCESS) {
delete[] subdevice_list;
num_subdevices = 1;
subdevice_list = device_list + i;
}
delete[] subdevice_list;
} else {
_cl_devices.push_back(device_list[i]);
add_properties(device_list[i]);
_num_devices++;
}
#endif
for (cl_uint j=0; j<num_subdevices; j++) {
_num_devices++;
_cl_devices.push_back(subdevice_list[j]);
add_properties(subdevice_list[j]);
}
if (num_subdevices > 1) delete[] subdevice_list;
} // for i
#endif