From ef9b4071e5b3af4395987b40be1efa3c7a1cede8 Mon Sep 17 00:00:00 2001 From: Ben Ashbaugh Date: Tue, 10 Dec 2024 16:40:20 -0800 Subject: [PATCH] ensure platform SVM capabilities include all device SVM capabilities --- layers/99_svmplusplus/emulate.cpp | 72 +++++++++++++++++++------------ 1 file changed, 45 insertions(+), 27 deletions(-) diff --git a/layers/99_svmplusplus/emulate.cpp b/layers/99_svmplusplus/emulate.cpp index 29a22ac..0cbe6e7 100644 --- a/layers/99_svmplusplus/emulate.cpp +++ b/layers/99_svmplusplus/emulate.cpp @@ -230,51 +230,71 @@ struct SLayerContext // USM Types: + cl_svm_capabilities_khr combinedCaps = 0; for (auto device: devices) { cl_svm_capabilities_khr caps = getDeviceUSMCaps(device); if (caps != 0) { - typeCapsPlatform.push_back(CL_SVM_TYPE_MACRO_DEVICE_KHR); - break; + combinedCaps = (combinedCaps == 0) ? caps : (combinedCaps & caps); } } + if (combinedCaps != 0) { + typeCapsPlatform.push_back(combinedCaps); + } + + combinedCaps = 0; for (auto device: devices) { cl_svm_capabilities_khr caps = getHostUSMCaps(device); if (caps != 0) { - typeCapsPlatform.push_back(CL_SVM_TYPE_MACRO_HOST_KHR); - break; + combinedCaps = (combinedCaps == 0) ? caps : (combinedCaps & caps); } } + if (combinedCaps != 0) { + typeCapsPlatform.push_back(combinedCaps); + } + + combinedCaps = 0; for (auto device: devices) { cl_svm_capabilities_khr caps = getSingleDeviceSharedUSMCaps(device); if (caps != 0) { - typeCapsPlatform.push_back(CL_SVM_TYPE_MACRO_SINGLE_DEVICE_SHARED_KHR); - break; + combinedCaps = (combinedCaps == 0) ? caps : (combinedCaps & caps); } } + if (combinedCaps != 0) { + typeCapsPlatform.push_back(combinedCaps); + } // SVM Types: + combinedCaps = 0; for (auto device: devices) { cl_svm_capabilities_khr caps = getCoarseGrainSVMCaps(device); if (caps != 0) { - typeCapsPlatform.push_back(CL_SVM_TYPE_MACRO_COARSE_GRAIN_BUFFER_KHR); - break; + combinedCaps = (combinedCaps == 0) ? caps : (combinedCaps & caps); } } + if (combinedCaps != 0) { + typeCapsPlatform.push_back(combinedCaps); + } + for (auto device: devices) { cl_svm_capabilities_khr caps = getFineGrainSVMCaps(device); if (caps != 0) { - typeCapsPlatform.push_back(CL_SVM_TYPE_MACRO_FINE_GRAIN_BUFFER_KHR); - break; + combinedCaps = (combinedCaps == 0) ? caps : (combinedCaps & caps); } } + if (combinedCaps != 0) { + typeCapsPlatform.push_back(combinedCaps); + } + for (auto device: devices) { cl_svm_capabilities_khr caps = getSystemSVMCaps(device); if (caps != 0) { - typeCapsPlatform.push_back(CL_SVM_TYPE_MACRO_SYSTEM_KHR); - break; + combinedCaps = (combinedCaps == 0) ? caps : (combinedCaps & caps); } } + if (combinedCaps != 0) { + typeCapsPlatform.push_back(combinedCaps); + } TypeCapsPlatform[platform] = typeCapsPlatform; @@ -282,28 +302,26 @@ struct SLayerContext std::vector typeCapsDevice; for (auto caps: typeCapsPlatform) { - switch(caps) { - case CL_SVM_TYPE_MACRO_DEVICE_KHR: + if ((caps & CL_SVM_TYPE_MACRO_DEVICE_KHR) == CL_SVM_TYPE_MACRO_DEVICE_KHR) { typeCapsDevice.push_back(getDeviceUSMCaps(device)); - break; - case CL_SVM_TYPE_MACRO_HOST_KHR: + } + else if ((caps & CL_SVM_TYPE_MACRO_HOST_KHR) == CL_SVM_TYPE_MACRO_HOST_KHR) { typeCapsDevice.push_back(getHostUSMCaps(device)); - break; - case CL_SVM_TYPE_MACRO_SINGLE_DEVICE_SHARED_KHR: + } + else if ((caps & CL_SVM_TYPE_MACRO_SINGLE_DEVICE_SHARED_KHR) == CL_SVM_TYPE_MACRO_SINGLE_DEVICE_SHARED_KHR) { typeCapsDevice.push_back(getSingleDeviceSharedUSMCaps(device)); - break; - case CL_SVM_TYPE_MACRO_COARSE_GRAIN_BUFFER_KHR: + } + else if ((caps & CL_SVM_TYPE_MACRO_COARSE_GRAIN_BUFFER_KHR) == CL_SVM_TYPE_MACRO_COARSE_GRAIN_BUFFER_KHR) { typeCapsDevice.push_back(getCoarseGrainSVMCaps(device)); - break; - case CL_SVM_TYPE_MACRO_FINE_GRAIN_BUFFER_KHR: + } + else if ((caps & CL_SVM_TYPE_MACRO_FINE_GRAIN_BUFFER_KHR) == CL_SVM_TYPE_MACRO_FINE_GRAIN_BUFFER_KHR) { typeCapsDevice.push_back(getFineGrainSVMCaps(device)); - break; - case CL_SVM_TYPE_MACRO_SYSTEM_KHR: + } + else if ((caps & CL_SVM_TYPE_MACRO_SYSTEM_KHR) == CL_SVM_TYPE_MACRO_SYSTEM_KHR) { typeCapsDevice.push_back(getSystemSVMCaps(device)); - break; - default: + } + else { assert(0 && "unknown platform SVM type"); - break; } }