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