diff --git a/pyopencl/c_wrapper/wrap_cl_core.h b/pyopencl/c_wrapper/wrap_cl_core.h index 3e473a0f27f6b7e4df94bb825bd2a7fc99253404..c00379997b106467cc66d5c7f6c0aa84e271f7f6 100644 --- a/pyopencl/c_wrapper/wrap_cl_core.h +++ b/pyopencl/c_wrapper/wrap_cl_core.h @@ -173,6 +173,34 @@ error *enqueue_fill_buffer(clobj_t *_evt, clobj_t _queue, clobj_t _mem, void *pattern, size_t psize, size_t offset, size_t size, const clobj_t *_wait_for, uint32_t num_wait_for); +error *enqueue_read_buffer_rect(clobj_t *evt, clobj_t _queue, clobj_t _mem, + void *buf, const size_t *_buf_orig, + size_t buf_orig_l, const size_t *_host_orig, + size_t host_orig_l, const size_t *_reg, + size_t reg_l, const size_t *_buf_pitches, + size_t buf_pitches_l, + const size_t *_host_pitches, + size_t host_pitches_l, const clobj_t *_wait_for, + uint32_t num_wait_for, int block, void *pyobj); +error *enqueue_write_buffer_rect(clobj_t *evt, clobj_t _queue, clobj_t _mem, + void *buf, const size_t *_buf_orig, + size_t buf_orig_l, const size_t *_host_orig, + size_t host_orig_l, const size_t *_reg, + size_t reg_l, const size_t *_buf_pitches, + size_t buf_pitches_l, + const size_t *_host_pitches, + size_t host_pitches_l, + const clobj_t *_wait_for, + uint32_t num_wait_for, int block, void *pyobj); +error *enqueue_copy_buffer_rect(clobj_t *evt, clobj_t _queue, clobj_t _src, + clobj_t _dst, const size_t *_src_orig, + size_t src_orig_l, const size_t *_dst_orig, + size_t dst_orig_l, const size_t *_reg, + size_t reg_l, const size_t *_src_pitches, + size_t src_pitches_l, + const size_t *_dst_pitches, + size_t dst_pitches_l, const clobj_t *_wait_for, + uint32_t num_wait_for); // enqueue_*_image* error *enqueue_read_image(clobj_t *event, clobj_t queue, clobj_t mem, const size_t *origin, size_t origin_l, diff --git a/src/c_wrapper/buffer.cpp b/src/c_wrapper/buffer.cpp index 87852b33ebbc28f3ac888e4ec34a5f0526012e37..6b82706d03f9f5205fdd9fd44e3d5b21c6ca92e2 100644 --- a/src/c_wrapper/buffer.cpp +++ b/src/c_wrapper/buffer.cpp @@ -152,6 +152,7 @@ enqueue_fill_buffer(clobj_t *evt, clobj_t _queue, clobj_t _mem, void *pattern, const auto wait_for = buf_from_class<event>(_wait_for, num_wait_for); auto queue = static_cast<command_queue*>(_queue); auto mem = static_cast<memory_object*>(_mem); + // TODO debug print pattern return c_handle_error([&] { retry_mem_error([&] { pyopencl_call_guarded( @@ -160,3 +161,97 @@ enqueue_fill_buffer(clobj_t *evt, clobj_t _queue, clobj_t _mem, void *pattern, }); }); } + +// {{{ rectangular transfers + +#if PYOPENCL_CL_VERSION >= 0x1010 + +error* +enqueue_read_buffer_rect(clobj_t *evt, clobj_t _queue, clobj_t _mem, void *buf, + const size_t *_buf_orig, size_t buf_orig_l, + const size_t *_host_orig, size_t host_orig_l, + const size_t *_reg, size_t reg_l, + const size_t *_buf_pitches, size_t buf_pitches_l, + const size_t *_host_pitches, size_t host_pitches_l, + const clobj_t *_wait_for, uint32_t num_wait_for, + int block, void *pyobj) +{ + const auto wait_for = buf_from_class<event>(_wait_for, num_wait_for); + auto queue = static_cast<command_queue*>(_queue); + auto mem = static_cast<memory_object*>(_mem); + ConstBuffer<size_t, 3> buf_orig(_buf_orig, buf_orig_l); + ConstBuffer<size_t, 3> host_orig(_host_orig, host_orig_l); + ConstBuffer<size_t, 3> reg(_reg, reg_l, 1); + ConstBuffer<size_t, 2> buf_pitches(_buf_pitches, buf_pitches_l); + ConstBuffer<size_t, 2> host_pitches(_host_pitches, host_pitches_l); + return c_handle_error([&] { + retry_mem_error([&] { + pyopencl_call_guarded( + clEnqueueReadBufferRect, queue, mem, bool(block), + buf_orig, host_orig, reg, buf_pitches[0], + buf_pitches[1], host_pitches[0], host_pitches[1], + buf, wait_for, nanny_event_out(evt, pyobj)); + }); + }); +} + +error* +enqueue_write_buffer_rect(clobj_t *evt, clobj_t _queue, clobj_t _mem, void *buf, + const size_t *_buf_orig, size_t buf_orig_l, + const size_t *_host_orig, size_t host_orig_l, + const size_t *_reg, size_t reg_l, + const size_t *_buf_pitches, size_t buf_pitches_l, + const size_t *_host_pitches, size_t host_pitches_l, + const clobj_t *_wait_for, uint32_t num_wait_for, + int block, void *pyobj) +{ + const auto wait_for = buf_from_class<event>(_wait_for, num_wait_for); + auto queue = static_cast<command_queue*>(_queue); + auto mem = static_cast<memory_object*>(_mem); + ConstBuffer<size_t, 3> buf_orig(_buf_orig, buf_orig_l); + ConstBuffer<size_t, 3> host_orig(_host_orig, host_orig_l); + ConstBuffer<size_t, 3> reg(_reg, reg_l, 1); + ConstBuffer<size_t, 2> buf_pitches(_buf_pitches, buf_pitches_l); + ConstBuffer<size_t, 2> host_pitches(_host_pitches, host_pitches_l); + return c_handle_error([&] { + retry_mem_error([&] { + pyopencl_call_guarded( + clEnqueueWriteBufferRect, queue, mem, bool(block), + buf_orig, host_orig, reg, buf_pitches[0], + buf_pitches[1], host_pitches[0], host_pitches[1], + buf, wait_for, nanny_event_out(evt, pyobj)); + }); + }); +} + +error* +enqueue_copy_buffer_rect(clobj_t *evt, clobj_t _queue, clobj_t _src, + clobj_t _dst, const size_t *_src_orig, + size_t src_orig_l, const size_t *_dst_orig, + size_t dst_orig_l, const size_t *_reg, size_t reg_l, + const size_t *_src_pitches, size_t src_pitches_l, + const size_t *_dst_pitches, size_t dst_pitches_l, + const clobj_t *_wait_for, uint32_t num_wait_for) +{ + const auto wait_for = buf_from_class<event>(_wait_for, num_wait_for); + auto queue = static_cast<command_queue*>(_queue); + auto src = static_cast<memory_object*>(_src); + auto dst = static_cast<memory_object*>(_dst); + ConstBuffer<size_t, 3> src_orig(_src_orig, src_orig_l); + ConstBuffer<size_t, 3> dst_orig(_dst_orig, dst_orig_l); + ConstBuffer<size_t, 3> reg(_reg, reg_l, 1); + ConstBuffer<size_t, 2> src_pitches(_src_pitches, src_pitches_l); + ConstBuffer<size_t, 2> dst_pitches(_dst_pitches, dst_pitches_l); + return c_handle_error([&] { + retry_mem_error([&] { + pyopencl_call_guarded( + clEnqueueCopyBufferRect, queue, src, dst, + src_orig, dst_orig, reg, src_pitches[0], + src_pitches[1], dst_pitches[0], dst_pitches[1], + wait_for, event_out(evt)); + }); + }); +} + +#endif +// }}} diff --git a/src/c_wrapper/utils.h b/src/c_wrapper/utils.h index 2ac9383b340f5935ed5d458d1b06d0e2538e421b..6bac71826085013e3bb472d47b0887e0a682f248 100644 --- a/src/c_wrapper/utils.h +++ b/src/c_wrapper/utils.h @@ -231,6 +231,11 @@ public: { return m_buf; } + PYOPENCL_INLINE T& + operator[](int i) const + { + return this->get()[i]; + } PYOPENCL_INLINE size_t len() const noexcept {