From 9b34f88c8a138631a049fa45efc928868ab76d3e Mon Sep 17 00:00:00 2001 From: Yichao Yu <yyc1992@gmail.com> Date: Sun, 22 Jun 2014 13:22:11 +0800 Subject: [PATCH] get_platform_version --- src/c_wrapper/platform.cpp | 30 ++++++++++++++++++++++++++++++ src/c_wrapper/platform.h | 2 ++ 2 files changed, 32 insertions(+) diff --git a/src/c_wrapper/platform.cpp b/src/c_wrapper/platform.cpp index f0f5b5aa..20e36bcf 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 4ef0ce89..1c47123a 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); + // }}} } -- GitLab