ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/OpenCL/OpenCL.pm
Revision: 1.86
Committed: Mon May 7 01:00:31 2012 UTC (12 years ago) by root
Branch: MAIN
Changes since 1.85: +3 -1 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 =head1 NAME
2    
3 root 1.5 OpenCL - Open Computing Language Bindings
4 root 1.1
5     =head1 SYNOPSIS
6    
7     use OpenCL;
8    
9     =head1 DESCRIPTION
10    
11 root 1.7 This is an early release which might be useful, but hasn't seen much testing.
12 root 1.1
13 root 1.9 =head2 OpenCL FROM 10000 FEET HEIGHT
14    
15     Here is a high level overview of OpenCL:
16    
17     First you need to find one or more OpenCL::Platforms (kind of like
18     vendors) - usually there is only one.
19    
20     Each platform gives you access to a number of OpenCL::Device objects, e.g.
21     your graphics card.
22    
23 root 1.11 From a platform and some device(s), you create an OpenCL::Context, which is
24 root 1.9 a very central object in OpenCL: Once you have a context you can create
25     most other objects:
26    
27 root 1.11 OpenCL::Program objects, which store source code and, after building for a
28     specific device ("compiling and linking"), also binary programs. For each
29     kernel function in a program you can then create an OpenCL::Kernel object
30     which represents basically a function call with argument values.
31 root 1.9
32 root 1.20 OpenCL::Memory objects of various flavours: OpenCL::Buffer objects (flat
33 root 1.80 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.71 The OpenCL specs used to develop this module - download these and keept
49     hema round, they are required reference material:
50 root 1.3
51     http://www.khronos.org/registry/cl/specs/opencl-1.1.pdf
52 root 1.57 http://www.khronos.org/registry/cl/specs/opencl-1.2.pdf
53     http://www.khronos.org/registry/cl/specs/opencl-1.2-extensions.pdf
54 root 1.3
55     OpenCL manpages:
56    
57     http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/
58 root 1.57 http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/
59 root 1.3
60 root 1.18 If you are into UML class diagrams, the following diagram might help - if
61 root 1.57 not, it will be mildly confusing (also, the class hierarchy of this module
62     is much more fine-grained):
63 root 1.18
64 root 1.57 http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/classDiagram.html
65 root 1.18
66 root 1.16 Here's a tutorial from AMD (very AMD-centric, too), not sure how useful it
67     is, but at least it's free of charge:
68    
69     http://developer.amd.com/zones/OpenCLZone/courses/Documents/Introduction_to_OpenCL_Programming%20Training_Guide%20%28201005%29.pdf
70    
71 root 1.18 And here's NVIDIA's OpenCL Best Practises Guide:
72 root 1.16
73 root 1.18 http://developer.download.nvidia.com/compute/cuda/3_2/toolkit/docs/OpenCL_Best_Practices_Guide.pdf
74 root 1.16
75 root 1.9 =head1 BASIC WORKFLOW
76    
77 root 1.11 To get something done, you basically have to do this once (refer to the
78     examples below for actual code, this is just a high-level description):
79 root 1.9
80 root 1.11 Find some platform (e.g. the first one) and some device(s) (e.g. the first
81     device of the platform), and create a context from those.
82 root 1.9
83 root 1.11 Create program objects from your OpenCL source code, then build (compile)
84     the programs for each device you want to run them on.
85 root 1.9
86 root 1.11 Create kernel objects for all kernels you want to use (surprisingly, these
87     are not device-specific).
88 root 1.9
89 root 1.11 Then, to execute stuff, you repeat these steps, possibly resuing or
90     sharing some buffers:
91 root 1.9
92 root 1.11 Create some input and output buffers from your context. Set these as
93     arguments to your kernel.
94    
95     Enqueue buffer writes to initialise your input buffers (when not
96     initialised at creation time).
97 root 1.9
98     Enqueue the kernel execution.
99    
100     Enqueue buffer reads for your output buffer to read results.
101    
102 root 1.3 =head1 EXAMPLES
103    
104 root 1.5 =head2 Enumerate all devices and get contexts for them.
105 root 1.1
106 root 1.11 Best run this once to get a feel for the platforms and devices in your
107     system.
108    
109 root 1.1 for my $platform (OpenCL::platforms) {
110 root 1.24 printf "platform: %s\n", $platform->name;
111     printf "extensions: %s\n", $platform->extensions;
112 root 1.1 for my $device ($platform->devices) {
113 root 1.24 printf "+ device: %s\n", $device->name;
114 root 1.29 my $ctx = $platform->context (undef, [$device]);
115 root 1.1 # do stuff
116     }
117     }
118    
119 root 1.5 =head2 Get a useful context and a command queue.
120 root 1.1
121 root 1.11 This is a useful boilerplate for any OpenCL program that only wants to use
122     one device,
123    
124     my ($platform) = OpenCL::platforms; # find first platform
125     my ($dev) = $platform->devices; # find first device of platform
126     my $ctx = $platform->context (undef, [$dev]); # create context out of those
127     my $queue = $ctx->queue ($dev); # create a command queue for the device
128 root 1.1
129 root 1.5 =head2 Print all supported image formats of a context.
130    
131 root 1.11 Best run this once for your context, to see whats available and how to
132     gather information.
133    
134 root 1.5 for my $type (OpenCL::MEM_OBJECT_IMAGE2D, OpenCL::MEM_OBJECT_IMAGE3D) {
135 root 1.10 print "supported image formats for ", OpenCL::enum2str $type, "\n";
136 root 1.5
137     for my $f ($ctx->supported_image_formats (0, $type)) {
138     printf " %-10s %-20s\n", OpenCL::enum2str $f->[0], OpenCL::enum2str $f->[1];
139     }
140     }
141    
142     =head2 Create a buffer with some predefined data, read it back synchronously,
143     then asynchronously.
144 root 1.3
145     my $buf = $ctx->buffer_sv (OpenCL::MEM_COPY_HOST_PTR, "helmut");
146    
147 root 1.59 $queue->read_buffer ($buf, 1, 1, 3, my $data);
148 root 1.10 print "$data\n";
149 root 1.3
150 root 1.59 my $ev = $queue->read_buffer ($buf, 0, 1, 3, my $data);
151 root 1.3 $ev->wait;
152 root 1.10 print "$data\n"; # prints "elm"
153 root 1.3
154 root 1.5 =head2 Create and build a program, then create a kernel out of one of its
155     functions.
156 root 1.3
157     my $src = '
158 root 1.31 kernel void
159     squareit (global float *input, global float *output)
160 root 1.3 {
161 root 1.15 $id = get_global_id (0);
162 root 1.3 output [id] = input [id] * input [id];
163     }
164     ';
165    
166 root 1.51 my $prog = $ctx->build_program ($src);
167 root 1.3 my $kernel = $prog->kernel ("squareit");
168    
169 root 1.11 =head2 Create some input and output float buffers, then call the
170     'squareit' kernel on them.
171 root 1.4
172     my $input = $ctx->buffer_sv (OpenCL::MEM_COPY_HOST_PTR, pack "f*", 1, 2, 3, 4.5);
173     my $output = $ctx->buffer (0, OpenCL::SIZEOF_FLOAT * 5);
174    
175     # set buffer
176     $kernel->set_buffer (0, $input);
177     $kernel->set_buffer (1, $output);
178    
179     # execute it for all 4 numbers
180 root 1.59 $queue->nd_range_kernel ($kernel, undef, [4], undef);
181 root 1.4
182 root 1.5 # enqueue a synchronous read
183 root 1.59 $queue->read_buffer ($output, 1, 0, OpenCL::SIZEOF_FLOAT * 4, my $data);
184 root 1.5
185     # print the results:
186 root 1.10 printf "%s\n", join ", ", unpack "f*", $data;
187 root 1.5
188     =head2 The same enqueue operations as before, but assuming an out-of-order queue,
189     showing off barriers.
190    
191     # execute it for all 4 numbers
192 root 1.59 $queue->nd_range_kernel ($kernel, undef, [4], undef);
193 root 1.5
194     # enqueue a barrier to ensure in-order execution
195 root 1.59 $queue->barrier;
196 root 1.4
197 root 1.5 # enqueue an async read
198 root 1.59 $queue->read_buffer ($output, 0, 0, OpenCL::SIZEOF_FLOAT * 4, my $data);
199 root 1.5
200     # wait for all requests to finish
201     $queue->finish;
202    
203     =head2 The same enqueue operations as before, but assuming an out-of-order queue,
204     showing off event objects and wait lists.
205    
206     # execute it for all 4 numbers
207 root 1.59 my $ev = $queue->nd_range_kernel ($kernel, undef, [4], undef);
208 root 1.5
209     # enqueue an async read
210 root 1.59 $ev = $queue->read_buffer ($output, 0, 0, OpenCL::SIZEOF_FLOAT * 4, my $data, $ev);
211 root 1.5
212     # wait for the last event to complete
213 root 1.4 $ev->wait;
214    
215 root 1.38 =head2 Use the OpenGL module to share a texture between OpenCL and OpenGL and draw some julia
216 root 1.71 set flight effect.
217 root 1.38
218 root 1.81 This is quite a long example to get you going - you can also download it
219     from L<http://cvs.schmorp.de/OpenCL/examples/juliaflight>.
220 root 1.38
221     use OpenGL ":all";
222     use OpenCL;
223    
224 root 1.64 my $S = $ARGV[0] || 256; # window/texture size, smaller is faster
225    
226 root 1.38 # open a window and create a gl texture
227 root 1.64 OpenGL::glpOpenWindow width => $S, height => $S;
228 root 1.38 my $texid = glGenTextures_p 1;
229     glBindTexture GL_TEXTURE_2D, $texid;
230 root 1.64 glTexImage2D_c GL_TEXTURE_2D, 0, GL_RGBA8, $S, $S, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0;
231 root 1.38
232     # find and use the first opencl device that let's us get a shared opengl context
233     my $platform;
234     my $dev;
235     my $ctx;
236    
237     for (OpenCL::platforms) {
238     $platform = $_;
239     for ($platform->devices) {
240     $dev = $_;
241     $ctx = $platform->context ([OpenCL::GLX_DISPLAY_KHR, undef, OpenCL::GL_CONTEXT_KHR, undef], [$dev])
242     and last;
243     }
244     }
245    
246     $ctx
247     or die "cannot find suitable OpenCL device\n";
248    
249     my $queue = $ctx->queue ($dev);
250    
251     # now attach an opencl image2d object to the opengl texture
252     my $tex = $ctx->gl_texture2d (OpenCL::MEM_WRITE_ONLY, GL_TEXTURE_2D, 0, $texid);
253    
254     # now the boring opencl code
255     my $src = <<EOF;
256     kernel void
257     juliatunnel (write_only image2d_t img, float time)
258     {
259 root 1.64 int2 xy = (int2)(get_global_id (0), get_global_id (1));
260     float2 p = convert_float2 (xy) / $S.f * 2.f - 1.f;
261 root 1.38
262 root 1.64 float2 m = (float2)(1.f, p.y) / fabs (p.x); // tunnel
263     m.x = fabs (fmod (m.x + time * 0.05f, 4.f) - 2.f);
264 root 1.38
265     float2 z = m;
266 root 1.64 float2 c = (float2)(sin (time * 0.01133f), cos (time * 0.02521f));
267 root 1.38
268 root 1.64 for (int i = 0; i < 25 && dot (z, z) < 4.f; ++i) // standard julia
269 root 1.38 z = (float2)(z.x * z.x - z.y * z.y, 2.f * z.x * z.y) + c;
270    
271 root 1.64 float3 colour = (float3)(z.x, z.y, atan2 (z.y, z.x));
272     write_imagef (img, xy, (float4)(colour * p.x * p.x, 1.));
273 root 1.38 }
274     EOF
275    
276 root 1.51 my $prog = $ctx->build_program ($src);
277 root 1.38 my $kernel = $prog->kernel ("juliatunnel");
278    
279     # program compiled, kernel ready, now draw and loop
280    
281     for (my $time; ; ++$time) {
282     # acquire objects from opengl
283 root 1.59 $queue->acquire_gl_objects ([$tex]);
284 root 1.38
285     # configure and run our kernel
286 root 1.64 $kernel->setf ("mf", $tex, $time*2); # mf = memory object, float
287     $queue->nd_range_kernel ($kernel, undef, [$S, $S], undef);
288 root 1.38
289     # release objects to opengl again
290 root 1.59 $queue->release_gl_objects ([$tex]);
291 root 1.38
292     # wait
293 root 1.40 $queue->finish;
294 root 1.38
295     # now draw the texture, the defaults should be all right
296     glTexParameterf GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST;
297    
298     glEnable GL_TEXTURE_2D;
299     glBegin GL_QUADS;
300     glTexCoord2f 0, 1; glVertex3i -1, -1, -1;
301     glTexCoord2f 0, 0; glVertex3i 1, -1, -1;
302     glTexCoord2f 1, 0; glVertex3i 1, 1, -1;
303     glTexCoord2f 1, 1; glVertex3i -1, 1, -1;
304     glEnd;
305    
306     glXSwapBuffers;
307    
308     select undef, undef, undef, 1/60;
309     }
310    
311 root 1.66 =head2 How to modify the previous example to not rely on GL sharing.
312 root 1.65
313     For those poor souls with only a sucky CPU OpenCL implementation, you
314     currently have to read the image into some perl scalar, and then modify a
315     texture or use glDrawPixels or so).
316    
317     First, when you don't need gl sharing, you can create the context much simpler:
318    
319     $ctx = $platform->context (undef, [$dev])
320    
321     To use a texture, you would modify the above example by creating an
322     OpenCL::Image manually instead of deriving it from a texture:
323    
324     my $tex = $ctx->image2d (OpenCL::MEM_WRITE_ONLY, OpenCL::RGBA, OpenCL::UNORM_INT8, $S, $S);
325    
326 root 1.71 And in the draw loop, intead of acquire_gl_objects/release_gl_objects, you
327 root 1.65 would read the image2d after the kernel has written it:
328    
329     $queue->read_image ($tex, 0, 0, 0, 0, $S, $S, 1, 0, 0, my $data);
330    
331     And then you would upload the pixel data to the texture (or use glDrawPixels):
332    
333     glTexSubImage2D_s GL_TEXTURE_2D, 0, 0, 0, $S, $S, GL_RGBA, GL_UNSIGNED_BYTE, $data;
334    
335     The fully modified example can be found at
336     L<http://cvs.schmorp.de/OpenCL/examples/juliaflight-nosharing>.
337    
338 root 1.71 =head2 Julia sets look soooo 80ies.
339    
340     Then colour them differently, e.g. using orbit traps! Replace the loop and
341     colour calculation from the previous examples by this:
342    
343     float2 dm = (float2)(1.f, 1.f);
344    
345     for (int i = 0; i < 25; ++i)
346     {
347     z = (float2)(z.x * z.x - z.y * z.y, 2.f * z.x * z.y) + c;
348     dm = fmin (dm, (float2)(fabs (dot (z, z) - 1.f), fabs (z.x - 1.f)));
349     }
350    
351     float3 colour = (float3)(dm.x * dm.y, dm.x * dm.y, dm.x);
352    
353     Also try C<-10.f> instead of C<-1.f>.
354    
355 root 1.5 =head1 DOCUMENTATION
356    
357     =head2 BASIC CONVENTIONS
358    
359 root 1.14 This is not a one-to-one C-style translation of OpenCL to Perl - instead
360     I attempted to make the interface as type-safe as possible by introducing
361 root 1.5 object syntax where it makes sense. There are a number of important
362     differences between the OpenCL C API and this module:
363    
364     =over 4
365    
366     =item * Object lifetime managament is automatic - there is no need
367     to free objects explicitly (C<clReleaseXXX>), the release function
368     is called automatically once all Perl references to it go away.
369    
370 root 1.20 =item * OpenCL uses CamelCase for function names
371     (e.g. C<clGetPlatformIDs>, C<clGetPlatformInfo>), while this module
372     uses underscores as word separator and often leaves out prefixes
373     (C<OpenCL::platforms>, C<< $platform->info >>).
374 root 1.5
375     =item * OpenCL often specifies fixed vector function arguments as short
376 root 1.19 arrays (C<size_t origin[3]>), while this module explicitly expects the
377     components as separate arguments (C<$orig_x, $orig_y, $orig_z>) in
378     function calls.
379 root 1.5
380 root 1.19 =item * Structures are often specified by flattening out their components
381     as with short vectors, and returned as arrayrefs.
382 root 1.5
383     =item * When enqueuing commands, the wait list is specified by adding
384 root 1.9 extra arguments to the function - anywhere a C<$wait_events...> argument
385 root 1.44 is documented this can be any number of event objects. As an extsnion
386     implemented by this module, C<undef> values will be ignored in the event
387     list.
388 root 1.5
389     =item * When enqueuing commands, if the enqueue method is called in void
390     context, no event is created. In all other contexts an event is returned
391     by the method.
392    
393 root 1.79 =item * This module expects all functions to return C<OpenCL::SUCCESS>. If any
394 root 1.5 other status is returned the function will throw an exception, so you
395     don't normally have to to any error checking.
396    
397     =back
398    
399 root 1.80 =head2 CONSTANTS
400    
401     All C<CL_xxx> constants that this module supports are always available
402     in the C<OpenCL> namespace as C<OpenCL::xxx> (i.e. without the C<CL_>
403 root 1.81 prefix). Constants which are not defined in the header files used during
404 root 1.86 compilation, or otherwise are not available, will have the value C<0> (in
405     some cases, this will make them indistinguishable from real constants,
406     sorry).
407 root 1.80
408 root 1.81 The latest version of this module knows and exports the constants
409     listed in L<http://cvs.schmorp.de/OpenCL/constiv.h>.
410    
411 root 1.80 =head2 OPENCL 1.1 VS. OPENCL 1.2
412    
413     This module supports both OpenCL version 1.1 and 1.2, although the OpenCL
414     1.2 interface hasn't been tested much for lack of availability of an
415     actual implementation.
416    
417     Every function or method in this manual page that interfaces to a
418     particular OpenCL function has a link to the its C manual page.
419    
420     If the link contains a F<1.1>, then this function is an OpenCL 1.1
421     function. Most but not all also exist in OpenCL 1.2, and this module
422     tries to emulate the missing ones for you, when told to do so at
423 root 1.81 compiletime. You can check whether a function was removed in OpenCL 1.2 by
424 root 1.80 replacing the F<1.1> component in the URL by F<1.2>.
425    
426     If the link contains a F<1.2>, then this is a OpenCL 1.2-only
427     function. Even if the module was compiled with OpenCL 1.2 header files
428     and has an 1.2 OpenCL library, calling such a function on a platform that
429     doesn't implement 1.2 causes undefined behaviour, usually a crash (But
430     this is not guaranteed).
431    
432     You can find out whether this module was compiled to prefer 1.1
433     functionality by ooking at C<OpenCL::PREFER_1_1> - if it is true, then
434     1.1 functions generally are implemented using 1.1 OpenCL functions. If it
435     is false, then 1.1 functions missing from 1.2 are emulated by calling 1.2
436     fucntions.
437    
438     This is a somewhat sorry state of affairs, but the Khronos group choose to
439     make every release of OpenCL source and binary incompatible with previous
440     releases.
441    
442 root 1.7 =head2 PERL AND OPENCL TYPES
443    
444 root 1.8 This handy(?) table lists OpenCL types and their perl, PDL and pack/unpack
445 root 1.7 format equivalents:
446    
447 root 1.8 OpenCL perl PDL pack/unpack
448     char IV - c
449     uchar IV byte C
450     short IV short s
451     ushort IV ushort S
452     int IV long? l
453     uint IV - L
454     long IV longlong q
455     ulong IV - Q
456     float NV float f
457     half IV ushort S
458     double NV double d
459 root 1.7
460 root 1.36 =head2 GLX SUPPORT
461    
462     Due to the sad state that OpenGL support is in in Perl (mostly the OpenGL
463     module, which has little to no documentation and has little to no support
464 root 1.38 for glX), this module, as a special extension, treats context creation
465 root 1.36 properties C<OpenCL::GLX_DISPLAY_KHR> and C<OpenCL::GL_CONTEXT_KHR>
466     specially: If either or both of these are C<undef>, then the OpenCL
467 root 1.38 module tries to dynamically resolve C<glXGetCurrentDisplay> and
468     C<glXGetCurrentContext>, call these functions and use their return values
469 root 1.36 instead.
470    
471     For this to work, the OpenGL library must be loaded, a GLX context must
472     have been created and be made current, and C<dlsym> must be available and
473     capable of finding the function via C<RTLD_DEFAULT>.
474    
475 root 1.55 =head2 EVENT SYSTEM
476    
477     OpenCL can generate a number of (potentially) asynchronous events, for
478     example, after compiling a program, to signal a context-related error or,
479     perhaps most important, to signal completion of queued jobs (by setting
480     callbacks on OpenCL::Event objects).
481    
482 root 1.74 The OpenCL module converts all these callbacks into events - you can
483     still register callbacks, but they are not executed when your OpenCL
484     implementation calls the actual callback, but only later. Therefore, none
485     of the limitations of OpenCL callbacks apply to the perl implementation:
486     it is perfectly safe to make blocking operations from event callbacks, and
487     enqueued operations don't need to be flushed.
488    
489 root 1.55 To facilitate this, this module maintains an event queue - each
490     time an asynchronous event happens, it is queued, and perl will be
491     interrupted. This is implemented via the L<Async::Interrupt> module. In
492     addition, this module has L<AnyEvent> support, so it can seamlessly
493     integrate itself into many event loops.
494    
495 root 1.74 Since L<Async::Interrupt> is a bit hard to understand, here are some case examples:
496 root 1.55
497     =head3 Don't use callbacks.
498    
499     When your program never uses any callbacks, then there will never be any
500     notifications you need to take care of, and therefore no need to worry
501     about all this.
502    
503     You can achieve a great deal by explicitly waiting for events, or using
504     barriers and flush calls. In many programs, there is no need at all to
505     tinker with asynchronous events.
506    
507     =head3 Use AnyEvent
508    
509     This module automatically registers a watcher that invokes all outstanding
510     event callbacks when AnyEvent is initialised (and block asynchronous
511     interruptions). Using this mode of operations is the safest and most
512     recommended one.
513    
514     To use this, simply use AnyEvent and this module normally, make sure you
515     have an event loop running:
516    
517     use Gtk2 -init;
518     use AnyEvent;
519    
520     # initialise AnyEvent, by creating a watcher, or:
521     AnyEvent::detect;
522    
523 root 1.59 my $e = $queue->marker;
524 root 1.55 $e->cb (sub {
525     warn "opencl is finished\n";
526     })
527    
528     main Gtk2;
529    
530     Note that this module will not initialise AnyEvent for you. Before
531     AnyEvent is initialised, the module will asynchronously interrupt perl
532     instead. To avoid any surprises, it's best to explicitly initialise
533     AnyEvent.
534    
535     You can temporarily enable asynchronous interruptions (see next paragraph)
536     by calling C<$OpenCL::INTERRUPT->unblock> and disable them again by
537     calling C<$OpenCL::INTERRUPT->block>.
538    
539     =head3 Let yourself be interrupted at any time
540    
541     This mode is the default unless AnyEvent is loaded and initialised. In
542     this mode, OpenCL asynchronously interrupts a running perl program. The
543     emphasis is on both I<asynchronously> and I<running> here.
544    
545     Asynchronously means that perl might execute your callbacks at any
546     time. For example, in the following code (I<THAT YOU SHOULD NOT COPY>),
547     the C<until> loop following the marker call will be interrupted by the
548     callback:
549    
550 root 1.59 my $e = $queue->marker;
551 root 1.55 my $flag;
552     $e->cb (sub { $flag = 1 });
553     1 until $flag;
554     # $flag is now 1
555    
556     The reason why you shouldn't blindly copy the above code is that
557     busy waiting is a really really bad thing, and really really bad for
558     performance.
559    
560     While at first this asynchronous business might look exciting, it can be
561     really hard, because you need to be prepared for the callback code to be
562     executed at any time, which limits the amount of things the callback code
563     can do safely.
564    
565     This can be mitigated somewhat by using C<<
566     $OpenCL::INTERRUPT->scope_block >> (see the L<Async::Interrupt>
567     documentation for details).
568    
569     The other problem is that your program must be actively I<running> to be
570     interrupted. When you calculate stuff, your program is running. When you
571     hang in some C functions or other block execution (by calling C<sleep>,
572     C<select>, running an event loop and so on), your program is waiting, not
573     running.
574    
575     One way around that would be to attach a read watcher to your event loop,
576     listening for events on C<< $OpenCL::INTERRUPT->pipe_fileno >>, using a
577     dummy callback (C<sub { }>) to temporarily execute some perl code.
578    
579     That is then awfully close to using the built-in AnyEvent support above,
580     though, so consider that one instead.
581    
582     =head3 Be creative
583    
584     OpenCL exports the L<Async::Interrupt> object it uses in the global
585     variable C<$OpenCL::INTERRUPT>. You can configure it in any way you like.
586    
587     So if you want to feel like a real pro, err, wait, if you feel no risk
588     menas no fun, you can experiment by implementing your own mode of
589     operations.
590    
591 root 1.52 =cut
592    
593     package OpenCL;
594    
595     use common::sense;
596 root 1.62 use Carp ();
597 root 1.55 use Async::Interrupt ();
598    
599     our $POLL_FUNC; # set by XS
600 root 1.52
601     BEGIN {
602 root 1.85 our $VERSION = '1.0';
603 root 1.52
604     require XSLoader;
605     XSLoader::load (__PACKAGE__, $VERSION);
606    
607     @OpenCL::Platform::ISA =
608     @OpenCL::Device::ISA =
609     @OpenCL::Context::ISA =
610     @OpenCL::Queue::ISA =
611     @OpenCL::Memory::ISA =
612     @OpenCL::Sampler::ISA =
613     @OpenCL::Program::ISA =
614     @OpenCL::Kernel::ISA =
615     @OpenCL::Event::ISA = OpenCL::Object::;
616    
617 root 1.71 @OpenCL::SubDevice::ISA = OpenCL::Device::;
618    
619 root 1.52 @OpenCL::Buffer::ISA =
620     @OpenCL::Image::ISA = OpenCL::Memory::;
621    
622     @OpenCL::BufferObj::ISA = OpenCL::Buffer::;
623    
624     @OpenCL::Image2D::ISA =
625     @OpenCL::Image3D::ISA =
626     @OpenCL::Image2DArray::ISA =
627     @OpenCL::Image1D::ISA =
628     @OpenCL::Image1DArray::ISA =
629     @OpenCL::Image1DBuffer::ISA = OpenCL::Image::;
630    
631     @OpenCL::UserEvent::ISA = OpenCL::Event::;
632 root 1.66
633 root 1.67 @OpenCL::MappedBuffer::ISA =
634     @OpenCL::MappedImage::ISA = OpenCL::Mapped::;
635 root 1.52 }
636    
637 root 1.5 =head2 THE OpenCL PACKAGE
638    
639     =over 4
640    
641     =item $int = OpenCL::errno
642    
643 root 1.11 The last error returned by a function - it's only valid after an error occured
644     and before calling another OpenCL function.
645 root 1.5
646 root 1.61 =item $str = OpenCL::err2str [$errval]
647 root 1.5
648 root 1.81 Converts an error value into a human readable string. If no error value is
649 root 1.61 given, then the last error will be used (as returned by OpenCL::errno).
650 root 1.5
651 root 1.81 The latest version of this module knows the error constants
652     listed in L<http://cvs.schmorp.de/OpenCL/errstr.h>.
653    
654 root 1.9 =item $str = OpenCL::enum2str $enum
655 root 1.5
656 root 1.30 Converts most enum values (of parameter names, image format constants,
657 root 1.5 object types, addressing and filter modes, command types etc.) into a
658 root 1.30 human readable string. When confronted with some random integer it can be
659 root 1.5 very helpful to pass it through this function to maybe get some readable
660     string out of it.
661    
662 root 1.81 The latest version of this module knows the enumaration constants
663 root 1.82 listed in L<http://cvs.schmorp.de/OpenCL/enumstr.h>.
664 root 1.81
665 root 1.5 =item @platforms = OpenCL::platforms
666    
667     Returns all available OpenCL::Platform objects.
668    
669     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetPlatformIDs.html>
670    
671 root 1.56 =item $ctx = OpenCL::context_from_type $properties, $type = OpenCL::DEVICE_TYPE_DEFAULT, $callback->($err, $pvt) = $print_stderr
672 root 1.5
673 root 1.56 Tries to create a context from a default device and platform type - never worked for me.
674 root 1.76 Consider using C<< $platform->context_from_type >> instead.
675 root 1.5
676 root 1.71 type: OpenCL::DEVICE_TYPE_DEFAULT, OpenCL::DEVICE_TYPE_CPU, OpenCL::DEVICE_TYPE_GPU,
677     OpenCL::DEVICE_TYPE_ACCELERATOR, OpenCL::DEVICE_TYPE_CUSTOM, OpenCL::DEVICE_TYPE_ALL.
678    
679 root 1.5 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContextFromType.html>
680    
681 root 1.56 =item $ctx = OpenCL::context $properties, \@devices, $callback->($err, $pvt) = $print_stderr)
682    
683 root 1.76 Create a new OpenCL::Context object using the given device object(s).
684     Consider using C<< $platform->context >> instead.
685 root 1.56
686     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContext.html>
687    
688 root 1.5 =item OpenCL::wait_for_events $wait_events...
689    
690     Waits for all events to complete.
691    
692     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clWaitForEvents.html>
693    
694 root 1.55 =item OpenCL::poll
695    
696     Checks if there are any outstanding events (see L<EVENT SYSTEM>) and
697     invokes their callbacks.
698    
699     =item $OpenCL::INTERRUPT
700    
701     The L<Async::Interrupt> object used to signal asynchronous events (see
702     L<EVENT SYSTEM>).
703    
704     =cut
705    
706     our $INTERRUPT = new Async::Interrupt c_cb => [$POLL_FUNC, 0];
707    
708     &_eq_initialise ($INTERRUPT->signal_func);
709    
710     =item $OpenCL::WATCHER
711    
712     The L<AnyEvent> watcher object used to watch for asynchronous events (see
713     L<EVENT SYSTEM>). This variable is C<undef> until L<AnyEvent> has been
714     loaded I<and> initialised (e.g. by calling C<AnyEvent::detect>).
715    
716     =cut
717    
718     our $WATCHER;
719    
720     sub _init_anyevent {
721     $INTERRUPT->block;
722     $WATCHER = AE::io ($INTERRUPT->pipe_fileno, 0, sub { $INTERRUPT->handle });
723     }
724    
725     if (defined $AnyEvent::MODEL) {
726     _init_anyevent;
727     } else {
728     push @AnyEvent::post_detect, \&_init_anyevent;
729     }
730    
731 root 1.5 =back
732    
733 root 1.52 =head2 THE OpenCL::Object CLASS
734    
735     This is the base class for all objects in the OpenCL module. The only
736     method it implements is the C<id> method, which is only useful if you want
737     to interface to OpenCL on the C level.
738    
739     =over 4
740    
741     =item $iv = $obj->id
742    
743     OpenCL objects are represented by pointers or integers on the C level. If
744     you want to interface to an OpenCL object directly on the C level, then
745     you need this value, which is returned by this method. You should use an
746     C<IV> type in your code and cast that to the correct type.
747    
748     =cut
749    
750     sub OpenCL::Object::id {
751 root 1.55 ref $_[0] eq "SCALAR"
752     ? ${ $_[0] }
753     : $_[0][0]
754 root 1.52 }
755    
756     =back
757    
758 root 1.5 =head2 THE OpenCL::Platform CLASS
759    
760     =over 4
761    
762     =item @devices = $platform->devices ($type = OpenCL::DEVICE_TYPE_ALL)
763    
764     Returns a list of matching OpenCL::Device objects.
765    
766 root 1.56 =item $ctx = $platform->context_from_type ($properties, $type = OpenCL::DEVICE_TYPE_DEFAULT, $callback->($err, $pvt) = $print_stderr)
767 root 1.5
768 root 1.22 Tries to create a context. Never worked for me, and you need devices explicitly anyway.
769 root 1.5
770     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContextFromType.html>
771    
772 root 1.56 =item $ctx = $platform->context ($properties, \@devices, $callback->($err, $pvt) = $print_stderr)
773 root 1.11
774     Create a new OpenCL::Context object using the given device object(s)- a
775 root 1.79 OpenCL::CONTEXT_PLATFORM property is supplied automatically.
776 root 1.11
777     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContext.html>
778    
779 root 1.20 =item $packed_value = $platform->info ($name)
780    
781     Calls C<clGetPlatformInfo> and returns the packed, raw value - for
782 root 1.22 strings, this will be the string (possibly including terminating \0), for
783     other values you probably need to use the correct C<unpack>.
784 root 1.20
785 root 1.22 It's best to avoid this method and use one of the following convenience
786     wrappers.
787 root 1.20
788     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetPlatformInfo.html>
789    
790 root 1.50 =item $platform->unload_compiler
791    
792     Attempts to unload the compiler for this platform, for endless
793     profit. Does nothing on OpenCL 1.1.
794    
795     L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clUnloadPlatformCompiler.html>
796    
797 root 1.20 =for gengetinfo begin platform
798    
799     =item $string = $platform->profile
800    
801 root 1.71 Calls C<clGetPlatformInfo> with C<OpenCL::PLATFORM_PROFILE> and returns the result.
802 root 1.20
803     =item $string = $platform->version
804    
805 root 1.71 Calls C<clGetPlatformInfo> with C<OpenCL::PLATFORM_VERSION> and returns the result.
806 root 1.20
807     =item $string = $platform->name
808    
809 root 1.71 Calls C<clGetPlatformInfo> with C<OpenCL::PLATFORM_NAME> and returns the result.
810 root 1.20
811     =item $string = $platform->vendor
812    
813 root 1.71 Calls C<clGetPlatformInfo> with C<OpenCL::PLATFORM_VENDOR> and returns the result.
814 root 1.20
815     =item $string = $platform->extensions
816    
817 root 1.71 Calls C<clGetPlatformInfo> with C<OpenCL::PLATFORM_EXTENSIONS> and returns the result.
818 root 1.21
819 root 1.20 =for gengetinfo end platform
820    
821 root 1.5 =back
822    
823     =head2 THE OpenCL::Device CLASS
824    
825     =over 4
826    
827     =item $packed_value = $device->info ($name)
828    
829     See C<< $platform->info >> for details.
830    
831 root 1.78 type: OpenCL::DEVICE_TYPE_DEFAULT, OpenCL::DEVICE_TYPE_CPU,
832     OpenCL::DEVICE_TYPE_GPU, OpenCL::DEVICE_TYPE_ACCELERATOR,
833     OpenCL::DEVICE_TYPE_CUSTOM, OpenCL::DEVICE_TYPE_ALL.
834    
835     fp_config: OpenCL::FP_DENORM, OpenCL::FP_INF_NAN, OpenCL::FP_ROUND_TO_NEAREST,
836     OpenCL::FP_ROUND_TO_ZERO, OpenCL::FP_ROUND_TO_INF, OpenCL::FP_FMA,
837     OpenCL::FP_SOFT_FLOAT, OpenCL::FP_CORRECTLY_ROUNDED_DIVIDE_SQRT.
838    
839     mem_cache_type: OpenCL::NONE, OpenCL::READ_ONLY_CACHE, OpenCL::READ_WRITE_CACHE.
840    
841     local_mem_type: OpenCL::LOCAL, OpenCL::GLOBAL.
842    
843     exec_capabilities: OpenCL::EXEC_KERNEL, OpenCL::EXEC_NATIVE_KERNEL.
844    
845     command_queue_properties: OpenCL::QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE,
846     OpenCL::QUEUE_PROFILING_ENABLE.
847    
848     partition_properties: OpenCL::DEVICE_PARTITION_EQUALLY,
849     OpenCL::DEVICE_PARTITION_BY_COUNTS, OpenCL::DEVICE_PARTITION_BY_COUNTS_LIST_END,
850     OpenCL::DEVICE_PARTITION_BY_AFFINITY_DOMAIN.
851    
852     affinity_domain: OpenCL::DEVICE_AFFINITY_DOMAIN_NUMA,
853     OpenCL::DEVICE_AFFINITY_DOMAIN_L4_CACHE, OpenCL::DEVICE_AFFINITY_DOMAIN_L3_CACHE,
854     OpenCL::DEVICE_AFFINITY_DOMAIN_L2_CACHE, OpenCL::DEVICE_AFFINITY_DOMAIN_L1_CACHE,
855     OpenCL::DEVICE_AFFINITY_DOMAIN_NEXT_PARTITIONABLE.
856    
857 root 1.5 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetDeviceInfo.html>
858    
859 root 1.71 =item @devices = $device->sub_devices (\@properties)
860    
861     Creates OpencL::SubDevice objects by partitioning an existing device.
862    
863     L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateSubDevices.html>
864    
865 root 1.21 =for gengetinfo begin device
866    
867     =item $device_type = $device->type
868    
869 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_TYPE> and returns the result.
870 root 1.21
871     =item $uint = $device->vendor_id
872    
873 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_VENDOR_ID> and returns the result.
874 root 1.21
875     =item $uint = $device->max_compute_units
876    
877 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_COMPUTE_UNITS> and returns the result.
878 root 1.21
879     =item $uint = $device->max_work_item_dimensions
880    
881 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_WORK_ITEM_DIMENSIONS> and returns the result.
882 root 1.21
883     =item $int = $device->max_work_group_size
884    
885 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_WORK_GROUP_SIZE> and returns the result.
886 root 1.21
887     =item @ints = $device->max_work_item_sizes
888    
889 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_WORK_ITEM_SIZES> and returns the result.
890 root 1.21
891     =item $uint = $device->preferred_vector_width_char
892    
893 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PREFERRED_VECTOR_WIDTH_CHAR> and returns the result.
894 root 1.21
895     =item $uint = $device->preferred_vector_width_short
896    
897 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PREFERRED_VECTOR_WIDTH_SHORT> and returns the result.
898 root 1.21
899     =item $uint = $device->preferred_vector_width_int
900    
901 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PREFERRED_VECTOR_WIDTH_INT> and returns the result.
902 root 1.21
903     =item $uint = $device->preferred_vector_width_long
904    
905 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PREFERRED_VECTOR_WIDTH_LONG> and returns the result.
906 root 1.21
907     =item $uint = $device->preferred_vector_width_float
908    
909 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT> and returns the result.
910 root 1.21
911     =item $uint = $device->preferred_vector_width_double
912    
913 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE> and returns the result.
914 root 1.21
915     =item $uint = $device->max_clock_frequency
916    
917 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_CLOCK_FREQUENCY> and returns the result.
918 root 1.21
919     =item $bitfield = $device->address_bits
920    
921 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_ADDRESS_BITS> and returns the result.
922 root 1.21
923     =item $uint = $device->max_read_image_args
924    
925 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_READ_IMAGE_ARGS> and returns the result.
926 root 1.21
927     =item $uint = $device->max_write_image_args
928    
929 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_WRITE_IMAGE_ARGS> and returns the result.
930 root 1.21
931     =item $ulong = $device->max_mem_alloc_size
932    
933 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_MEM_ALLOC_SIZE> and returns the result.
934 root 1.21
935     =item $int = $device->image2d_max_width
936    
937 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_IMAGE2D_MAX_WIDTH> and returns the result.
938 root 1.21
939     =item $int = $device->image2d_max_height
940    
941 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_IMAGE2D_MAX_HEIGHT> and returns the result.
942 root 1.21
943     =item $int = $device->image3d_max_width
944    
945 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_IMAGE3D_MAX_WIDTH> and returns the result.
946 root 1.21
947     =item $int = $device->image3d_max_height
948    
949 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_IMAGE3D_MAX_HEIGHT> and returns the result.
950 root 1.21
951     =item $int = $device->image3d_max_depth
952    
953 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_IMAGE3D_MAX_DEPTH> and returns the result.
954 root 1.21
955     =item $uint = $device->image_support
956    
957 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_IMAGE_SUPPORT> and returns the result.
958 root 1.21
959     =item $int = $device->max_parameter_size
960    
961 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_PARAMETER_SIZE> and returns the result.
962 root 1.21
963     =item $uint = $device->max_samplers
964    
965 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_SAMPLERS> and returns the result.
966 root 1.21
967     =item $uint = $device->mem_base_addr_align
968    
969 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MEM_BASE_ADDR_ALIGN> and returns the result.
970 root 1.21
971     =item $uint = $device->min_data_type_align_size
972    
973 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MIN_DATA_TYPE_ALIGN_SIZE> and returns the result.
974 root 1.21
975     =item $device_fp_config = $device->single_fp_config
976    
977 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_SINGLE_FP_CONFIG> and returns the result.
978 root 1.21
979     =item $device_mem_cache_type = $device->global_mem_cache_type
980    
981 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_GLOBAL_MEM_CACHE_TYPE> and returns the result.
982 root 1.21
983     =item $uint = $device->global_mem_cacheline_size
984    
985 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_GLOBAL_MEM_CACHELINE_SIZE> and returns the result.
986 root 1.21
987     =item $ulong = $device->global_mem_cache_size
988    
989 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_GLOBAL_MEM_CACHE_SIZE> and returns the result.
990 root 1.21
991     =item $ulong = $device->global_mem_size
992    
993 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_GLOBAL_MEM_SIZE> and returns the result.
994 root 1.21
995     =item $ulong = $device->max_constant_buffer_size
996    
997 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_CONSTANT_BUFFER_SIZE> and returns the result.
998 root 1.21
999     =item $uint = $device->max_constant_args
1000    
1001 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_CONSTANT_ARGS> and returns the result.
1002 root 1.21
1003     =item $device_local_mem_type = $device->local_mem_type
1004    
1005 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_LOCAL_MEM_TYPE> and returns the result.
1006 root 1.21
1007     =item $ulong = $device->local_mem_size
1008    
1009 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_LOCAL_MEM_SIZE> and returns the result.
1010 root 1.21
1011     =item $boolean = $device->error_correction_support
1012    
1013 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_ERROR_CORRECTION_SUPPORT> and returns the result.
1014 root 1.21
1015     =item $int = $device->profiling_timer_resolution
1016    
1017 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PROFILING_TIMER_RESOLUTION> and returns the result.
1018 root 1.21
1019     =item $boolean = $device->endian_little
1020    
1021 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_ENDIAN_LITTLE> and returns the result.
1022 root 1.21
1023     =item $boolean = $device->available
1024    
1025 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_AVAILABLE> and returns the result.
1026 root 1.21
1027     =item $boolean = $device->compiler_available
1028    
1029 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_COMPILER_AVAILABLE> and returns the result.
1030 root 1.21
1031     =item $device_exec_capabilities = $device->execution_capabilities
1032    
1033 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_EXECUTION_CAPABILITIES> and returns the result.
1034 root 1.21
1035     =item $command_queue_properties = $device->properties
1036    
1037 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_QUEUE_PROPERTIES> and returns the result.
1038 root 1.21
1039     =item $ = $device->platform
1040    
1041 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PLATFORM> and returns the result.
1042 root 1.21
1043     =item $string = $device->name
1044    
1045 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_NAME> and returns the result.
1046 root 1.21
1047     =item $string = $device->vendor
1048    
1049 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_VENDOR> and returns the result.
1050 root 1.21
1051     =item $string = $device->driver_version
1052    
1053 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DRIVER_VERSION> and returns the result.
1054 root 1.21
1055     =item $string = $device->profile
1056    
1057 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PROFILE> and returns the result.
1058 root 1.21
1059     =item $string = $device->version
1060    
1061 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_VERSION> and returns the result.
1062 root 1.21
1063     =item $string = $device->extensions
1064    
1065 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_EXTENSIONS> and returns the result.
1066 root 1.21
1067     =item $uint = $device->preferred_vector_width_half
1068    
1069 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PREFERRED_VECTOR_WIDTH_HALF> and returns the result.
1070 root 1.21
1071     =item $uint = $device->native_vector_width_char
1072    
1073 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_NATIVE_VECTOR_WIDTH_CHAR> and returns the result.
1074 root 1.21
1075     =item $uint = $device->native_vector_width_short
1076    
1077 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_NATIVE_VECTOR_WIDTH_SHORT> and returns the result.
1078 root 1.21
1079     =item $uint = $device->native_vector_width_int
1080    
1081 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_NATIVE_VECTOR_WIDTH_INT> and returns the result.
1082 root 1.21
1083     =item $uint = $device->native_vector_width_long
1084    
1085 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_NATIVE_VECTOR_WIDTH_LONG> and returns the result.
1086 root 1.21
1087     =item $uint = $device->native_vector_width_float
1088    
1089 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_NATIVE_VECTOR_WIDTH_FLOAT> and returns the result.
1090 root 1.21
1091     =item $uint = $device->native_vector_width_double
1092    
1093 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE> and returns the result.
1094 root 1.21
1095     =item $uint = $device->native_vector_width_half
1096    
1097 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_NATIVE_VECTOR_WIDTH_HALF> and returns the result.
1098 root 1.21
1099     =item $device_fp_config = $device->double_fp_config
1100    
1101 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_DOUBLE_FP_CONFIG> and returns the result.
1102 root 1.21
1103     =item $device_fp_config = $device->half_fp_config
1104    
1105 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_HALF_FP_CONFIG> and returns the result.
1106 root 1.21
1107     =item $boolean = $device->host_unified_memory
1108    
1109 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_HOST_UNIFIED_MEMORY> and returns the result.
1110 root 1.21
1111     =item $device = $device->parent_device_ext
1112    
1113 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PARENT_DEVICE_EXT> and returns the result.
1114 root 1.21
1115     =item @device_partition_property_exts = $device->partition_types_ext
1116    
1117 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PARTITION_TYPES_EXT> and returns the result.
1118 root 1.21
1119     =item @device_partition_property_exts = $device->affinity_domains_ext
1120    
1121 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_AFFINITY_DOMAINS_EXT> and returns the result.
1122 root 1.21
1123 root 1.45 =item $uint = $device->reference_count_ext
1124 root 1.21
1125 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_REFERENCE_COUNT_EXT> and returns the result.
1126 root 1.21
1127     =item @device_partition_property_exts = $device->partition_style_ext
1128    
1129 root 1.71 Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PARTITION_STYLE_EXT> and returns the result.
1130 root 1.21
1131     =for gengetinfo end device
1132    
1133 root 1.5 =back
1134    
1135     =head2 THE OpenCL::Context CLASS
1136    
1137 root 1.71 An OpenCL::Context is basically a container, or manager, for a number of
1138     devices of a platform. It is used to create all sorts of secondary objects
1139     such as buffers, queues, programs and so on.
1140    
1141     All context creation functions and methods take a list of properties
1142     (type-value pairs). All property values can be specified as integers -
1143     some additionally support other types:
1144    
1145     =over 4
1146    
1147     =item OpenCL::CONTEXT_PLATFORM
1148    
1149     Also accepts OpenCL::Platform objects.
1150    
1151     =item OpenCL::GLX_DISPLAY_KHR
1152    
1153     Also accepts C<undef>, in which case a deep and troubling hack is engaged
1154     to find the current glx display (see L<GLX SUPPORT>).
1155    
1156     =item OpenCL::GL_CONTEXT_KHR
1157    
1158     Also accepts C<undef>, in which case a deep and troubling hack is engaged
1159     to find the current glx context (see L<GLX SUPPORT>).
1160    
1161     =back
1162    
1163 root 1.5 =over 4
1164    
1165 root 1.51 =item $prog = $ctx->build_program ($program, $options = "")
1166    
1167     This convenience function tries to build the program on all devices in
1168     the context. If the build fails, then the function will C<croak> with the
1169     build log. Otherwise ti returns the program object.
1170    
1171     The C<$program> can either be a C<OpenCL::Program> object or a string
1172     containing the program. In the latter case, a program objetc will be
1173     created automatically.
1174    
1175     =cut
1176    
1177     sub OpenCL::Context::build_program {
1178     my ($self, $prog, $options) = @_;
1179    
1180     $prog = $self->program_with_source ($prog)
1181     unless ref $prog;
1182    
1183 root 1.61 eval { $prog->build (undef, $options); 1 }
1184     or errno == BUILD_PROGRAM_FAILURE
1185 root 1.63 or errno == INVALID_BINARY # workaround nvidia bug
1186 root 1.61 or Carp::croak "OpenCL::Context->build_program: " . err2str;
1187    
1188     # we check status for all devices
1189 root 1.51 for my $dev ($self->devices) {
1190 root 1.61 $prog->build_status ($dev) == BUILD_SUCCESS
1191 root 1.62 or Carp::croak "Building OpenCL program for device '" . $dev->name . "' failed:\n"
1192     . $prog->build_log ($dev);
1193 root 1.51 }
1194    
1195     $prog
1196     }
1197    
1198 root 1.9 =item $queue = $ctx->queue ($device, $properties)
1199 root 1.5
1200 root 1.9 Create a new OpenCL::Queue object from the context and the given device.
1201 root 1.5
1202     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateCommandQueue.html>
1203    
1204 root 1.45 Example: create an out-of-order queue.
1205    
1206     $queue = $ctx->queue ($device, OpenCL::QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE);
1207    
1208 root 1.5 =item $ev = $ctx->user_event
1209    
1210     Creates a new OpenCL::UserEvent object.
1211    
1212     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateUserEvent.html>
1213    
1214     =item $buf = $ctx->buffer ($flags, $len)
1215    
1216 root 1.27 Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object with the
1217     given flags and octet-size.
1218 root 1.5
1219 root 1.71 flags: OpenCL::MEM_READ_WRITE, OpenCL::MEM_WRITE_ONLY, OpenCL::MEM_READ_ONLY,
1220     OpenCL::MEM_USE_HOST_PTR, OpenCL::MEM_ALLOC_HOST_PTR, OpenCL::MEM_COPY_HOST_PTR,
1221     OpenCL::MEM_HOST_WRITE_ONLY, OpenCL::MEM_HOST_READ_ONLY, OpenCL::MEM_HOST_NO_ACCESS.
1222    
1223 root 1.5 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateBuffer.html>
1224    
1225     =item $buf = $ctx->buffer_sv ($flags, $data)
1226    
1227 root 1.27 Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object and
1228     initialise it with the given data values.
1229 root 1.5
1230 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)
1231 root 1.49
1232     Creates a new OpenCL::Image object and optionally initialises it with
1233     the given data values.
1234    
1235 root 1.71 channel_order: OpenCL::R, OpenCL::A, OpenCL::RG, OpenCL::RA, OpenCL::RGB,
1236     OpenCL::RGBA, OpenCL::BGRA, OpenCL::ARGB, OpenCL::INTENSITY, OpenCL::LUMINANCE,
1237     OpenCL::Rx, OpenCL::RGx, OpenCL::RGBx.
1238    
1239     channel_type: OpenCL::SNORM_INT8, OpenCL::SNORM_INT16, OpenCL::UNORM_INT8,
1240     OpenCL::UNORM_INT16, OpenCL::UNORM_SHORT_565, OpenCL::UNORM_SHORT_555,
1241     OpenCL::UNORM_INT_101010, OpenCL::SIGNED_INT8, OpenCL::SIGNED_INT16,
1242     OpenCL::SIGNED_INT32, OpenCL::UNSIGNED_INT8, OpenCL::UNSIGNED_INT16,
1243     OpenCL::UNSIGNED_INT32, OpenCL::HALF_FLOAT, OpenCL::FLOAT.
1244    
1245     type: OpenCL::MEM_OBJECT_BUFFER, OpenCL::MEM_OBJECT_IMAGE2D,
1246     OpenCL::MEM_OBJECT_IMAGE3D, OpenCL::MEM_OBJECT_IMAGE2D_ARRAY,
1247     OpenCL::MEM_OBJECT_IMAGE1D, OpenCL::MEM_OBJECT_IMAGE1D_ARRAY,
1248     OpenCL::MEM_OBJECT_IMAGE1D_BUFFER.
1249    
1250 root 1.49 L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateImage.html>
1251    
1252 root 1.18 =item $img = $ctx->image2d ($flags, $channel_order, $channel_type, $width, $height, $row_pitch = 0, $data = undef)
1253 root 1.5
1254 root 1.27 Creates a new OpenCL::Image2D object and optionally initialises it with
1255     the given data values.
1256 root 1.5
1257     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateImage2D.html>
1258    
1259 root 1.18 =item $img = $ctx->image3d ($flags, $channel_order, $channel_type, $width, $height, $depth, $row_pitch = 0, $slice_pitch = 0, $data = undef)
1260 root 1.5
1261 root 1.27 Creates a new OpenCL::Image3D object and optionally initialises it with
1262     the given data values.
1263 root 1.5
1264     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateImage3D.html>
1265    
1266 root 1.33 =item $buffer = $ctx->gl_buffer ($flags, $bufobj)
1267    
1268     Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object that refers to the given
1269     OpenGL buffer object.
1270    
1271 root 1.71 flags: OpenCL::MEM_READ_WRITE, OpenCL::MEM_READ_ONLY, OpenCL::MEM_WRITE_ONLY.
1272    
1273 root 1.33 http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateFromGLBuffer.html
1274    
1275 root 1.47 =item $img = $ctx->gl_texture ($flags, $target, $miplevel, $texture)
1276    
1277     Creates a new OpenCL::Image object that refers to the given OpenGL
1278     texture object or buffer.
1279    
1280 root 1.71 target: GL_TEXTURE_1D, GL_TEXTURE_1D_ARRAY, GL_TEXTURE_BUFFER,
1281     GL_TEXTURE_2D, GL_TEXTURE_2D_ARRAY, GL_TEXTURE_3D,
1282     GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
1283     GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
1284     GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
1285     GL_TEXTURE_RECTANGLE/GL_TEXTURE_RECTANGLE_ARB.
1286    
1287 root 1.47 http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateFromGLTexture.html
1288    
1289     =item $img = $ctx->gl_texture2d ($flags, $target, $miplevel, $texture)
1290 root 1.33
1291     Creates a new OpenCL::Image2D object that refers to the given OpenGL
1292     2D texture object.
1293    
1294     http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateFromGLTexture2D.html
1295    
1296 root 1.47 =item $img = $ctx->gl_texture3d ($flags, $target, $miplevel, $texture)
1297 root 1.33
1298     Creates a new OpenCL::Image3D object that refers to the given OpenGL
1299     3D texture object.
1300    
1301     http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateFromGLTexture3D.html
1302    
1303     =item $ctx->gl_renderbuffer ($flags, $renderbuffer)
1304    
1305     Creates a new OpenCL::Image2D object that refers to the given OpenGL
1306     render buffer.
1307    
1308     http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateFromGLRenderbuffer.html
1309    
1310 root 1.5 =item @formats = $ctx->supported_image_formats ($flags, $image_type)
1311    
1312     Returns a list of matching image formats - each format is an arrayref with
1313     two values, $channel_order and $channel_type, in it.
1314    
1315     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetSupportedImageFormats.html>
1316    
1317     =item $sampler = $ctx->sampler ($normalized_coords, $addressing_mode, $filter_mode)
1318    
1319     Creates a new OpenCL::Sampler object.
1320    
1321 root 1.71 addressing_mode: OpenCL::ADDRESS_NONE, OpenCL::ADDRESS_CLAMP_TO_EDGE,
1322     OpenCL::ADDRESS_CLAMP, OpenCL::ADDRESS_REPEAT, OpenCL::ADDRESS_MIRRORED_REPEAT.
1323    
1324     filter_mode: OpenCL::FILTER_NEAREST, OpenCL::FILTER_LINEAR.
1325    
1326 root 1.5 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateSampler.html>
1327    
1328     =item $program = $ctx->program_with_source ($string)
1329    
1330     Creates a new OpenCL::Program object from the given source code.
1331    
1332     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateProgramWithSource.html>
1333    
1334 root 1.69 =item ($program, \@status) = $ctx->program_with_binary (\@devices, \@binaries)
1335    
1336     Creates a new OpenCL::Program object from the given binaries.
1337    
1338     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateProgramWithBinary.html>
1339    
1340     Example: clone an existing program object that contains a successfully
1341     compiled program, no matter how useless this is.
1342    
1343     my $clone = $ctx->program_with_binary ([$prog->devices], [$prog->binaries]);
1344    
1345 root 1.71 =item $program = $ctx->program_with_built_in_kernels (\@devices, $kernel_names)
1346    
1347     Creates a new OpenCL::Program object from the given built-in kernel names.
1348    
1349     L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateProgramWithBuiltInKernels.html>
1350    
1351 root 1.75 =item $program = $ctx->link_program (\@devices, $options, \@programs, $cb->($program) = undef)
1352    
1353     Links all (already compiled) program objects specified in C<@programs>
1354     together and returns a new OpenCL::Program object with the result.
1355    
1356     L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clLinkProgram.html>
1357    
1358 root 1.20 =item $packed_value = $ctx->info ($name)
1359    
1360     See C<< $platform->info >> for details.
1361    
1362     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetContextInfo.html>
1363    
1364     =for gengetinfo begin context
1365    
1366 root 1.21 =item $uint = $context->reference_count
1367    
1368 root 1.71 Calls C<clGetContextInfo> with C<OpenCL::CONTEXT_REFERENCE_COUNT> and returns the result.
1369 root 1.21
1370     =item @devices = $context->devices
1371    
1372 root 1.71 Calls C<clGetContextInfo> with C<OpenCL::CONTEXT_DEVICES> and returns the result.
1373 root 1.21
1374     =item @property_ints = $context->properties
1375    
1376 root 1.71 Calls C<clGetContextInfo> with C<OpenCL::CONTEXT_PROPERTIES> and returns the result.
1377 root 1.21
1378     =item $uint = $context->num_devices
1379    
1380 root 1.71 Calls C<clGetContextInfo> with C<OpenCL::CONTEXT_NUM_DEVICES> and returns the result.
1381 root 1.21
1382 root 1.20 =for gengetinfo end context
1383    
1384 root 1.5 =back
1385    
1386     =head2 THE OpenCL::Queue CLASS
1387    
1388     An OpenCL::Queue represents an execution queue for OpenCL. You execute
1389 root 1.59 requests by calling their respective method and waiting for it to complete
1390     in some way.
1391 root 1.5
1392 root 1.59 Most methods that enqueue some request return an event object that can
1393     be used to wait for completion (optionally using a callback), unless
1394     the method is called in void context, in which case no event object is
1395     created.
1396 root 1.5
1397     They also allow you to specify any number of other event objects that this
1398     request has to wait for before it starts executing, by simply passing the
1399 root 1.45 event objects as extra parameters to the enqueue methods. To simplify
1400     program design, this module ignores any C<undef> values in the list of
1401     events. This makes it possible to code operations such as this, without
1402     having to put a valid event object into C<$event> first:
1403    
1404 root 1.59 $event = $queue->xxx (..., $event);
1405 root 1.5
1406     Queues execute in-order by default, without any parallelism, so in most
1407 root 1.6 cases (i.e. you use only one queue) it's not necessary to wait for or
1408 root 1.45 create event objects, althoguh an our of order queue is often a bit
1409     faster.
1410 root 1.5
1411     =over 4
1412    
1413 root 1.59 =item $ev = $queue->read_buffer ($buffer, $blocking, $offset, $len, $data, $wait_events...)
1414 root 1.5
1415     Reads data from buffer into the given string.
1416    
1417     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadBuffer.html>
1418    
1419 root 1.59 =item $ev = $queue->write_buffer ($buffer, $blocking, $offset, $data, $wait_events...)
1420 root 1.5
1421     Writes data to buffer from the given string.
1422    
1423     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteBuffer.html>
1424    
1425 root 1.59 =item $ev = $queue->copy_buffer ($src, $dst, $src_offset, $dst_offset, $len, $wait_events...)
1426 root 1.5
1427     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBuffer.html>
1428    
1429 root 1.83 $eue->read_buffer_rect ($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...)
1430 root 1.25
1431     http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadBufferRect.html
1432    
1433 root 1.83 =item $ev = $queue->write_buffer_rect ($buf, $blocking, $buf_y, $host_x, $host_z, $height, $buf_row_pitch, $host_row_pitch, $data, $wait_events...)
1434 root 1.25
1435     http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteBufferRect.html
1436    
1437 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...)
1438    
1439     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferToImage.html>
1440    
1441 root 1.59 =item $ev = $queue->read_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...)
1442 root 1.5
1443 root 1.65 C<$row_pitch> (and C<$slice_pitch>) can be C<0>, in which case the OpenCL
1444     module uses the image width (and height) to supply default values.
1445 root 1.27
1446 root 1.5 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadImage.html>
1447    
1448 root 1.59 =item $ev = $queue->write_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...)
1449 root 1.5
1450 root 1.65 C<$row_pitch> (and C<$slice_pitch>) can be C<0>, in which case the OpenCL
1451     module uses the image width (and height) to supply default values.
1452 root 1.5 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteImage.html>
1453    
1454 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...)
1455 root 1.5
1456     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyImage.html>
1457    
1458 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...)
1459 root 1.5
1460     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyImageToBuffer.html>
1461    
1462 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...)
1463 root 1.27
1464     Yeah.
1465    
1466     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferToImage.html>.
1467    
1468 root 1.59 =item $ev = $queue->fill_buffer ($mem, $pattern, $offset, $size, ...)
1469 root 1.52
1470     Fills the given buffer object with repeated applications of C<$pattern>,
1471     starting at C<$offset> for C<$size> octets.
1472    
1473     L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueFillBuffer.html>
1474    
1475 root 1.59 =item $ev = $queue->fill_image ($img, $r, $g, $b, $a, $x, $y, $z, $width, $height, $depth, ...)
1476 root 1.52
1477     Fills the given image area with the given rgba colour components. The
1478     components are normally floating point values between C<0> and C<1>,
1479     except when the image channel data type is a signe dor unsigned
1480     unnormalised format, in which case the range is determined by the format.
1481    
1482     L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueFillImage.html>
1483    
1484 root 1.59 =item $ev = $queue->task ($kernel, $wait_events...)
1485 root 1.5
1486     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueTask.html>
1487    
1488 root 1.59 =item $ev = $queue->nd_range_kernel ($kernel, \@global_work_offset, \@global_work_size, \@local_work_size, $wait_events...)
1489 root 1.5
1490     Enqueues a kernel execution.
1491    
1492 root 1.57 \@global_work_size must be specified as a reference to an array of
1493 root 1.5 integers specifying the work sizes (element counts).
1494    
1495 root 1.57 \@global_work_offset must be either C<undef> (in which case all offsets
1496 root 1.5 are C<0>), or a reference to an array of work offsets, with the same number
1497 root 1.57 of elements as \@global_work_size.
1498 root 1.5
1499 root 1.57 \@local_work_size must be either C<undef> (in which case the
1500 root 1.5 implementation is supposed to choose good local work sizes), or a
1501     reference to an array of local work sizes, with the same number of
1502 root 1.57 elements as \@global_work_size.
1503 root 1.5
1504     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueNDRangeKernel.html>
1505    
1506 root 1.71 =item $ev = $queue->migrate_mem_objects (\@mem_objects, $flags, $wait_events...)
1507    
1508     Migrates a number of OpenCL::Memory objects to or from the device.
1509    
1510     flags: OpenCL::MIGRATE_MEM_OBJECT_HOST, OpenCL::MIGRATE_MEM_OBJECT_CONTENT_UNDEFINED
1511    
1512     L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueMigrateMemObjects.html>
1513    
1514 root 1.59 =item $ev = $queue->acquire_gl_objects ([object, ...], $wait_events...)
1515 root 1.35
1516     Enqueues a list (an array-ref of OpenCL::Memory objects) to be acquired
1517     for subsequent OpenCL usage.
1518    
1519     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueAcquireGLObjects.html>
1520    
1521 root 1.59 =item $ev = $queue->release_gl_objects ([object, ...], $wait_events...)
1522 root 1.35
1523     Enqueues a list (an array-ref of OpenCL::Memory objects) to be released
1524     for subsequent OpenGL usage.
1525    
1526     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReleaseGLObjects.html>
1527    
1528 root 1.59 =item $ev = $queue->wait_for_events ($wait_events...)
1529 root 1.5
1530     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWaitForEvents.html>
1531    
1532 root 1.59 =item $ev = $queue->marker ($wait_events...)
1533 root 1.46
1534     L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueMarkerWithWaitList.html>
1535    
1536 root 1.59 =item $ev = $queue->barrier ($wait_events...)
1537 root 1.5
1538 root 1.46 L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueBarrierWithWaitList.html>
1539 root 1.5
1540     =item $queue->flush
1541    
1542     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clFlush.html>
1543    
1544     =item $queue->finish
1545    
1546     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clFinish.html>
1547    
1548 root 1.21 =item $packed_value = $queue->info ($name)
1549    
1550     See C<< $platform->info >> for details.
1551    
1552     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetCommandQueueInfo.html>
1553    
1554     =for gengetinfo begin command_queue
1555    
1556     =item $ctx = $command_queue->context
1557    
1558 root 1.71 Calls C<clGetCommandQueueInfo> with C<OpenCL::QUEUE_CONTEXT> and returns the result.
1559 root 1.21
1560     =item $device = $command_queue->device
1561    
1562 root 1.71 Calls C<clGetCommandQueueInfo> with C<OpenCL::QUEUE_DEVICE> and returns the result.
1563 root 1.21
1564     =item $uint = $command_queue->reference_count
1565    
1566 root 1.71 Calls C<clGetCommandQueueInfo> with C<OpenCL::QUEUE_REFERENCE_COUNT> and returns the result.
1567 root 1.21
1568     =item $command_queue_properties = $command_queue->properties
1569    
1570 root 1.71 Calls C<clGetCommandQueueInfo> with C<OpenCL::QUEUE_PROPERTIES> and returns the result.
1571 root 1.21
1572     =for gengetinfo end command_queue
1573    
1574 root 1.5 =back
1575    
1576 root 1.66 =head3 MEMORY MAPPED BUFFERS
1577    
1578     OpenCL allows you to map buffers and images to host memory (read: perl
1579     scalars). This is done much like reading or copying a buffer, by enqueuing
1580     a map or unmap operation on the command queue.
1581    
1582 root 1.69 The map operations return an C<OpenCL::Mapped> object - see L<THE
1583 root 1.66 OpenCL::Mapped CLASS> section for details on what to do with these
1584     objects.
1585    
1586     The object will be unmapped automatically when the mapped object is
1587     destroyed (you can use a barrier to make sure the unmap has finished,
1588     before using the buffer in a kernel), but you can also enqueue an unmap
1589     operation manually.
1590    
1591     =over 4
1592    
1593 root 1.69 =item $mapped_buffer = $queue->map_buffer ($buf, $blocking=1, $map_flags=OpenCL::MAP_READ|OpenCL::MAP_WRITE, $offset=0, $size=undef, $wait_events...)
1594 root 1.66
1595 root 1.69 Maps the given buffer into host memory and returns an
1596     C<OpenCL::MappedBuffer> object. If C<$size> is specified as undef, then
1597     the map will extend to the end of the buffer.
1598 root 1.66
1599 root 1.71 map_flags: OpenCL::MAP_READ, OpenCL::MAP_WRITE, OpenCL::MAP_WRITE_INVALIDATE_REGION.
1600    
1601 root 1.66 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueMapBuffer.html>
1602    
1603 root 1.69 Example: map the buffer $buf fully and replace the first 4 bytes by "abcd", then unmap.
1604    
1605     {
1606     my $mapped = $queue->map_buffer ($buf, 1, OpenCL::MAP_WRITE);
1607     substr $$mapped, 0, 4, "abcd";
1608     } # asynchronously unmap because $mapped is destroyed
1609 root 1.66
1610 root 1.69 =item $mapped_image = $queue->map_image ($img, $blocking=1, $map_flags=OpenCL::MAP_READ|OpenCL::MAP_WRITE, $x=0, $y=0, $z=0, $width=undef, $height=undef, $depth=undef, $wait_events...)
1611    
1612     Maps the given image area into host memory and return an
1613     C<OpenCL::MappedImage> object.
1614    
1615     If any of C<$width>, C<$height> and/or C<$depth> are C<undef> then they
1616     will be replaced by the maximum possible value.
1617 root 1.66
1618     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueMapImage.html>
1619    
1620 root 1.69 Example: map an image (with OpenCL::UNSIGNED_INT8 channel type) and set
1621     the first channel of the leftmost column to 5, then explicitly unmap
1622     it. You are not necessarily meant to do it this way, this example just
1623     shows you the accessors to use :)
1624    
1625     my $mapped = $queue->map_image ($image, 1, OpenCL::MAP_WRITE);
1626    
1627 root 1.84 $mapped->write ($_ * $mapped->row_pitch, pack "C", 5)
1628     for 0 .. $mapped->height - 1;
1629 root 1.69
1630     $mapped->unmap;.
1631     $mapped->wait; # only needed for out of order queues normally
1632    
1633 root 1.66 =item $ev = $queue->unmap ($mapped, $wait_events...)
1634    
1635     Unmaps the data from host memory. You must not call any methods that
1636     modify the data, or modify the data scalar directly, after calling this
1637     method.
1638    
1639     The mapped event object will always be passed as part of the
1640     $wait_events. The mapped event object will be replaced by the new event
1641     object that this request creates.
1642    
1643     =back
1644    
1645 root 1.5 =head2 THE OpenCL::Memory CLASS
1646    
1647     This the superclass of all memory objects - OpenCL::Buffer, OpenCL::Image,
1648 root 1.21 OpenCL::Image2D and OpenCL::Image3D.
1649 root 1.5
1650     =over 4
1651    
1652     =item $packed_value = $memory->info ($name)
1653    
1654     See C<< $platform->info >> for details.
1655    
1656     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetMemObjectInfo.html>
1657    
1658 root 1.83 =item $memory->destructor_callback ($cb->())
1659    
1660     Sets a callback that will be invoked after the memory object is destructed.
1661    
1662     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clSetMemObjectDestructorCallback.html>
1663    
1664 root 1.21 =for gengetinfo begin mem
1665    
1666     =item $mem_object_type = $mem->type
1667    
1668 root 1.71 Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_TYPE> and returns the result.
1669 root 1.21
1670     =item $mem_flags = $mem->flags
1671    
1672 root 1.71 Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_FLAGS> and returns the result.
1673 root 1.21
1674     =item $int = $mem->size
1675    
1676 root 1.71 Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_SIZE> and returns the result.
1677 root 1.21
1678     =item $ptr_value = $mem->host_ptr
1679    
1680 root 1.71 Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_HOST_PTR> and returns the result.
1681 root 1.21
1682     =item $uint = $mem->map_count
1683    
1684 root 1.71 Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_MAP_COUNT> and returns the result.
1685 root 1.21
1686     =item $uint = $mem->reference_count
1687    
1688 root 1.71 Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_REFERENCE_COUNT> and returns the result.
1689 root 1.21
1690     =item $ctx = $mem->context
1691    
1692 root 1.71 Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_CONTEXT> and returns the result.
1693 root 1.21
1694     =item $mem = $mem->associated_memobject
1695    
1696 root 1.71 Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_ASSOCIATED_MEMOBJECT> and returns the result.
1697 root 1.21
1698     =item $int = $mem->offset
1699    
1700 root 1.71 Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_OFFSET> and returns the result.
1701 root 1.21
1702     =for gengetinfo end mem
1703    
1704 root 1.34 =item ($type, $name) = $mem->gl_object_info
1705    
1706     Returns the OpenGL object type (e.g. OpenCL::GL_OBJECT_TEXTURE2D) and the
1707     object "name" (e.g. the texture name) used to create this memory object.
1708    
1709     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetGLObjectInfo.html>
1710    
1711 root 1.5 =back
1712    
1713 root 1.27 =head2 THE OpenCL::Buffer CLASS
1714    
1715     This is a subclass of OpenCL::Memory, and the superclass of
1716     OpenCL::BufferObj. Its purpose is simply to distinguish between buffers
1717     and sub-buffers.
1718    
1719     =head2 THE OpenCL::BufferObj CLASS
1720    
1721     This is a subclass of OpenCL::Buffer and thus OpenCL::Memory. It exists
1722     because one cna create sub buffers of OpenLC::BufferObj objects, but not
1723     sub buffers from these sub buffers.
1724    
1725     =over 4
1726    
1727     =item $subbuf = $buf_obj->sub_buffer_region ($flags, $origin, $size)
1728    
1729     Creates an OpenCL::Buffer objects from this buffer and returns it. The
1730 root 1.79 C<buffer_create_type> is assumed to be C<OpenCL::BUFFER_CREATE_TYPE_REGION>.
1731 root 1.27
1732     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateSubBuffer.html>
1733    
1734     =back
1735    
1736 root 1.20 =head2 THE OpenCL::Image CLASS
1737    
1738 root 1.47 This is the superclass of all image objects - OpenCL::Image1D,
1739     OpenCL::Image1DArray, OpenCL::Image1DBuffer, OpenCL::Image2D,
1740     OpenCL::Image2DArray and OpenCL::Image3D.
1741 root 1.20
1742     =over 4
1743    
1744 root 1.53 =item $packed_value = $image->image_info ($name)
1745 root 1.20
1746     See C<< $platform->info >> for details.
1747    
1748     The reason this method is not called C<info> is that there already is an
1749     C<< ->info >> method inherited from C<OpenCL::Memory>.
1750    
1751     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetImageInfo.html>
1752    
1753 root 1.53 =item ($channel_order, $channel_data_type) = $image->format
1754    
1755     Returns the channel order and type used to create the image by calling
1756 root 1.79 C<clGetImageInfo> with C<OpenCL::IMAGE_FORMAT>.
1757 root 1.53
1758 root 1.21 =for gengetinfo begin image
1759    
1760     =item $int = $image->element_size
1761    
1762 root 1.71 Calls C<clGetImageInfo> with C<OpenCL::IMAGE_ELEMENT_SIZE> and returns the result.
1763 root 1.21
1764     =item $int = $image->row_pitch
1765    
1766 root 1.71 Calls C<clGetImageInfo> with C<OpenCL::IMAGE_ROW_PITCH> and returns the result.
1767 root 1.21
1768     =item $int = $image->slice_pitch
1769    
1770 root 1.71 Calls C<clGetImageInfo> with C<OpenCL::IMAGE_SLICE_PITCH> and returns the result.
1771 root 1.21
1772     =item $int = $image->width
1773    
1774 root 1.71 Calls C<clGetImageInfo> with C<OpenCL::IMAGE_WIDTH> and returns the result.
1775 root 1.21
1776     =item $int = $image->height
1777    
1778 root 1.71 Calls C<clGetImageInfo> with C<OpenCL::IMAGE_HEIGHT> and returns the result.
1779 root 1.21
1780     =item $int = $image->depth
1781    
1782 root 1.71 Calls C<clGetImageInfo> with C<OpenCL::IMAGE_DEPTH> and returns the result.
1783 root 1.21
1784     =for gengetinfo end image
1785    
1786 root 1.34 =for gengetinfo begin gl_texture
1787    
1788     =item $GLenum = $gl_texture->target
1789    
1790 root 1.71 Calls C<clGetGLTextureInfo> with C<OpenCL::GL_TEXTURE_TARGET> and returns the result.
1791 root 1.34
1792     =item $GLint = $gl_texture->gl_mipmap_level
1793    
1794 root 1.71 Calls C<clGetGLTextureInfo> with C<OpenCL::GL_MIPMAP_LEVEL> and returns the result.
1795 root 1.34
1796     =for gengetinfo end gl_texture
1797    
1798 root 1.20 =back
1799    
1800 root 1.5 =head2 THE OpenCL::Sampler CLASS
1801    
1802     =over 4
1803    
1804     =item $packed_value = $sampler->info ($name)
1805    
1806     See C<< $platform->info >> for details.
1807    
1808     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetSamplerInfo.html>
1809    
1810 root 1.21 =for gengetinfo begin sampler
1811    
1812     =item $uint = $sampler->reference_count
1813    
1814 root 1.71 Calls C<clGetSamplerInfo> with C<OpenCL::SAMPLER_REFERENCE_COUNT> and returns the result.
1815 root 1.21
1816     =item $ctx = $sampler->context
1817    
1818 root 1.71 Calls C<clGetSamplerInfo> with C<OpenCL::SAMPLER_CONTEXT> and returns the result.
1819 root 1.21
1820     =item $addressing_mode = $sampler->normalized_coords
1821    
1822 root 1.71 Calls C<clGetSamplerInfo> with C<OpenCL::SAMPLER_NORMALIZED_COORDS> and returns the result.
1823 root 1.21
1824     =item $filter_mode = $sampler->addressing_mode
1825    
1826 root 1.71 Calls C<clGetSamplerInfo> with C<OpenCL::SAMPLER_ADDRESSING_MODE> and returns the result.
1827 root 1.21
1828     =item $boolean = $sampler->filter_mode
1829    
1830 root 1.71 Calls C<clGetSamplerInfo> with C<OpenCL::SAMPLER_FILTER_MODE> and returns the result.
1831 root 1.21
1832     =for gengetinfo end sampler
1833    
1834 root 1.5 =back
1835    
1836     =head2 THE OpenCL::Program CLASS
1837    
1838     =over 4
1839    
1840 root 1.55 =item $program->build (\@devices = undef, $options = "", $cb->($program) = undef)
1841 root 1.5
1842 root 1.51 Tries to build the program with the given options. See also the
1843     C<$ctx->build> convenience function.
1844 root 1.5
1845 root 1.55 If a callback is specified, then it will be called when compilation is
1846     finished. Note that many OpenCL implementations block your program while
1847     compiling whether you use a callback or not. See C<build_async> if you
1848     want to make sure the build is done in the background.
1849    
1850 root 1.63 Note that some OpenCL implementations act up badly, and don't call the
1851 root 1.55 callback in some error cases (but call it in others). This implementation
1852     assumes the callback will always be called, and leaks memory if this is
1853     not so. So best make sure you don't pass in invalid values.
1854    
1855 root 1.63 Some implementations fail with C<OpenCL::INVALID_BINARY> when the
1856     compilation state is successful but some later stage fails.
1857    
1858 root 1.71 options: C<-D name>, C<-D name=definition>, C<-I dir>,
1859     C<-cl-single-precision-constant>, C<-cl-denorms-are-zero>,
1860     C<-cl-fp32-correctly-rounded-divide-sqrt>, C<-cl-opt-disable>,
1861     C<-cl-mad-enable>, C<-cl-no-signed-zeros>, C<-cl-unsafe-math-optimizations>,
1862     C<-cl-finite-math-only>, C<-cl-fast-relaxed-math>,
1863     C<-w>, C<-Werror>, C<-cl-std=CL1.1/CL1.2>, C<-cl-kernel-arg-info>,
1864     C<-create-library>, C<-enable-link-options>.
1865    
1866 root 1.75 build_status: OpenCL::BUILD_SUCCESS, OpenCL::BUILD_NONE,
1867     OpenCL::BUILD_ERROR, OpenCL::BUILD_IN_PROGRESS.
1868    
1869 root 1.5 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clBuildProgram.html>
1870    
1871 root 1.55 =item $program->build_async (\@devices = undef, $options = "", $cb->($program) = undef)
1872    
1873     Similar to C<< ->build >>, except it starts a thread, and never fails (you
1874     need to check the compilation status form the callback, or by polling).
1875    
1876 root 1.75 =item $program->compile (\@devices = undef, $options = "", \%headers = undef, $cb->($program) = undef)
1877    
1878     Compiles the given program for the given devices (or all devices if
1879     undef). If C<$headers> is given, it must be a hashref with include name =>
1880     OpenCL::Program pairs.
1881    
1882     L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCompileProgram.html>
1883 root 1.72
1884 root 1.5 =item $packed_value = $program->build_info ($device, $name)
1885    
1886     Similar to C<< $platform->info >>, but returns build info for a previous
1887     build attempt for the given device.
1888    
1889 root 1.78 binary_type: OpenCL::PROGRAM_BINARY_TYPE_NONE,
1890     OpenCL::PROGRAM_BINARY_TYPE_COMPILED_OBJECT,
1891     OpenCL::PROGRAM_BINARY_TYPE_LIBRARY,
1892     OpenCL::PROGRAM_BINARY_TYPE_EXECUTABLE.
1893    
1894 root 1.5 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetBuildInfo.html>
1895    
1896     =item $kernel = $program->kernel ($function_name)
1897    
1898     Creates an OpenCL::Kernel object out of the named C<__kernel> function in
1899     the program.
1900    
1901     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateKernel.html>
1902    
1903 root 1.50 =item @kernels = $program->kernels_in_program
1904    
1905     Returns all kernels successfully compiled for all devices in program.
1906    
1907     http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateKernelsInProgram.html
1908    
1909 root 1.21 =for gengetinfo begin program_build
1910    
1911     =item $build_status = $program->build_status ($device)
1912    
1913 root 1.71 Calls C<clGetProgramBuildInfo> with C<OpenCL::PROGRAM_BUILD_STATUS> and returns the result.
1914    
1915 root 1.21 =item $string = $program->build_options ($device)
1916    
1917 root 1.71 Calls C<clGetProgramBuildInfo> with C<OpenCL::PROGRAM_BUILD_OPTIONS> and returns the result.
1918 root 1.21
1919     =item $string = $program->build_log ($device)
1920    
1921 root 1.71 Calls C<clGetProgramBuildInfo> with C<OpenCL::PROGRAM_BUILD_LOG> and returns the result.
1922 root 1.21
1923 root 1.79 =item $binary_type = $program->binary_type ($device)
1924    
1925     Calls C<clGetProgramBuildInfo> with C<OpenCL::PROGRAM_BINARY_TYPE> and returns the result.
1926    
1927 root 1.21 =for gengetinfo end program_build
1928    
1929     =item $packed_value = $program->info ($name)
1930    
1931     See C<< $platform->info >> for details.
1932    
1933     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetProgramInfo.html>
1934    
1935     =for gengetinfo begin program
1936    
1937     =item $uint = $program->reference_count
1938    
1939 root 1.71 Calls C<clGetProgramInfo> with C<OpenCL::PROGRAM_REFERENCE_COUNT> and returns the result.
1940 root 1.21
1941     =item $ctx = $program->context
1942    
1943 root 1.71 Calls C<clGetProgramInfo> with C<OpenCL::PROGRAM_CONTEXT> and returns the result.
1944 root 1.21
1945     =item $uint = $program->num_devices
1946    
1947 root 1.71 Calls C<clGetProgramInfo> with C<OpenCL::PROGRAM_NUM_DEVICES> and returns the result.
1948 root 1.21
1949     =item @devices = $program->devices
1950    
1951 root 1.71 Calls C<clGetProgramInfo> with C<OpenCL::PROGRAM_DEVICES> and returns the result.
1952 root 1.21
1953     =item $string = $program->source
1954    
1955 root 1.71 Calls C<clGetProgramInfo> with C<OpenCL::PROGRAM_SOURCE> and returns the result.
1956 root 1.21
1957     =item @ints = $program->binary_sizes
1958    
1959 root 1.71 Calls C<clGetProgramInfo> with C<OpenCL::PROGRAM_BINARY_SIZES> and returns the result.
1960 root 1.21
1961     =for gengetinfo end program
1962    
1963 root 1.23 =item @blobs = $program->binaries
1964    
1965     Returns a string for the compiled binary for every device associated with
1966     the program, empty strings indicate missing programs, and an empty result
1967     means no program binaries are available.
1968    
1969     These "binaries" are often, in fact, informative low-level assembly
1970     sources.
1971    
1972     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetProgramInfo.html>
1973    
1974 root 1.5 =back
1975    
1976     =head2 THE OpenCL::Kernel CLASS
1977    
1978     =over 4
1979    
1980     =item $packed_value = $kernel->info ($name)
1981    
1982     See C<< $platform->info >> for details.
1983    
1984     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetKernelInfo.html>
1985    
1986 root 1.21 =for gengetinfo begin kernel
1987    
1988     =item $string = $kernel->function_name
1989    
1990 root 1.71 Calls C<clGetKernelInfo> with C<OpenCL::KERNEL_FUNCTION_NAME> and returns the result.
1991 root 1.21
1992     =item $uint = $kernel->num_args
1993    
1994 root 1.71 Calls C<clGetKernelInfo> with C<OpenCL::KERNEL_NUM_ARGS> and returns the result.
1995 root 1.21
1996     =item $uint = $kernel->reference_count
1997    
1998 root 1.71 Calls C<clGetKernelInfo> with C<OpenCL::KERNEL_REFERENCE_COUNT> and returns the result.
1999 root 1.21
2000     =item $ctx = $kernel->context
2001    
2002 root 1.71 Calls C<clGetKernelInfo> with C<OpenCL::KERNEL_CONTEXT> and returns the result.
2003 root 1.21
2004     =item $program = $kernel->program
2005    
2006 root 1.71 Calls C<clGetKernelInfo> with C<OpenCL::KERNEL_PROGRAM> and returns the result.
2007 root 1.21
2008     =for gengetinfo end kernel
2009    
2010 root 1.20 =item $packed_value = $kernel->work_group_info ($device, $name)
2011    
2012     See C<< $platform->info >> for details.
2013    
2014     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetKernelWorkGroupInfo.html>
2015    
2016 root 1.21 =for gengetinfo begin kernel_work_group
2017    
2018     =item $int = $kernel->work_group_size ($device)
2019    
2020 root 1.71 Calls C<clGetKernelWorkGroupInfo> with C<OpenCL::KERNEL_WORK_GROUP_SIZE> and returns the result.
2021 root 1.21
2022     =item @ints = $kernel->compile_work_group_size ($device)
2023    
2024 root 1.71 Calls C<clGetKernelWorkGroupInfo> with C<OpenCL::KERNEL_COMPILE_WORK_GROUP_SIZE> and returns the result.
2025 root 1.21
2026     =item $ulong = $kernel->local_mem_size ($device)
2027    
2028 root 1.71 Calls C<clGetKernelWorkGroupInfo> with C<OpenCL::KERNEL_LOCAL_MEM_SIZE> and returns the result.
2029 root 1.21
2030     =item $int = $kernel->preferred_work_group_size_multiple ($device)
2031    
2032 root 1.71 Calls C<clGetKernelWorkGroupInfo> with C<OpenCL::KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE> and returns the result.
2033 root 1.21
2034     =item $ulong = $kernel->private_mem_size ($device)
2035    
2036 root 1.71 Calls C<clGetKernelWorkGroupInfo> with C<OpenCL::KERNEL_PRIVATE_MEM_SIZE> and returns the result.
2037 root 1.21
2038     =for gengetinfo end kernel_work_group
2039    
2040 root 1.73 =item $packed_value = $kernel->arg_info ($idx, $name)
2041    
2042     See C<< $platform->info >> for details.
2043    
2044     L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clGetKernelArgInfo.html>
2045    
2046     =for gengetinfo begin kernel_arg
2047    
2048     =item $kernel_arg_address_qualifier = $kernel->arg_address_qualifier ($idx)
2049    
2050     Calls C<clGetKernelArgInfo> with C<OpenCL::KERNEL_ARG_ADDRESS_QUALIFIER> and returns the result.
2051    
2052     =item $kernel_arg_access_qualifier = $kernel->arg_access_qualifier ($idx)
2053    
2054     Calls C<clGetKernelArgInfo> with C<OpenCL::KERNEL_ARG_ACCESS_QUALIFIER> and returns the result.
2055    
2056     =item $string = $kernel->arg_type_name ($idx)
2057    
2058     Calls C<clGetKernelArgInfo> with C<OpenCL::KERNEL_ARG_TYPE_NAME> and returns the result.
2059    
2060     =item $kernel_arg_type_qualifier = $kernel->arg_type_qualifier ($idx)
2061    
2062     Calls C<clGetKernelArgInfo> with C<OpenCL::KERNEL_ARG_TYPE_QUALIFIER> and returns the result.
2063    
2064     =item $string = $kernel->arg_name ($idx)
2065    
2066     Calls C<clGetKernelArgInfo> with C<OpenCL::KERNEL_ARG_NAME> and returns the result.
2067 root 1.72
2068 root 1.73 =for gengetinfo end kernel_arg
2069 root 1.72
2070 root 1.60 =item $kernel->setf ($format, ...)
2071    
2072     Sets the arguments of a kernel. Since OpenCL 1.1 doesn't have a generic
2073     way to set arguments (and with OpenCL 1.2 it might be rather slow), you
2074     need to specify a format argument, much as with C<printf>, to tell OpenCL
2075     what type of argument it is.
2076    
2077     The format arguments are single letters:
2078    
2079     c char
2080     C unsigned char
2081     s short
2082     S unsigned short
2083     i int
2084     I unsigned int
2085     l long
2086     L unsigned long
2087    
2088     h half float (0..65535)
2089     f float
2090     d double
2091    
2092     z local (octet size)
2093    
2094     m memory object (buffer or image)
2095     a sampler
2096     e event
2097    
2098     Space characters in the format string are ignored.
2099    
2100     Example: set the arguments for a kernel that expects an int, two floats, a buffer and an image.
2101    
2102     $kernel->setf ("i ff mm", 5, 0.5, 3, $buffer, $image);
2103    
2104 root 1.58 =item $kernel->set_TYPE ($index, $value)
2105 root 1.5
2106 root 1.58 =item $kernel->set_char ($index, $value)
2107 root 1.5
2108 root 1.58 =item $kernel->set_uchar ($index, $value)
2109    
2110     =item $kernel->set_short ($index, $value)
2111    
2112     =item $kernel->set_ushort ($index, $value)
2113    
2114     =item $kernel->set_int ($index, $value)
2115    
2116     =item $kernel->set_uint ($index, $value)
2117    
2118     =item $kernel->set_long ($index, $value)
2119    
2120     =item $kernel->set_ulong ($index, $value)
2121    
2122     =item $kernel->set_half ($index, $value)
2123    
2124     =item $kernel->set_float ($index, $value)
2125    
2126     =item $kernel->set_double ($index, $value)
2127    
2128     =item $kernel->set_memory ($index, $value)
2129    
2130     =item $kernel->set_buffer ($index, $value)
2131    
2132     =item $kernel->set_image ($index, $value)
2133    
2134     =item $kernel->set_sampler ($index, $value)
2135    
2136     =item $kernel->set_local ($index, $value)
2137    
2138     =item $kernel->set_event ($index, $value)
2139    
2140     This is a family of methods to set the kernel argument with the number
2141     C<$index> to the give C<$value>.
2142 root 1.5
2143     Chars and integers (including the half type) are specified as integers,
2144 root 1.58 float and double as floating point values, memory/buffer/image must be
2145     an object of that type or C<undef>, local-memory arguments are set by
2146     specifying the size, and sampler and event must be objects of that type.
2147    
2148     Note that C<set_memory> works for all memory objects (all types of buffers
2149     and images) - the main purpose of the more specific C<set_TYPE> functions
2150     is type checking.
2151 root 1.5
2152 root 1.50 Setting an argument for a kernel does NOT keep a reference to the object -
2153     for example, if you set an argument to some image object, free the image,
2154     and call the kernel, you will run into undefined behaviour.
2155    
2156 root 1.5 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clSetKernelArg.html>
2157    
2158     =back
2159    
2160     =head2 THE OpenCL::Event CLASS
2161    
2162     This is the superclass for all event objects (including OpenCL::UserEvent
2163     objects).
2164    
2165     =over 4
2166    
2167 root 1.21 =item $ev->wait
2168    
2169     Waits for the event to complete.
2170    
2171     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clWaitForEvents.html>
2172    
2173 root 1.55 =item $ev->cb ($exec_callback_type, $callback->($event, $event_command_exec_status))
2174    
2175     Adds a callback to the callback stack for the given event type. There is
2176     no way to remove a callback again.
2177    
2178     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clSetEventCallback.html>
2179    
2180 root 1.5 =item $packed_value = $ev->info ($name)
2181    
2182     See C<< $platform->info >> for details.
2183    
2184     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetEventInfo.html>
2185    
2186 root 1.21 =for gengetinfo begin event
2187    
2188     =item $queue = $event->command_queue
2189    
2190 root 1.71 Calls C<clGetEventInfo> with C<OpenCL::EVENT_COMMAND_QUEUE> and returns the result.
2191 root 1.21
2192     =item $command_type = $event->command_type
2193    
2194 root 1.71 Calls C<clGetEventInfo> with C<OpenCL::EVENT_COMMAND_TYPE> and returns the result.
2195 root 1.21
2196     =item $uint = $event->reference_count
2197    
2198 root 1.71 Calls C<clGetEventInfo> with C<OpenCL::EVENT_REFERENCE_COUNT> and returns the result.
2199 root 1.21
2200     =item $uint = $event->command_execution_status
2201    
2202 root 1.71 Calls C<clGetEventInfo> with C<OpenCL::EVENT_COMMAND_EXECUTION_STATUS> and returns the result.
2203 root 1.21
2204     =item $ctx = $event->context
2205    
2206 root 1.71 Calls C<clGetEventInfo> with C<OpenCL::EVENT_CONTEXT> and returns the result.
2207 root 1.21
2208     =for gengetinfo end event
2209    
2210 root 1.20 =item $packed_value = $ev->profiling_info ($name)
2211    
2212     See C<< $platform->info >> for details.
2213    
2214     The reason this method is not called C<info> is that there already is an
2215     C<< ->info >> method.
2216    
2217     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetProfilingInfo.html>
2218    
2219 root 1.21 =for gengetinfo begin profiling
2220    
2221     =item $ulong = $event->profiling_command_queued
2222    
2223 root 1.71 Calls C<clGetEventProfilingInfo> with C<OpenCL::PROFILING_COMMAND_QUEUED> and returns the result.
2224 root 1.21
2225     =item $ulong = $event->profiling_command_submit
2226    
2227 root 1.71 Calls C<clGetEventProfilingInfo> with C<OpenCL::PROFILING_COMMAND_SUBMIT> and returns the result.
2228 root 1.21
2229     =item $ulong = $event->profiling_command_start
2230    
2231 root 1.71 Calls C<clGetEventProfilingInfo> with C<OpenCL::PROFILING_COMMAND_START> and returns the result.
2232 root 1.21
2233     =item $ulong = $event->profiling_command_end
2234 root 1.5
2235 root 1.71 Calls C<clGetEventProfilingInfo> with C<OpenCL::PROFILING_COMMAND_END> and returns the result.
2236 root 1.5
2237 root 1.21 =for gengetinfo end profiling
2238 root 1.5
2239     =back
2240    
2241     =head2 THE OpenCL::UserEvent CLASS
2242    
2243     This is a subclass of OpenCL::Event.
2244 root 1.4
2245 root 1.1 =over 4
2246    
2247 root 1.5 =item $ev->set_status ($execution_status)
2248    
2249 root 1.55 Sets the execution status of the user event. Can only be called once,
2250     either with OpenCL::COMPLETE or a negative number as status.
2251    
2252 root 1.71 execution_status: OpenCL::COMPLETE or a negative integer.
2253    
2254 root 1.5 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clSetUserEventStatus.html>
2255    
2256     =back
2257    
2258 root 1.66 =head2 THE OpenCL::Mapped CLASS
2259    
2260     This class represents objects mapped into host memory. They are
2261     represented by a blessed string scalar. The string data is the mapped
2262     memory area, that is, if you read or write it, then the mapped object is
2263     accessed directly.
2264    
2265     You must only ever use operations that modify the string in-place - for
2266     example, a C<substr> that doesn't change the length, or maybe a regex that
2267     doesn't change the length. Any other operation might cause the data to be
2268     copied.
2269    
2270     When the object is destroyed it will enqueue an implicit unmap operation
2271     on the queue that was used to create it.
2272    
2273 root 1.67 Keep in mind that you I<need> to unmap (or destroy) mapped objects before
2274     OpenCL sees the changes, even if some implementations don't need this
2275     sometimes.
2276    
2277 root 1.66 Example, replace the first two floats in the mapped buffer by 1 and 2.
2278    
2279     my $mapped = $queue->map_buffer ($buf, ...
2280     $mapped->event->wait; # make sure it's there
2281    
2282     # now replace first 8 bytes by new data, which is exactly 8 bytes long
2283     # we blindly assume device endianness to equal host endianness
2284     # (and of course, we assume iee 754 single precision floats :)
2285     substr $$mapped, 0, 8, pack "f*", 1, 2;
2286    
2287     =over 4
2288    
2289 root 1.67 =item $ev = $mapped->unmap ($wait_events...)
2290    
2291     Unmaps the mapped memory object, using the queue originally used to create
2292     it, quite similarly to C<< $queue->unmap ($mapped, ...) >>.
2293    
2294 root 1.66 =item $bool = $mapped->mapped
2295    
2296     Returns whether the object is still mapped - true before an C<unmap> is
2297     enqueued, false afterwards.
2298    
2299     =item $ev = $mapped->event
2300    
2301     Return the event object associated with the mapped object. Initially, this
2302     will be the event object created when mapping the object, and after an
2303     unmap, this will be the event object that the unmap operation created.
2304    
2305     =item $mapped->wait
2306    
2307     Same as C<< $mapped->event->wait >> - makes sure no operations on this
2308     mapped object are outstanding.
2309    
2310     =item $bytes = $mapped->size
2311    
2312     Returns the size of the mapped area, in bytes. Same as C<length $$mapped>.
2313    
2314     =item $ptr = $mapped->ptr
2315    
2316 root 1.68 Returns the raw memory address of the mapped area.
2317 root 1.66
2318 root 1.67 =item $mapped->set ($offset, $data)
2319    
2320     Replaces the data at the given C<$offset> in the memory area by the new
2321 root 1.68 C<$data>. This method is safer than direct manipulation of C<$mapped>
2322     because it does bounds-checking, but also slower.
2323 root 1.67
2324     =item $data = $mapped->get ($offset, $length)
2325    
2326     Returns (without copying) a scalar representing the data at the given
2327     C<$offset> and C<$length> in the mapped memory area. This is the same as
2328 root 1.68 the following substr, except much slower;
2329 root 1.67
2330     $data = substr $$mapped, $offset, $length
2331    
2332     =cut
2333    
2334 root 1.68 sub OpenCL::Mapped::get {
2335 root 1.67 substr ${$_[0]}, $_[1], $_[2]
2336     }
2337    
2338 root 1.66 =back
2339    
2340     =head2 THE OpenCL::MappedBuffer CLASS
2341    
2342     This is a subclass of OpenCL::Mapped, representing mapped buffers.
2343    
2344     =head2 THE OpenCL::MappedImage CLASS
2345    
2346     This is a subclass of OpenCL::Mapped, representing mapped images.
2347    
2348     =over 4
2349    
2350 root 1.84 =item $pixels = $mapped->width
2351    
2352     =item $pixels = $mapped->height
2353    
2354     =item $pixels = $mapped->depth
2355    
2356     Return the width/height/depth of the mapped image region, in pixels.
2357    
2358 root 1.67 =item $bytes = $mapped->row_pitch
2359    
2360     =item $bytes = $mapped->slice_pitch
2361    
2362     Return the row or slice pitch of the image that has been mapped.
2363    
2364 root 1.84 =item $bytes = $mapped->element_size
2365    
2366     Return the size of a single pixel.
2367    
2368     =item $data = $mapped->get_row ($count, $x=0, $y=0, $z=0)
2369    
2370     Return C<$count> pixels from the given coordinates. The pixel data must
2371     be completely contained within a single row.
2372    
2373     If C<$count> is C<undef>, then all the remaining pixels in that row are
2374     returned.
2375    
2376     =item $mapped->set_row ($data, $x=0, $y=0, $z=0)
2377    
2378     Write the given pixel data at the given coordinate. The pixel data must
2379     be completely contained within a single row.
2380    
2381 root 1.66 =back
2382    
2383 root 1.1 =cut
2384    
2385     1;
2386    
2387     =head1 AUTHOR
2388    
2389     Marc Lehmann <schmorp@schmorp.de>
2390     http://home.schmorp.de/
2391    
2392     =cut
2393