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