From fc244cc6d95f100809ca37e5d072823020e57795 Mon Sep 17 00:00:00 2001 From: Yichao Yu <yyc1992@gmail.com> Date: Sun, 22 Jun 2014 14:15:12 +0800 Subject: [PATCH] Kernel.get_arg_info --- TODOs | 1 - pyopencl/c_wrapper/wrap_cl_core.h | 2 ++ pyopencl/cffi_cl.py | 5 +++++ src/c_wrapper/kernel.cpp | 32 +++++++++++++++++++++++++++++++ src/c_wrapper/kernel.h | 32 ++++--------------------------- 5 files changed, 43 insertions(+), 29 deletions(-) diff --git a/TODOs b/TODOs index ab94abae..22ae0413 100644 --- a/TODOs +++ b/TODOs @@ -13,7 +13,6 @@ - _Program.compile - _Program.link - _Program.all_kernels -- Kernel.get_arg_info - ?LocalMemory - get_apple_cgl_share_group - GLBuffer diff --git a/pyopencl/c_wrapper/wrap_cl_core.h b/pyopencl/c_wrapper/wrap_cl_core.h index 40ac1fc6..f2b92603 100644 --- a/pyopencl/c_wrapper/wrap_cl_core.h +++ b/pyopencl/c_wrapper/wrap_cl_core.h @@ -123,6 +123,8 @@ error *kernel__set_arg_buf(clobj_t kernel, cl_uint arg_index, error *kernel__get_work_group_info(clobj_t kernel, cl_kernel_work_group_info param, clobj_t device, generic_info *out); +error *kernel__get_arg_info(clobj_t _knl, cl_uint idx, + cl_kernel_arg_info param, generic_info *out); // Image error *create_image_2d(clobj_t *image, clobj_t context, cl_mem_flags flags, cl_image_format *fmt, size_t width, size_t height, diff --git a/pyopencl/cffi_cl.py b/pyopencl/cffi_cl.py index d1fc6bee..ca7d20ef 100644 --- a/pyopencl/cffi_cl.py +++ b/pyopencl/cffi_cl.py @@ -910,6 +910,11 @@ class Kernel(_Common): self.ptr, param, device.ptr, info)) return _generic_info_to_python(info) + def get_arg_info(self, idx, param): + info = _ffi.new('generic_info*') + _handle_error(_lib.kernel__get_arg_info(self.ptr, idx, param, info)) + return _generic_info_to_python(info) + # }}} diff --git a/src/c_wrapper/kernel.cpp b/src/c_wrapper/kernel.cpp index 7de0343a..3e94cdbf 100644 --- a/src/c_wrapper/kernel.cpp +++ b/src/c_wrapper/kernel.cpp @@ -67,6 +67,26 @@ kernel::get_work_group_info(cl_kernel_work_group_info param, } } +#if PYOPENCL_CL_VERSION >= 0x1020 +PYOPENCL_USE_RESULT generic_info +kernel::get_arg_info(cl_uint idx, cl_kernel_arg_info param) const +{ + switch (param) { + case CL_KERNEL_ARG_ADDRESS_QUALIFIER: + return pyopencl_get_int_info(cl_kernel_arg_address_qualifier, + KernelArg, this, idx, param); + case CL_KERNEL_ARG_ACCESS_QUALIFIER: + return pyopencl_get_int_info(cl_kernel_arg_access_qualifier, + KernelArg, this, idx, param); + case CL_KERNEL_ARG_TYPE_NAME: + case CL_KERNEL_ARG_NAME: + return pyopencl_get_str_info(KernelArg, this, idx, param); + default: + throw clerror("Kernel.get_arg_info", CL_INVALID_VALUE); + } +} +#endif + } // c wrapper @@ -137,6 +157,18 @@ kernel__get_work_group_info(clobj_t _knl, cl_kernel_work_group_info param, }); } +#if PYOPENCL_CL_VERSION >= 0x1020 +error* +kernel__get_arg_info(clobj_t _knl, cl_uint idx, cl_kernel_arg_info param, + generic_info *out) +{ + auto knl = static_cast<kernel*>(_knl); + return c_handle_error([&] { + *out = knl->get_arg_info(idx, param); + }); +} +#endif + error* enqueue_nd_range_kernel(clobj_t *evt, clobj_t _queue, clobj_t _knl, cl_uint work_dim, const size_t *global_work_offset, diff --git a/src/c_wrapper/kernel.h b/src/c_wrapper/kernel.h index fda782d0..c297dae6 100644 --- a/src/c_wrapper/kernel.h +++ b/src/c_wrapper/kernel.h @@ -33,34 +33,10 @@ public: get_work_group_info(cl_kernel_work_group_info param, const device *dev) const; - // #if PYOPENCL_CL_VERSION >= 0x1020 - // py::object get_arg_info( - // cl_uint arg_index, - // cl_kernel_arg_info param_name - // ) const - // { - // switch (param_name) - // { - // #define PYOPENCL_FIRST_ARG data(), arg_index // hackety hack - // case CL_KERNEL_ARG_ADDRESS_QUALIFIER: - // PYOPENCL_GET_INTEGRAL_INFO(KernelArg, - // PYOPENCL_FIRST_ARG, param_name, - // cl_kernel_arg_address_qualifier); - - // case CL_KERNEL_ARG_ACCESS_QUALIFIER: - // PYOPENCL_GET_INTEGRAL_INFO(KernelArg, - // PYOPENCL_FIRST_ARG, param_name, - // cl_kernel_arg_access_qualifier); - - // case CL_KERNEL_ARG_TYPE_NAME: - // case CL_KERNEL_ARG_NAME: - // PYOPENCL_GET_STR_INFO(KernelArg, PYOPENCL_FIRST_ARG, param_name); - // #undef PYOPENCL_FIRST_ARG - // default: - // throw error("Kernel.get_arg_info", CL_INVALID_VALUE); - // } - // } - // #endif +#if PYOPENCL_CL_VERSION >= 0x1020 + PYOPENCL_USE_RESULT generic_info + get_arg_info(cl_uint idx, cl_kernel_arg_info param) const; +#endif }; extern template void print_clobj<kernel>(std::ostream&, const kernel*); -- GitLab