ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/OpenCL/OpenCL.pm
Revision: 1.53
Committed: Tue Apr 24 14:30:57 2012 UTC (12 years ago) by root
Branch: MAIN
Changes since 1.52: +6 -1 lines
Log Message:
*** empty log message ***

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     our $VERSION = '0.96';
389    
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     $prog = $self->program_with_source ($prog)
847     unless ref $prog;
848    
849     for my $dev ($self->devices) {
850     eval { $prog->build ($dev, $options); 1 }
851     or Carp::croak "Building OpenCL program for device '" . $dev->name . "' failed:\n"
852     . $prog->build_log ($dev);
853     }
854    
855     $prog
856     }
857    
858 root 1.9 =item $queue = $ctx->queue ($device, $properties)
859 root 1.5
860 root 1.9 Create a new OpenCL::Queue object from the context and the given device.
861 root 1.5
862     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateCommandQueue.html>
863    
864 root 1.45 Example: create an out-of-order queue.
865    
866     $queue = $ctx->queue ($device, OpenCL::QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE);
867    
868 root 1.5 =item $ev = $ctx->user_event
869    
870     Creates a new OpenCL::UserEvent object.
871    
872     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateUserEvent.html>
873    
874     =item $buf = $ctx->buffer ($flags, $len)
875    
876 root 1.27 Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object with the
877     given flags and octet-size.
878 root 1.5
879     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateBuffer.html>
880    
881     =item $buf = $ctx->buffer_sv ($flags, $data)
882    
883 root 1.27 Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object and
884     initialise it with the given data values.
885 root 1.5
886 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)
887    
888     Creates a new OpenCL::Image object and optionally initialises it with
889     the given data values.
890    
891     L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateImage.html>
892    
893 root 1.18 =item $img = $ctx->image2d ($flags, $channel_order, $channel_type, $width, $height, $row_pitch = 0, $data = undef)
894 root 1.5
895 root 1.27 Creates a new OpenCL::Image2D object and optionally initialises it with
896     the given data values.
897 root 1.5
898     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateImage2D.html>
899    
900 root 1.18 =item $img = $ctx->image3d ($flags, $channel_order, $channel_type, $width, $height, $depth, $row_pitch = 0, $slice_pitch = 0, $data = undef)
901 root 1.5
902 root 1.27 Creates a new OpenCL::Image3D object and optionally initialises it with
903     the given data values.
904 root 1.5
905     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateImage3D.html>
906    
907 root 1.33 =item $buffer = $ctx->gl_buffer ($flags, $bufobj)
908    
909     Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object that refers to the given
910     OpenGL buffer object.
911    
912     http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateFromGLBuffer.html
913    
914 root 1.47 =item $img = $ctx->gl_texture ($flags, $target, $miplevel, $texture)
915    
916     Creates a new OpenCL::Image object that refers to the given OpenGL
917     texture object or buffer.
918    
919     http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateFromGLTexture.html
920    
921     =item $img = $ctx->gl_texture2d ($flags, $target, $miplevel, $texture)
922 root 1.33
923     Creates a new OpenCL::Image2D object that refers to the given OpenGL
924     2D texture object.
925    
926     http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateFromGLTexture2D.html
927    
928 root 1.47 =item $img = $ctx->gl_texture3d ($flags, $target, $miplevel, $texture)
929 root 1.33
930     Creates a new OpenCL::Image3D object that refers to the given OpenGL
931     3D texture object.
932    
933     http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateFromGLTexture3D.html
934    
935     =item $ctx->gl_renderbuffer ($flags, $renderbuffer)
936    
937     Creates a new OpenCL::Image2D object that refers to the given OpenGL
938     render buffer.
939    
940     http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateFromGLRenderbuffer.html
941    
942 root 1.5 =item @formats = $ctx->supported_image_formats ($flags, $image_type)
943    
944     Returns a list of matching image formats - each format is an arrayref with
945     two values, $channel_order and $channel_type, in it.
946    
947     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetSupportedImageFormats.html>
948    
949     =item $sampler = $ctx->sampler ($normalized_coords, $addressing_mode, $filter_mode)
950    
951     Creates a new OpenCL::Sampler object.
952    
953     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateSampler.html>
954    
955     =item $program = $ctx->program_with_source ($string)
956    
957     Creates a new OpenCL::Program object from the given source code.
958    
959     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateProgramWithSource.html>
960    
961 root 1.20 =item $packed_value = $ctx->info ($name)
962    
963     See C<< $platform->info >> for details.
964    
965     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetContextInfo.html>
966    
967     =for gengetinfo begin context
968    
969 root 1.21 =item $uint = $context->reference_count
970    
971 root 1.24 Calls C<clGetContextInfo> with C<CL_CONTEXT_REFERENCE_COUNT> and returns the result.
972 root 1.21
973     =item @devices = $context->devices
974    
975 root 1.24 Calls C<clGetContextInfo> with C<CL_CONTEXT_DEVICES> and returns the result.
976 root 1.21
977     =item @property_ints = $context->properties
978    
979 root 1.24 Calls C<clGetContextInfo> with C<CL_CONTEXT_PROPERTIES> and returns the result.
980 root 1.21
981     =item $uint = $context->num_devices
982    
983 root 1.24 Calls C<clGetContextInfo> with C<CL_CONTEXT_NUM_DEVICES> and returns the result.
984 root 1.21
985 root 1.20 =for gengetinfo end context
986    
987 root 1.5 =back
988    
989     =head2 THE OpenCL::Queue CLASS
990    
991     An OpenCL::Queue represents an execution queue for OpenCL. You execute
992     requests by calling their respective C<enqueue_xxx> method and waitinf for
993     it to complete in some way.
994    
995     All the enqueue methods return an event object that can be used to wait
996     for completion, unless the method is called in void context, in which case
997     no event object is created.
998    
999     They also allow you to specify any number of other event objects that this
1000     request has to wait for before it starts executing, by simply passing the
1001 root 1.45 event objects as extra parameters to the enqueue methods. To simplify
1002     program design, this module ignores any C<undef> values in the list of
1003     events. This makes it possible to code operations such as this, without
1004     having to put a valid event object into C<$event> first:
1005    
1006     $event = $queue->enqueue_xxx (..., $event);
1007 root 1.5
1008     Queues execute in-order by default, without any parallelism, so in most
1009 root 1.6 cases (i.e. you use only one queue) it's not necessary to wait for or
1010 root 1.45 create event objects, althoguh an our of order queue is often a bit
1011     faster.
1012 root 1.5
1013     =over 4
1014    
1015     =item $ev = $queue->enqueue_read_buffer ($buffer, $blocking, $offset, $len, $data, $wait_events...)
1016    
1017     Reads data from buffer into the given string.
1018    
1019     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadBuffer.html>
1020    
1021     =item $ev = $queue->enqueue_write_buffer ($buffer, $blocking, $offset, $data, $wait_events...)
1022    
1023     Writes data to buffer from the given string.
1024    
1025     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteBuffer.html>
1026    
1027     =item $ev = $queue->enqueue_copy_buffer ($src, $dst, $src_offset, $dst_offset, $len, $wait_events...)
1028    
1029     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBuffer.html>
1030    
1031 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...)
1032    
1033     http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadBufferRect.html
1034    
1035     =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...)
1036    
1037     http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteBufferRect.html
1038    
1039 root 1.5 =item $ev = $queue->enqueue_read_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...)
1040    
1041 root 1.27 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferRect.html>
1042    
1043     =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...)
1044    
1045 root 1.5 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadImage.html>
1046    
1047 root 1.17 =item $ev = $queue->enqueue_write_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...)
1048 root 1.5
1049     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteImage.html>
1050    
1051 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...)
1052 root 1.5
1053     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyImage.html>
1054    
1055 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...)
1056 root 1.5
1057     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyImageToBuffer.html>
1058    
1059 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...)
1060    
1061     Yeah.
1062    
1063     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferToImage.html>.
1064    
1065 root 1.52 =item $ev = $queue->enqueue_fill_buffer ($mem, $pattern, $offset, $size, ...)
1066    
1067     Fills the given buffer object with repeated applications of C<$pattern>,
1068     starting at C<$offset> for C<$size> octets.
1069    
1070     L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueFillBuffer.html>
1071    
1072     =item $ev = $queue->enqueue_fill_image ($img, $r, $g, $b, $a, $x, $y, $z, $width, $height, $depth, ...)
1073    
1074     Fills the given image area with the given rgba colour components. The
1075     components are normally floating point values between C<0> and C<1>,
1076     except when the image channel data type is a signe dor unsigned
1077     unnormalised format, in which case the range is determined by the format.
1078    
1079     L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueFillImage.html>
1080    
1081 root 1.5 =item $ev = $queue->enqueue_task ($kernel, $wait_events...)
1082    
1083     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueTask.html>
1084    
1085     =item $ev = $queue->enqueue_nd_range_kernel ($kernel, @$global_work_offset, @$global_work_size, @$local_work_size, $wait_events...)
1086    
1087     Enqueues a kernel execution.
1088    
1089     @$global_work_size must be specified as a reference to an array of
1090     integers specifying the work sizes (element counts).
1091    
1092     @$global_work_offset must be either C<undef> (in which case all offsets
1093     are C<0>), or a reference to an array of work offsets, with the same number
1094     of elements as @$global_work_size.
1095    
1096     @$local_work_size must be either C<undef> (in which case the
1097     implementation is supposed to choose good local work sizes), or a
1098     reference to an array of local work sizes, with the same number of
1099     elements as @$global_work_size.
1100    
1101     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueNDRangeKernel.html>
1102    
1103 root 1.35 =item $ev = $queue->enqueue_acquire_gl_objects ([object, ...], $wait_events...)
1104    
1105     Enqueues a list (an array-ref of OpenCL::Memory objects) to be acquired
1106     for subsequent OpenCL usage.
1107    
1108     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueAcquireGLObjects.html>
1109    
1110     =item $ev = $queue->enqueue_release_gl_objects ([object, ...], $wait_events...)
1111    
1112     Enqueues a list (an array-ref of OpenCL::Memory objects) to be released
1113     for subsequent OpenGL usage.
1114    
1115     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReleaseGLObjects.html>
1116    
1117 root 1.5 =item $ev = $queue->enqueue_wait_for_events ($wait_events...)
1118    
1119     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWaitForEvents.html>
1120    
1121 root 1.46 =item $ev = $queue->enqueue_marker ($wait_events...)
1122    
1123     L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueMarkerWithWaitList.html>
1124    
1125     =item $ev = $queue->enqueue_barrier ($wait_events...)
1126 root 1.5
1127 root 1.46 L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueBarrierWithWaitList.html>
1128 root 1.5
1129     =item $queue->flush
1130    
1131     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clFlush.html>
1132    
1133     =item $queue->finish
1134    
1135     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clFinish.html>
1136    
1137 root 1.21 =item $packed_value = $queue->info ($name)
1138    
1139     See C<< $platform->info >> for details.
1140    
1141     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetCommandQueueInfo.html>
1142    
1143     =for gengetinfo begin command_queue
1144    
1145     =item $ctx = $command_queue->context
1146    
1147 root 1.24 Calls C<clGetCommandQueueInfo> with C<CL_QUEUE_CONTEXT> and returns the result.
1148 root 1.21
1149     =item $device = $command_queue->device
1150    
1151 root 1.24 Calls C<clGetCommandQueueInfo> with C<CL_QUEUE_DEVICE> and returns the result.
1152 root 1.21
1153     =item $uint = $command_queue->reference_count
1154    
1155 root 1.24 Calls C<clGetCommandQueueInfo> with C<CL_QUEUE_REFERENCE_COUNT> and returns the result.
1156 root 1.21
1157     =item $command_queue_properties = $command_queue->properties
1158    
1159 root 1.24 Calls C<clGetCommandQueueInfo> with C<CL_QUEUE_PROPERTIES> and returns the result.
1160 root 1.21
1161     =for gengetinfo end command_queue
1162    
1163 root 1.5 =back
1164    
1165     =head2 THE OpenCL::Memory CLASS
1166    
1167     This the superclass of all memory objects - OpenCL::Buffer, OpenCL::Image,
1168 root 1.21 OpenCL::Image2D and OpenCL::Image3D.
1169 root 1.5
1170     =over 4
1171    
1172     =item $packed_value = $memory->info ($name)
1173    
1174     See C<< $platform->info >> for details.
1175    
1176     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetMemObjectInfo.html>
1177    
1178 root 1.21 =for gengetinfo begin mem
1179    
1180     =item $mem_object_type = $mem->type
1181    
1182 root 1.24 Calls C<clGetMemObjectInfo> with C<CL_MEM_TYPE> and returns the result.
1183 root 1.21
1184     =item $mem_flags = $mem->flags
1185    
1186 root 1.24 Calls C<clGetMemObjectInfo> with C<CL_MEM_FLAGS> and returns the result.
1187 root 1.21
1188     =item $int = $mem->size
1189    
1190 root 1.24 Calls C<clGetMemObjectInfo> with C<CL_MEM_SIZE> and returns the result.
1191 root 1.21
1192     =item $ptr_value = $mem->host_ptr
1193    
1194 root 1.24 Calls C<clGetMemObjectInfo> with C<CL_MEM_HOST_PTR> and returns the result.
1195 root 1.21
1196     =item $uint = $mem->map_count
1197    
1198 root 1.24 Calls C<clGetMemObjectInfo> with C<CL_MEM_MAP_COUNT> and returns the result.
1199 root 1.21
1200     =item $uint = $mem->reference_count
1201    
1202 root 1.24 Calls C<clGetMemObjectInfo> with C<CL_MEM_REFERENCE_COUNT> and returns the result.
1203 root 1.21
1204     =item $ctx = $mem->context
1205    
1206 root 1.24 Calls C<clGetMemObjectInfo> with C<CL_MEM_CONTEXT> and returns the result.
1207 root 1.21
1208     =item $mem = $mem->associated_memobject
1209    
1210 root 1.24 Calls C<clGetMemObjectInfo> with C<CL_MEM_ASSOCIATED_MEMOBJECT> and returns the result.
1211 root 1.21
1212     =item $int = $mem->offset
1213    
1214 root 1.24 Calls C<clGetMemObjectInfo> with C<CL_MEM_OFFSET> and returns the result.
1215 root 1.21
1216     =for gengetinfo end mem
1217    
1218 root 1.34 =item ($type, $name) = $mem->gl_object_info
1219    
1220     Returns the OpenGL object type (e.g. OpenCL::GL_OBJECT_TEXTURE2D) and the
1221     object "name" (e.g. the texture name) used to create this memory object.
1222    
1223     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetGLObjectInfo.html>
1224    
1225 root 1.5 =back
1226    
1227 root 1.27 =head2 THE OpenCL::Buffer CLASS
1228    
1229     This is a subclass of OpenCL::Memory, and the superclass of
1230     OpenCL::BufferObj. Its purpose is simply to distinguish between buffers
1231     and sub-buffers.
1232    
1233     =head2 THE OpenCL::BufferObj CLASS
1234    
1235     This is a subclass of OpenCL::Buffer and thus OpenCL::Memory. It exists
1236     because one cna create sub buffers of OpenLC::BufferObj objects, but not
1237     sub buffers from these sub buffers.
1238    
1239     =over 4
1240    
1241     =item $subbuf = $buf_obj->sub_buffer_region ($flags, $origin, $size)
1242    
1243     Creates an OpenCL::Buffer objects from this buffer and returns it. The
1244     C<buffer_create_type> is assumed to be C<CL_BUFFER_CREATE_TYPE_REGION>.
1245    
1246     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateSubBuffer.html>
1247    
1248     =back
1249    
1250 root 1.20 =head2 THE OpenCL::Image CLASS
1251    
1252 root 1.47 This is the superclass of all image objects - OpenCL::Image1D,
1253     OpenCL::Image1DArray, OpenCL::Image1DBuffer, OpenCL::Image2D,
1254     OpenCL::Image2DArray and OpenCL::Image3D.
1255 root 1.20
1256     =over 4
1257    
1258 root 1.53 =item $packed_value = $image->image_info ($name)
1259 root 1.20
1260     See C<< $platform->info >> for details.
1261    
1262     The reason this method is not called C<info> is that there already is an
1263     C<< ->info >> method inherited from C<OpenCL::Memory>.
1264    
1265     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetImageInfo.html>
1266    
1267 root 1.53 =item ($channel_order, $channel_data_type) = $image->format
1268    
1269     Returns the channel order and type used to create the image by calling
1270     C<clGetImageInfo> with C<CL_IMAGE_FORMAT>.
1271    
1272 root 1.21 =for gengetinfo begin image
1273    
1274     =item $int = $image->element_size
1275    
1276 root 1.24 Calls C<clGetImageInfo> with C<CL_IMAGE_ELEMENT_SIZE> and returns the result.
1277 root 1.21
1278     =item $int = $image->row_pitch
1279    
1280 root 1.24 Calls C<clGetImageInfo> with C<CL_IMAGE_ROW_PITCH> and returns the result.
1281 root 1.21
1282     =item $int = $image->slice_pitch
1283    
1284 root 1.24 Calls C<clGetImageInfo> with C<CL_IMAGE_SLICE_PITCH> and returns the result.
1285 root 1.21
1286     =item $int = $image->width
1287    
1288 root 1.24 Calls C<clGetImageInfo> with C<CL_IMAGE_WIDTH> and returns the result.
1289 root 1.21
1290     =item $int = $image->height
1291    
1292 root 1.24 Calls C<clGetImageInfo> with C<CL_IMAGE_HEIGHT> and returns the result.
1293 root 1.21
1294     =item $int = $image->depth
1295    
1296 root 1.24 Calls C<clGetImageInfo> with C<CL_IMAGE_DEPTH> and returns the result.
1297 root 1.21
1298     =for gengetinfo end image
1299    
1300 root 1.34 =for gengetinfo begin gl_texture
1301    
1302     =item $GLenum = $gl_texture->target
1303    
1304 root 1.37 Calls C<clGetGLTextureInfo> with C<CL_GL_TEXTURE_TARGET> and returns the result.
1305 root 1.34
1306     =item $GLint = $gl_texture->gl_mipmap_level
1307    
1308 root 1.37 Calls C<clGetGLTextureInfo> with C<CL_GL_MIPMAP_LEVEL> and returns the result.
1309 root 1.34
1310     =for gengetinfo end gl_texture
1311    
1312 root 1.20 =back
1313    
1314 root 1.5 =head2 THE OpenCL::Sampler CLASS
1315    
1316     =over 4
1317    
1318     =item $packed_value = $sampler->info ($name)
1319    
1320     See C<< $platform->info >> for details.
1321    
1322     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetSamplerInfo.html>
1323    
1324 root 1.21 =for gengetinfo begin sampler
1325    
1326     =item $uint = $sampler->reference_count
1327    
1328 root 1.24 Calls C<clGetSamplerInfo> with C<CL_SAMPLER_REFERENCE_COUNT> and returns the result.
1329 root 1.21
1330     =item $ctx = $sampler->context
1331    
1332 root 1.24 Calls C<clGetSamplerInfo> with C<CL_SAMPLER_CONTEXT> and returns the result.
1333 root 1.21
1334     =item $addressing_mode = $sampler->normalized_coords
1335    
1336 root 1.24 Calls C<clGetSamplerInfo> with C<CL_SAMPLER_NORMALIZED_COORDS> and returns the result.
1337 root 1.21
1338     =item $filter_mode = $sampler->addressing_mode
1339    
1340 root 1.24 Calls C<clGetSamplerInfo> with C<CL_SAMPLER_ADDRESSING_MODE> and returns the result.
1341 root 1.21
1342     =item $boolean = $sampler->filter_mode
1343    
1344 root 1.24 Calls C<clGetSamplerInfo> with C<CL_SAMPLER_FILTER_MODE> and returns the result.
1345 root 1.21
1346     =for gengetinfo end sampler
1347    
1348 root 1.5 =back
1349    
1350     =head2 THE OpenCL::Program CLASS
1351    
1352     =over 4
1353    
1354     =item $program->build ($device, $options = "")
1355    
1356 root 1.51 Tries to build the program with the given options. See also the
1357     C<$ctx->build> convenience function.
1358 root 1.5
1359     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clBuildProgram.html>
1360    
1361     =item $packed_value = $program->build_info ($device, $name)
1362    
1363     Similar to C<< $platform->info >>, but returns build info for a previous
1364     build attempt for the given device.
1365    
1366     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetBuildInfo.html>
1367    
1368     =item $kernel = $program->kernel ($function_name)
1369    
1370     Creates an OpenCL::Kernel object out of the named C<__kernel> function in
1371     the program.
1372    
1373     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateKernel.html>
1374    
1375 root 1.50 =item @kernels = $program->kernels_in_program
1376    
1377     Returns all kernels successfully compiled for all devices in program.
1378    
1379     http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateKernelsInProgram.html
1380    
1381 root 1.21 =for gengetinfo begin program_build
1382    
1383     =item $build_status = $program->build_status ($device)
1384    
1385 root 1.24 Calls C<clGetProgramBuildInfo> with C<CL_PROGRAM_BUILD_STATUS> and returns the result.
1386 root 1.21
1387     =item $string = $program->build_options ($device)
1388    
1389 root 1.24 Calls C<clGetProgramBuildInfo> with C<CL_PROGRAM_BUILD_OPTIONS> and returns the result.
1390 root 1.21
1391     =item $string = $program->build_log ($device)
1392    
1393 root 1.24 Calls C<clGetProgramBuildInfo> with C<CL_PROGRAM_BUILD_LOG> and returns the result.
1394 root 1.21
1395     =for gengetinfo end program_build
1396    
1397     =item $packed_value = $program->info ($name)
1398    
1399     See C<< $platform->info >> for details.
1400    
1401     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetProgramInfo.html>
1402    
1403     =for gengetinfo begin program
1404    
1405     =item $uint = $program->reference_count
1406    
1407 root 1.24 Calls C<clGetProgramInfo> with C<CL_PROGRAM_REFERENCE_COUNT> and returns the result.
1408 root 1.21
1409     =item $ctx = $program->context
1410    
1411 root 1.24 Calls C<clGetProgramInfo> with C<CL_PROGRAM_CONTEXT> and returns the result.
1412 root 1.21
1413     =item $uint = $program->num_devices
1414    
1415 root 1.24 Calls C<clGetProgramInfo> with C<CL_PROGRAM_NUM_DEVICES> and returns the result.
1416 root 1.21
1417     =item @devices = $program->devices
1418    
1419 root 1.24 Calls C<clGetProgramInfo> with C<CL_PROGRAM_DEVICES> and returns the result.
1420 root 1.21
1421     =item $string = $program->source
1422    
1423 root 1.24 Calls C<clGetProgramInfo> with C<CL_PROGRAM_SOURCE> and returns the result.
1424 root 1.21
1425     =item @ints = $program->binary_sizes
1426    
1427 root 1.24 Calls C<clGetProgramInfo> with C<CL_PROGRAM_BINARY_SIZES> and returns the result.
1428 root 1.21
1429     =for gengetinfo end program
1430    
1431 root 1.23 =item @blobs = $program->binaries
1432    
1433     Returns a string for the compiled binary for every device associated with
1434     the program, empty strings indicate missing programs, and an empty result
1435     means no program binaries are available.
1436    
1437     These "binaries" are often, in fact, informative low-level assembly
1438     sources.
1439    
1440     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetProgramInfo.html>
1441    
1442 root 1.5 =back
1443    
1444     =head2 THE OpenCL::Kernel CLASS
1445    
1446     =over 4
1447    
1448     =item $packed_value = $kernel->info ($name)
1449    
1450     See C<< $platform->info >> for details.
1451    
1452     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetKernelInfo.html>
1453    
1454 root 1.21 =for gengetinfo begin kernel
1455    
1456     =item $string = $kernel->function_name
1457    
1458 root 1.24 Calls C<clGetKernelInfo> with C<CL_KERNEL_FUNCTION_NAME> and returns the result.
1459 root 1.21
1460     =item $uint = $kernel->num_args
1461    
1462 root 1.24 Calls C<clGetKernelInfo> with C<CL_KERNEL_NUM_ARGS> and returns the result.
1463 root 1.21
1464     =item $uint = $kernel->reference_count
1465    
1466 root 1.24 Calls C<clGetKernelInfo> with C<CL_KERNEL_REFERENCE_COUNT> and returns the result.
1467 root 1.21
1468     =item $ctx = $kernel->context
1469    
1470 root 1.24 Calls C<clGetKernelInfo> with C<CL_KERNEL_CONTEXT> and returns the result.
1471 root 1.21
1472     =item $program = $kernel->program
1473    
1474 root 1.24 Calls C<clGetKernelInfo> with C<CL_KERNEL_PROGRAM> and returns the result.
1475 root 1.21
1476     =for gengetinfo end kernel
1477    
1478 root 1.20 =item $packed_value = $kernel->work_group_info ($device, $name)
1479    
1480     See C<< $platform->info >> for details.
1481    
1482     The reason this method is not called C<info> is that there already is an
1483     C<< ->info >> method.
1484    
1485     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetKernelWorkGroupInfo.html>
1486    
1487 root 1.21 =for gengetinfo begin kernel_work_group
1488    
1489     =item $int = $kernel->work_group_size ($device)
1490    
1491 root 1.24 Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_WORK_GROUP_SIZE> and returns the result.
1492 root 1.21
1493     =item @ints = $kernel->compile_work_group_size ($device)
1494    
1495 root 1.24 Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_COMPILE_WORK_GROUP_SIZE> and returns the result.
1496 root 1.21
1497     =item $ulong = $kernel->local_mem_size ($device)
1498    
1499 root 1.24 Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_LOCAL_MEM_SIZE> and returns the result.
1500 root 1.21
1501     =item $int = $kernel->preferred_work_group_size_multiple ($device)
1502    
1503 root 1.24 Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE> and returns the result.
1504 root 1.21
1505     =item $ulong = $kernel->private_mem_size ($device)
1506    
1507 root 1.24 Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_PRIVATE_MEM_SIZE> and returns the result.
1508 root 1.21
1509     =for gengetinfo end kernel_work_group
1510    
1511 root 1.5 =item $kernel->set_TYPE ($index, $value)
1512    
1513     This is a family of methods to set the kernel argument with the number C<$index> to the give C<$value>.
1514    
1515     TYPE is one of C<char>, C<uchar>, C<short>, C<ushort>, C<int>, C<uint>,
1516     C<long>, C<ulong>, C<half>, C<float>, C<double>, C<memory>, C<buffer>,
1517 root 1.41 C<image2d>, C<image3d>, C<sampler>, C<local> or C<event>.
1518 root 1.5
1519     Chars and integers (including the half type) are specified as integers,
1520     float and double as floating point values, memory/buffer/image2d/image3d
1521 root 1.41 must be an object of that type or C<undef>, local-memory arguments are
1522     set by specifying the size, and sampler and event must be objects of that
1523     type.
1524 root 1.5
1525 root 1.50 Setting an argument for a kernel does NOT keep a reference to the object -
1526     for example, if you set an argument to some image object, free the image,
1527     and call the kernel, you will run into undefined behaviour.
1528    
1529 root 1.5 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clSetKernelArg.html>
1530    
1531     =back
1532    
1533     =head2 THE OpenCL::Event CLASS
1534    
1535     This is the superclass for all event objects (including OpenCL::UserEvent
1536     objects).
1537    
1538     =over 4
1539    
1540 root 1.21 =item $ev->wait
1541    
1542     Waits for the event to complete.
1543    
1544     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clWaitForEvents.html>
1545    
1546 root 1.5 =item $packed_value = $ev->info ($name)
1547    
1548     See C<< $platform->info >> for details.
1549    
1550     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetEventInfo.html>
1551    
1552 root 1.21 =for gengetinfo begin event
1553    
1554     =item $queue = $event->command_queue
1555    
1556 root 1.24 Calls C<clGetEventInfo> with C<CL_EVENT_COMMAND_QUEUE> and returns the result.
1557 root 1.21
1558     =item $command_type = $event->command_type
1559    
1560 root 1.24 Calls C<clGetEventInfo> with C<CL_EVENT_COMMAND_TYPE> and returns the result.
1561 root 1.21
1562     =item $uint = $event->reference_count
1563    
1564 root 1.24 Calls C<clGetEventInfo> with C<CL_EVENT_REFERENCE_COUNT> and returns the result.
1565 root 1.21
1566     =item $uint = $event->command_execution_status
1567    
1568 root 1.24 Calls C<clGetEventInfo> with C<CL_EVENT_COMMAND_EXECUTION_STATUS> and returns the result.
1569 root 1.21
1570     =item $ctx = $event->context
1571    
1572 root 1.24 Calls C<clGetEventInfo> with C<CL_EVENT_CONTEXT> and returns the result.
1573 root 1.21
1574     =for gengetinfo end event
1575    
1576 root 1.20 =item $packed_value = $ev->profiling_info ($name)
1577    
1578     See C<< $platform->info >> for details.
1579    
1580     The reason this method is not called C<info> is that there already is an
1581     C<< ->info >> method.
1582    
1583     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetProfilingInfo.html>
1584    
1585 root 1.21 =for gengetinfo begin profiling
1586    
1587     =item $ulong = $event->profiling_command_queued
1588    
1589 root 1.24 Calls C<clGetEventProfilingInfo> with C<CL_PROFILING_COMMAND_QUEUED> and returns the result.
1590 root 1.21
1591     =item $ulong = $event->profiling_command_submit
1592    
1593 root 1.24 Calls C<clGetEventProfilingInfo> with C<CL_PROFILING_COMMAND_SUBMIT> and returns the result.
1594 root 1.21
1595     =item $ulong = $event->profiling_command_start
1596    
1597 root 1.24 Calls C<clGetEventProfilingInfo> with C<CL_PROFILING_COMMAND_START> and returns the result.
1598 root 1.21
1599     =item $ulong = $event->profiling_command_end
1600 root 1.5
1601 root 1.24 Calls C<clGetEventProfilingInfo> with C<CL_PROFILING_COMMAND_END> and returns the result.
1602 root 1.5
1603 root 1.21 =for gengetinfo end profiling
1604 root 1.5
1605     =back
1606    
1607     =head2 THE OpenCL::UserEvent CLASS
1608    
1609     This is a subclass of OpenCL::Event.
1610 root 1.4
1611 root 1.1 =over 4
1612    
1613 root 1.5 =item $ev->set_status ($execution_status)
1614    
1615     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clSetUserEventStatus.html>
1616    
1617     =back
1618    
1619 root 1.1 =cut
1620    
1621     1;
1622    
1623     =head1 AUTHOR
1624    
1625     Marc Lehmann <schmorp@schmorp.de>
1626     http://home.schmorp.de/
1627    
1628     =cut
1629