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