diff --git a/src/c_wrapper/platform.cpp b/src/c_wrapper/platform.cpp index f0f5b5aadc61525fbaee1f0825bf9eae9205f11e..20e36bcfd6995a4c825861437140ea39ca7d8d42 100644 --- a/src/c_wrapper/platform.cpp +++ b/src/c_wrapper/platform.cpp @@ -2,6 +2,9 @@ #include "device.h" #include "clhelper.h" +#include <stdlib.h> +#include <regex> + namespace pyopencl { template class clobj<cl_platform_id>; @@ -28,6 +31,33 @@ platform::get_info(cl_uint param_name) const } } +static const std::regex ver_regex("^OpenCL ([0-9]+)\\.([0-9]+).*"); + +void +get_platform_version(cl_platform_id plat, int *major, int *minor) +{ + char s_buff[128]; + size_t size; + pyopencl_buf<char> d_buff(0); + char *name = s_buff; + pyopencl_call_guarded(clGetPlatformInfo, plat, CL_PLATFORM_VERSION, + 0, nullptr, buf_arg(size)); + if (size > sizeof(s_buff)) { + d_buff.resize(size); + name = d_buff.get(); + } + pyopencl_call_guarded(clGetPlatformInfo, plat, CL_PLATFORM_VERSION, + size_arg(name, size), buf_arg(size)); + std::cmatch ver_match; + if (!std::regex_match(name, ver_match, ver_regex)) { + throw clerror("get_platform_version", CL_INVALID_VALUE, + "platform returned non-conformant " + "platform version string"); + } + *major = atoi(name + ver_match.position(1)); + *minor = atoi(name + ver_match.position(2)); +} + } // c wrapper diff --git a/src/c_wrapper/platform.h b/src/c_wrapper/platform.h index 4ef0ce8909877ee088fef4a4cf23a35c3bae8d17..1c47123af51ad25cc3011053c0b34ac79d4d8f3c 100644 --- a/src/c_wrapper/platform.h +++ b/src/c_wrapper/platform.h @@ -23,6 +23,8 @@ public: extern template void print_clobj<platform>(std::ostream&, const platform*); +void get_platform_version(cl_platform_id plat, int *major, int *minor); + // }}} }