ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/OpenCL/OpenCL.pm
Revision: 1.65
Committed: Mon Apr 30 23:35:16 2012 UTC (12 years ago) by root
Branch: MAIN
Changes since 1.64: +35 -3 lines
Log Message:
*** empty log message ***

File Contents

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