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