diff --git a/pyopencl/characterize/__init__.py b/pyopencl/characterize/__init__.py index 26a4a688bba94c3576fc45f9e98fd8e6ef0a6e63..873e1c11c834b4c9b0dfa28837440f318b3a7b21 100644 --- a/pyopencl/characterize/__init__.py +++ b/pyopencl/characterize/__init__.py @@ -387,3 +387,33 @@ def has_struct_arg_count_bug(dev, ctx=None): return "pocl" return False + + +def _may_have_svm(dev): + has_svm = (dev.platform._get_cl_version() >= (2, 0) and + cl.get_cl_header_version() >= (2, 0)) + + if dev.platform.name == "Portable Computing Language": + has_svm = ( + get_pocl_version(dev.platform) >= (1, 0) + and cl.get_cl_header_version() >= (2, 0)) + + return has_svm + + +def has_coarse_grain_buffer_svm(dev): + return (_may_have_svm(dev) and + bool(dev.svm_capabilities + & cl.device_svm_capabilities.COARSE_GRAIN_BUFFER)) + + +def has_fine_grain_buffer_svm(dev): + return (_may_have_svm(dev) and + bool(dev.svm_capabilities + & cl.device_svm_capabilities.FINE_GRAIN_BUFFER)) + + +def has_fine_grain_system_svm(dev): + return (_may_have_svm(dev) and + bool(dev.svm_capabilities + & cl.device_svm_capabilities.FINE_GRAIN_SYSTEM)) diff --git a/test/test_wrapper.py b/test/test_wrapper.py index e8f5c36ba0f2b8aad0c1e5d62f4fbc10aad8ce57..bba4ca6af72f681c5e7ac4eb841a0cce3ca6026f 100644 --- a/test/test_wrapper.py +++ b/test/test_wrapper.py @@ -306,7 +306,7 @@ def test_device_topology_amd_constructor(): assert topol.device == 4 assert topol.function == 5 - assert not topol.__dict__ + assert not hasattr(topol, "__dict__") def test_nonempty_supported_image_formats(ctx_factory): @@ -922,17 +922,10 @@ def test_coarse_grain_svm(ctx_factory): dev = ctx.devices[0] - has_svm = (ctx._get_cl_version() >= (2, 0) and - cl.get_cl_header_version() >= (2, 0)) - - if dev.platform.name == "Portable Computing Language": - has_svm = ( - get_pocl_version(dev.platform) >= (1, 0) - and cl.get_cl_header_version() >= (2, 0)) - - if not has_svm: - from pytest import skip - skip("SVM only available in OpenCL 2.0 and higher") + from pyopencl.characterize import has_coarse_grain_buffer_svm + from pytest import skip + if not has_coarse_grain_buffer_svm(queue.device): + skip("device does not support coarse-grain SVM") if ("AMD" in dev.platform.name and dev.type & cl.device_type.CPU): @@ -981,13 +974,9 @@ def test_fine_grain_svm(ctx_factory): ctx = ctx_factory() queue = cl.CommandQueue(ctx) + from pyopencl.characterize import has_fine_grain_buffer_svm from pytest import skip - if (ctx._get_cl_version() < (2, 0) or - cl.get_cl_header_version() < (2, 0)): - skip("SVM only available in OpenCL 2.0 and higher") - - if not (ctx.devices[0].svm_capabilities - & cl.device_svm_capabilities.FINE_GRAIN_BUFFER): + if not has_fine_grain_buffer_svm(queue.device): skip("device does not support fine-grain SVM") n = 3000