Skip to content

Commit ef9b407

Browse files
committed
ensure platform SVM capabilities include all device SVM capabilities
1 parent c019c8a commit ef9b407

1 file changed

Lines changed: 45 additions & 27 deletions

File tree

layers/99_svmplusplus/emulate.cpp

Lines changed: 45 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -230,80 +230,98 @@ struct SLayerContext
230230

231231
// USM Types:
232232

233+
cl_svm_capabilities_khr combinedCaps = 0;
233234
for (auto device: devices) {
234235
cl_svm_capabilities_khr caps = getDeviceUSMCaps(device);
235236
if (caps != 0) {
236-
typeCapsPlatform.push_back(CL_SVM_TYPE_MACRO_DEVICE_KHR);
237-
break;
237+
combinedCaps = (combinedCaps == 0) ? caps : (combinedCaps & caps);
238238
}
239239
}
240+
if (combinedCaps != 0) {
241+
typeCapsPlatform.push_back(combinedCaps);
242+
}
243+
244+
combinedCaps = 0;
240245
for (auto device: devices) {
241246
cl_svm_capabilities_khr caps = getHostUSMCaps(device);
242247
if (caps != 0) {
243-
typeCapsPlatform.push_back(CL_SVM_TYPE_MACRO_HOST_KHR);
244-
break;
248+
combinedCaps = (combinedCaps == 0) ? caps : (combinedCaps & caps);
245249
}
246250
}
251+
if (combinedCaps != 0) {
252+
typeCapsPlatform.push_back(combinedCaps);
253+
}
254+
255+
combinedCaps = 0;
247256
for (auto device: devices) {
248257
cl_svm_capabilities_khr caps = getSingleDeviceSharedUSMCaps(device);
249258
if (caps != 0) {
250-
typeCapsPlatform.push_back(CL_SVM_TYPE_MACRO_SINGLE_DEVICE_SHARED_KHR);
251-
break;
259+
combinedCaps = (combinedCaps == 0) ? caps : (combinedCaps & caps);
252260
}
253261
}
262+
if (combinedCaps != 0) {
263+
typeCapsPlatform.push_back(combinedCaps);
264+
}
254265

255266
// SVM Types:
256267

268+
combinedCaps = 0;
257269
for (auto device: devices) {
258270
cl_svm_capabilities_khr caps = getCoarseGrainSVMCaps(device);
259271
if (caps != 0) {
260-
typeCapsPlatform.push_back(CL_SVM_TYPE_MACRO_COARSE_GRAIN_BUFFER_KHR);
261-
break;
272+
combinedCaps = (combinedCaps == 0) ? caps : (combinedCaps & caps);
262273
}
263274
}
275+
if (combinedCaps != 0) {
276+
typeCapsPlatform.push_back(combinedCaps);
277+
}
278+
264279
for (auto device: devices) {
265280
cl_svm_capabilities_khr caps = getFineGrainSVMCaps(device);
266281
if (caps != 0) {
267-
typeCapsPlatform.push_back(CL_SVM_TYPE_MACRO_FINE_GRAIN_BUFFER_KHR);
268-
break;
282+
combinedCaps = (combinedCaps == 0) ? caps : (combinedCaps & caps);
269283
}
270284
}
285+
if (combinedCaps != 0) {
286+
typeCapsPlatform.push_back(combinedCaps);
287+
}
288+
271289
for (auto device: devices) {
272290
cl_svm_capabilities_khr caps = getSystemSVMCaps(device);
273291
if (caps != 0) {
274-
typeCapsPlatform.push_back(CL_SVM_TYPE_MACRO_SYSTEM_KHR);
275-
break;
292+
combinedCaps = (combinedCaps == 0) ? caps : (combinedCaps & caps);
276293
}
277294
}
295+
if (combinedCaps != 0) {
296+
typeCapsPlatform.push_back(combinedCaps);
297+
}
278298

279299
TypeCapsPlatform[platform] = typeCapsPlatform;
280300

281301
for (auto device: devices) {
282302
std::vector<cl_svm_capabilities_khr> typeCapsDevice;
283303

284304
for (auto caps: typeCapsPlatform) {
285-
switch(caps) {
286-
case CL_SVM_TYPE_MACRO_DEVICE_KHR:
305+
if ((caps & CL_SVM_TYPE_MACRO_DEVICE_KHR) == CL_SVM_TYPE_MACRO_DEVICE_KHR) {
287306
typeCapsDevice.push_back(getDeviceUSMCaps(device));
288-
break;
289-
case CL_SVM_TYPE_MACRO_HOST_KHR:
307+
}
308+
else if ((caps & CL_SVM_TYPE_MACRO_HOST_KHR) == CL_SVM_TYPE_MACRO_HOST_KHR) {
290309
typeCapsDevice.push_back(getHostUSMCaps(device));
291-
break;
292-
case CL_SVM_TYPE_MACRO_SINGLE_DEVICE_SHARED_KHR:
310+
}
311+
else if ((caps & CL_SVM_TYPE_MACRO_SINGLE_DEVICE_SHARED_KHR) == CL_SVM_TYPE_MACRO_SINGLE_DEVICE_SHARED_KHR) {
293312
typeCapsDevice.push_back(getSingleDeviceSharedUSMCaps(device));
294-
break;
295-
case CL_SVM_TYPE_MACRO_COARSE_GRAIN_BUFFER_KHR:
313+
}
314+
else if ((caps & CL_SVM_TYPE_MACRO_COARSE_GRAIN_BUFFER_KHR) == CL_SVM_TYPE_MACRO_COARSE_GRAIN_BUFFER_KHR) {
296315
typeCapsDevice.push_back(getCoarseGrainSVMCaps(device));
297-
break;
298-
case CL_SVM_TYPE_MACRO_FINE_GRAIN_BUFFER_KHR:
316+
}
317+
else if ((caps & CL_SVM_TYPE_MACRO_FINE_GRAIN_BUFFER_KHR) == CL_SVM_TYPE_MACRO_FINE_GRAIN_BUFFER_KHR) {
299318
typeCapsDevice.push_back(getFineGrainSVMCaps(device));
300-
break;
301-
case CL_SVM_TYPE_MACRO_SYSTEM_KHR:
319+
}
320+
else if ((caps & CL_SVM_TYPE_MACRO_SYSTEM_KHR) == CL_SVM_TYPE_MACRO_SYSTEM_KHR) {
302321
typeCapsDevice.push_back(getSystemSVMCaps(device));
303-
break;
304-
default:
322+
}
323+
else {
305324
assert(0 && "unknown platform SVM type");
306-
break;
307325
}
308326
}
309327

0 commit comments

Comments
 (0)