ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/OpenCL/OpenCL.pm
Revision: 1.54
Committed: Tue Apr 24 14:57:06 2012 UTC (12 years ago) by root
Branch: MAIN
CVS Tags: rel-0_97
Changes since 1.53: +5 -3 lines
Log Message:
0.97

File Contents

# User Rev Content
1 root 1.1 =head1 NAME
2    
3 root 1.5 OpenCL - Open Computing Language Bindings
4 root 1.1
5     =head1 SYNOPSIS
6    
7     use OpenCL;
8    
9     =head1 DESCRIPTION
10    
11 root 1.7 This is an early release which might be useful, but hasn't seen much testing.
12 root 1.1
13 root 1.9 =head2 OpenCL FROM 10000 FEET HEIGHT
14    
15     Here is a high level overview of OpenCL:
16    
17     First you need to find one or more OpenCL::Platforms (kind of like
18     vendors) - usually there is only one.
19    
20     Each platform gives you access to a number of OpenCL::Device objects, e.g.
21     your graphics card.
22    
23 root 1.11 From a platform and some device(s), you create an OpenCL::Context, which is
24 root 1.9 a very central object in OpenCL: Once you have a context you can create
25     most other objects:
26    
27 root 1.11 OpenCL::Program objects, which store source code and, after building for a
28     specific device ("compiling and linking"), also binary programs. For each
29     kernel function in a program you can then create an OpenCL::Kernel object
30     which represents basically a function call with argument values.
31 root 1.9
32 root 1.20 OpenCL::Memory objects of various flavours: OpenCL::Buffer objects (flat
33 root 1.16 memory areas, think arrays or structs) and OpenCL::Image objects (think 2d
34     or 3d array) for bulk data and input and output for kernels.
35 root 1.9
36     OpenCL::Sampler objects, which are kind of like texture filter modes in
37     OpenGL.
38    
39     OpenCL::Queue objects - command queues, which allow you to submit memory
40     reads, writes and copies, as well as kernel calls to your devices. They
41     also offer a variety of methods to synchronise request execution, for
42     example with barriers or OpenCL::Event objects.
43    
44     OpenCL::Event objects are used to signal when something is complete.
45    
46     =head2 HELPFUL RESOURCES
47 root 1.3
48 root 1.5 The OpenCL spec used to develop this module (1.2 spec was available, but
49 root 1.3 no implementation was available to me :).
50    
51     http://www.khronos.org/registry/cl/specs/opencl-1.1.pdf
52    
53     OpenCL manpages:
54    
55     http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/
56    
57 root 1.18 If you are into UML class diagrams, the following diagram might help - if
58     not, it will be mildly cobfusing:
59    
60     http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/classDiagram.html
61    
62 root 1.16 Here's a tutorial from AMD (very AMD-centric, too), not sure how useful it
63     is, but at least it's free of charge:
64    
65     http://developer.amd.com/zones/OpenCLZone/courses/Documents/Introduction_to_OpenCL_Programming%20Training_Guide%20%28201005%29.pdf
66    
67 root 1.18 And here's NVIDIA's OpenCL Best Practises Guide:
68 root 1.16
69 root 1.18 http://developer.download.nvidia.com/compute/cuda/3_2/toolkit/docs/OpenCL_Best_Practices_Guide.pdf
70 root 1.16
71 root 1.9 =head1 BASIC WORKFLOW
72    
73 root 1.11 To get something done, you basically have to do this once (refer to the
74     examples below for actual code, this is just a high-level description):
75 root 1.9
76 root 1.11 Find some platform (e.g. the first one) and some device(s) (e.g. the first
77     device of the platform), and create a context from those.
78 root 1.9
79 root 1.11 Create program objects from your OpenCL source code, then build (compile)
80     the programs for each device you want to run them on.
81 root 1.9
82 root 1.11 Create kernel objects for all kernels you want to use (surprisingly, these
83     are not device-specific).
84 root 1.9
85 root 1.11 Then, to execute stuff, you repeat these steps, possibly resuing or
86     sharing some buffers:
87 root 1.9
88 root 1.11 Create some input and output buffers from your context. Set these as
89     arguments to your kernel.
90    
91     Enqueue buffer writes to initialise your input buffers (when not
92     initialised at creation time).
93 root 1.9
94     Enqueue the kernel execution.
95    
96     Enqueue buffer reads for your output buffer to read results.
97    
98 root 1.3 =head1 EXAMPLES
99    
100 root 1.5 =head2 Enumerate all devices and get contexts for them.
101 root 1.1
102 root 1.11 Best run this once to get a feel for the platforms and devices in your
103     system.
104    
105 root 1.1 for my $platform (OpenCL::platforms) {
106 root 1.24 printf "platform: %s\n", $platform->name;
107     printf "extensions: %s\n", $platform->extensions;
108 root 1.1 for my $device ($platform->devices) {
109 root 1.24 printf "+ device: %s\n", $device->name;
110 root 1.29 my $ctx = $platform->context (undef, [$device]);
111 root 1.1 # do stuff
112     }
113     }
114    
115 root 1.5 =head2 Get a useful context and a command queue.
116 root 1.1
117 root 1.11 This is a useful boilerplate for any OpenCL program that only wants to use
118     one device,
119    
120     my ($platform) = OpenCL::platforms; # find first platform
121     my ($dev) = $platform->devices; # find first device of platform
122     my $ctx = $platform->context (undef, [$dev]); # create context out of those
123     my $queue = $ctx->queue ($dev); # create a command queue for the device
124 root 1.1
125 root 1.5 =head2 Print all supported image formats of a context.
126    
127 root 1.11 Best run this once for your context, to see whats available and how to
128     gather information.
129    
130 root 1.5 for my $type (OpenCL::MEM_OBJECT_IMAGE2D, OpenCL::MEM_OBJECT_IMAGE3D) {
131 root 1.10 print "supported image formats for ", OpenCL::enum2str $type, "\n";
132 root 1.5
133     for my $f ($ctx->supported_image_formats (0, $type)) {
134     printf " %-10s %-20s\n", OpenCL::enum2str $f->[0], OpenCL::enum2str $f->[1];
135     }
136     }
137    
138     =head2 Create a buffer with some predefined data, read it back synchronously,
139     then asynchronously.
140 root 1.3
141     my $buf = $ctx->buffer_sv (OpenCL::MEM_COPY_HOST_PTR, "helmut");
142    
143     $queue->enqueue_read_buffer ($buf, 1, 1, 3, my $data);
144 root 1.10 print "$data\n";
145 root 1.3
146     my $ev = $queue->enqueue_read_buffer ($buf, 0, 1, 3, my $data);
147     $ev->wait;
148 root 1.10 print "$data\n"; # prints "elm"
149 root 1.3
150 root 1.5 =head2 Create and build a program, then create a kernel out of one of its
151     functions.
152 root 1.3
153     my $src = '
154 root 1.31 kernel void
155     squareit (global float *input, global float *output)
156 root 1.3 {
157 root 1.15 $id = get_global_id (0);
158 root 1.3 output [id] = input [id] * input [id];
159     }
160     ';
161    
162 root 1.51 my $prog = $ctx->build_program ($src);
163 root 1.3 my $kernel = $prog->kernel ("squareit");
164    
165 root 1.11 =head2 Create some input and output float buffers, then call the
166     'squareit' kernel on them.
167 root 1.4
168     my $input = $ctx->buffer_sv (OpenCL::MEM_COPY_HOST_PTR, pack "f*", 1, 2, 3, 4.5);
169     my $output = $ctx->buffer (0, OpenCL::SIZEOF_FLOAT * 5);
170    
171     # set buffer
172     $kernel->set_buffer (0, $input);
173     $kernel->set_buffer (1, $output);
174    
175     # execute it for all 4 numbers
176     $queue->enqueue_nd_range_kernel ($kernel, undef, [4], undef);
177    
178 root 1.5 # enqueue a synchronous read
179     $queue->enqueue_read_buffer ($output, 1, 0, OpenCL::SIZEOF_FLOAT * 4, my $data);
180    
181     # print the results:
182 root 1.10 printf "%s\n", join ", ", unpack "f*", $data;
183 root 1.5
184     =head2 The same enqueue operations as before, but assuming an out-of-order queue,
185     showing off barriers.
186    
187     # execute it for all 4 numbers
188     $queue->enqueue_nd_range_kernel ($kernel, undef, [4], undef);
189    
190     # enqueue a barrier to ensure in-order execution
191 root 1.4 $queue->enqueue_barrier;
192    
193 root 1.5 # enqueue an async read
194     $queue->enqueue_read_buffer ($output, 0, 0, OpenCL::SIZEOF_FLOAT * 4, my $data);
195    
196     # wait for all requests to finish
197     $queue->finish;
198    
199     =head2 The same enqueue operations as before, but assuming an out-of-order queue,
200     showing off event objects and wait lists.
201    
202     # execute it for all 4 numbers
203     my $ev = $queue->enqueue_nd_range_kernel ($kernel, undef, [4], undef);
204    
205     # enqueue an async read
206     $ev = $queue->enqueue_read_buffer ($output, 0, 0, OpenCL::SIZEOF_FLOAT * 4, my $data, $ev);
207    
208     # wait for the last event to complete
209 root 1.4 $ev->wait;
210    
211 root 1.38 =head2 Use the OpenGL module to share a texture between OpenCL and OpenGL and draw some julia
212     set tunnel effect.
213    
214     This is quite a long example to get you going.
215    
216     use OpenGL ":all";
217     use OpenCL;
218    
219     # open a window and create a gl texture
220     OpenGL::glpOpenWindow width => 256, height => 256;
221     my $texid = glGenTextures_p 1;
222     glBindTexture GL_TEXTURE_2D, $texid;
223     glTexImage2D_c GL_TEXTURE_2D, 0, GL_RGBA8, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0;
224    
225     # find and use the first opencl device that let's us get a shared opengl context
226     my $platform;
227     my $dev;
228     my $ctx;
229    
230     for (OpenCL::platforms) {
231     $platform = $_;
232     for ($platform->devices) {
233     $dev = $_;
234     $ctx = $platform->context ([OpenCL::GLX_DISPLAY_KHR, undef, OpenCL::GL_CONTEXT_KHR, undef], [$dev])
235     and last;
236     }
237     }
238    
239     $ctx
240     or die "cannot find suitable OpenCL device\n";
241    
242     my $queue = $ctx->queue ($dev);
243    
244     # now attach an opencl image2d object to the opengl texture
245     my $tex = $ctx->gl_texture2d (OpenCL::MEM_WRITE_ONLY, GL_TEXTURE_2D, 0, $texid);
246    
247     # now the boring opencl code
248     my $src = <<EOF;
249     kernel void
250     juliatunnel (write_only image2d_t img, float time)
251     {
252     float2 p = (float2)(get_global_id (0), get_global_id (1)) / 256.f * 2.f - 1.f;
253    
254     float2 m = (float2)(1.f, p.y) / fabs (p.x);
255     m.x = fabs (fmod (m.x + time * 0.05f, 4.f)) - 2.f;
256    
257     float2 z = m;
258     float2 c = (float2)(sin (time * 0.05005), cos (time * 0.06001));
259    
260 root 1.39 for (int i = 0; i < 25 && dot (z, z) < 4.f; ++i)
261 root 1.38 z = (float2)(z.x * z.x - z.y * z.y, 2.f * z.x * z.y) + c;
262    
263     float3 colour = (float3)(z.x, z.y, z.x * z.y);
264     write_imagef (img, (int2)(get_global_id (0), get_global_id (1)), (float4)(colour * p.x * p.x, 1.));
265     }
266     EOF
267    
268 root 1.51 my $prog = $ctx->build_program ($src);
269 root 1.38 my $kernel = $prog->kernel ("juliatunnel");
270    
271     # program compiled, kernel ready, now draw and loop
272    
273     for (my $time; ; ++$time) {
274     # acquire objects from opengl
275     $queue->enqueue_acquire_gl_objects ([$tex]);
276    
277     # configure and run our kernel
278     $kernel->set_image2d (0, $tex);
279     $kernel->set_float (1, $time);
280     $queue->enqueue_nd_range_kernel ($kernel, undef, [256, 256], undef);
281    
282     # release objects to opengl again
283     $queue->enqueue_release_gl_objects ([$tex]);
284    
285     # wait
286 root 1.40 $queue->finish;
287 root 1.38
288     # now draw the texture, the defaults should be all right
289     glTexParameterf GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST;
290    
291     glEnable GL_TEXTURE_2D;
292     glBegin GL_QUADS;
293     glTexCoord2f 0, 1; glVertex3i -1, -1, -1;
294     glTexCoord2f 0, 0; glVertex3i 1, -1, -1;
295     glTexCoord2f 1, 0; glVertex3i 1, 1, -1;
296     glTexCoord2f 1, 1; glVertex3i -1, 1, -1;
297     glEnd;
298    
299     glXSwapBuffers;
300    
301     select undef, undef, undef, 1/60;
302     }
303    
304 root 1.5 =head1 DOCUMENTATION
305    
306     =head2 BASIC CONVENTIONS
307    
308 root 1.14 This is not a one-to-one C-style translation of OpenCL to Perl - instead
309     I attempted to make the interface as type-safe as possible by introducing
310 root 1.5 object syntax where it makes sense. There are a number of important
311     differences between the OpenCL C API and this module:
312    
313     =over 4
314    
315     =item * Object lifetime managament is automatic - there is no need
316     to free objects explicitly (C<clReleaseXXX>), the release function
317     is called automatically once all Perl references to it go away.
318    
319 root 1.20 =item * OpenCL uses CamelCase for function names
320     (e.g. C<clGetPlatformIDs>, C<clGetPlatformInfo>), while this module
321     uses underscores as word separator and often leaves out prefixes
322     (C<OpenCL::platforms>, C<< $platform->info >>).
323 root 1.5
324     =item * OpenCL often specifies fixed vector function arguments as short
325 root 1.19 arrays (C<size_t origin[3]>), while this module explicitly expects the
326     components as separate arguments (C<$orig_x, $orig_y, $orig_z>) in
327     function calls.
328 root 1.5
329 root 1.19 =item * Structures are often specified by flattening out their components
330     as with short vectors, and returned as arrayrefs.
331 root 1.5
332     =item * When enqueuing commands, the wait list is specified by adding
333 root 1.9 extra arguments to the function - anywhere a C<$wait_events...> argument
334 root 1.44 is documented this can be any number of event objects. As an extsnion
335     implemented by this module, C<undef> values will be ignored in the event
336     list.
337 root 1.5
338     =item * When enqueuing commands, if the enqueue method is called in void
339     context, no event is created. In all other contexts an event is returned
340     by the method.
341    
342     =item * This module expects all functions to return C<CL_SUCCESS>. If any
343     other status is returned the function will throw an exception, so you
344     don't normally have to to any error checking.
345    
346     =back
347    
348 root 1.7 =head2 PERL AND OPENCL TYPES
349    
350 root 1.8 This handy(?) table lists OpenCL types and their perl, PDL and pack/unpack
351 root 1.7 format equivalents:
352    
353 root 1.8 OpenCL perl PDL pack/unpack
354     char IV - c
355     uchar IV byte C
356     short IV short s
357     ushort IV ushort S
358     int IV long? l
359     uint IV - L
360     long IV longlong q
361     ulong IV - Q
362     float NV float f
363     half IV ushort S
364     double NV double d
365 root 1.7
366 root 1.36 =head2 GLX SUPPORT
367    
368     Due to the sad state that OpenGL support is in in Perl (mostly the OpenGL
369     module, which has little to no documentation and has little to no support
370 root 1.38 for glX), this module, as a special extension, treats context creation
371 root 1.36 properties C<OpenCL::GLX_DISPLAY_KHR> and C<OpenCL::GL_CONTEXT_KHR>
372     specially: If either or both of these are C<undef>, then the OpenCL
373 root 1.38 module tries to dynamically resolve C<glXGetCurrentDisplay> and
374     C<glXGetCurrentContext>, call these functions and use their return values
375 root 1.36 instead.
376    
377     For this to work, the OpenGL library must be loaded, a GLX context must
378     have been created and be made current, and C<dlsym> must be available and
379     capable of finding the function via C<RTLD_DEFAULT>.
380    
381 root 1.52 =cut
382    
383     package OpenCL;
384    
385     use common::sense;
386    
387     BEGIN {
388 root 1.54 our $VERSION = '0.97';
389 root 1.52
390     require XSLoader;
391     XSLoader::load (__PACKAGE__, $VERSION);
392    
393     @OpenCL::Platform::ISA =
394     @OpenCL::Device::ISA =
395     @OpenCL::Context::ISA =
396     @OpenCL::Queue::ISA =
397     @OpenCL::Memory::ISA =
398     @OpenCL::Sampler::ISA =
399     @OpenCL::Program::ISA =
400     @OpenCL::Kernel::ISA =
401     @OpenCL::Event::ISA = OpenCL::Object::;
402    
403     @OpenCL::Buffer::ISA =
404     @OpenCL::Image::ISA = OpenCL::Memory::;
405    
406     @OpenCL::BufferObj::ISA = OpenCL::Buffer::;
407    
408     @OpenCL::Image2D::ISA =
409     @OpenCL::Image3D::ISA =
410     @OpenCL::Image2DArray::ISA =
411     @OpenCL::Image1D::ISA =
412     @OpenCL::Image1DArray::ISA =
413     @OpenCL::Image1DBuffer::ISA = OpenCL::Image::;
414    
415     @OpenCL::UserEvent::ISA = OpenCL::Event::;
416     }
417    
418 root 1.5 =head2 THE OpenCL PACKAGE
419    
420     =over 4
421    
422     =item $int = OpenCL::errno
423    
424 root 1.11 The last error returned by a function - it's only valid after an error occured
425     and before calling another OpenCL function.
426 root 1.5
427     =item $str = OpenCL::err2str $errval
428    
429     Comverts an error value into a human readable string.
430    
431 root 1.9 =item $str = OpenCL::enum2str $enum
432 root 1.5
433 root 1.30 Converts most enum values (of parameter names, image format constants,
434 root 1.5 object types, addressing and filter modes, command types etc.) into a
435 root 1.30 human readable string. When confronted with some random integer it can be
436 root 1.5 very helpful to pass it through this function to maybe get some readable
437     string out of it.
438    
439     =item @platforms = OpenCL::platforms
440    
441     Returns all available OpenCL::Platform objects.
442    
443     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetPlatformIDs.html>
444    
445 root 1.10 =item $ctx = OpenCL::context_from_type $properties, $type = OpenCL::DEVICE_TYPE_DEFAULT, $notify = undef
446 root 1.5
447     Tries to create a context from a default device and platform - never worked for me.
448    
449     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContextFromType.html>
450    
451     =item OpenCL::wait_for_events $wait_events...
452    
453     Waits for all events to complete.
454    
455     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clWaitForEvents.html>
456    
457     =back
458    
459 root 1.52 =head2 THE OpenCL::Object CLASS
460    
461     This is the base class for all objects in the OpenCL module. The only
462     method it implements is the C<id> method, which is only useful if you want
463     to interface to OpenCL on the C level.
464    
465     =over 4
466    
467     =item $iv = $obj->id
468    
469     OpenCL objects are represented by pointers or integers on the C level. If
470     you want to interface to an OpenCL object directly on the C level, then
471     you need this value, which is returned by this method. You should use an
472     C<IV> type in your code and cast that to the correct type.
473    
474     =cut
475    
476     sub OpenCL::Object::id {
477     ${$_[0]}
478     }
479    
480     =back
481    
482 root 1.5 =head2 THE OpenCL::Platform CLASS
483    
484     =over 4
485    
486     =item @devices = $platform->devices ($type = OpenCL::DEVICE_TYPE_ALL)
487    
488     Returns a list of matching OpenCL::Device objects.
489    
490 root 1.10 =item $ctx = $platform->context_from_type ($properties, $type = OpenCL::DEVICE_TYPE_DEFAULT, $notify = undef)
491 root 1.5
492 root 1.22 Tries to create a context. Never worked for me, and you need devices explicitly anyway.
493 root 1.5
494     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContextFromType.html>
495    
496 root 1.29 =item $ctx = $platform->context ($properties = undef, @$devices, $notify = undef)
497 root 1.11
498     Create a new OpenCL::Context object using the given device object(s)- a
499     CL_CONTEXT_PLATFORM property is supplied automatically.
500    
501     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContext.html>
502    
503 root 1.20 =item $packed_value = $platform->info ($name)
504    
505     Calls C<clGetPlatformInfo> and returns the packed, raw value - for
506 root 1.22 strings, this will be the string (possibly including terminating \0), for
507     other values you probably need to use the correct C<unpack>.
508 root 1.20
509 root 1.22 It's best to avoid this method and use one of the following convenience
510     wrappers.
511 root 1.20
512     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetPlatformInfo.html>
513    
514 root 1.50 =item $platform->unload_compiler
515    
516     Attempts to unload the compiler for this platform, for endless
517     profit. Does nothing on OpenCL 1.1.
518    
519     L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clUnloadPlatformCompiler.html>
520    
521 root 1.20 =for gengetinfo begin platform
522    
523     =item $string = $platform->profile
524    
525 root 1.24 Calls C<clGetPlatformInfo> with C<CL_PLATFORM_PROFILE> and returns the result.
526 root 1.20
527     =item $string = $platform->version
528    
529 root 1.24 Calls C<clGetPlatformInfo> with C<CL_PLATFORM_VERSION> and returns the result.
530 root 1.20
531     =item $string = $platform->name
532    
533 root 1.24 Calls C<clGetPlatformInfo> with C<CL_PLATFORM_NAME> and returns the result.
534 root 1.20
535     =item $string = $platform->vendor
536    
537 root 1.24 Calls C<clGetPlatformInfo> with C<CL_PLATFORM_VENDOR> and returns the result.
538 root 1.20
539     =item $string = $platform->extensions
540    
541 root 1.24 Calls C<clGetPlatformInfo> with C<CL_PLATFORM_EXTENSIONS> and returns the result.
542 root 1.21
543 root 1.20 =for gengetinfo end platform
544    
545 root 1.5 =back
546    
547     =head2 THE OpenCL::Device CLASS
548    
549     =over 4
550    
551     =item $packed_value = $device->info ($name)
552    
553     See C<< $platform->info >> for details.
554    
555     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetDeviceInfo.html>
556    
557 root 1.21 =for gengetinfo begin device
558    
559     =item $device_type = $device->type
560    
561 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_TYPE> and returns the result.
562 root 1.21
563     =item $uint = $device->vendor_id
564    
565 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_VENDOR_ID> and returns the result.
566 root 1.21
567     =item $uint = $device->max_compute_units
568    
569 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_COMPUTE_UNITS> and returns the result.
570 root 1.21
571     =item $uint = $device->max_work_item_dimensions
572    
573 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS> and returns the result.
574 root 1.21
575     =item $int = $device->max_work_group_size
576    
577 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_WORK_GROUP_SIZE> and returns the result.
578 root 1.21
579     =item @ints = $device->max_work_item_sizes
580    
581 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_WORK_ITEM_SIZES> and returns the result.
582 root 1.21
583     =item $uint = $device->preferred_vector_width_char
584    
585 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR> and returns the result.
586 root 1.21
587     =item $uint = $device->preferred_vector_width_short
588    
589 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT> and returns the result.
590 root 1.21
591     =item $uint = $device->preferred_vector_width_int
592    
593 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT> and returns the result.
594 root 1.21
595     =item $uint = $device->preferred_vector_width_long
596    
597 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG> and returns the result.
598 root 1.21
599     =item $uint = $device->preferred_vector_width_float
600    
601 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT> and returns the result.
602 root 1.21
603     =item $uint = $device->preferred_vector_width_double
604    
605 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE> and returns the result.
606 root 1.21
607     =item $uint = $device->max_clock_frequency
608    
609 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_CLOCK_FREQUENCY> and returns the result.
610 root 1.21
611     =item $bitfield = $device->address_bits
612    
613 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_ADDRESS_BITS> and returns the result.
614 root 1.21
615     =item $uint = $device->max_read_image_args
616    
617 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_READ_IMAGE_ARGS> and returns the result.
618 root 1.21
619     =item $uint = $device->max_write_image_args
620    
621 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_WRITE_IMAGE_ARGS> and returns the result.
622 root 1.21
623     =item $ulong = $device->max_mem_alloc_size
624    
625 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_MEM_ALLOC_SIZE> and returns the result.
626 root 1.21
627     =item $int = $device->image2d_max_width
628    
629 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE2D_MAX_WIDTH> and returns the result.
630 root 1.21
631     =item $int = $device->image2d_max_height
632    
633 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE2D_MAX_HEIGHT> and returns the result.
634 root 1.21
635     =item $int = $device->image3d_max_width
636    
637 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE3D_MAX_WIDTH> and returns the result.
638 root 1.21
639     =item $int = $device->image3d_max_height
640    
641 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE3D_MAX_HEIGHT> and returns the result.
642 root 1.21
643     =item $int = $device->image3d_max_depth
644    
645 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE3D_MAX_DEPTH> and returns the result.
646 root 1.21
647     =item $uint = $device->image_support
648    
649 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE_SUPPORT> and returns the result.
650 root 1.21
651     =item $int = $device->max_parameter_size
652    
653 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_PARAMETER_SIZE> and returns the result.
654 root 1.21
655     =item $uint = $device->max_samplers
656    
657 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_SAMPLERS> and returns the result.
658 root 1.21
659     =item $uint = $device->mem_base_addr_align
660    
661 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MEM_BASE_ADDR_ALIGN> and returns the result.
662 root 1.21
663     =item $uint = $device->min_data_type_align_size
664    
665 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE> and returns the result.
666 root 1.21
667     =item $device_fp_config = $device->single_fp_config
668    
669 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_SINGLE_FP_CONFIG> and returns the result.
670 root 1.21
671     =item $device_mem_cache_type = $device->global_mem_cache_type
672    
673 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_GLOBAL_MEM_CACHE_TYPE> and returns the result.
674 root 1.21
675     =item $uint = $device->global_mem_cacheline_size
676    
677 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE> and returns the result.
678 root 1.21
679     =item $ulong = $device->global_mem_cache_size
680    
681 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_GLOBAL_MEM_CACHE_SIZE> and returns the result.
682 root 1.21
683     =item $ulong = $device->global_mem_size
684    
685 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_GLOBAL_MEM_SIZE> and returns the result.
686 root 1.21
687     =item $ulong = $device->max_constant_buffer_size
688    
689 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE> and returns the result.
690 root 1.21
691     =item $uint = $device->max_constant_args
692    
693 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_CONSTANT_ARGS> and returns the result.
694 root 1.21
695     =item $device_local_mem_type = $device->local_mem_type
696    
697 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_LOCAL_MEM_TYPE> and returns the result.
698 root 1.21
699     =item $ulong = $device->local_mem_size
700    
701 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_LOCAL_MEM_SIZE> and returns the result.
702 root 1.21
703     =item $boolean = $device->error_correction_support
704    
705 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_ERROR_CORRECTION_SUPPORT> and returns the result.
706 root 1.21
707     =item $int = $device->profiling_timer_resolution
708    
709 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PROFILING_TIMER_RESOLUTION> and returns the result.
710 root 1.21
711     =item $boolean = $device->endian_little
712    
713 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_ENDIAN_LITTLE> and returns the result.
714 root 1.21
715     =item $boolean = $device->available
716    
717 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_AVAILABLE> and returns the result.
718 root 1.21
719     =item $boolean = $device->compiler_available
720    
721 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_COMPILER_AVAILABLE> and returns the result.
722 root 1.21
723     =item $device_exec_capabilities = $device->execution_capabilities
724    
725 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_EXECUTION_CAPABILITIES> and returns the result.
726 root 1.21
727     =item $command_queue_properties = $device->properties
728    
729 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_QUEUE_PROPERTIES> and returns the result.
730 root 1.21
731     =item $ = $device->platform
732    
733 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PLATFORM> and returns the result.
734 root 1.21
735     =item $string = $device->name
736    
737 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_NAME> and returns the result.
738 root 1.21
739     =item $string = $device->vendor
740    
741 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_VENDOR> and returns the result.
742 root 1.21
743     =item $string = $device->driver_version
744    
745 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DRIVER_VERSION> and returns the result.
746 root 1.21
747     =item $string = $device->profile
748    
749 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PROFILE> and returns the result.
750 root 1.21
751     =item $string = $device->version
752    
753 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_VERSION> and returns the result.
754 root 1.21
755     =item $string = $device->extensions
756    
757 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_EXTENSIONS> and returns the result.
758 root 1.21
759     =item $uint = $device->preferred_vector_width_half
760    
761 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF> and returns the result.
762 root 1.21
763     =item $uint = $device->native_vector_width_char
764    
765 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR> and returns the result.
766 root 1.21
767     =item $uint = $device->native_vector_width_short
768    
769 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT> and returns the result.
770 root 1.21
771     =item $uint = $device->native_vector_width_int
772    
773 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_INT> and returns the result.
774 root 1.21
775     =item $uint = $device->native_vector_width_long
776    
777 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG> and returns the result.
778 root 1.21
779     =item $uint = $device->native_vector_width_float
780    
781 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT> and returns the result.
782 root 1.21
783     =item $uint = $device->native_vector_width_double
784    
785 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE> and returns the result.
786 root 1.21
787     =item $uint = $device->native_vector_width_half
788    
789 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF> and returns the result.
790 root 1.21
791     =item $device_fp_config = $device->double_fp_config
792    
793 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_DOUBLE_FP_CONFIG> and returns the result.
794 root 1.21
795     =item $device_fp_config = $device->half_fp_config
796    
797 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_HALF_FP_CONFIG> and returns the result.
798 root 1.21
799     =item $boolean = $device->host_unified_memory
800    
801 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_HOST_UNIFIED_MEMORY> and returns the result.
802 root 1.21
803     =item $device = $device->parent_device_ext
804    
805 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PARENT_DEVICE_EXT> and returns the result.
806 root 1.21
807     =item @device_partition_property_exts = $device->partition_types_ext
808    
809 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PARTITION_TYPES_EXT> and returns the result.
810 root 1.21
811     =item @device_partition_property_exts = $device->affinity_domains_ext
812    
813 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_AFFINITY_DOMAINS_EXT> and returns the result.
814 root 1.21
815 root 1.45 =item $uint = $device->reference_count_ext
816 root 1.21
817 root 1.48 Calls C<clGetDeviceInfo> with C<CL_DEVICE_REFERENCE_COUNT_EXT> and returns the result.
818 root 1.21
819     =item @device_partition_property_exts = $device->partition_style_ext
820    
821 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PARTITION_STYLE_EXT> and returns the result.
822 root 1.21
823     =for gengetinfo end device
824    
825 root 1.5 =back
826    
827     =head2 THE OpenCL::Context CLASS
828    
829     =over 4
830    
831 root 1.51 =item $prog = $ctx->build_program ($program, $options = "")
832    
833     This convenience function tries to build the program on all devices in
834     the context. If the build fails, then the function will C<croak> with the
835     build log. Otherwise ti returns the program object.
836    
837     The C<$program> can either be a C<OpenCL::Program> object or a string
838     containing the program. In the latter case, a program objetc will be
839     created automatically.
840    
841     =cut
842    
843     sub OpenCL::Context::build_program {
844     my ($self, $prog, $options) = @_;
845    
846 root 1.54 require Carp;
847    
848 root 1.51 $prog = $self->program_with_source ($prog)
849     unless ref $prog;
850    
851     for my $dev ($self->devices) {
852     eval { $prog->build ($dev, $options); 1 }
853 root 1.54 or Carp::croak ("Building OpenCL program for device '" . $dev->name . "' failed:\n"
854     . $prog->build_log ($dev));
855 root 1.51 }
856    
857     $prog
858     }
859    
860 root 1.9 =item $queue = $ctx->queue ($device, $properties)
861 root 1.5
862 root 1.9 Create a new OpenCL::Queue object from the context and the given device.
863 root 1.5
864     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateCommandQueue.html>
865    
866 root 1.45 Example: create an out-of-order queue.
867    
868     $queue = $ctx->queue ($device, OpenCL::QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE);
869    
870 root 1.5 =item $ev = $ctx->user_event
871    
872     Creates a new OpenCL::UserEvent object.
873    
874     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateUserEvent.html>
875    
876     =item $buf = $ctx->buffer ($flags, $len)
877    
878 root 1.27 Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object with the
879     given flags and octet-size.
880 root 1.5
881     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateBuffer.html>
882    
883     =item $buf = $ctx->buffer_sv ($flags, $data)
884    
885 root 1.27 Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object and
886     initialise it with the given data values.
887 root 1.5
888 root 1.49 =item $img = $ctx->image ($self, $flags, $channel_order, $channel_type, $type, $width, $height, $depth, $array_size = 0, $row_pitch = 0, $slice_pitch = 0, $num_mip_level = 0, $num_samples = 0, $*data = &PL_sv_undef)
889    
890     Creates a new OpenCL::Image object and optionally initialises it with
891     the given data values.
892    
893     L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateImage.html>
894    
895 root 1.18 =item $img = $ctx->image2d ($flags, $channel_order, $channel_type, $width, $height, $row_pitch = 0, $data = undef)
896 root 1.5
897 root 1.27 Creates a new OpenCL::Image2D object and optionally initialises it with
898     the given data values.
899 root 1.5
900     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateImage2D.html>
901    
902 root 1.18 =item $img = $ctx->image3d ($flags, $channel_order, $channel_type, $width, $height, $depth, $row_pitch = 0, $slice_pitch = 0, $data = undef)
903 root 1.5
904 root 1.27 Creates a new OpenCL::Image3D object and optionally initialises it with
905     the given data values.
906 root 1.5
907     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateImage3D.html>
908    
909 root 1.33 =item $buffer = $ctx->gl_buffer ($flags, $bufobj)
910    
911     Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object that refers to the given
912     OpenGL buffer object.
913    
914     http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateFromGLBuffer.html
915    
916 root 1.47 =item $img = $ctx->gl_texture ($flags, $target, $miplevel, $texture)
917    
918     Creates a new OpenCL::Image object that refers to the given OpenGL
919     texture object or buffer.
920    
921     http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateFromGLTexture.html
922    
923     =item $img = $ctx->gl_texture2d ($flags, $target, $miplevel, $texture)
924 root 1.33
925     Creates a new OpenCL::Image2D object that refers to the given OpenGL
926     2D texture object.
927    
928     http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateFromGLTexture2D.html
929    
930 root 1.47 =item $img = $ctx->gl_texture3d ($flags, $target, $miplevel, $texture)
931 root 1.33
932     Creates a new OpenCL::Image3D object that refers to the given OpenGL
933     3D texture object.
934    
935     http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateFromGLTexture3D.html
936    
937     =item $ctx->gl_renderbuffer ($flags, $renderbuffer)
938    
939     Creates a new OpenCL::Image2D object that refers to the given OpenGL
940     render buffer.
941    
942     http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateFromGLRenderbuffer.html
943    
944 root 1.5 =item @formats = $ctx->supported_image_formats ($flags, $image_type)
945    
946     Returns a list of matching image formats - each format is an arrayref with
947     two values, $channel_order and $channel_type, in it.
948    
949     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetSupportedImageFormats.html>
950    
951     =item $sampler = $ctx->sampler ($normalized_coords, $addressing_mode, $filter_mode)
952    
953     Creates a new OpenCL::Sampler object.
954    
955     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateSampler.html>
956    
957     =item $program = $ctx->program_with_source ($string)
958    
959     Creates a new OpenCL::Program object from the given source code.
960    
961     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateProgramWithSource.html>
962    
963 root 1.20 =item $packed_value = $ctx->info ($name)
964    
965     See C<< $platform->info >> for details.
966    
967     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetContextInfo.html>
968    
969     =for gengetinfo begin context
970    
971 root 1.21 =item $uint = $context->reference_count
972    
973 root 1.24 Calls C<clGetContextInfo> with C<CL_CONTEXT_REFERENCE_COUNT> and returns the result.
974 root 1.21
975     =item @devices = $context->devices
976    
977 root 1.24 Calls C<clGetContextInfo> with C<CL_CONTEXT_DEVICES> and returns the result.
978 root 1.21
979     =item @property_ints = $context->properties
980    
981 root 1.24 Calls C<clGetContextInfo> with C<CL_CONTEXT_PROPERTIES> and returns the result.
982 root 1.21
983     =item $uint = $context->num_devices
984    
985 root 1.24 Calls C<clGetContextInfo> with C<CL_CONTEXT_NUM_DEVICES> and returns the result.
986 root 1.21
987 root 1.20 =for gengetinfo end context
988    
989 root 1.5 =back
990    
991     =head2 THE OpenCL::Queue CLASS
992    
993     An OpenCL::Queue represents an execution queue for OpenCL. You execute
994     requests by calling their respective C<enqueue_xxx> method and waitinf for
995     it to complete in some way.
996    
997     All the enqueue methods return an event object that can be used to wait
998     for completion, unless the method is called in void context, in which case
999     no event object is created.
1000    
1001     They also allow you to specify any number of other event objects that this
1002     request has to wait for before it starts executing, by simply passing the
1003 root 1.45 event objects as extra parameters to the enqueue methods. To simplify
1004     program design, this module ignores any C<undef> values in the list of
1005     events. This makes it possible to code operations such as this, without
1006     having to put a valid event object into C<$event> first:
1007    
1008     $event = $queue->enqueue_xxx (..., $event);
1009 root 1.5
1010     Queues execute in-order by default, without any parallelism, so in most
1011 root 1.6 cases (i.e. you use only one queue) it's not necessary to wait for or
1012 root 1.45 create event objects, althoguh an our of order queue is often a bit
1013     faster.
1014 root 1.5
1015     =over 4
1016    
1017     =item $ev = $queue->enqueue_read_buffer ($buffer, $blocking, $offset, $len, $data, $wait_events...)
1018    
1019     Reads data from buffer into the given string.
1020    
1021     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadBuffer.html>
1022    
1023     =item $ev = $queue->enqueue_write_buffer ($buffer, $blocking, $offset, $data, $wait_events...)
1024    
1025     Writes data to buffer from the given string.
1026    
1027     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteBuffer.html>
1028    
1029     =item $ev = $queue->enqueue_copy_buffer ($src, $dst, $src_offset, $dst_offset, $len, $wait_events...)
1030    
1031     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBuffer.html>
1032    
1033 root 1.25 =item $ev = $queue->enqueue_read_buffer_rect (OpenCL::Memory buf, cl_bool blocking, $buf_x, $buf_y, $buf_z, $host_x, $host_y, $host_z, $width, $height, $depth, $buf_row_pitch, $buf_slice_pitch, $host_row_pitch, $host_slice_pitch, $data, $wait_events...)
1034    
1035     http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadBufferRect.html
1036    
1037     =item $ev = $queue->enqueue_write_buffer_rect (OpenCL::Memory buf, cl_bool blocking, $buf_x, $buf_y, $buf_z, $host_x, $host_y, $host_z, $width, $height, $depth, $buf_row_pitch, $buf_slice_pitch, $host_row_pitch, $host_slice_pitch, $data, $wait_events...)
1038    
1039     http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteBufferRect.html
1040    
1041 root 1.5 =item $ev = $queue->enqueue_read_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...)
1042    
1043 root 1.27 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferRect.html>
1044    
1045     =item $ev = $queue->enqueue_copy_buffer_to_image ($src_buffer, $dst_image, $src_offset, $dst_x, $dst_y, $dst_z, $width, $height, $depth, $wait_events...)
1046    
1047 root 1.5 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadImage.html>
1048    
1049 root 1.17 =item $ev = $queue->enqueue_write_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...)
1050 root 1.5
1051     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteImage.html>
1052    
1053 root 1.15 =item $ev = $queue->enqueue_copy_image ($src_image, $dst_image, $src_x, $src_y, $src_z, $dst_x, $dst_y, $dst_z, $width, $height, $depth, $wait_events...)
1054 root 1.5
1055     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyImage.html>
1056    
1057 root 1.15 =item $ev = $queue->enqueue_copy_image_to_buffer ($src_image, $dst_image, $src_x, $src_y, $src_z, $width, $height, $depth, $dst_offset, $wait_events...)
1058 root 1.5
1059     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyImageToBuffer.html>
1060    
1061 root 1.27 =item $ev = $queue->enqueue_copy_buffer_rect ($src, $dst, $src_x, $src_y, $src_z, $dst_x, $dst_y, $dst_z, $width, $height, $depth, $src_row_pitch, $src_slice_pitch, $dst_row_pitch, $dst_slice_pitch, $wait_event...)
1062    
1063     Yeah.
1064    
1065     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferToImage.html>.
1066    
1067 root 1.52 =item $ev = $queue->enqueue_fill_buffer ($mem, $pattern, $offset, $size, ...)
1068    
1069     Fills the given buffer object with repeated applications of C<$pattern>,
1070     starting at C<$offset> for C<$size> octets.
1071    
1072     L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueFillBuffer.html>
1073    
1074     =item $ev = $queue->enqueue_fill_image ($img, $r, $g, $b, $a, $x, $y, $z, $width, $height, $depth, ...)
1075    
1076     Fills the given image area with the given rgba colour components. The
1077     components are normally floating point values between C<0> and C<1>,
1078     except when the image channel data type is a signe dor unsigned
1079     unnormalised format, in which case the range is determined by the format.
1080    
1081     L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueFillImage.html>
1082    
1083 root 1.5 =item $ev = $queue->enqueue_task ($kernel, $wait_events...)
1084    
1085     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueTask.html>
1086    
1087     =item $ev = $queue->enqueue_nd_range_kernel ($kernel, @$global_work_offset, @$global_work_size, @$local_work_size, $wait_events...)
1088    
1089     Enqueues a kernel execution.
1090    
1091     @$global_work_size must be specified as a reference to an array of
1092     integers specifying the work sizes (element counts).
1093    
1094     @$global_work_offset must be either C<undef> (in which case all offsets
1095     are C<0>), or a reference to an array of work offsets, with the same number
1096     of elements as @$global_work_size.
1097    
1098     @$local_work_size must be either C<undef> (in which case the
1099     implementation is supposed to choose good local work sizes), or a
1100     reference to an array of local work sizes, with the same number of
1101     elements as @$global_work_size.
1102    
1103     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueNDRangeKernel.html>
1104    
1105 root 1.35 =item $ev = $queue->enqueue_acquire_gl_objects ([object, ...], $wait_events...)
1106    
1107     Enqueues a list (an array-ref of OpenCL::Memory objects) to be acquired
1108     for subsequent OpenCL usage.
1109    
1110     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueAcquireGLObjects.html>
1111    
1112     =item $ev = $queue->enqueue_release_gl_objects ([object, ...], $wait_events...)
1113    
1114     Enqueues a list (an array-ref of OpenCL::Memory objects) to be released
1115     for subsequent OpenGL usage.
1116    
1117     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReleaseGLObjects.html>
1118    
1119 root 1.5 =item $ev = $queue->enqueue_wait_for_events ($wait_events...)
1120    
1121     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWaitForEvents.html>
1122    
1123 root 1.46 =item $ev = $queue->enqueue_marker ($wait_events...)
1124    
1125     L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueMarkerWithWaitList.html>
1126    
1127     =item $ev = $queue->enqueue_barrier ($wait_events...)
1128 root 1.5
1129 root 1.46 L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueBarrierWithWaitList.html>
1130 root 1.5
1131     =item $queue->flush
1132    
1133     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clFlush.html>
1134    
1135     =item $queue->finish
1136    
1137     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clFinish.html>
1138    
1139 root 1.21 =item $packed_value = $queue->info ($name)
1140    
1141     See C<< $platform->info >> for details.
1142    
1143     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetCommandQueueInfo.html>
1144    
1145     =for gengetinfo begin command_queue
1146    
1147     =item $ctx = $command_queue->context
1148    
1149 root 1.24 Calls C<clGetCommandQueueInfo> with C<CL_QUEUE_CONTEXT> and returns the result.
1150 root 1.21
1151     =item $device = $command_queue->device
1152    
1153 root 1.24 Calls C<clGetCommandQueueInfo> with C<CL_QUEUE_DEVICE> and returns the result.
1154 root 1.21
1155     =item $uint = $command_queue->reference_count
1156    
1157 root 1.24 Calls C<clGetCommandQueueInfo> with C<CL_QUEUE_REFERENCE_COUNT> and returns the result.
1158 root 1.21
1159     =item $command_queue_properties = $command_queue->properties
1160    
1161 root 1.24 Calls C<clGetCommandQueueInfo> with C<CL_QUEUE_PROPERTIES> and returns the result.
1162 root 1.21
1163     =for gengetinfo end command_queue
1164    
1165 root 1.5 =back
1166    
1167     =head2 THE OpenCL::Memory CLASS
1168    
1169     This the superclass of all memory objects - OpenCL::Buffer, OpenCL::Image,
1170 root 1.21 OpenCL::Image2D and OpenCL::Image3D.
1171 root 1.5
1172     =over 4
1173    
1174     =item $packed_value = $memory->info ($name)
1175    
1176     See C<< $platform->info >> for details.
1177    
1178     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetMemObjectInfo.html>
1179    
1180 root 1.21 =for gengetinfo begin mem
1181    
1182     =item $mem_object_type = $mem->type
1183    
1184 root 1.24 Calls C<clGetMemObjectInfo> with C<CL_MEM_TYPE> and returns the result.
1185 root 1.21
1186     =item $mem_flags = $mem->flags
1187    
1188 root 1.24 Calls C<clGetMemObjectInfo> with C<CL_MEM_FLAGS> and returns the result.
1189 root 1.21
1190     =item $int = $mem->size
1191    
1192 root 1.24 Calls C<clGetMemObjectInfo> with C<CL_MEM_SIZE> and returns the result.
1193 root 1.21
1194     =item $ptr_value = $mem->host_ptr
1195    
1196 root 1.24 Calls C<clGetMemObjectInfo> with C<CL_MEM_HOST_PTR> and returns the result.
1197 root 1.21
1198     =item $uint = $mem->map_count
1199    
1200 root 1.24 Calls C<clGetMemObjectInfo> with C<CL_MEM_MAP_COUNT> and returns the result.
1201 root 1.21
1202     =item $uint = $mem->reference_count
1203    
1204 root 1.24 Calls C<clGetMemObjectInfo> with C<CL_MEM_REFERENCE_COUNT> and returns the result.
1205 root 1.21
1206     =item $ctx = $mem->context
1207    
1208 root 1.24 Calls C<clGetMemObjectInfo> with C<CL_MEM_CONTEXT> and returns the result.
1209 root 1.21
1210     =item $mem = $mem->associated_memobject
1211    
1212 root 1.24 Calls C<clGetMemObjectInfo> with C<CL_MEM_ASSOCIATED_MEMOBJECT> and returns the result.
1213 root 1.21
1214     =item $int = $mem->offset
1215    
1216 root 1.24 Calls C<clGetMemObjectInfo> with C<CL_MEM_OFFSET> and returns the result.
1217 root 1.21
1218     =for gengetinfo end mem
1219    
1220 root 1.34 =item ($type, $name) = $mem->gl_object_info
1221    
1222     Returns the OpenGL object type (e.g. OpenCL::GL_OBJECT_TEXTURE2D) and the
1223     object "name" (e.g. the texture name) used to create this memory object.
1224    
1225     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetGLObjectInfo.html>
1226    
1227 root 1.5 =back
1228    
1229 root 1.27 =head2 THE OpenCL::Buffer CLASS
1230    
1231     This is a subclass of OpenCL::Memory, and the superclass of
1232     OpenCL::BufferObj. Its purpose is simply to distinguish between buffers
1233     and sub-buffers.
1234    
1235     =head2 THE OpenCL::BufferObj CLASS
1236    
1237     This is a subclass of OpenCL::Buffer and thus OpenCL::Memory. It exists
1238     because one cna create sub buffers of OpenLC::BufferObj objects, but not
1239     sub buffers from these sub buffers.
1240    
1241     =over 4
1242    
1243     =item $subbuf = $buf_obj->sub_buffer_region ($flags, $origin, $size)
1244    
1245     Creates an OpenCL::Buffer objects from this buffer and returns it. The
1246     C<buffer_create_type> is assumed to be C<CL_BUFFER_CREATE_TYPE_REGION>.
1247    
1248     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateSubBuffer.html>
1249    
1250     =back
1251    
1252 root 1.20 =head2 THE OpenCL::Image CLASS
1253    
1254 root 1.47 This is the superclass of all image objects - OpenCL::Image1D,
1255     OpenCL::Image1DArray, OpenCL::Image1DBuffer, OpenCL::Image2D,
1256     OpenCL::Image2DArray and OpenCL::Image3D.
1257 root 1.20
1258     =over 4
1259    
1260 root 1.53 =item $packed_value = $image->image_info ($name)
1261 root 1.20
1262     See C<< $platform->info >> for details.
1263    
1264     The reason this method is not called C<info> is that there already is an
1265     C<< ->info >> method inherited from C<OpenCL::Memory>.
1266    
1267     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetImageInfo.html>
1268    
1269 root 1.53 =item ($channel_order, $channel_data_type) = $image->format
1270    
1271     Returns the channel order and type used to create the image by calling
1272     C<clGetImageInfo> with C<CL_IMAGE_FORMAT>.
1273    
1274 root 1.21 =for gengetinfo begin image
1275    
1276     =item $int = $image->element_size
1277    
1278 root 1.24 Calls C<clGetImageInfo> with C<CL_IMAGE_ELEMENT_SIZE> and returns the result.
1279 root 1.21
1280     =item $int = $image->row_pitch
1281    
1282 root 1.24 Calls C<clGetImageInfo> with C<CL_IMAGE_ROW_PITCH> and returns the result.
1283 root 1.21
1284     =item $int = $image->slice_pitch
1285    
1286 root 1.24 Calls C<clGetImageInfo> with C<CL_IMAGE_SLICE_PITCH> and returns the result.
1287 root 1.21
1288     =item $int = $image->width
1289    
1290 root 1.24 Calls C<clGetImageInfo> with C<CL_IMAGE_WIDTH> and returns the result.
1291 root 1.21
1292     =item $int = $image->height
1293    
1294 root 1.24 Calls C<clGetImageInfo> with C<CL_IMAGE_HEIGHT> and returns the result.
1295 root 1.21
1296     =item $int = $image->depth
1297    
1298 root 1.24 Calls C<clGetImageInfo> with C<CL_IMAGE_DEPTH> and returns the result.
1299 root 1.21
1300     =for gengetinfo end image
1301    
1302 root 1.34 =for gengetinfo begin gl_texture
1303    
1304     =item $GLenum = $gl_texture->target
1305    
1306 root 1.37 Calls C<clGetGLTextureInfo> with C<CL_GL_TEXTURE_TARGET> and returns the result.
1307 root 1.34
1308     =item $GLint = $gl_texture->gl_mipmap_level
1309    
1310 root 1.37 Calls C<clGetGLTextureInfo> with C<CL_GL_MIPMAP_LEVEL> and returns the result.
1311 root 1.34
1312     =for gengetinfo end gl_texture
1313    
1314 root 1.20 =back
1315    
1316 root 1.5 =head2 THE OpenCL::Sampler CLASS
1317    
1318     =over 4
1319    
1320     =item $packed_value = $sampler->info ($name)
1321    
1322     See C<< $platform->info >> for details.
1323    
1324     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetSamplerInfo.html>
1325    
1326 root 1.21 =for gengetinfo begin sampler
1327    
1328     =item $uint = $sampler->reference_count
1329    
1330 root 1.24 Calls C<clGetSamplerInfo> with C<CL_SAMPLER_REFERENCE_COUNT> and returns the result.
1331 root 1.21
1332     =item $ctx = $sampler->context
1333    
1334 root 1.24 Calls C<clGetSamplerInfo> with C<CL_SAMPLER_CONTEXT> and returns the result.
1335 root 1.21
1336     =item $addressing_mode = $sampler->normalized_coords
1337    
1338 root 1.24 Calls C<clGetSamplerInfo> with C<CL_SAMPLER_NORMALIZED_COORDS> and returns the result.
1339 root 1.21
1340     =item $filter_mode = $sampler->addressing_mode
1341    
1342 root 1.24 Calls C<clGetSamplerInfo> with C<CL_SAMPLER_ADDRESSING_MODE> and returns the result.
1343 root 1.21
1344     =item $boolean = $sampler->filter_mode
1345    
1346 root 1.24 Calls C<clGetSamplerInfo> with C<CL_SAMPLER_FILTER_MODE> and returns the result.
1347 root 1.21
1348     =for gengetinfo end sampler
1349    
1350 root 1.5 =back
1351    
1352     =head2 THE OpenCL::Program CLASS
1353    
1354     =over 4
1355    
1356     =item $program->build ($device, $options = "")
1357    
1358 root 1.51 Tries to build the program with the given options. See also the
1359     C<$ctx->build> convenience function.
1360 root 1.5
1361     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clBuildProgram.html>
1362    
1363     =item $packed_value = $program->build_info ($device, $name)
1364    
1365     Similar to C<< $platform->info >>, but returns build info for a previous
1366     build attempt for the given device.
1367    
1368     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetBuildInfo.html>
1369    
1370     =item $kernel = $program->kernel ($function_name)
1371    
1372     Creates an OpenCL::Kernel object out of the named C<__kernel> function in
1373     the program.
1374    
1375     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateKernel.html>
1376    
1377 root 1.50 =item @kernels = $program->kernels_in_program
1378    
1379     Returns all kernels successfully compiled for all devices in program.
1380    
1381     http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateKernelsInProgram.html
1382    
1383 root 1.21 =for gengetinfo begin program_build
1384    
1385     =item $build_status = $program->build_status ($device)
1386    
1387 root 1.24 Calls C<clGetProgramBuildInfo> with C<CL_PROGRAM_BUILD_STATUS> and returns the result.
1388 root 1.21
1389     =item $string = $program->build_options ($device)
1390    
1391 root 1.24 Calls C<clGetProgramBuildInfo> with C<CL_PROGRAM_BUILD_OPTIONS> and returns the result.
1392 root 1.21
1393     =item $string = $program->build_log ($device)
1394    
1395 root 1.24 Calls C<clGetProgramBuildInfo> with C<CL_PROGRAM_BUILD_LOG> and returns the result.
1396 root 1.21
1397     =for gengetinfo end program_build
1398    
1399     =item $packed_value = $program->info ($name)
1400    
1401     See C<< $platform->info >> for details.
1402    
1403     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetProgramInfo.html>
1404    
1405     =for gengetinfo begin program
1406    
1407     =item $uint = $program->reference_count
1408    
1409 root 1.24 Calls C<clGetProgramInfo> with C<CL_PROGRAM_REFERENCE_COUNT> and returns the result.
1410 root 1.21
1411     =item $ctx = $program->context
1412    
1413 root 1.24 Calls C<clGetProgramInfo> with C<CL_PROGRAM_CONTEXT> and returns the result.
1414 root 1.21
1415     =item $uint = $program->num_devices
1416    
1417 root 1.24 Calls C<clGetProgramInfo> with C<CL_PROGRAM_NUM_DEVICES> and returns the result.
1418 root 1.21
1419     =item @devices = $program->devices
1420    
1421 root 1.24 Calls C<clGetProgramInfo> with C<CL_PROGRAM_DEVICES> and returns the result.
1422 root 1.21
1423     =item $string = $program->source
1424    
1425 root 1.24 Calls C<clGetProgramInfo> with C<CL_PROGRAM_SOURCE> and returns the result.
1426 root 1.21
1427     =item @ints = $program->binary_sizes
1428    
1429 root 1.24 Calls C<clGetProgramInfo> with C<CL_PROGRAM_BINARY_SIZES> and returns the result.
1430 root 1.21
1431     =for gengetinfo end program
1432    
1433 root 1.23 =item @blobs = $program->binaries
1434    
1435     Returns a string for the compiled binary for every device associated with
1436     the program, empty strings indicate missing programs, and an empty result
1437     means no program binaries are available.
1438    
1439     These "binaries" are often, in fact, informative low-level assembly
1440     sources.
1441    
1442     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetProgramInfo.html>
1443    
1444 root 1.5 =back
1445    
1446     =head2 THE OpenCL::Kernel CLASS
1447    
1448     =over 4
1449    
1450     =item $packed_value = $kernel->info ($name)
1451    
1452     See C<< $platform->info >> for details.
1453    
1454     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetKernelInfo.html>
1455    
1456 root 1.21 =for gengetinfo begin kernel
1457    
1458     =item $string = $kernel->function_name
1459    
1460 root 1.24 Calls C<clGetKernelInfo> with C<CL_KERNEL_FUNCTION_NAME> and returns the result.
1461 root 1.21
1462     =item $uint = $kernel->num_args
1463    
1464 root 1.24 Calls C<clGetKernelInfo> with C<CL_KERNEL_NUM_ARGS> and returns the result.
1465 root 1.21
1466     =item $uint = $kernel->reference_count
1467    
1468 root 1.24 Calls C<clGetKernelInfo> with C<CL_KERNEL_REFERENCE_COUNT> and returns the result.
1469 root 1.21
1470     =item $ctx = $kernel->context
1471    
1472 root 1.24 Calls C<clGetKernelInfo> with C<CL_KERNEL_CONTEXT> and returns the result.
1473 root 1.21
1474     =item $program = $kernel->program
1475    
1476 root 1.24 Calls C<clGetKernelInfo> with C<CL_KERNEL_PROGRAM> and returns the result.
1477 root 1.21
1478     =for gengetinfo end kernel
1479    
1480 root 1.20 =item $packed_value = $kernel->work_group_info ($device, $name)
1481    
1482     See C<< $platform->info >> for details.
1483    
1484     The reason this method is not called C<info> is that there already is an
1485     C<< ->info >> method.
1486    
1487     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetKernelWorkGroupInfo.html>
1488    
1489 root 1.21 =for gengetinfo begin kernel_work_group
1490    
1491     =item $int = $kernel->work_group_size ($device)
1492    
1493 root 1.24 Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_WORK_GROUP_SIZE> and returns the result.
1494 root 1.21
1495     =item @ints = $kernel->compile_work_group_size ($device)
1496    
1497 root 1.24 Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_COMPILE_WORK_GROUP_SIZE> and returns the result.
1498 root 1.21
1499     =item $ulong = $kernel->local_mem_size ($device)
1500    
1501 root 1.24 Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_LOCAL_MEM_SIZE> and returns the result.
1502 root 1.21
1503     =item $int = $kernel->preferred_work_group_size_multiple ($device)
1504    
1505 root 1.24 Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE> and returns the result.
1506 root 1.21
1507     =item $ulong = $kernel->private_mem_size ($device)
1508    
1509 root 1.24 Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_PRIVATE_MEM_SIZE> and returns the result.
1510 root 1.21
1511     =for gengetinfo end kernel_work_group
1512    
1513 root 1.5 =item $kernel->set_TYPE ($index, $value)
1514    
1515     This is a family of methods to set the kernel argument with the number C<$index> to the give C<$value>.
1516    
1517     TYPE is one of C<char>, C<uchar>, C<short>, C<ushort>, C<int>, C<uint>,
1518     C<long>, C<ulong>, C<half>, C<float>, C<double>, C<memory>, C<buffer>,
1519 root 1.41 C<image2d>, C<image3d>, C<sampler>, C<local> or C<event>.
1520 root 1.5
1521     Chars and integers (including the half type) are specified as integers,
1522     float and double as floating point values, memory/buffer/image2d/image3d
1523 root 1.41 must be an object of that type or C<undef>, local-memory arguments are
1524     set by specifying the size, and sampler and event must be objects of that
1525     type.
1526 root 1.5
1527 root 1.50 Setting an argument for a kernel does NOT keep a reference to the object -
1528     for example, if you set an argument to some image object, free the image,
1529     and call the kernel, you will run into undefined behaviour.
1530    
1531 root 1.5 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clSetKernelArg.html>
1532    
1533     =back
1534    
1535     =head2 THE OpenCL::Event CLASS
1536    
1537     This is the superclass for all event objects (including OpenCL::UserEvent
1538     objects).
1539    
1540     =over 4
1541    
1542 root 1.21 =item $ev->wait
1543    
1544     Waits for the event to complete.
1545    
1546     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clWaitForEvents.html>
1547    
1548 root 1.5 =item $packed_value = $ev->info ($name)
1549    
1550     See C<< $platform->info >> for details.
1551    
1552     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetEventInfo.html>
1553    
1554 root 1.21 =for gengetinfo begin event
1555    
1556     =item $queue = $event->command_queue
1557    
1558 root 1.24 Calls C<clGetEventInfo> with C<CL_EVENT_COMMAND_QUEUE> and returns the result.
1559 root 1.21
1560     =item $command_type = $event->command_type
1561    
1562 root 1.24 Calls C<clGetEventInfo> with C<CL_EVENT_COMMAND_TYPE> and returns the result.
1563 root 1.21
1564     =item $uint = $event->reference_count
1565    
1566 root 1.24 Calls C<clGetEventInfo> with C<CL_EVENT_REFERENCE_COUNT> and returns the result.
1567 root 1.21
1568     =item $uint = $event->command_execution_status
1569    
1570 root 1.24 Calls C<clGetEventInfo> with C<CL_EVENT_COMMAND_EXECUTION_STATUS> and returns the result.
1571 root 1.21
1572     =item $ctx = $event->context
1573    
1574 root 1.24 Calls C<clGetEventInfo> with C<CL_EVENT_CONTEXT> and returns the result.
1575 root 1.21
1576     =for gengetinfo end event
1577    
1578 root 1.20 =item $packed_value = $ev->profiling_info ($name)
1579    
1580     See C<< $platform->info >> for details.
1581    
1582     The reason this method is not called C<info> is that there already is an
1583     C<< ->info >> method.
1584    
1585     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetProfilingInfo.html>
1586    
1587 root 1.21 =for gengetinfo begin profiling
1588    
1589     =item $ulong = $event->profiling_command_queued
1590    
1591 root 1.24 Calls C<clGetEventProfilingInfo> with C<CL_PROFILING_COMMAND_QUEUED> and returns the result.
1592 root 1.21
1593     =item $ulong = $event->profiling_command_submit
1594    
1595 root 1.24 Calls C<clGetEventProfilingInfo> with C<CL_PROFILING_COMMAND_SUBMIT> and returns the result.
1596 root 1.21
1597     =item $ulong = $event->profiling_command_start
1598    
1599 root 1.24 Calls C<clGetEventProfilingInfo> with C<CL_PROFILING_COMMAND_START> and returns the result.
1600 root 1.21
1601     =item $ulong = $event->profiling_command_end
1602 root 1.5
1603 root 1.24 Calls C<clGetEventProfilingInfo> with C<CL_PROFILING_COMMAND_END> and returns the result.
1604 root 1.5
1605 root 1.21 =for gengetinfo end profiling
1606 root 1.5
1607     =back
1608    
1609     =head2 THE OpenCL::UserEvent CLASS
1610    
1611     This is a subclass of OpenCL::Event.
1612 root 1.4
1613 root 1.1 =over 4
1614    
1615 root 1.5 =item $ev->set_status ($execution_status)
1616    
1617     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clSetUserEventStatus.html>
1618    
1619     =back
1620    
1621 root 1.1 =cut
1622    
1623     1;
1624    
1625     =head1 AUTHOR
1626    
1627     Marc Lehmann <schmorp@schmorp.de>
1628     http://home.schmorp.de/
1629    
1630     =cut
1631