From 0b8b831d56462e1fbfcbd07d0b445afff71721ab Mon Sep 17 00:00:00 2001 From: Yichao Yu <yyc1992@gmail.com> Date: Mon, 19 May 2014 20:07:45 -0400 Subject: [PATCH] const pointers, do not copy strings if not necessary --- pyopencl/c_wrapper/wrap_cl_core.h | 7 ++++--- pyopencl/cffi_cl.py | 8 +++++--- src/c_wrapper/wrap_cl.cpp | 18 +++++++++--------- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/pyopencl/c_wrapper/wrap_cl_core.h b/pyopencl/c_wrapper/wrap_cl_core.h index 594bacd9..1393b0e8 100644 --- a/pyopencl/c_wrapper/wrap_cl_core.h +++ b/pyopencl/c_wrapper/wrap_cl_core.h @@ -42,7 +42,7 @@ error *platform__get_devices(void *ptr_platform, void **ptr_devices, uint32_t *n error *_create_context(void **ptr_ctx, cl_context_properties *properties, cl_uint num_devices, void **ptr_devices); error *_create_command_queue(void **ptr_command_queue, void *ptr_context, void *ptr_device, cl_command_queue_properties properties); error *_create_buffer(void **ptr_buffer, void *ptr_context, cl_mem_flags flags, size_t size, void *hostbuf); -error *_create_program_with_source(void **ptr_program, void *ptr_context, char *src); +error *_create_program_with_source(void **ptr_program, void *ptr_context, const char *src); error *_create_program_with_binary(void **ptr_program, void *ptr_context, cl_uint num_devices, void **ptr_devices, cl_uint num_binaries, char **binaries, size_t *binary_sizes); error *program__build(void *ptr_program, char *options, cl_uint num_devices, void **ptr_devices); error *program__kind(void *ptr_program, int *kind); @@ -57,7 +57,8 @@ error *_create_kernel(void **ptr_kernel, void *ptr_program, char *name); error *kernel__set_arg_null(void *ptr_kernel, cl_uint arg_index); error *kernel__set_arg_mem(void *ptr_kernel, cl_uint arg_index, void *ptr_mem); error *kernel__set_arg_sampler(void *ptr_kernel, cl_uint arg_index, void *ptr_sampler); -error *kernel__set_arg_buf(void *ptr_kernel, cl_uint arg_index, void *buffer, size_t size); +error *kernel__set_arg_buf(void *ptr_kernel, cl_uint arg_index, + const void *buffer, size_t size); error *kernel__get_work_group_info(void *ptr_kernel, cl_kernel_work_group_info param, void *ptr_device, generic_info *out); @@ -80,7 +81,7 @@ error *_enqueue_marker(void **ptr_event, void *ptr_command_queue); error *_enqueue_barrier(void *ptr_command_queue); error *_enqueue_read_buffer(void **ptr_event, void *ptr_command_queue, void *ptr_mem, void *buffer, size_t size, size_t device_offset, void **wait_for, uint32_t num_wait_for, int is_blocking); error *_enqueue_copy_buffer(void **ptr_event, void *ptr_command_queue, void *ptr_src, void *ptr_dst, ptrdiff_t byte_count, size_t src_offset, size_t dst_offset, void **wait_for, uint32_t num_wait_for); -error *_enqueue_write_buffer(void **ptr_event, void *ptr_command_queue, void *ptr_memory_object_holder, void *buffer, size_t size, size_t device_offset, void **wait_for, uint32_t num_wait_for, int is_blocking); +error *_enqueue_write_buffer(void **ptr_event, void *ptr_command_queue, void *ptr_memory_object_holder, const void *buffer, size_t size, size_t device_offset, void **wait_for, uint32_t num_wait_for, int is_blocking); error *_enqueue_read_image(void **ptr_event, void *ptr_command_queue, void *ptr_mem, size_t *origin, size_t *region, void *buffer, size_t size, size_t row_pitch, size_t slice_pitch, void **wait_for, uint32_t num_wait_for, int is_blocking); void populate_constants(void(*add)(const char*, const char*, long value)); diff --git a/pyopencl/cffi_cl.py b/pyopencl/cffi_cl.py index 19a84724..c82a4ae6 100644 --- a/pyopencl/cffi_cl.py +++ b/pyopencl/cffi_cl.py @@ -471,9 +471,11 @@ def _c_buffer_from_obj(obj, writable=False): s_array.nbytes, s_array) elif isinstance(obj, bytes): - # There sould be better ways to pass arguments - p = _ffi.new('char[]', obj) - return (_ffi.cast('void *', p), len(obj), p) + if writable: + # There sould be better ways to pass arguments + p = _ffi.new('char[]', obj) + return (_ffi.cast('void *', p), len(obj), p) + return (obj, len(obj), None) else: raise LogicError("", status_code.INVALID_VALUE, "PyOpencl on PyPy only accepts numpy arrays " diff --git a/src/c_wrapper/wrap_cl.cpp b/src/c_wrapper/wrap_cl.cpp index 74c47cb8..ba0cf69e 100644 --- a/src/c_wrapper/wrap_cl.cpp +++ b/src/c_wrapper/wrap_cl.cpp @@ -2418,10 +2418,9 @@ namespace pyopencl inline program *create_program_with_source( context &ctx, - std::string const &src) + const char *string) { - const char *string = src.c_str(); - size_t length = src.size(); + size_t length = strlen(string); cl_int status_code; PYOPENCL_PRINT_CALL_TRACE("clCreateProgramWithSource"); @@ -2571,7 +2570,7 @@ namespace pyopencl clSetKernelArg, (m_kernel, arg_index, sizeof(cl_sampler), &s)); } - void set_arg_buf(cl_uint arg_index, void *buffer, size_t size) + void set_arg_buf(cl_uint arg_index, const void *buffer, size_t size) { PYOPENCL_CALL_GUARDED( clSetKernelArg, (m_kernel, arg_index, size, buffer)); @@ -2774,7 +2773,7 @@ namespace pyopencl event *enqueue_write_buffer( command_queue &cq, memory_object_holder &mem, - void *buffer, + const void *buffer, size_t size, size_t device_offset, void **wait_for, uint32_t num_wait_for, @@ -3000,13 +2999,14 @@ void pyopencl_free_pointer_array(void **p, uint32_t size) // {{{ program -::error *_create_program_with_source(void **ptr_program, void *ptr_context, char *src) +::error *_create_program_with_source(void **ptr_program, void *ptr_context, + const char *src) { pyopencl::context *ctx = static_cast<pyopencl::context*>(ptr_context); BEGIN_C_HANDLE_ERROR - *ptr_program = create_program_with_source(*ctx, src); + *ptr_program = create_program_with_source(*ctx, src); END_C_HANDLE_ERROR @@ -3166,7 +3166,7 @@ void pyopencl_free_pointer_array(void **p, uint32_t size) } ::error *kernel__set_arg_buf( - void *ptr_kernel, cl_uint arg_index, void *buffer, size_t size) + void *ptr_kernel, cl_uint arg_index, const void *buffer, size_t size) { BEGIN_C_HANDLE_ERROR @@ -3356,7 +3356,7 @@ error *_create_image_3d( ::error *_enqueue_write_buffer( void **ptr_event, void *ptr_command_queue, void *ptr_mem, - void *buffer, size_t size, size_t device_offset, void **wait_for, + const void *buffer, size_t size, size_t device_offset, void **wait_for, uint32_t num_wait_for, int is_blocking) { BEGIN_C_HANDLE_ERROR -- GitLab