diff --git a/layers/99_svmplusplus/emulate.cpp b/layers/99_svmplusplus/emulate.cpp index 8521794..9176f4a 100644 --- a/layers/99_svmplusplus/emulate.cpp +++ b/layers/99_svmplusplus/emulate.cpp @@ -121,16 +121,11 @@ static cl_svm_capabilities_exp getDeviceUSMCaps(cl_device_id device) nullptr); if (usmCaps != 0) { - ret = - CL_SVM_CAPABILITY_SINGLE_ADDRESS_SPACE_EXP | - CL_SVM_CAPABILITY_DEVICE_OWNED_EXP | - CL_SVM_CAPABILITY_INDIRECT_ACCESS_EXP; - if (usmCaps & CL_UNIFIED_SHARED_MEMORY_ACCESS_INTEL ) { - ret |= CL_SVM_CAPABILITY_DEVICE_ACCESS_EXP; - } - if (usmCaps & CL_UNIFIED_SHARED_MEMORY_ATOMIC_ACCESS_INTEL) { - ret |= CL_SVM_CAPABILITY_DEVICE_ATOMIC_ACCESS_EXP; - } + ret = CL_SVM_TYPE_MACRO_DEVICE_EXP; + + assert(usmCaps & CL_UNIFIED_SHARED_MEMORY_ACCESS_INTEL); + assert(usmCaps & CL_UNIFIED_SHARED_MEMORY_ATOMIC_ACCESS_INTEL); + if (usmCaps & CL_UNIFIED_SHARED_MEMORY_CONCURRENT_ACCESS_INTEL) { ret |= CL_SVM_CAPABILITY_CONCURRENT_ACCESS_EXP; } @@ -155,16 +150,10 @@ static cl_svm_capabilities_exp getHostUSMCaps(cl_device_id device) nullptr); if (usmCaps != 0) { - ret = - CL_SVM_CAPABILITY_SINGLE_ADDRESS_SPACE_EXP | - CL_SVM_CAPABILITY_DEVICE_UNASSOCIATED_EXP | - CL_SVM_CAPABILITY_OTHER_DEVICES_ACCESSIBLE_EXP | - CL_SVM_CAPABILITY_HOST_OWNED_EXP | - CL_SVM_CAPABILITY_HOST_ACCESSIBLE_EXP | - CL_SVM_CAPABILITY_INDIRECT_ACCESS_EXP; - if (usmCaps & CL_UNIFIED_SHARED_MEMORY_ACCESS_INTEL ) { - ret |= CL_SVM_CAPABILITY_DEVICE_ACCESS_EXP; - } + ret = CL_SVM_TYPE_MACRO_HOST_EXP; + + assert(usmCaps & CL_UNIFIED_SHARED_MEMORY_ACCESS_INTEL); + if (usmCaps & CL_UNIFIED_SHARED_MEMORY_ATOMIC_ACCESS_INTEL) { ret |= CL_SVM_CAPABILITY_DEVICE_ATOMIC_ACCESS_EXP; } @@ -192,13 +181,10 @@ static cl_svm_capabilities_exp getSingleDeviceSharedUSMCaps(cl_device_id device) nullptr); if (usmCaps != 0) { - ret = - CL_SVM_CAPABILITY_SINGLE_ADDRESS_SPACE_EXP | - CL_SVM_CAPABILITY_HOST_ACCESSIBLE_EXP | - CL_SVM_CAPABILITY_INDIRECT_ACCESS_EXP; - if (usmCaps & CL_UNIFIED_SHARED_MEMORY_ACCESS_INTEL ) { - ret |= CL_SVM_CAPABILITY_DEVICE_ACCESS_EXP; - } + ret = CL_SVM_TYPE_MACRO_SINGLE_DEVICE_SHARED_EXP; + + assert(usmCaps & CL_UNIFIED_SHARED_MEMORY_ACCESS_INTEL); + if (usmCaps & CL_UNIFIED_SHARED_MEMORY_ATOMIC_ACCESS_INTEL) { ret |= CL_SVM_CAPABILITY_DEVICE_ATOMIC_ACCESS_EXP; } @@ -213,6 +199,75 @@ static cl_svm_capabilities_exp getSingleDeviceSharedUSMCaps(cl_device_id device) return ret; } +static cl_svm_capabilities_exp getCoarseGrainSVMCaps(cl_device_id device) +{ + cl_svm_capabilities_exp ret = 0; + + cl_device_svm_capabilities svmCaps = 0; + g_pNextDispatch->clGetDeviceInfo( + device, + CL_DEVICE_SVM_CAPABILITIES, + sizeof(svmCaps), + &svmCaps, + nullptr); + + if (svmCaps & CL_DEVICE_SVM_COARSE_GRAIN_BUFFER) { + ret = CL_SVM_TYPE_MACRO_COARSE_GRAIN_BUFFER_EXP; + } + + return ret; +} + +static cl_svm_capabilities_exp getFineGrainSVMCaps(cl_device_id device) +{ + cl_svm_capabilities_exp ret = 0; + + cl_device_svm_capabilities svmCaps = 0; + g_pNextDispatch->clGetDeviceInfo( + device, + CL_DEVICE_SVM_CAPABILITIES, + sizeof(svmCaps), + &svmCaps, + nullptr); + + if (svmCaps & CL_DEVICE_SVM_FINE_GRAIN_BUFFER) { + ret = CL_SVM_TYPE_MACRO_FINE_GRAIN_BUFFER_EXP; + + if (svmCaps & CL_DEVICE_SVM_ATOMICS) { + ret |= CL_SVM_CAPABILITY_CONCURRENT_ATOMIC_ACCESS_EXP; + } + } + + return ret; +} + +static cl_svm_capabilities_exp getSystemSVMCaps(cl_device_id device) +{ + cl_svm_capabilities_exp ret = 0; + + cl_device_svm_capabilities svmCaps = 0; + g_pNextDispatch->clGetDeviceInfo( + device, + CL_DEVICE_SVM_CAPABILITIES, + sizeof(svmCaps), + &svmCaps, + nullptr); + + cl_device_unified_shared_memory_capabilities_intel usmCaps = 0; + g_pNextDispatch->clGetDeviceInfo( + device, + CL_DEVICE_SHARED_SYSTEM_MEM_CAPABILITIES_INTEL, + sizeof(usmCaps), + &usmCaps, + nullptr); + + if (svmCaps & CL_DEVICE_SVM_FINE_GRAIN_SYSTEM || usmCaps != 0) { + ret = CL_SVM_TYPE_MACRO_SYSTEM_EXP; + } + + return ret; +} + static std::vector getSVMTypeCaps(cl_device_id device) { std::vector types; @@ -223,90 +278,59 @@ static std::vector getSVMTypeCaps(cl_device if (caps != 0) { types.emplace_back(); cl_device_svm_type_capabilities_exp& type = types.back(); - type.capabilities = caps; - type.toggleable_capabilities = 0; + type.capabilities = caps & CL_SVM_TYPE_MACRO_DEVICE_EXP; + type.optional_capabilities = caps & ( + CL_SVM_CAPABILITY_CONCURRENT_ACCESS_EXP | + CL_SVM_CAPABILITY_CONCURRENT_ATOMIC_ACCESS_EXP); } caps = getHostUSMCaps(device); if (caps != 0) { types.emplace_back(); cl_device_svm_type_capabilities_exp& type = types.back(); - type.capabilities = caps; - type.toggleable_capabilities = 0; + type.capabilities = caps & CL_SVM_TYPE_MACRO_HOST_EXP; + type.optional_capabilities = caps & ( + CL_SVM_CAPABILITY_DEVICE_ATOMIC_ACCESS_EXP | + CL_SVM_CAPABILITY_CONCURRENT_ACCESS_EXP | + CL_SVM_CAPABILITY_CONCURRENT_ATOMIC_ACCESS_EXP); } caps = getSingleDeviceSharedUSMCaps(device); if (caps != 0) { types.emplace_back(); cl_device_svm_type_capabilities_exp& type = types.back(); - type.capabilities = caps; - type.toggleable_capabilities = 0; + type.capabilities = caps & CL_SVM_TYPE_MACRO_SINGLE_DEVICE_SHARED_EXP; + type.optional_capabilities = caps & ( + CL_SVM_CAPABILITY_DEVICE_ATOMIC_ACCESS_EXP | + CL_SVM_CAPABILITY_CONCURRENT_ACCESS_EXP | + CL_SVM_CAPABILITY_CONCURRENT_ATOMIC_ACCESS_EXP); } // SVM Types - cl_device_svm_capabilities svmCaps = 0; - g_pNextDispatch->clGetDeviceInfo( - device, - CL_DEVICE_SVM_CAPABILITIES, - sizeof(svmCaps), - &svmCaps, - nullptr); - if (svmCaps & CL_DEVICE_SVM_COARSE_GRAIN_BUFFER) { + caps = getCoarseGrainSVMCaps(device); + if (caps != 0) { types.emplace_back(); cl_device_svm_type_capabilities_exp& type = types.back(); - - type.capabilities = - CL_SVM_CAPABILITY_SINGLE_ADDRESS_SPACE_EXP | - CL_SVM_CAPABILITY_DEVICE_UNASSOCIATED_EXP | - CL_SVM_CAPABILITY_OTHER_DEVICES_ACCESSIBLE_EXP | - CL_SVM_CAPABILITY_HOST_ACCESSIBLE_WITH_MAP_EXP | - CL_SVM_CAPABILITY_DEVICE_ACCESS_EXP | - CL_SVM_CAPABILITY_DEVICE_ATOMIC_ACCESS_EXP; - type.toggleable_capabilities = 0; + type.capabilities = CL_SVM_TYPE_MACRO_COARSE_GRAIN_BUFFER_EXP; + type.optional_capabilities = 0; } - if (svmCaps & CL_DEVICE_SVM_FINE_GRAIN_BUFFER) { + caps = getFineGrainSVMCaps(device); + if (caps != 0) { types.emplace_back(); cl_device_svm_type_capabilities_exp& type = types.back(); - - type.capabilities = - CL_SVM_CAPABILITY_SINGLE_ADDRESS_SPACE_EXP | - CL_SVM_CAPABILITY_DEVICE_UNASSOCIATED_EXP | - CL_SVM_CAPABILITY_OTHER_DEVICES_ACCESSIBLE_EXP | - CL_SVM_CAPABILITY_HOST_ACCESSIBLE_EXP | - CL_SVM_CAPABILITY_HOST_ACCESSIBLE_WITH_MAP_EXP | - CL_SVM_CAPABILITY_DEVICE_ACCESS_EXP | - CL_SVM_CAPABILITY_DEVICE_ATOMIC_ACCESS_EXP | - CL_SVM_CAPABILITY_CONCURRENT_ACCESS_EXP; - if (svmCaps & CL_DEVICE_SVM_ATOMICS) { - type.toggleable_capabilities = CL_SVM_CAPABILITY_CONCURRENT_ATOMIC_ACCESS_EXP; - } + type.capabilities = CL_SVM_TYPE_MACRO_FINE_GRAIN_BUFFER_EXP; + type.optional_capabilities = caps & ( + CL_SVM_CAPABILITY_CONCURRENT_ATOMIC_ACCESS_EXP); } - cl_device_unified_shared_memory_capabilities_intel usmCaps = 0; - g_pNextDispatch->clGetDeviceInfo( - device, - CL_DEVICE_SHARED_SYSTEM_MEM_CAPABILITIES_INTEL, - sizeof(usmCaps), - &usmCaps, - nullptr); - if (svmCaps & CL_DEVICE_SVM_FINE_GRAIN_SYSTEM || usmCaps != 0) { + caps = getSystemSVMCaps(device); + if (caps != 0) { types.emplace_back(); cl_device_svm_type_capabilities_exp& type = types.back(); - - type.capabilities = - CL_SVM_CAPABILITY_SINGLE_ADDRESS_SPACE_EXP | - CL_SVM_CAPABILITY_SYSTEM_ALLOCATOR_EXP | - CL_SVM_CAPABILITY_DEVICE_UNASSOCIATED_EXP | - CL_SVM_CAPABILITY_OTHER_DEVICES_ACCESSIBLE_EXP | - CL_SVM_CAPABILITY_HOST_ACCESSIBLE_EXP | - CL_SVM_CAPABILITY_HOST_ACCESSIBLE_WITH_MAP_EXP | - CL_SVM_CAPABILITY_DEVICE_ACCESS_EXP | - CL_SVM_CAPABILITY_DEVICE_ATOMIC_ACCESS_EXP | - CL_SVM_CAPABILITY_CONCURRENT_ACCESS_EXP | - CL_SVM_CAPABILITY_CONCURRENT_ATOMIC_ACCESS_EXP | - CL_SVM_CAPABILITY_INDIRECT_ACCESS_EXP; + type.capabilities = CL_SVM_TYPE_MACRO_SYSTEM_EXP; + type.optional_capabilities = 0; } return types; @@ -446,7 +470,7 @@ static cl_svm_capabilities_exp getSuggestedSVMCapabilitiesForDevice( { auto supported = getSVMTypeCaps(device); for(const auto& type : supported) { - auto supported_caps = type.capabilities | type.toggleable_capabilities; + auto supported_caps = type.capabilities | type.optional_capabilities; if ((supported_caps & capabilities) == capabilities) { return supported_caps; } @@ -476,6 +500,7 @@ cl_int CL_API_CALL clGetSuggestedSVMCapabilitiesEXP_EMU( cl_int CL_API_CALL clGetSVMInfoEXP_EMU( cl_context context, + cl_device_id device, const void* ptr, cl_svm_info_exp param_name, size_t param_value_size, @@ -492,23 +517,30 @@ cl_int CL_API_CALL clGetSVMInfoEXP_EMU( sizeof(type), &type, nullptr); - cl_device_id device = nullptr; + cl_device_id associatedDevice = nullptr; clGetMemAllocInfoINTEL( context, ptr, CL_MEM_ALLOC_DEVICE_INTEL, - sizeof(device), - &device, + sizeof(associatedDevice), + &associatedDevice, + nullptr); + cl_device_id contextDevice = nullptr; + clGetContextInfo( + context, // note: assumes single-device context! + CL_CONTEXT_DEVICES, + sizeof(contextDevice), + &contextDevice, nullptr); switch (type) { case CL_MEM_TYPE_DEVICE_INTEL: - caps = getDeviceUSMCaps(device); + caps = getDeviceUSMCaps(associatedDevice); break; case CL_MEM_TYPE_HOST_INTEL: - caps = getHostUSMCaps(device); + caps = getHostUSMCaps(contextDevice); break; case CL_MEM_TYPE_SHARED_INTEL: - caps = getSingleDeviceSharedUSMCaps(device); + caps = getSingleDeviceSharedUSMCaps(associatedDevice); break; default: break; @@ -531,6 +563,7 @@ cl_int CL_API_CALL clGetSVMInfoEXP_EMU( param_value_size_ret); } + // Note: do not currently support querying SVM pointers! return CL_INVALID_OPERATION; } diff --git a/layers/99_svmplusplus/emulate.h b/layers/99_svmplusplus/emulate.h index 746d50c..57f4544 100644 --- a/layers/99_svmplusplus/emulate.h +++ b/layers/99_svmplusplus/emulate.h @@ -33,6 +33,7 @@ cl_int CL_API_CALL clGetSuggestedSVMCapabilitiesEXP_EMU( cl_int CL_API_CALL clGetSVMInfoEXP_EMU( cl_context context, + cl_device_id device, const void* ptr, cl_svm_info_exp param_name, size_t param_value_size, diff --git a/samples/usvm/00_usvmqueries/main.cpp b/samples/usvm/00_usvmqueries/main.cpp index e0f9ca6..88c5865 100644 --- a/samples/usvm/00_usvmqueries/main.cpp +++ b/samples/usvm/00_usvmqueries/main.cpp @@ -10,24 +10,55 @@ #include +static inline bool has_all_svm_caps( + cl_svm_capabilities_exp caps, + cl_svm_capabilities_exp check) +{ + return (caps & check) == check; +} + +static const char* get_svm_name(cl_svm_capabilities_exp svmcaps) +{ + if (has_all_svm_caps(svmcaps, CL_SVM_TYPE_MACRO_SYSTEM_EXP)) { + return "SYSTEM"; + } + if (has_all_svm_caps(svmcaps, CL_SVM_TYPE_MACRO_FINE_GRAIN_BUFFER_EXP)) { + return "FINE_GRAIN_BUFFER"; + } + if (has_all_svm_caps(svmcaps, CL_SVM_TYPE_MACRO_COARSE_GRAIN_BUFFER_EXP)) { + return "COARSE_GRAIN_BUFFER"; + } + if (has_all_svm_caps(svmcaps, CL_SVM_TYPE_MACRO_HOST_EXP)) { + return "HOST"; + } + if (has_all_svm_caps(svmcaps, CL_SVM_TYPE_MACRO_DEVICE_EXP)) { + return "DEVICE"; + } + if (has_all_svm_caps(svmcaps, CL_SVM_TYPE_MACRO_SINGLE_DEVICE_SHARED_EXP)) { + return "SINGLE_DEVICE_SHARED"; + } + return "*** UNKNOWN! ***"; +} + void PrintUSVMCaps( - const char* label, + const char* prefix, cl_svm_capabilities_exp svmcaps ) { - printf("\t\t%s: %s%s%s%s%s%s%s%s%s%s%s\n", - label, + printf("%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n", + prefix, ( svmcaps & CL_SVM_CAPABILITY_SINGLE_ADDRESS_SPACE_EXP ) ? "\n\t\t\tCL_SVM_CAPABILITY_SINGLE_ADDRESS_SPACE_EXP" : "", - ( svmcaps & CL_SVM_CAPABILITY_SYSTEM_ALLOCATOR_EXP ) ? "\n\t\t\tCL_SVM_CAPABILITY_SYSTEM_ALLOCATOR_EXP" : "", + ( svmcaps & CL_SVM_CAPABILITY_SYSTEM_ALLOCATED_EXP ) ? "\n\t\t\tCL_SVM_CAPABILITY_SYSTEM_ALLOCATED_EXP" : "", ( svmcaps & CL_SVM_CAPABILITY_DEVICE_OWNED_EXP ) ? "\n\t\t\tCL_SVM_CAPABILITY_DEVICE_OWNED_EXP" : "", ( svmcaps & CL_SVM_CAPABILITY_HOST_OWNED_EXP ) ? "\n\t\t\tCL_SVM_CAPABILITY_HOST_OWNED_EXP" : "", - ( svmcaps & CL_SVM_CAPABILITY_HOST_ACCESSIBLE_EXP ) ? "\n\t\t\tCL_SVM_CAPABILITY_HOST_ACCESSIBLE_EXP" : "", - ( svmcaps & CL_SVM_CAPABILITY_HOST_ACCESSIBLE_WITH_MAP_EXP ) ? "\n\t\t\tCL_SVM_CAPABILITY_HOST_ACCESSIBLE_WITH_MAP_EXP" : "", - ( svmcaps & CL_SVM_CAPABILITY_DEVICE_ACCESS_EXP ) ? "\n\t\t\tCL_SVM_CAPABILITY_DEVICE_ACCESS_EXP" : "", + ( svmcaps & CL_SVM_CAPABILITY_HOST_READ_EXP ) ? "\n\t\t\tCL_SVM_CAPABILITY_HOST_READ_EXP" : "", + ( svmcaps & CL_SVM_CAPABILITY_HOST_WRITE_EXP ) ? "\n\t\t\tCL_SVM_CAPABILITY_HOST_WRITE_EXP" : "", + ( svmcaps & CL_SVM_CAPABILITY_HOST_MAP_EXP ) ? "\n\t\t\tCL_SVM_CAPABILITY_HOST_MAP_EXP" : "", + ( svmcaps & CL_SVM_CAPABILITY_DEVICE_READ_EXP ) ? "\n\t\t\tCL_SVM_CAPABILITY_DEVICE_READ_EXP" : "", + ( svmcaps & CL_SVM_CAPABILITY_DEVICE_WRITE_EXP ) ? "\n\t\t\tCL_SVM_CAPABILITY_DEVICE_WRITE_EXP" : "", ( svmcaps & CL_SVM_CAPABILITY_DEVICE_ATOMIC_ACCESS_EXP ) ? "\n\t\t\tCL_SVM_CAPABILITY_DEVICE_ATOMIC_ACCESS_EXP" : "", ( svmcaps & CL_SVM_CAPABILITY_CONCURRENT_ACCESS_EXP ) ? "\n\t\t\tCL_SVM_CAPABILITY_CONCURRENT_ACCESS_EXP" : "", ( svmcaps & CL_SVM_CAPABILITY_CONCURRENT_ATOMIC_ACCESS_EXP ) ? "\n\t\t\tCL_SVM_CAPABILITY_CONCURRENT_ATOMIC_ACCESS_EXP" : "", ( svmcaps & CL_SVM_CAPABILITY_INDIRECT_ACCESS_EXP ) ? "\n\t\t\tCL_SVM_CAPABILITY_INDIRECT_ACCESS_EXP" : "" ); - } int main( @@ -77,9 +108,10 @@ int main( for (size_t t = 0; t < usmTypes.size(); t++) { printf("\tUSM Type[%zu]:\n", t); - PrintUSVMCaps("capabilities", usmTypes[t].capabilities); - if (usmTypes[t].toggleable_capabilities) { - PrintUSVMCaps("toggleable_capabilities", usmTypes[t].toggleable_capabilities); + printf("\t\tinferred name: %s\n", get_svm_name(usmTypes[t].capabilities)); + PrintUSVMCaps("\t\tcapabilities: ", usmTypes[t].capabilities); + if (usmTypes[t].optional_capabilities) { + PrintUSVMCaps("\t\toptional_capabilities: ", usmTypes[t].optional_capabilities); } } @@ -90,7 +122,7 @@ int main( context(), 1, &devices[d](), - CL_SVM_CAPABILITY_DEVICE_ACCESS_EXP, + CL_SVM_TYPE_MACRO_DEVICE_EXP, &caps); printf("\tSuggested SVM caps with device handle is: %016" PRIx64 "\n", caps); @@ -100,9 +132,9 @@ int main( context(), 0, nullptr, - CL_SVM_CAPABILITY_DEVICE_ACCESS_EXP, + CL_SVM_TYPE_MACRO_DEVICE_EXP, &caps); - printf("\tSuggested SVM type NULL device handle is: %016" PRIx64 "\n", + printf("\tSuggested SVM caps NULL device handle is: %016" PRIx64 "\n", caps); printf( "\n" ); diff --git a/samples/usvm/01_usvmmeminfo/main.cpp b/samples/usvm/01_usvmmeminfo/main.cpp index 4cd0ca8..11674d2 100644 --- a/samples/usvm/01_usvmmeminfo/main.cpp +++ b/samples/usvm/01_usvmmeminfo/main.cpp @@ -10,6 +10,36 @@ #include +static inline bool has_all_svm_caps( + cl_svm_capabilities_exp caps, + cl_svm_capabilities_exp check) +{ + return (caps & check) == check; +} + +static const char* get_svm_name(cl_svm_capabilities_exp svmcaps) +{ + if (has_all_svm_caps(svmcaps, CL_SVM_TYPE_MACRO_SYSTEM_EXP)) { + return "SYSTEM"; + } + if (has_all_svm_caps(svmcaps, CL_SVM_TYPE_MACRO_FINE_GRAIN_BUFFER_EXP)) { + return "FINE_GRAIN_BUFFER"; + } + if (has_all_svm_caps(svmcaps, CL_SVM_TYPE_MACRO_COARSE_GRAIN_BUFFER_EXP)) { + return "COARSE_GRAIN_BUFFER"; + } + if (has_all_svm_caps(svmcaps, CL_SVM_TYPE_MACRO_HOST_EXP)) { + return "HOST"; + } + if (has_all_svm_caps(svmcaps, CL_SVM_TYPE_MACRO_DEVICE_EXP)) { + return "DEVICE"; + } + if (has_all_svm_caps(svmcaps, CL_SVM_TYPE_MACRO_SINGLE_DEVICE_SHARED_EXP)) { + return "SINGLE_DEVICE_SHARED"; + } + return "*** UNKNOWN! ***"; +} + // Each of these functions should eventually move into opencl.hpp: static cl_svm_capabilities_exp @@ -18,6 +48,7 @@ getSVM_INFO_CAPABILITIES_EXP( cl::Context& context, const void* ptr ) cl_svm_capabilities_exp caps = 0; clGetSVMInfoEXP( context(), + nullptr, ptr, CL_SVM_INFO_CAPABILITIES_EXP, sizeof(caps), @@ -32,6 +63,7 @@ getSVM_INFO_BASE_PTR_EXP( cl::Context& context, const void* ptr ) const void* base = nullptr; clGetSVMInfoEXP( context(), + nullptr, ptr, CL_SVM_INFO_BASE_PTR_EXP, sizeof(base), @@ -46,6 +78,7 @@ getSVM_INFO_SIZE_EXP( cl::Context& context, const void* ptr ) size_t size = 0; clGetSVMInfoEXP( context(), + nullptr, ptr, CL_SVM_INFO_SIZE_EXP, sizeof(size), @@ -60,6 +93,7 @@ getSVM_INFO_ASSOCIATED_DEVICE_HANDLE_EXP( cl::Context& context, const void* ptr cl_device_id device = 0; clGetSVMInfoEXP( context(), + nullptr, ptr, CL_SVM_INFO_ASSOCIATED_DEVICE_HANDLE_EXP, sizeof(device), @@ -113,7 +147,11 @@ int main( std::vector usmTypes = devices[deviceIndex].getInfo(); for (const auto& type : usmTypes) { - printf("\nTesting Allocations with caps %016" PRIx64 ":\n", type.capabilities); + const size_t cAllocSize = 16; + printf("\nTesting %s (%016" PRIx64 "), alloc size = %zu:\n", + get_svm_name(type.capabilities), + type.capabilities, + cAllocSize); const cl_svm_alloc_properties_exp associatedDeviceProps[] = { CL_SVM_ALLOC_ASSOCIATED_DEVICE_HANDLE_EXP, (cl_svm_alloc_properties_exp)devices[deviceIndex](), 0, @@ -127,7 +165,7 @@ int main( props, type.capabilities, CL_MEM_READ_WRITE, - 16, + cAllocSize, 0, nullptr ); printf("Allocated pointer 0: ptr = %p\n", ptr0); @@ -136,7 +174,7 @@ int main( props, type.capabilities, CL_MEM_READ_WRITE, - 16, + cAllocSize, 0, nullptr ); printf("Allocated pointer 1: ptr = %p\n", ptr1); @@ -144,31 +182,31 @@ int main( cl_svm_capabilities_exp caps = 0; caps = getSVM_INFO_CAPABILITIES_EXP(context, ptr0); - printf("Queried base pointer 0: caps = %016" PRIx64 "\n", caps); + printf("Queried caps for base pointer 0: %s (%016" PRIx64 ")\n", get_svm_name(caps), caps); caps = getSVM_INFO_CAPABILITIES_EXP(context, ptr0 + 4); - printf("Queried offset pointer 0: caps = %016" PRIx64 "\n", caps); + printf("Queried caps for offset pointer 0: %s (%016" PRIx64 ")\n", get_svm_name(caps), caps); caps = getSVM_INFO_CAPABILITIES_EXP(context, ptr0 + 64); - printf("Queried out of range pointer 0: caps = %016" PRIx64 "\n", caps); + printf("Queried caps for out of range pointer 0: %s (%016" PRIx64 ")\n", get_svm_name(caps), caps); caps = getSVM_INFO_CAPABILITIES_EXP(context, ptr1); - printf("Queried base pointer 1: caps = %016" PRIx64 "\n", caps); + printf("Queried caps for base pointer 1: %s (%016" PRIx64 ")\n", get_svm_name(caps), caps); caps = getSVM_INFO_CAPABILITIES_EXP(context, ptr1 + 4); - printf("Queried offset pointer 1: caps = %016" PRIx64 "\n", caps); + printf("Queried caps for offset pointer 1: %s (%016" PRIx64 ")\n", get_svm_name(caps), caps); caps = getSVM_INFO_CAPABILITIES_EXP(context, ptr1 + 64); - printf("Queried out of range pointer 1: caps = %016" PRIx64 "\n", caps); + printf("Queried caps for out of range pointer 1: %s (%016" PRIx64 ")\n", get_svm_name(caps), caps); const void* base = getSVM_INFO_BASE_PTR_EXP(context, ptr0 + 4); - printf("Queried offset pointer 0: base = %p\n", base); + printf("Queried base address for offset pointer 0: %p\n", base); size_t size = getSVM_INFO_SIZE_EXP(context, ptr0 + 4); - printf("Queried offset pointer 0: size = %u\n", (unsigned)size); + printf("Queried size for offset pointer 0: %zu\n", size); cl_device_id device = getSVM_INFO_ASSOCIATED_DEVICE_HANDLE_EXP(context, ptr0 + 4); - printf("Queried offset pointer 0: device = %p\n", device); + printf("Queried device id for offset pointer 0: %p\n", device); clSVMFree( context(), diff --git a/samples/usvm/300_usmemhelloworld/main.cpp b/samples/usvm/300_usmemhelloworld/main.cpp index be0fd00..5384d2c 100644 --- a/samples/usvm/300_usmemhelloworld/main.cpp +++ b/samples/usvm/300_usmemhelloworld/main.cpp @@ -71,7 +71,7 @@ int main( cl_uint* s_src = (cl_uint*)clSVMAllocWithPropertiesEXP( context(), props, - CL_SVM_CAPABILITY_HOST_ACCESSIBLE_EXP | CL_SVM_CAPABILITY_DEVICE_ACCESS_EXP, + CL_SVM_TYPE_MACRO_SINGLE_DEVICE_SHARED_EXP, CL_MEM_READ_WRITE, gwx * sizeof(cl_uint), 0, @@ -79,7 +79,7 @@ int main( cl_uint* s_dst = (cl_uint*)clSVMAllocWithPropertiesEXP( context(), props, - CL_SVM_CAPABILITY_HOST_ACCESSIBLE_EXP | CL_SVM_CAPABILITY_DEVICE_ACCESS_EXP, + CL_SVM_TYPE_MACRO_SINGLE_DEVICE_SHARED_EXP, CL_MEM_READ_WRITE, gwx * sizeof(cl_uint), 0, diff --git a/samples/usvm/301_usmemlinkedlist/main.cpp b/samples/usvm/301_usmemlinkedlist/main.cpp index 6f7a8a1..ef39911 100644 --- a/samples/usvm/301_usmemlinkedlist/main.cpp +++ b/samples/usvm/301_usmemlinkedlist/main.cpp @@ -57,7 +57,7 @@ static void init( cl::Context& context, cl::Device& device ) s_head = (Node*)clSVMAllocWithPropertiesEXP( context(), props, - CL_SVM_CAPABILITY_HOST_ACCESSIBLE_EXP | CL_SVM_CAPABILITY_DEVICE_ACCESS_EXP, + CL_SVM_TYPE_MACRO_SINGLE_DEVICE_SHARED_EXP, CL_MEM_READ_WRITE, sizeof(Node), 0, @@ -74,7 +74,7 @@ static void init( cl::Context& context, cl::Device& device ) s_cur->pNext = (Node*)clSVMAllocWithPropertiesEXP( context(), props, - CL_SVM_CAPABILITY_HOST_ACCESSIBLE_EXP | CL_SVM_CAPABILITY_DEVICE_ACCESS_EXP, + CL_SVM_TYPE_MACRO_SINGLE_DEVICE_SHARED_EXP, CL_MEM_READ_WRITE, sizeof(Node), 0, diff --git a/xml/cl.xml b/xml/cl.xml index 63e2d7f..367a0f1 100644 --- a/xml/cl.xml +++ b/xml/cl.xml @@ -401,8 +401,72 @@ server's OpenCL/api-docs repository. cl_svm_capabilities_exp capabilities - cl_svm_capabilities_exp toggleable_capabilities + cl_svm_capabilities_exp optional_capabilities + + #define CL_SVM_TYPE_MACRO_COARSE_GRAIN_BUFFER_EXP \ + (CL_SVM_CAPABILITY_SINGLE_ADDRESS_SPACE_EXP | \ + CL_SVM_CAPABILITY_DEVICE_UNASSOCIATED_EXP | \ + CL_SVM_CAPABILITY_CONTEXT_ACCESS_EXP | \ + CL_SVM_CAPABILITY_HOST_MAP_EXP | \ + CL_SVM_CAPABILITY_DEVICE_READ_EXP | \ + CL_SVM_CAPABILITY_DEVICE_WRITE_EXP | \ + CL_SVM_CAPABILITY_DEVICE_ATOMIC_ACCESS_EXP) + + #define CL_SVM_TYPE_MACRO_FINE_GRAIN_BUFFER_EXP \ + (CL_SVM_CAPABILITY_SINGLE_ADDRESS_SPACE_EXP | \ + CL_SVM_CAPABILITY_DEVICE_UNASSOCIATED_EXP | \ + CL_SVM_CAPABILITY_CONTEXT_ACCESS_EXP | \ + CL_SVM_CAPABILITY_HOST_READ_EXP | \ + CL_SVM_CAPABILITY_HOST_WRITE_EXP | \ + CL_SVM_CAPABILITY_HOST_MAP_EXP | \ + CL_SVM_CAPABILITY_DEVICE_READ_EXP | \ + CL_SVM_CAPABILITY_DEVICE_WRITE_EXP | \ + CL_SVM_CAPABILITY_DEVICE_ATOMIC_ACCESS_EXP | \ + CL_SVM_CAPABILITY_CONCURRENT_ACCESS_EXP) + + #define CL_SVM_TYPE_MACRO_DEVICE_EXP \ + (CL_SVM_CAPABILITY_SINGLE_ADDRESS_SPACE_EXP | \ + CL_SVM_CAPABILITY_DEVICE_OWNED_EXP | \ + CL_SVM_CAPABILITY_DEVICE_READ_EXP | \ + CL_SVM_CAPABILITY_DEVICE_WRITE_EXP | \ + CL_SVM_CAPABILITY_DEVICE_ATOMIC_ACCESS_EXP | \ + CL_SVM_CAPABILITY_INDIRECT_ACCESS_EXP) + + #define CL_SVM_TYPE_MACRO_HOST_EXP \ + (CL_SVM_CAPABILITY_SINGLE_ADDRESS_SPACE_EXP | \ + CL_SVM_CAPABILITY_DEVICE_UNASSOCIATED_EXP | \ + CL_SVM_CAPABILITY_CONTEXT_ACCESS_EXP | \ + CL_SVM_CAPABILITY_HOST_OWNED_EXP | \ + CL_SVM_CAPABILITY_HOST_READ_EXP | \ + CL_SVM_CAPABILITY_HOST_WRITE_EXP | \ + CL_SVM_CAPABILITY_DEVICE_READ_EXP | \ + CL_SVM_CAPABILITY_DEVICE_WRITE_EXP | \ + CL_SVM_CAPABILITY_INDIRECT_ACCESS_EXP) + + #define CL_SVM_TYPE_MACRO_SINGLE_DEVICE_SHARED_EXP \ + (CL_SVM_CAPABILITY_SINGLE_ADDRESS_SPACE_EXP | \ + CL_SVM_CAPABILITY_HOST_READ_EXP | \ + CL_SVM_CAPABILITY_HOST_WRITE_EXP | \ + CL_SVM_CAPABILITY_DEVICE_READ_EXP | \ + CL_SVM_CAPABILITY_DEVICE_WRITE_EXP | \ + CL_SVM_CAPABILITY_INDIRECT_ACCESS_EXP) + + #define CL_SVM_TYPE_MACRO_SYSTEM_EXP \ + (CL_SVM_CAPABILITY_SINGLE_ADDRESS_SPACE_EXP | \ + CL_SVM_CAPABILITY_SYSTEM_ALLOCATED_EXP | \ + CL_SVM_CAPABILITY_DEVICE_UNASSOCIATED_EXP | \ + CL_SVM_CAPABILITY_CONTEXT_ACCESS_EXP | \ + CL_SVM_CAPABILITY_HOST_READ_EXP | \ + CL_SVM_CAPABILITY_HOST_WRITE_EXP | \ + CL_SVM_CAPABILITY_HOST_MAP_EXP | \ + CL_SVM_CAPABILITY_DEVICE_READ_EXP | \ + CL_SVM_CAPABILITY_DEVICE_WRITE_EXP | \ + CL_SVM_CAPABILITY_DEVICE_ATOMIC_ACCESS_EXP | \ + CL_SVM_CAPABILITY_CONCURRENT_ACCESS_EXP | \ + CL_SVM_CAPABILITY_CONCURRENT_ATOMIC_ACCESS_EXP | \ + CL_SVM_CAPABILITY_INDIRECT_ACCESS_EXP) + @@ -1256,18 +1320,20 @@ server's OpenCL/api-docs repository. - + - + - - - - - - - + + + + + + + + + @@ -3393,6 +3459,7 @@ server's OpenCL/api-docs repository. cl_int clGetSVMInfoEXP cl_context context + cl_device_id device const void* ptr cl_svm_info_exp param_name size_t param_value_size @@ -7581,7 +7648,7 @@ server's OpenCL/api-docs repository. - + @@ -7591,14 +7658,16 @@ server's OpenCL/api-docs repository. - + - + - - - + + + + + @@ -7635,9 +7704,17 @@ server's OpenCL/api-docs repository. - + + + + + + + + +