Example #1
0
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
}
Example #2
0
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
}
Example #3
0
// 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);
        });
}
Example #4
0
// 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);
        });
}
Example #5
0
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));
    });
}
Example #6
0
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));
        });
}
Example #7
0
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));
        });
}
Example #8
0
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));
    });
}
Example #9
0
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
}
Example #10
0
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));
        });
}
Example #11
0
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));
        });
}
Example #12
0
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
}
Example #13
0
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
}
Example #14
0
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));
        });
}
Example #15
0
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
}
Example #16
0
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
}
Example #17
0
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
}