ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/OpenCL/OpenCL.pm
Revision: 1.34
Committed: Thu Apr 19 13:06:55 2012 UTC (12 years, 1 month ago) by root
Branch: MAIN
Changes since 1.33: +19 -0 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     my $prog = $ctx->program_with_source ($src);
163    
164 root 1.11 # build croaks on compile errors, so catch it and print the compile errors
165 root 1.3 eval { $prog->build ($dev); 1 }
166 root 1.24 or die $prog->build_log;
167 root 1.3
168     my $kernel = $prog->kernel ("squareit");
169    
170 root 1.11 =head2 Create some input and output float buffers, then call the
171     'squareit' kernel on them.
172 root 1.4
173     my $input = $ctx->buffer_sv (OpenCL::MEM_COPY_HOST_PTR, pack "f*", 1, 2, 3, 4.5);
174     my $output = $ctx->buffer (0, OpenCL::SIZEOF_FLOAT * 5);
175    
176     # set buffer
177     $kernel->set_buffer (0, $input);
178     $kernel->set_buffer (1, $output);
179    
180     # execute it for all 4 numbers
181     $queue->enqueue_nd_range_kernel ($kernel, undef, [4], undef);
182    
183 root 1.5 # enqueue a synchronous read
184     $queue->enqueue_read_buffer ($output, 1, 0, OpenCL::SIZEOF_FLOAT * 4, my $data);
185    
186     # print the results:
187 root 1.10 printf "%s\n", join ", ", unpack "f*", $data;
188 root 1.5
189     =head2 The same enqueue operations as before, but assuming an out-of-order queue,
190     showing off barriers.
191    
192     # execute it for all 4 numbers
193     $queue->enqueue_nd_range_kernel ($kernel, undef, [4], undef);
194    
195     # enqueue a barrier to ensure in-order execution
196 root 1.4 $queue->enqueue_barrier;
197    
198 root 1.5 # enqueue an async read
199     $queue->enqueue_read_buffer ($output, 0, 0, OpenCL::SIZEOF_FLOAT * 4, my $data);
200    
201     # wait for all requests to finish
202     $queue->finish;
203    
204     =head2 The same enqueue operations as before, but assuming an out-of-order queue,
205     showing off event objects and wait lists.
206    
207     # execute it for all 4 numbers
208     my $ev = $queue->enqueue_nd_range_kernel ($kernel, undef, [4], undef);
209    
210     # enqueue an async read
211     $ev = $queue->enqueue_read_buffer ($output, 0, 0, OpenCL::SIZEOF_FLOAT * 4, my $data, $ev);
212    
213     # wait for the last event to complete
214 root 1.4 $ev->wait;
215    
216 root 1.5 =head1 DOCUMENTATION
217    
218     =head2 BASIC CONVENTIONS
219    
220 root 1.14 This is not a one-to-one C-style translation of OpenCL to Perl - instead
221     I attempted to make the interface as type-safe as possible by introducing
222 root 1.5 object syntax where it makes sense. There are a number of important
223     differences between the OpenCL C API and this module:
224    
225     =over 4
226    
227     =item * Object lifetime managament is automatic - there is no need
228     to free objects explicitly (C<clReleaseXXX>), the release function
229     is called automatically once all Perl references to it go away.
230    
231 root 1.20 =item * OpenCL uses CamelCase for function names
232     (e.g. C<clGetPlatformIDs>, C<clGetPlatformInfo>), while this module
233     uses underscores as word separator and often leaves out prefixes
234     (C<OpenCL::platforms>, C<< $platform->info >>).
235 root 1.5
236     =item * OpenCL often specifies fixed vector function arguments as short
237 root 1.19 arrays (C<size_t origin[3]>), while this module explicitly expects the
238     components as separate arguments (C<$orig_x, $orig_y, $orig_z>) in
239     function calls.
240 root 1.5
241 root 1.19 =item * Structures are often specified by flattening out their components
242     as with short vectors, and returned as arrayrefs.
243 root 1.5
244     =item * When enqueuing commands, the wait list is specified by adding
245 root 1.9 extra arguments to the function - anywhere a C<$wait_events...> argument
246 root 1.5 is documented this can be any number of event objects.
247    
248     =item * When enqueuing commands, if the enqueue method is called in void
249     context, no event is created. In all other contexts an event is returned
250     by the method.
251    
252     =item * This module expects all functions to return C<CL_SUCCESS>. If any
253     other status is returned the function will throw an exception, so you
254     don't normally have to to any error checking.
255    
256     =back
257    
258 root 1.7 =head2 PERL AND OPENCL TYPES
259    
260 root 1.8 This handy(?) table lists OpenCL types and their perl, PDL and pack/unpack
261 root 1.7 format equivalents:
262    
263 root 1.8 OpenCL perl PDL pack/unpack
264     char IV - c
265     uchar IV byte C
266     short IV short s
267     ushort IV ushort S
268     int IV long? l
269     uint IV - L
270     long IV longlong q
271     ulong IV - Q
272     float NV float f
273     half IV ushort S
274     double NV double d
275 root 1.7
276 root 1.5 =head2 THE OpenCL PACKAGE
277    
278     =over 4
279    
280     =item $int = OpenCL::errno
281    
282 root 1.11 The last error returned by a function - it's only valid after an error occured
283     and before calling another OpenCL function.
284 root 1.5
285     =item $str = OpenCL::err2str $errval
286    
287     Comverts an error value into a human readable string.
288    
289 root 1.9 =item $str = OpenCL::enum2str $enum
290 root 1.5
291 root 1.30 Converts most enum values (of parameter names, image format constants,
292 root 1.5 object types, addressing and filter modes, command types etc.) into a
293 root 1.30 human readable string. When confronted with some random integer it can be
294 root 1.5 very helpful to pass it through this function to maybe get some readable
295     string out of it.
296    
297     =item @platforms = OpenCL::platforms
298    
299     Returns all available OpenCL::Platform objects.
300    
301     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetPlatformIDs.html>
302    
303 root 1.10 =item $ctx = OpenCL::context_from_type $properties, $type = OpenCL::DEVICE_TYPE_DEFAULT, $notify = undef
304 root 1.5
305     Tries to create a context from a default device and platform - never worked for me.
306    
307     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContextFromType.html>
308    
309     =item OpenCL::wait_for_events $wait_events...
310    
311     Waits for all events to complete.
312    
313     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clWaitForEvents.html>
314    
315     =back
316    
317     =head2 THE OpenCL::Platform CLASS
318    
319     =over 4
320    
321     =item @devices = $platform->devices ($type = OpenCL::DEVICE_TYPE_ALL)
322    
323     Returns a list of matching OpenCL::Device objects.
324    
325 root 1.10 =item $ctx = $platform->context_from_type ($properties, $type = OpenCL::DEVICE_TYPE_DEFAULT, $notify = undef)
326 root 1.5
327 root 1.22 Tries to create a context. Never worked for me, and you need devices explicitly anyway.
328 root 1.5
329     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContextFromType.html>
330    
331 root 1.29 =item $ctx = $platform->context ($properties = undef, @$devices, $notify = undef)
332 root 1.11
333     Create a new OpenCL::Context object using the given device object(s)- a
334     CL_CONTEXT_PLATFORM property is supplied automatically.
335    
336     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContext.html>
337    
338 root 1.20 =item $packed_value = $platform->info ($name)
339    
340     Calls C<clGetPlatformInfo> and returns the packed, raw value - for
341 root 1.22 strings, this will be the string (possibly including terminating \0), for
342     other values you probably need to use the correct C<unpack>.
343 root 1.20
344 root 1.22 It's best to avoid this method and use one of the following convenience
345     wrappers.
346 root 1.20
347     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetPlatformInfo.html>
348    
349     =for gengetinfo begin platform
350    
351     =item $string = $platform->profile
352    
353 root 1.24 Calls C<clGetPlatformInfo> with C<CL_PLATFORM_PROFILE> and returns the result.
354 root 1.20
355     =item $string = $platform->version
356    
357 root 1.24 Calls C<clGetPlatformInfo> with C<CL_PLATFORM_VERSION> and returns the result.
358 root 1.20
359     =item $string = $platform->name
360    
361 root 1.24 Calls C<clGetPlatformInfo> with C<CL_PLATFORM_NAME> and returns the result.
362 root 1.20
363     =item $string = $platform->vendor
364    
365 root 1.24 Calls C<clGetPlatformInfo> with C<CL_PLATFORM_VENDOR> and returns the result.
366 root 1.20
367     =item $string = $platform->extensions
368    
369 root 1.24 Calls C<clGetPlatformInfo> with C<CL_PLATFORM_EXTENSIONS> and returns the result.
370 root 1.21
371 root 1.20 =for gengetinfo end platform
372    
373 root 1.5 =back
374    
375     =head2 THE OpenCL::Device CLASS
376    
377     =over 4
378    
379     =item $packed_value = $device->info ($name)
380    
381     See C<< $platform->info >> for details.
382    
383     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetDeviceInfo.html>
384    
385 root 1.21 =for gengetinfo begin device
386    
387     =item $device_type = $device->type
388    
389 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_TYPE> and returns the result.
390 root 1.21
391     =item $uint = $device->vendor_id
392    
393 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_VENDOR_ID> and returns the result.
394 root 1.21
395     =item $uint = $device->max_compute_units
396    
397 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_COMPUTE_UNITS> and returns the result.
398 root 1.21
399     =item $uint = $device->max_work_item_dimensions
400    
401 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS> and returns the result.
402 root 1.21
403     =item $int = $device->max_work_group_size
404    
405 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_WORK_GROUP_SIZE> and returns the result.
406 root 1.21
407     =item @ints = $device->max_work_item_sizes
408    
409 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_WORK_ITEM_SIZES> and returns the result.
410 root 1.21
411     =item $uint = $device->preferred_vector_width_char
412    
413 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR> and returns the result.
414 root 1.21
415     =item $uint = $device->preferred_vector_width_short
416    
417 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT> and returns the result.
418 root 1.21
419     =item $uint = $device->preferred_vector_width_int
420    
421 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT> and returns the result.
422 root 1.21
423     =item $uint = $device->preferred_vector_width_long
424    
425 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG> and returns the result.
426 root 1.21
427     =item $uint = $device->preferred_vector_width_float
428    
429 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT> and returns the result.
430 root 1.21
431     =item $uint = $device->preferred_vector_width_double
432    
433 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE> and returns the result.
434 root 1.21
435     =item $uint = $device->max_clock_frequency
436    
437 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_CLOCK_FREQUENCY> and returns the result.
438 root 1.21
439     =item $bitfield = $device->address_bits
440    
441 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_ADDRESS_BITS> and returns the result.
442 root 1.21
443     =item $uint = $device->max_read_image_args
444    
445 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_READ_IMAGE_ARGS> and returns the result.
446 root 1.21
447     =item $uint = $device->max_write_image_args
448    
449 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_WRITE_IMAGE_ARGS> and returns the result.
450 root 1.21
451     =item $ulong = $device->max_mem_alloc_size
452    
453 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_MEM_ALLOC_SIZE> and returns the result.
454 root 1.21
455     =item $int = $device->image2d_max_width
456    
457 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE2D_MAX_WIDTH> and returns the result.
458 root 1.21
459     =item $int = $device->image2d_max_height
460    
461 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE2D_MAX_HEIGHT> and returns the result.
462 root 1.21
463     =item $int = $device->image3d_max_width
464    
465 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE3D_MAX_WIDTH> and returns the result.
466 root 1.21
467     =item $int = $device->image3d_max_height
468    
469 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE3D_MAX_HEIGHT> and returns the result.
470 root 1.21
471     =item $int = $device->image3d_max_depth
472    
473 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE3D_MAX_DEPTH> and returns the result.
474 root 1.21
475     =item $uint = $device->image_support
476    
477 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE_SUPPORT> and returns the result.
478 root 1.21
479     =item $int = $device->max_parameter_size
480    
481 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_PARAMETER_SIZE> and returns the result.
482 root 1.21
483     =item $uint = $device->max_samplers
484    
485 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_SAMPLERS> and returns the result.
486 root 1.21
487     =item $uint = $device->mem_base_addr_align
488    
489 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MEM_BASE_ADDR_ALIGN> and returns the result.
490 root 1.21
491     =item $uint = $device->min_data_type_align_size
492    
493 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE> and returns the result.
494 root 1.21
495     =item $device_fp_config = $device->single_fp_config
496    
497 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_SINGLE_FP_CONFIG> and returns the result.
498 root 1.21
499     =item $device_mem_cache_type = $device->global_mem_cache_type
500    
501 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_GLOBAL_MEM_CACHE_TYPE> and returns the result.
502 root 1.21
503     =item $uint = $device->global_mem_cacheline_size
504    
505 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE> and returns the result.
506 root 1.21
507     =item $ulong = $device->global_mem_cache_size
508    
509 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_GLOBAL_MEM_CACHE_SIZE> and returns the result.
510 root 1.21
511     =item $ulong = $device->global_mem_size
512    
513 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_GLOBAL_MEM_SIZE> and returns the result.
514 root 1.21
515     =item $ulong = $device->max_constant_buffer_size
516    
517 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE> and returns the result.
518 root 1.21
519     =item $uint = $device->max_constant_args
520    
521 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_CONSTANT_ARGS> and returns the result.
522 root 1.21
523     =item $device_local_mem_type = $device->local_mem_type
524    
525 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_LOCAL_MEM_TYPE> and returns the result.
526 root 1.21
527     =item $ulong = $device->local_mem_size
528    
529 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_LOCAL_MEM_SIZE> and returns the result.
530 root 1.21
531     =item $boolean = $device->error_correction_support
532    
533 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_ERROR_CORRECTION_SUPPORT> and returns the result.
534 root 1.21
535     =item $int = $device->profiling_timer_resolution
536    
537 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PROFILING_TIMER_RESOLUTION> and returns the result.
538 root 1.21
539     =item $boolean = $device->endian_little
540    
541 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_ENDIAN_LITTLE> and returns the result.
542 root 1.21
543     =item $boolean = $device->available
544    
545 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_AVAILABLE> and returns the result.
546 root 1.21
547     =item $boolean = $device->compiler_available
548    
549 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_COMPILER_AVAILABLE> and returns the result.
550 root 1.21
551     =item $device_exec_capabilities = $device->execution_capabilities
552    
553 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_EXECUTION_CAPABILITIES> and returns the result.
554 root 1.21
555     =item $command_queue_properties = $device->properties
556    
557 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_QUEUE_PROPERTIES> and returns the result.
558 root 1.21
559     =item $ = $device->platform
560    
561 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PLATFORM> and returns the result.
562 root 1.21
563     =item $string = $device->name
564    
565 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_NAME> and returns the result.
566 root 1.21
567     =item $string = $device->vendor
568    
569 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_VENDOR> and returns the result.
570 root 1.21
571     =item $string = $device->driver_version
572    
573 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DRIVER_VERSION> and returns the result.
574 root 1.21
575     =item $string = $device->profile
576    
577 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PROFILE> and returns the result.
578 root 1.21
579     =item $string = $device->version
580    
581 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_VERSION> and returns the result.
582 root 1.21
583     =item $string = $device->extensions
584    
585 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_EXTENSIONS> and returns the result.
586 root 1.21
587     =item $uint = $device->preferred_vector_width_half
588    
589 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF> and returns the result.
590 root 1.21
591     =item $uint = $device->native_vector_width_char
592    
593 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR> and returns the result.
594 root 1.21
595     =item $uint = $device->native_vector_width_short
596    
597 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT> and returns the result.
598 root 1.21
599     =item $uint = $device->native_vector_width_int
600    
601 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_INT> and returns the result.
602 root 1.21
603     =item $uint = $device->native_vector_width_long
604    
605 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG> and returns the result.
606 root 1.21
607     =item $uint = $device->native_vector_width_float
608    
609 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT> and returns the result.
610 root 1.21
611     =item $uint = $device->native_vector_width_double
612    
613 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE> and returns the result.
614 root 1.21
615     =item $uint = $device->native_vector_width_half
616    
617 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF> and returns the result.
618 root 1.21
619     =item $device_fp_config = $device->double_fp_config
620    
621 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_DOUBLE_FP_CONFIG> and returns the result.
622 root 1.21
623     =item $device_fp_config = $device->half_fp_config
624    
625 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_HALF_FP_CONFIG> and returns the result.
626 root 1.21
627     =item $boolean = $device->host_unified_memory
628    
629 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_HOST_UNIFIED_MEMORY> and returns the result.
630 root 1.21
631     =item $device = $device->parent_device_ext
632    
633 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PARENT_DEVICE_EXT> and returns the result.
634 root 1.21
635     =item @device_partition_property_exts = $device->partition_types_ext
636    
637 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PARTITION_TYPES_EXT> and returns the result.
638 root 1.21
639     =item @device_partition_property_exts = $device->affinity_domains_ext
640    
641 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_AFFINITY_DOMAINS_EXT> and returns the result.
642 root 1.21
643     =item $uint = $device->reference_count_ext
644    
645 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_REFERENCE_COUNT_EXT > and returns the result.
646 root 1.21
647     =item @device_partition_property_exts = $device->partition_style_ext
648    
649 root 1.24 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PARTITION_STYLE_EXT> and returns the result.
650 root 1.21
651     =for gengetinfo end device
652    
653 root 1.5 =back
654    
655     =head2 THE OpenCL::Context CLASS
656    
657     =over 4
658    
659 root 1.9 =item $queue = $ctx->queue ($device, $properties)
660 root 1.5
661 root 1.9 Create a new OpenCL::Queue object from the context and the given device.
662 root 1.5
663     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateCommandQueue.html>
664    
665     =item $ev = $ctx->user_event
666    
667     Creates a new OpenCL::UserEvent object.
668    
669     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateUserEvent.html>
670    
671     =item $buf = $ctx->buffer ($flags, $len)
672    
673 root 1.27 Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object with the
674     given flags and octet-size.
675 root 1.5
676     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateBuffer.html>
677    
678     =item $buf = $ctx->buffer_sv ($flags, $data)
679    
680 root 1.27 Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object and
681     initialise it with the given data values.
682 root 1.5
683 root 1.18 =item $img = $ctx->image2d ($flags, $channel_order, $channel_type, $width, $height, $row_pitch = 0, $data = undef)
684 root 1.5
685 root 1.27 Creates a new OpenCL::Image2D object and optionally initialises it with
686     the given data values.
687 root 1.5
688     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateImage2D.html>
689    
690 root 1.18 =item $img = $ctx->image3d ($flags, $channel_order, $channel_type, $width, $height, $depth, $row_pitch = 0, $slice_pitch = 0, $data = undef)
691 root 1.5
692 root 1.27 Creates a new OpenCL::Image3D object and optionally initialises it with
693     the given data values.
694 root 1.5
695     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateImage3D.html>
696    
697 root 1.33 =item $buffer = $ctx->gl_buffer ($flags, $bufobj)
698    
699     Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object that refers to the given
700     OpenGL buffer object.
701    
702     http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateFromGLBuffer.html
703    
704     =item $ctx->gl_texture2d ($flags, $target, $miplevel, $texture)
705    
706     Creates a new OpenCL::Image2D object that refers to the given OpenGL
707     2D texture object.
708    
709     http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateFromGLTexture2D.html
710    
711     =item $ctx->gl_texture3d ($flags, $target, $miplevel, $texture)
712    
713     Creates a new OpenCL::Image3D object that refers to the given OpenGL
714     3D texture object.
715    
716     http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateFromGLTexture3D.html
717    
718     =item $ctx->gl_renderbuffer ($flags, $renderbuffer)
719    
720     Creates a new OpenCL::Image2D object that refers to the given OpenGL
721     render buffer.
722    
723     http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateFromGLRenderbuffer.html
724    
725 root 1.5 =item @formats = $ctx->supported_image_formats ($flags, $image_type)
726    
727     Returns a list of matching image formats - each format is an arrayref with
728     two values, $channel_order and $channel_type, in it.
729    
730     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetSupportedImageFormats.html>
731    
732     =item $sampler = $ctx->sampler ($normalized_coords, $addressing_mode, $filter_mode)
733    
734     Creates a new OpenCL::Sampler object.
735    
736     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateSampler.html>
737    
738     =item $program = $ctx->program_with_source ($string)
739    
740     Creates a new OpenCL::Program object from the given source code.
741    
742     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateProgramWithSource.html>
743    
744 root 1.20 =item $packed_value = $ctx->info ($name)
745    
746     See C<< $platform->info >> for details.
747    
748     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetContextInfo.html>
749    
750     =for gengetinfo begin context
751    
752 root 1.21 =item $uint = $context->reference_count
753    
754 root 1.24 Calls C<clGetContextInfo> with C<CL_CONTEXT_REFERENCE_COUNT> and returns the result.
755 root 1.21
756     =item @devices = $context->devices
757    
758 root 1.24 Calls C<clGetContextInfo> with C<CL_CONTEXT_DEVICES> and returns the result.
759 root 1.21
760     =item @property_ints = $context->properties
761    
762 root 1.24 Calls C<clGetContextInfo> with C<CL_CONTEXT_PROPERTIES> and returns the result.
763 root 1.21
764     =item $uint = $context->num_devices
765    
766 root 1.24 Calls C<clGetContextInfo> with C<CL_CONTEXT_NUM_DEVICES> and returns the result.
767 root 1.21
768 root 1.20 =for gengetinfo end context
769    
770 root 1.5 =back
771    
772     =head2 THE OpenCL::Queue CLASS
773    
774     An OpenCL::Queue represents an execution queue for OpenCL. You execute
775     requests by calling their respective C<enqueue_xxx> method and waitinf for
776     it to complete in some way.
777    
778     All the enqueue methods return an event object that can be used to wait
779     for completion, unless the method is called in void context, in which case
780     no event object is created.
781    
782     They also allow you to specify any number of other event objects that this
783     request has to wait for before it starts executing, by simply passing the
784     event objects as extra parameters to the enqueue methods.
785    
786     Queues execute in-order by default, without any parallelism, so in most
787 root 1.6 cases (i.e. you use only one queue) it's not necessary to wait for or
788     create event objects.
789 root 1.5
790     =over 4
791    
792     =item $ev = $queue->enqueue_read_buffer ($buffer, $blocking, $offset, $len, $data, $wait_events...)
793    
794     Reads data from buffer into the given string.
795    
796     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadBuffer.html>
797    
798     =item $ev = $queue->enqueue_write_buffer ($buffer, $blocking, $offset, $data, $wait_events...)
799    
800     Writes data to buffer from the given string.
801    
802     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteBuffer.html>
803    
804     =item $ev = $queue->enqueue_copy_buffer ($src, $dst, $src_offset, $dst_offset, $len, $wait_events...)
805    
806     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBuffer.html>
807    
808 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...)
809    
810     http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadBufferRect.html
811    
812     =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...)
813    
814     http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteBufferRect.html
815    
816 root 1.5 =item $ev = $queue->enqueue_read_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...)
817    
818 root 1.27 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferRect.html>
819    
820     =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...)
821    
822 root 1.5 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadImage.html>
823    
824 root 1.17 =item $ev = $queue->enqueue_write_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...)
825 root 1.5
826     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteImage.html>
827    
828 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...)
829 root 1.5
830     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyImage.html>
831    
832 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...)
833 root 1.5
834     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyImageToBuffer.html>
835    
836 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...)
837    
838     Yeah.
839    
840     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferToImage.html>.
841    
842 root 1.5 =item $ev = $queue->enqueue_task ($kernel, $wait_events...)
843    
844     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueTask.html>
845    
846     =item $ev = $queue->enqueue_nd_range_kernel ($kernel, @$global_work_offset, @$global_work_size, @$local_work_size, $wait_events...)
847    
848     Enqueues a kernel execution.
849    
850     @$global_work_size must be specified as a reference to an array of
851     integers specifying the work sizes (element counts).
852    
853     @$global_work_offset must be either C<undef> (in which case all offsets
854     are C<0>), or a reference to an array of work offsets, with the same number
855     of elements as @$global_work_size.
856    
857     @$local_work_size must be either C<undef> (in which case the
858     implementation is supposed to choose good local work sizes), or a
859     reference to an array of local work sizes, with the same number of
860     elements as @$global_work_size.
861    
862     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueNDRangeKernel.html>
863    
864     =item $ev = $queue->enqueue_marker
865    
866     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueMarker.html>
867    
868     =item $ev = $queue->enqueue_wait_for_events ($wait_events...)
869    
870     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWaitForEvents.html>
871    
872     =item $queue->enqueue_barrier
873    
874     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueBarrier.html>
875    
876     =item $queue->flush
877    
878     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clFlush.html>
879    
880     =item $queue->finish
881    
882     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clFinish.html>
883    
884 root 1.21 =item $packed_value = $queue->info ($name)
885    
886     See C<< $platform->info >> for details.
887    
888     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetCommandQueueInfo.html>
889    
890     =for gengetinfo begin command_queue
891    
892     =item $ctx = $command_queue->context
893    
894 root 1.24 Calls C<clGetCommandQueueInfo> with C<CL_QUEUE_CONTEXT> and returns the result.
895 root 1.21
896     =item $device = $command_queue->device
897    
898 root 1.24 Calls C<clGetCommandQueueInfo> with C<CL_QUEUE_DEVICE> and returns the result.
899 root 1.21
900     =item $uint = $command_queue->reference_count
901    
902 root 1.24 Calls C<clGetCommandQueueInfo> with C<CL_QUEUE_REFERENCE_COUNT> and returns the result.
903 root 1.21
904     =item $command_queue_properties = $command_queue->properties
905    
906 root 1.24 Calls C<clGetCommandQueueInfo> with C<CL_QUEUE_PROPERTIES> and returns the result.
907 root 1.21
908     =for gengetinfo end command_queue
909    
910 root 1.5 =back
911    
912     =head2 THE OpenCL::Memory CLASS
913    
914     This the superclass of all memory objects - OpenCL::Buffer, OpenCL::Image,
915 root 1.21 OpenCL::Image2D and OpenCL::Image3D.
916 root 1.5
917     =over 4
918    
919     =item $packed_value = $memory->info ($name)
920    
921     See C<< $platform->info >> for details.
922    
923     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetMemObjectInfo.html>
924    
925 root 1.21 =for gengetinfo begin mem
926    
927     =item $mem_object_type = $mem->type
928    
929 root 1.24 Calls C<clGetMemObjectInfo> with C<CL_MEM_TYPE> and returns the result.
930 root 1.21
931     =item $mem_flags = $mem->flags
932    
933 root 1.24 Calls C<clGetMemObjectInfo> with C<CL_MEM_FLAGS> and returns the result.
934 root 1.21
935     =item $int = $mem->size
936    
937 root 1.24 Calls C<clGetMemObjectInfo> with C<CL_MEM_SIZE> and returns the result.
938 root 1.21
939     =item $ptr_value = $mem->host_ptr
940    
941 root 1.24 Calls C<clGetMemObjectInfo> with C<CL_MEM_HOST_PTR> and returns the result.
942 root 1.21
943     =item $uint = $mem->map_count
944    
945 root 1.24 Calls C<clGetMemObjectInfo> with C<CL_MEM_MAP_COUNT> and returns the result.
946 root 1.21
947     =item $uint = $mem->reference_count
948    
949 root 1.24 Calls C<clGetMemObjectInfo> with C<CL_MEM_REFERENCE_COUNT> and returns the result.
950 root 1.21
951     =item $ctx = $mem->context
952    
953 root 1.24 Calls C<clGetMemObjectInfo> with C<CL_MEM_CONTEXT> and returns the result.
954 root 1.21
955     =item $mem = $mem->associated_memobject
956    
957 root 1.24 Calls C<clGetMemObjectInfo> with C<CL_MEM_ASSOCIATED_MEMOBJECT> and returns the result.
958 root 1.21
959     =item $int = $mem->offset
960    
961 root 1.24 Calls C<clGetMemObjectInfo> with C<CL_MEM_OFFSET> and returns the result.
962 root 1.21
963     =for gengetinfo end mem
964    
965 root 1.34 =item ($type, $name) = $mem->gl_object_info
966    
967     Returns the OpenGL object type (e.g. OpenCL::GL_OBJECT_TEXTURE2D) and the
968     object "name" (e.g. the texture name) used to create this memory object.
969    
970     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetGLObjectInfo.html>
971    
972 root 1.5 =back
973    
974 root 1.27 =head2 THE OpenCL::Buffer CLASS
975    
976     This is a subclass of OpenCL::Memory, and the superclass of
977     OpenCL::BufferObj. Its purpose is simply to distinguish between buffers
978     and sub-buffers.
979    
980     =head2 THE OpenCL::BufferObj CLASS
981    
982     This is a subclass of OpenCL::Buffer and thus OpenCL::Memory. It exists
983     because one cna create sub buffers of OpenLC::BufferObj objects, but not
984     sub buffers from these sub buffers.
985    
986     =over 4
987    
988     =item $subbuf = $buf_obj->sub_buffer_region ($flags, $origin, $size)
989    
990     Creates an OpenCL::Buffer objects from this buffer and returns it. The
991     C<buffer_create_type> is assumed to be C<CL_BUFFER_CREATE_TYPE_REGION>.
992    
993     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateSubBuffer.html>
994    
995     =back
996    
997 root 1.20 =head2 THE OpenCL::Image CLASS
998    
999     This is the superclass of all image objects - OpenCL::Image2D and OpenCL::Image3D.
1000    
1001     =over 4
1002    
1003     =item $packed_value = $ev->image_info ($name)
1004    
1005     See C<< $platform->info >> for details.
1006    
1007     The reason this method is not called C<info> is that there already is an
1008     C<< ->info >> method inherited from C<OpenCL::Memory>.
1009    
1010     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetImageInfo.html>
1011    
1012 root 1.21 =for gengetinfo begin image
1013    
1014     =item $int = $image->element_size
1015    
1016 root 1.24 Calls C<clGetImageInfo> with C<CL_IMAGE_ELEMENT_SIZE> and returns the result.
1017 root 1.21
1018     =item $int = $image->row_pitch
1019    
1020 root 1.24 Calls C<clGetImageInfo> with C<CL_IMAGE_ROW_PITCH> and returns the result.
1021 root 1.21
1022     =item $int = $image->slice_pitch
1023    
1024 root 1.24 Calls C<clGetImageInfo> with C<CL_IMAGE_SLICE_PITCH> and returns the result.
1025 root 1.21
1026     =item $int = $image->width
1027    
1028 root 1.24 Calls C<clGetImageInfo> with C<CL_IMAGE_WIDTH> and returns the result.
1029 root 1.21
1030     =item $int = $image->height
1031    
1032 root 1.24 Calls C<clGetImageInfo> with C<CL_IMAGE_HEIGHT> and returns the result.
1033 root 1.21
1034     =item $int = $image->depth
1035    
1036 root 1.24 Calls C<clGetImageInfo> with C<CL_IMAGE_DEPTH> and returns the result.
1037 root 1.21
1038     =for gengetinfo end image
1039    
1040 root 1.34 =for gengetinfo begin gl_texture
1041    
1042     =item $GLenum = $gl_texture->target
1043    
1044     Calls C<clGetGlTextureInfo> with C<CL_GL_TEXTURE_TARGET> and returns the result.
1045    
1046     =item $GLint = $gl_texture->gl_mipmap_level
1047    
1048     Calls C<clGetGlTextureInfo> with C<CL_GL_MIPMAP_LEVEL> and returns the result.
1049    
1050     =for gengetinfo end gl_texture
1051    
1052 root 1.20 =back
1053    
1054 root 1.5 =head2 THE OpenCL::Sampler CLASS
1055    
1056     =over 4
1057    
1058     =item $packed_value = $sampler->info ($name)
1059    
1060     See C<< $platform->info >> for details.
1061    
1062     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetSamplerInfo.html>
1063    
1064 root 1.21 =for gengetinfo begin sampler
1065    
1066     =item $uint = $sampler->reference_count
1067    
1068 root 1.24 Calls C<clGetSamplerInfo> with C<CL_SAMPLER_REFERENCE_COUNT> and returns the result.
1069 root 1.21
1070     =item $ctx = $sampler->context
1071    
1072 root 1.24 Calls C<clGetSamplerInfo> with C<CL_SAMPLER_CONTEXT> and returns the result.
1073 root 1.21
1074     =item $addressing_mode = $sampler->normalized_coords
1075    
1076 root 1.24 Calls C<clGetSamplerInfo> with C<CL_SAMPLER_NORMALIZED_COORDS> and returns the result.
1077 root 1.21
1078     =item $filter_mode = $sampler->addressing_mode
1079    
1080 root 1.24 Calls C<clGetSamplerInfo> with C<CL_SAMPLER_ADDRESSING_MODE> and returns the result.
1081 root 1.21
1082     =item $boolean = $sampler->filter_mode
1083    
1084 root 1.24 Calls C<clGetSamplerInfo> with C<CL_SAMPLER_FILTER_MODE> and returns the result.
1085 root 1.21
1086     =for gengetinfo end sampler
1087    
1088 root 1.5 =back
1089    
1090     =head2 THE OpenCL::Program CLASS
1091    
1092     =over 4
1093    
1094     =item $program->build ($device, $options = "")
1095    
1096     Tries to build the program with the givne options.
1097    
1098     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clBuildProgram.html>
1099    
1100     =item $packed_value = $program->build_info ($device, $name)
1101    
1102     Similar to C<< $platform->info >>, but returns build info for a previous
1103     build attempt for the given device.
1104    
1105     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetBuildInfo.html>
1106    
1107     =item $kernel = $program->kernel ($function_name)
1108    
1109     Creates an OpenCL::Kernel object out of the named C<__kernel> function in
1110     the program.
1111    
1112     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateKernel.html>
1113    
1114 root 1.21 =for gengetinfo begin program_build
1115    
1116     =item $build_status = $program->build_status ($device)
1117    
1118 root 1.24 Calls C<clGetProgramBuildInfo> with C<CL_PROGRAM_BUILD_STATUS> and returns the result.
1119 root 1.21
1120     =item $string = $program->build_options ($device)
1121    
1122 root 1.24 Calls C<clGetProgramBuildInfo> with C<CL_PROGRAM_BUILD_OPTIONS> and returns the result.
1123 root 1.21
1124     =item $string = $program->build_log ($device)
1125    
1126 root 1.24 Calls C<clGetProgramBuildInfo> with C<CL_PROGRAM_BUILD_LOG> and returns the result.
1127 root 1.21
1128     =for gengetinfo end program_build
1129    
1130     =item $packed_value = $program->info ($name)
1131    
1132     See C<< $platform->info >> for details.
1133    
1134     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetProgramInfo.html>
1135    
1136     =for gengetinfo begin program
1137    
1138     =item $uint = $program->reference_count
1139    
1140 root 1.24 Calls C<clGetProgramInfo> with C<CL_PROGRAM_REFERENCE_COUNT> and returns the result.
1141 root 1.21
1142     =item $ctx = $program->context
1143    
1144 root 1.24 Calls C<clGetProgramInfo> with C<CL_PROGRAM_CONTEXT> and returns the result.
1145 root 1.21
1146     =item $uint = $program->num_devices
1147    
1148 root 1.24 Calls C<clGetProgramInfo> with C<CL_PROGRAM_NUM_DEVICES> and returns the result.
1149 root 1.21
1150     =item @devices = $program->devices
1151    
1152 root 1.24 Calls C<clGetProgramInfo> with C<CL_PROGRAM_DEVICES> and returns the result.
1153 root 1.21
1154     =item $string = $program->source
1155    
1156 root 1.24 Calls C<clGetProgramInfo> with C<CL_PROGRAM_SOURCE> and returns the result.
1157 root 1.21
1158     =item @ints = $program->binary_sizes
1159    
1160 root 1.24 Calls C<clGetProgramInfo> with C<CL_PROGRAM_BINARY_SIZES> and returns the result.
1161 root 1.21
1162     =for gengetinfo end program
1163    
1164 root 1.23 =item @blobs = $program->binaries
1165    
1166     Returns a string for the compiled binary for every device associated with
1167     the program, empty strings indicate missing programs, and an empty result
1168     means no program binaries are available.
1169    
1170     These "binaries" are often, in fact, informative low-level assembly
1171     sources.
1172    
1173     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetProgramInfo.html>
1174    
1175 root 1.5 =back
1176    
1177     =head2 THE OpenCL::Kernel CLASS
1178    
1179     =over 4
1180    
1181     =item $packed_value = $kernel->info ($name)
1182    
1183     See C<< $platform->info >> for details.
1184    
1185     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetKernelInfo.html>
1186    
1187 root 1.21 =for gengetinfo begin kernel
1188    
1189     =item $string = $kernel->function_name
1190    
1191 root 1.24 Calls C<clGetKernelInfo> with C<CL_KERNEL_FUNCTION_NAME> and returns the result.
1192 root 1.21
1193     =item $uint = $kernel->num_args
1194    
1195 root 1.24 Calls C<clGetKernelInfo> with C<CL_KERNEL_NUM_ARGS> and returns the result.
1196 root 1.21
1197     =item $uint = $kernel->reference_count
1198    
1199 root 1.24 Calls C<clGetKernelInfo> with C<CL_KERNEL_REFERENCE_COUNT> and returns the result.
1200 root 1.21
1201     =item $ctx = $kernel->context
1202    
1203 root 1.24 Calls C<clGetKernelInfo> with C<CL_KERNEL_CONTEXT> and returns the result.
1204 root 1.21
1205     =item $program = $kernel->program
1206    
1207 root 1.24 Calls C<clGetKernelInfo> with C<CL_KERNEL_PROGRAM> and returns the result.
1208 root 1.21
1209     =for gengetinfo end kernel
1210    
1211 root 1.20 =item $packed_value = $kernel->work_group_info ($device, $name)
1212    
1213     See C<< $platform->info >> for details.
1214    
1215     The reason this method is not called C<info> is that there already is an
1216     C<< ->info >> method.
1217    
1218     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetKernelWorkGroupInfo.html>
1219    
1220 root 1.21 =for gengetinfo begin kernel_work_group
1221    
1222     =item $int = $kernel->work_group_size ($device)
1223    
1224 root 1.24 Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_WORK_GROUP_SIZE> and returns the result.
1225 root 1.21
1226     =item @ints = $kernel->compile_work_group_size ($device)
1227    
1228 root 1.24 Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_COMPILE_WORK_GROUP_SIZE> and returns the result.
1229 root 1.21
1230     =item $ulong = $kernel->local_mem_size ($device)
1231    
1232 root 1.24 Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_LOCAL_MEM_SIZE> and returns the result.
1233 root 1.21
1234     =item $int = $kernel->preferred_work_group_size_multiple ($device)
1235    
1236 root 1.24 Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE> and returns the result.
1237 root 1.21
1238     =item $ulong = $kernel->private_mem_size ($device)
1239    
1240 root 1.24 Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_PRIVATE_MEM_SIZE> and returns the result.
1241 root 1.21
1242     =for gengetinfo end kernel_work_group
1243    
1244 root 1.5 =item $kernel->set_TYPE ($index, $value)
1245    
1246     This is a family of methods to set the kernel argument with the number C<$index> to the give C<$value>.
1247    
1248     TYPE is one of C<char>, C<uchar>, C<short>, C<ushort>, C<int>, C<uint>,
1249     C<long>, C<ulong>, C<half>, C<float>, C<double>, C<memory>, C<buffer>,
1250     C<image2d>, C<image3d>, C<sampler> or C<event>.
1251    
1252     Chars and integers (including the half type) are specified as integers,
1253     float and double as floating point values, memory/buffer/image2d/image3d
1254     must be an object of that type or C<undef>, and sampler and event must be
1255     objects of that type.
1256    
1257     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clSetKernelArg.html>
1258    
1259     =back
1260    
1261     =head2 THE OpenCL::Event CLASS
1262    
1263     This is the superclass for all event objects (including OpenCL::UserEvent
1264     objects).
1265    
1266     =over 4
1267    
1268 root 1.21 =item $ev->wait
1269    
1270     Waits for the event to complete.
1271    
1272     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clWaitForEvents.html>
1273    
1274 root 1.5 =item $packed_value = $ev->info ($name)
1275    
1276     See C<< $platform->info >> for details.
1277    
1278     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetEventInfo.html>
1279    
1280 root 1.21 =for gengetinfo begin event
1281    
1282     =item $queue = $event->command_queue
1283    
1284 root 1.24 Calls C<clGetEventInfo> with C<CL_EVENT_COMMAND_QUEUE> and returns the result.
1285 root 1.21
1286     =item $command_type = $event->command_type
1287    
1288 root 1.24 Calls C<clGetEventInfo> with C<CL_EVENT_COMMAND_TYPE> and returns the result.
1289 root 1.21
1290     =item $uint = $event->reference_count
1291    
1292 root 1.24 Calls C<clGetEventInfo> with C<CL_EVENT_REFERENCE_COUNT> and returns the result.
1293 root 1.21
1294     =item $uint = $event->command_execution_status
1295    
1296 root 1.24 Calls C<clGetEventInfo> with C<CL_EVENT_COMMAND_EXECUTION_STATUS> and returns the result.
1297 root 1.21
1298     =item $ctx = $event->context
1299    
1300 root 1.24 Calls C<clGetEventInfo> with C<CL_EVENT_CONTEXT> and returns the result.
1301 root 1.21
1302     =for gengetinfo end event
1303    
1304 root 1.20 =item $packed_value = $ev->profiling_info ($name)
1305    
1306     See C<< $platform->info >> for details.
1307    
1308     The reason this method is not called C<info> is that there already is an
1309     C<< ->info >> method.
1310    
1311     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetProfilingInfo.html>
1312    
1313 root 1.21 =for gengetinfo begin profiling
1314    
1315     =item $ulong = $event->profiling_command_queued
1316    
1317 root 1.24 Calls C<clGetEventProfilingInfo> with C<CL_PROFILING_COMMAND_QUEUED> and returns the result.
1318 root 1.21
1319     =item $ulong = $event->profiling_command_submit
1320    
1321 root 1.24 Calls C<clGetEventProfilingInfo> with C<CL_PROFILING_COMMAND_SUBMIT> and returns the result.
1322 root 1.21
1323     =item $ulong = $event->profiling_command_start
1324    
1325 root 1.24 Calls C<clGetEventProfilingInfo> with C<CL_PROFILING_COMMAND_START> and returns the result.
1326 root 1.21
1327     =item $ulong = $event->profiling_command_end
1328 root 1.5
1329 root 1.24 Calls C<clGetEventProfilingInfo> with C<CL_PROFILING_COMMAND_END> and returns the result.
1330 root 1.5
1331 root 1.21 =for gengetinfo end profiling
1332 root 1.5
1333     =back
1334    
1335     =head2 THE OpenCL::UserEvent CLASS
1336    
1337     This is a subclass of OpenCL::Event.
1338 root 1.4
1339 root 1.1 =over 4
1340    
1341 root 1.5 =item $ev->set_status ($execution_status)
1342    
1343     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clSetUserEventStatus.html>
1344    
1345     =back
1346    
1347 root 1.1 =cut
1348    
1349     package OpenCL;
1350    
1351 root 1.2 use common::sense;
1352    
1353 root 1.1 BEGIN {
1354 root 1.31 our $VERSION = '0.92';
1355 root 1.1
1356     require XSLoader;
1357     XSLoader::load (__PACKAGE__, $VERSION);
1358 root 1.3
1359 root 1.27 @OpenCL::Buffer::ISA =
1360     @OpenCL::Image::ISA = OpenCL::Memory::;
1361    
1362     @OpenCL::BufferObj::ISA = OpenCL::Buffer::;
1363 root 1.3
1364 root 1.27 @OpenCL::Image2D::ISA =
1365     @OpenCL::Image3D::ISA = OpenCL::Image::;
1366 root 1.5
1367 root 1.27 @OpenCL::UserEvent::ISA = OpenCL::Event::;
1368 root 1.1 }
1369    
1370     1;
1371    
1372     =head1 AUTHOR
1373    
1374     Marc Lehmann <schmorp@schmorp.de>
1375     http://home.schmorp.de/
1376    
1377     =cut
1378