Newer
Older
#include "kernel.h"
#include "context.h"
#include "device.h"
#include "program.h"
#include "memory_object.h"
#include "sampler.h"
#include "command_queue.h"
#include "event.h"
#include "clhelper.h"
namespace pyopencl {
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
kernel::~kernel()
{
pyopencl_call_guarded_cleanup(clReleaseKernel, this);
}
generic_info
kernel::get_info(cl_uint param) const
{
switch ((cl_kernel_info)param) {
case CL_KERNEL_FUNCTION_NAME:
return pyopencl_get_str_info(Kernel, this, param);
case CL_KERNEL_NUM_ARGS:
case CL_KERNEL_REFERENCE_COUNT:
return pyopencl_get_int_info(cl_uint, Kernel, this, param);
case CL_KERNEL_CONTEXT:
return pyopencl_get_opaque_info(context, Kernel, this, param);
case CL_KERNEL_PROGRAM:
return pyopencl_get_opaque_info(program, Kernel, this, param);
#if PYOPENCL_CL_VERSION >= 0x1020
case CL_KERNEL_ATTRIBUTES:
return pyopencl_get_str_info(Kernel, this, param);
#endif
default:
throw clerror("Kernel.get_info", CL_INVALID_VALUE);
}
}
generic_info
kernel::get_work_group_info(cl_kernel_work_group_info param,
const device *dev) const
{
switch (param) {
#if PYOPENCL_CL_VERSION >= 0x1010
case CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE:
#endif
case CL_KERNEL_WORK_GROUP_SIZE:
return pyopencl_get_int_info(size_t, KernelWorkGroup, this, dev, param);
case CL_KERNEL_COMPILE_WORK_GROUP_SIZE:
return pyopencl_get_array_info(size_t, KernelWorkGroup,
this, dev, param);
case CL_KERNEL_LOCAL_MEM_SIZE:
#if PYOPENCL_CL_VERSION >= 0x1010
case CL_KERNEL_PRIVATE_MEM_SIZE:
#endif
return pyopencl_get_int_info(cl_ulong, KernelWorkGroup,
this, dev, param);
default:
throw clerror("Kernel.get_work_group_info", CL_INVALID_VALUE);
}
}
}
// c wrapper
// Import all the names in pyopencl namespace for c wrappers.
using namespace pyopencl;
// Kernel
error*
create_kernel(clobj_t *knl, clobj_t _prog, const char *name)
{
auto prog = static_cast<const program*>(_prog);
return c_handle_error([&] {
*knl = new kernel(pyopencl_call_guarded(clCreateKernel, prog,
name), false);
});
}
error*
kernel__set_arg_null(clobj_t _knl, cl_uint arg_index)
{
auto knl = static_cast<kernel*>(_knl);
return c_handle_error([&] {
const cl_mem m = 0;
pyopencl_call_guarded(clSetKernelArg, knl,
arg_index, make_sizearg(m));
});
}
error*
kernel__set_arg_mem(clobj_t _knl, cl_uint arg_index, clobj_t _mem)
{
auto knl = static_cast<kernel*>(_knl);
auto mem = static_cast<memory_object*>(_mem);
return c_handle_error([&] {
pyopencl_call_guarded(clSetKernelArg, knl, arg_index,
make_sizearg(mem->data()));
});
}
error*
kernel__set_arg_sampler(clobj_t _knl, cl_uint arg_index, clobj_t _samp)
{
auto knl = static_cast<kernel*>(_knl);
auto samp = static_cast<sampler*>(_samp);
return c_handle_error([&] {
pyopencl_call_guarded(clSetKernelArg, knl, arg_index,
make_sizearg(samp->data()));
});
}
error*
kernel__set_arg_buf(clobj_t _knl, cl_uint arg_index,
const void *buffer, size_t size)
{
auto knl = static_cast<kernel*>(_knl);
return c_handle_error([&] {
pyopencl_call_guarded(clSetKernelArg, knl, arg_index, size, buffer);
});
}
error*
kernel__get_work_group_info(clobj_t _knl, cl_kernel_work_group_info param,
clobj_t _dev, generic_info *out)
{
auto knl = static_cast<kernel*>(_knl);
auto dev = static_cast<device*>(_dev);
return c_handle_error([&] {
*out = knl->get_work_group_info(param, dev);
});
}
error*
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_error([&] {
retry_mem_error([&] {
pyopencl_call_guarded(
clEnqueueNDRangeKernel, queue, knl,
work_dim, global_work_offset, global_work_size,
});
});
}
error*
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_error([&] {
retry_mem_error([&] {
pyopencl_call_guarded(
});
});
}