diff --git a/src/c_wrapper/context.cpp b/src/c_wrapper/context.cpp index 99d8a530bd43dce2aba956e1f9eed2d8b0ceb4af..6c5937ccc76ba81d287310766e6febb8be338e6c 100644 --- a/src/c_wrapper/context.cpp +++ b/src/c_wrapper/context.cpp @@ -11,6 +11,28 @@ template void print_clobj(std::ostream&, const context*); template void print_buf(std::ostream&, const cl_context*, size_t, ArgType, bool, bool); +void +context::get_version(cl_context ctx, int *major, int *minor) +{ + cl_device_id s_buff[16]; + size_t size; + pyopencl_buf d_buff(0); + cl_device_id *devs = s_buff; + pyopencl_call_guarded(clGetContextInfo, ctx, CL_CONTEXT_DEVICES, + 0, nullptr, buf_arg(size)); + if (PYOPENCL_UNLIKELY(!size)) { + throw clerror("Context.get_version", CL_INVALID_VALUE, + "Cannot get devices from context."); + } + if (PYOPENCL_UNLIKELY(size > sizeof(s_buff))) { + d_buff.resize(size / sizeof(cl_device_id)); + devs = d_buff.get(); + } + pyopencl_call_guarded(clGetContextInfo, ctx, CL_CONTEXT_DEVICES, + size_arg(devs, size), buf_arg(size)); + device::get_version(devs[0], major, minor); +} + context::~context() { pyopencl_call_guarded_cleanup(clReleaseContext, this); diff --git a/src/c_wrapper/context.h b/src/c_wrapper/context.h index be18a3fc7df126ccf5844c5283833162238e3808..3ae4098ccf9ce2ee834c8d553bbd9e3064f173f9 100644 --- a/src/c_wrapper/context.h +++ b/src/c_wrapper/context.h @@ -16,6 +16,7 @@ extern template void print_buf(std::ostream&, const cl_context*, class context : public clobj { public: PYOPENCL_DEF_CL_CLASS(CONTEXT); + void get_version(cl_context ctx, int *major, int *minor); PYOPENCL_INLINE context(cl_context ctx, bool retain) : clobj(ctx) diff --git a/src/c_wrapper/platform.cpp b/src/c_wrapper/platform.cpp index 28b123c838276063d134decf32017a6b2e228875..1bf7e496cedc20ef83edc6fdc211f34dac0c01dc 100644 --- a/src/c_wrapper/platform.cpp +++ b/src/c_wrapper/platform.cpp @@ -42,7 +42,7 @@ platform::get_version(cl_platform_id plat, int *major, int *minor) char *name = s_buff; pyopencl_call_guarded(clGetPlatformInfo, plat, CL_PLATFORM_VERSION, 0, nullptr, buf_arg(size)); - if (size > sizeof(s_buff)) { + if (PYOPENCL_UNLIKELY(size > sizeof(s_buff))) { d_buff.resize(size); name = d_buff.get(); } @@ -50,7 +50,7 @@ platform::get_version(cl_platform_id plat, int *major, int *minor) 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, + throw clerror("Platform.get_version", CL_INVALID_VALUE, "platform returned non-conformant " "platform version string"); }