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