From bae2c48a3f3ce2176bb5ad759f4837e19abe70dd Mon Sep 17 00:00:00 2001 From: Yichao Yu <yyc1992@gmail.com> Date: Fri, 16 May 2014 07:34:30 -0400 Subject: [PATCH] enqueue_marker/barrier --- pyopencl/c_wrapper/wrap_cl_core.h | 8 +++ pyopencl/cffi_cl.py | 35 ++++++++++- src/c_wrapper/wrap_cl.cpp | 101 ++++++++++++++++++++++++++++++ 3 files changed, 143 insertions(+), 1 deletion(-) diff --git a/pyopencl/c_wrapper/wrap_cl_core.h b/pyopencl/c_wrapper/wrap_cl_core.h index 2e3132b9..a586a33d 100644 --- a/pyopencl/c_wrapper/wrap_cl_core.h +++ b/pyopencl/c_wrapper/wrap_cl_core.h @@ -70,6 +70,14 @@ error *image__get_image_info(void *ptr_image, cl_image_info param, generic_info long _hash(void *ptr_platform, class_t); error *_enqueue_nd_range_kernel(void **ptr_event, void *ptr_command_queue, void *ptr_kernel, cl_uint work_dim, const size_t *global_work_offset, const size_t *global_work_size, const size_t *local_work_size); + +error *_enqueue_marker_with_wait_list(void **ptr_event, void *ptr_command_queue, + void **wait_for, uint32_t num_wait_for); +error *_enqueue_barrier_with_wait_list(void **ptr_event, + void *ptr_command_queue, + void **wait_for, uint32_t num_wait_for); +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); diff --git a/pyopencl/cffi_cl.py b/pyopencl/cffi_cl.py index 16fd418c..8d2510e6 100644 --- a/pyopencl/cffi_cl.py +++ b/pyopencl/cffi_cl.py @@ -704,11 +704,44 @@ def enqueue_nd_range_kernel(queue, kernel, # }}} +# {{{ _enqueue_marker_* + +def _enqueue_marker_with_wait_list(queue, wait_for=None): + ptr_event = _ffi.new('void **') + c_wait_for, num_wait_for = _c_obj_list(wait_for) + _handle_error(_lib._enqueue_marker_with_wait_list( + ptr_event, + queue.ptr, + c_wait_for, num_wait_for)) + return _create_instance(Event, ptr_event[0]) + +def _enqueue_marker(queue): + ptr_event = _ffi.new('void **') + _handle_error(_lib._enqueue_marker(ptr_event, queue.ptr)) + return _create_instance(Event, ptr_event[0]) + +# }}} + +# {{{ _enqueue_barrier_* + +def _enqueue_barrier_with_wait_list(queue, wait_for=None): + ptr_event = _ffi.new('void **') + c_wait_for, num_wait_for = _c_obj_list(wait_for) + _handle_error(_lib._enqueue_barrier_with_wait_list( + ptr_event, + queue.ptr, + c_wait_for, num_wait_for)) + return _create_instance(Event, ptr_event[0]) + +def _enqueue_barrier(queue): + _handle_error(_lib._enqueue_barrier(queue.ptr)) + +# }}} # {{{ _enqueue_*_buffer def _enqueue_read_buffer(queue, mem, hostbuf, device_offset=0, - wait_for=None, is_blocking=True): + wait_for=None, is_blocking=True): c_buf, size, _ = _c_buffer_from_obj(hostbuf, writable=True) ptr_event = _ffi.new('void **') c_wait_for, num_wait_for = _c_obj_list(wait_for) diff --git a/src/c_wrapper/wrap_cl.cpp b/src/c_wrapper/wrap_cl.cpp index 1c89e94c..18d2c0cb 100644 --- a/src/c_wrapper/wrap_cl.cpp +++ b/src/c_wrapper/wrap_cl.cpp @@ -2834,6 +2834,51 @@ namespace pyopencl )); PYOPENCL_RETURN_NEW_EVENT(evt); } + +#if PYOPENCL_CL_VERSION >= 0x1020 + inline + event *enqueue_marker_with_wait_list(command_queue &cq, + void **wait_for, uint32_t num_wait_for) + { + PYOPENCL_PARSE_WAIT_FOR; + cl_event evt; + + PYOPENCL_CALL_GUARDED(clEnqueueMarkerWithWaitList, ( + cq.data(), PYOPENCL_WAITLIST_ARGS, &evt)); + + PYOPENCL_RETURN_NEW_EVENT(evt); + } + + inline + event *enqueue_barrier_with_wait_list(command_queue &cq, + void **wait_for, uint32_t num_wait_for) + { + PYOPENCL_PARSE_WAIT_FOR; + cl_event evt; + + PYOPENCL_CALL_GUARDED(clEnqueueBarrierWithWaitList, + (cq.data(), PYOPENCL_WAITLIST_ARGS, &evt)); + + PYOPENCL_RETURN_NEW_EVENT(evt); + } +#endif + + inline + event *enqueue_marker(command_queue &cq) + { + cl_event evt; + // TODO + //PYOPENCL_RETRY_IF_MEM_ERROR( + PYOPENCL_CALL_GUARDED(clEnqueueMarker, (cq.data(), &evt)); + //); + PYOPENCL_RETURN_NEW_EVENT(evt); + } + + inline + void enqueue_barrier(command_queue &cq) + { + PYOPENCL_CALL_GUARDED(clEnqueueBarrier, (cq.data())); + } } @@ -3234,6 +3279,62 @@ error *_create_image_3d( return 0; } +#if PYOPENCL_CL_VERSION >= 0x1020 +::error *_enqueue_marker_with_wait_list( + void **ptr_event, void *ptr_command_queue, void **wait_for, + uint32_t num_wait_for) +{ + BEGIN_C_HANDLE_ERROR + + *ptr_event = enqueue_marker_with_wait_list( + *static_cast<pyopencl::command_queue*>(ptr_command_queue), + wait_for, num_wait_for); + + END_C_HANDLE_ERROR + + return 0; +} + +::error *_enqueue_barrier_with_wait_list( + void **ptr_event, void *ptr_command_queue, void **wait_for, + uint32_t num_wait_for) +{ + BEGIN_C_HANDLE_ERROR + + *ptr_event = enqueue_barrier_with_wait_list( + *static_cast<pyopencl::command_queue*>(ptr_command_queue), + wait_for, num_wait_for); + + END_C_HANDLE_ERROR + + return 0; +} +#endif + +::error *_enqueue_marker( + void **ptr_event, void *ptr_command_queue) +{ + BEGIN_C_HANDLE_ERROR + + *ptr_event = enqueue_marker( + *static_cast<pyopencl::command_queue*>(ptr_command_queue)); + + END_C_HANDLE_ERROR + + return 0; +} + +::error *_enqueue_barrier(void *ptr_command_queue) +{ + BEGIN_C_HANDLE_ERROR + + enqueue_barrier(*static_cast<pyopencl::command_queue*>(ptr_command_queue)); + + END_C_HANDLE_ERROR + + return 0; +} + // {{{ transfer enqueues ::error *_enqueue_read_buffer( -- GitLab