ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/OpenCL/OpenCL.pm
Revision: 1.52
Committed: Tue Apr 24 14:24:42 2012 UTC (12 years ago) by root
Branch: MAIN
Changes since 1.51: +76 -25 lines
Log Message:
*** empty log message ***

File Contents

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