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) { #if PYOPENCL_CL_VERSION >= 0x1010 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_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)); }); #else PYOPENCL_UNSUPPORTED(clEnqueueCopyBufferRect, "CL 1.0") #endif }
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) { #if PYOPENCL_CL_VERSION >= 0x1010 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_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)); }); #else PYOPENCL_UNSUPPORTED(clEnqueueWriteBufferRect, "CL 1.0") #endif }
// Buffer error* create_buffer(clobj_t *buffer, clobj_t _ctx, cl_mem_flags flags, size_t size, void *hostbuf) { auto ctx = static_cast<context*>(_ctx); return c_handle_retry_mem_error([&] { auto mem = pyopencl_call_guarded(clCreateBuffer, ctx, flags, size, hostbuf); *buffer = new_buffer(mem); }); }
// Image error* create_image_2d(clobj_t *img, clobj_t _ctx, cl_mem_flags flags, cl_image_format *fmt, size_t width, size_t height, size_t pitch, void *buf) { auto ctx = static_cast<context*>(_ctx); return c_handle_retry_mem_error([&] { auto mem = pyopencl_call_guarded(clCreateImage2D, ctx, flags, fmt, width, height, pitch, buf); *img = new_image(mem, fmt); }); }
error* enqueue_task(clobj_t *evt, clobj_t _queue, clobj_t _knl, const clobj_t *_wait_for, uint32_t num_wait_for) { auto queue = static_cast<command_queue*>(_queue); auto knl = static_cast<kernel*>(_knl); const auto wait_for = buf_from_class<event>(_wait_for, num_wait_for); return c_handle_retry_mem_error([&] { pyopencl_call_guarded(clEnqueueTask, queue, knl, wait_for, event_out(evt)); }); }
error* enqueue_migrate_mem_objects(clobj_t *evt, clobj_t _queue, const clobj_t *_mem_obj, uint32_t num_mem_obj, cl_mem_migration_flags flags, const clobj_t *_wait_for, uint32_t num_wait_for) { const auto wait_for = buf_from_class<event>(_wait_for, num_wait_for); const auto mem_obj = buf_from_class<memory_object>(_mem_obj, num_mem_obj); auto queue = static_cast<command_queue*>(_queue); return c_handle_retry_mem_error([&] { pyopencl_call_guarded(clEnqueueMigrateMemObjects, queue, mem_obj, flags, wait_for, event_out(evt)); }); }
error* enqueue_write_buffer(clobj_t *evt, clobj_t _queue, clobj_t _mem, const void *buffer, size_t size, size_t device_offset, 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); return c_handle_retry_mem_error([&] { pyopencl_call_guarded( clEnqueueWriteBuffer, queue, mem, bool(block), device_offset, size, buffer, wait_for, nanny_event_out(evt, pyobj)); }); }
error* enqueue_nd_range_kernel(clobj_t *evt, clobj_t _queue, clobj_t _knl, cl_uint work_dim, const size_t *global_work_offset, const size_t *global_work_size, const size_t *local_work_size, const clobj_t *_wait_for, uint32_t num_wait_for) { auto queue = static_cast<command_queue*>(_queue); auto knl = static_cast<kernel*>(_knl); const auto wait_for = buf_from_class<event>(_wait_for, num_wait_for); return c_handle_retry_mem_error([&] { pyopencl_call_guarded(clEnqueueNDRangeKernel, queue, knl, work_dim, global_work_offset, global_work_size, local_work_size, wait_for, event_out(evt)); }); }
error* svm_alloc( clobj_t _ctx, cl_mem_flags flags, size_t size, cl_uint alignment, void **result) { #if PYOPENCL_CL_VERSION >= 0x2000 auto ctx = static_cast<context*>(_ctx); return c_handle_retry_mem_error([&] { *result = clSVMAlloc(ctx->data(), flags, size, alignment); if (!*result) throw clerror("clSVMalloc", CL_INVALID_VALUE, "(allocation failure, unspecified reason)"); }); #else PYOPENCL_UNSUPPORTED_BEFORE(clSVMAlloc, "CL 2.0") #endif }
error* enqueue_copy_buffer_to_image(clobj_t *evt, clobj_t _queue, clobj_t _src, clobj_t _dst, size_t offset, const size_t *_orig, size_t orig_l, const size_t *_reg, size_t reg_l, const clobj_t *_wait_for, uint32_t num_wait_for) { auto queue = static_cast<command_queue*>(_queue); auto src = static_cast<buffer*>(_src); auto dst = static_cast<image*>(_dst); const auto wait_for = buf_from_class<event>(_wait_for, num_wait_for); ConstBuffer<size_t, 3> orig(_orig, orig_l); ConstBuffer<size_t, 3> reg(_reg, reg_l, 1); return c_handle_retry_mem_error([&] { pyopencl_call_guarded(clEnqueueCopyBufferToImage, queue, src, dst, offset, orig, reg, wait_for, event_out(evt)); }); }
error* enqueue_fill_image(clobj_t *evt, clobj_t _queue, clobj_t mem, const void *color, const size_t *_orig, size_t orig_l, const size_t *_reg, size_t reg_l, const clobj_t *_wait_for, uint32_t num_wait_for) { // TODO debug color auto queue = static_cast<command_queue*>(_queue); auto img = static_cast<image*>(mem); const auto wait_for = buf_from_class<event>(_wait_for, num_wait_for); ConstBuffer<size_t, 3> orig(_orig, orig_l); ConstBuffer<size_t, 3> reg(_reg, reg_l, 1); return c_handle_retry_mem_error([&] { pyopencl_call_guarded(clEnqueueFillImage, queue, img, color, orig, reg, wait_for, event_out(evt)); }); }
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) { #if PYOPENCL_CL_VERSION >= 0x1020 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_retry_mem_error([&] { pyopencl_call_guarded(clEnqueueFillBuffer, queue, mem, pattern, psize, offset, size, wait_for, event_out(evt)); }); #else PYOPENCL_UNSUPPORTED(clEnqueueFillBuffer, "CL 1.1 and below") #endif }
error* enqueue_svm_unmap( clobj_t *evt, clobj_t _queue, void *svm_ptr, const clobj_t *_wait_for, uint32_t num_wait_for) { #if PYOPENCL_CL_VERSION >= 0x2000 const auto wait_for = buf_from_class<event>(_wait_for, num_wait_for); auto queue = static_cast<command_queue*>(_queue); return c_handle_retry_mem_error([&] { pyopencl_call_guarded( clEnqueueSVMUnmap, queue, svm_ptr, wait_for, event_out(evt)); }); #else PYOPENCL_UNSUPPORTED_BEFORE(clEnqueueSVMUnmap, "CL 2.0") #endif }
error* enqueue_write_image(clobj_t *evt, clobj_t _queue, clobj_t _mem, const size_t *_orig, size_t orig_l, const size_t *_reg, size_t reg_l, const void *buf, size_t row_pitch, size_t slice_pitch, const clobj_t *_wait_for, uint32_t num_wait_for, int block, void *pyobj) { auto queue = static_cast<command_queue*>(_queue); auto img = static_cast<image*>(_mem); const auto wait_for = buf_from_class<event>(_wait_for, num_wait_for); ConstBuffer<size_t, 3> orig(_orig, orig_l); ConstBuffer<size_t, 3> reg(_reg, reg_l, 1); return c_handle_retry_mem_error([&] { pyopencl_call_guarded(clEnqueueWriteImage, queue, img, bool(block), orig, reg, row_pitch, slice_pitch, buf, wait_for, nanny_event_out(evt, pyobj)); }); }
error* enqueue_svm_memcpy( clobj_t *evt, clobj_t _queue, cl_bool is_blocking, void *dst_ptr, const void *src_ptr, size_t size, const clobj_t *_wait_for, uint32_t num_wait_for) { #if PYOPENCL_CL_VERSION >= 0x2000 const auto wait_for = buf_from_class<event>(_wait_for, num_wait_for); auto queue = static_cast<command_queue*>(_queue); return c_handle_retry_mem_error([&] { pyopencl_call_guarded( clEnqueueSVMMemcpy, queue, is_blocking, dst_ptr, src_ptr, size, wait_for, event_out(evt)); }); #else PYOPENCL_UNSUPPORTED_BEFORE(clEnqueueSVMMemcpy, "CL 2.0") #endif }
error* enqueue_svm_migrate_mem( clobj_t *evt, clobj_t _queue, cl_uint num_svm_pointers, const void **svm_pointers, const size_t *sizes, cl_mem_migration_flags flags, const clobj_t *_wait_for, uint32_t num_wait_for) { #if PYOPENCL_CL_VERSION >= 0x2010 const auto wait_for = buf_from_class<event>(_wait_for, num_wait_for); auto queue = static_cast<command_queue*>(_queue); return c_handle_retry_mem_error([&] { pyopencl_call_guarded( clEnqueueSVMMigrateMem, queue, num_svm_pointers, svm_pointers, sizes, flags, wait_for, event_out(evt)); }); #else PYOPENCL_UNSUPPORTED_BEFORE(clEnqueueSVMMigrateMem, "CL 2.1") #endif }
error* enqueue_svm_free( clobj_t *evt, clobj_t _queue, cl_uint num_svm_pointers, void *svm_pointers[], const clobj_t *_wait_for, uint32_t num_wait_for) { #if PYOPENCL_CL_VERSION >= 0x2000 const auto wait_for = buf_from_class<event>(_wait_for, num_wait_for); auto queue = static_cast<command_queue*>(_queue); return c_handle_retry_mem_error([&] { pyopencl_call_guarded( clEnqueueSVMFree, queue, num_svm_pointers, svm_pointers, /* pfn_free_func*/ nullptr, /* user_data */ nullptr, wait_for, event_out(evt)); }); #else PYOPENCL_UNSUPPORTED_BEFORE(clEnqueueSVMFree, "CL 2.0") #endif }