ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/OpenCL/OpenCL.pm
Revision: 1.18
Committed: Thu Nov 17 06:22:29 2011 UTC (12 years, 6 months ago) by root
Branch: MAIN
CVS Tags: rel-0_15
Changes since 1.17: +10 -6 lines
Log Message:
0.15

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     OpenCL::Memory objects of various flavours: OpenCL::Buffers 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.10 printf "platform: %s\n", $platform->info (OpenCL::PLATFORM_NAME);
107     printf "extensions: %s\n", $platform->info (OpenCL::PLATFORM_EXTENSIONS);
108 root 1.1 for my $device ($platform->devices) {
109 root 1.10 printf "+ device: %s\n", $device->info (OpenCL::DEVICE_NAME);
110     my $ctx = $device->context;
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     __kernel void
155     squareit (__global float *input, __global float *output)
156     {
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     or die $prog->build_info ($dev, OpenCL::PROGRAM_BUILD_LOG);
167    
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     =item * OpenCL uses CamelCase for function names (C<clGetPlatformInfo>),
232     while this module uses underscores as word separator and often leaves out
233     prefixes (C<< $platform->info >>).
234    
235     =item * OpenCL often specifies fixed vector function arguments as short
236 root 1.15 arrays (C<$origin[3]>), while this module explicitly expects the
237 root 1.5 components as separate arguments-
238    
239 root 1.13 =item * Structures are often specified with their components, and returned
240     as arrayrefs.
241    
242 root 1.9 =item * Where possible, one of the pitch values is calculated from the
243     perl scalar length and need not be specified.
244 root 1.5
245     =item * When enqueuing commands, the wait list is specified by adding
246 root 1.9 extra arguments to the function - anywhere a C<$wait_events...> argument
247 root 1.5 is documented this can be any number of event objects.
248    
249     =item * When enqueuing commands, if the enqueue method is called in void
250     context, no event is created. In all other contexts an event is returned
251     by the method.
252    
253     =item * This module expects all functions to return C<CL_SUCCESS>. If any
254     other status is returned the function will throw an exception, so you
255     don't normally have to to any error checking.
256    
257     =back
258    
259 root 1.7 =head2 PERL AND OPENCL TYPES
260    
261 root 1.8 This handy(?) table lists OpenCL types and their perl, PDL and pack/unpack
262 root 1.7 format equivalents:
263    
264 root 1.8 OpenCL perl PDL pack/unpack
265     char IV - c
266     uchar IV byte C
267     short IV short s
268     ushort IV ushort S
269     int IV long? l
270     uint IV - L
271     long IV longlong q
272     ulong IV - Q
273     float NV float f
274     half IV ushort S
275     double NV double d
276 root 1.7
277 root 1.5 =head2 THE OpenCL PACKAGE
278    
279     =over 4
280    
281     =item $int = OpenCL::errno
282    
283 root 1.11 The last error returned by a function - it's only valid after an error occured
284     and before calling another OpenCL function.
285 root 1.5
286     =item $str = OpenCL::err2str $errval
287    
288     Comverts an error value into a human readable string.
289    
290 root 1.9 =item $str = OpenCL::enum2str $enum
291 root 1.5
292     Converts most enum values (inof parameter names, image format constants,
293     object types, addressing and filter modes, command types etc.) into a
294     human readbale string. When confronted with some random integer it can be
295     very helpful to pass it through this function to maybe get some readable
296     string out of it.
297    
298     =item @platforms = OpenCL::platforms
299    
300     Returns all available OpenCL::Platform objects.
301    
302     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetPlatformIDs.html>
303    
304 root 1.10 =item $ctx = OpenCL::context_from_type $properties, $type = OpenCL::DEVICE_TYPE_DEFAULT, $notify = undef
305 root 1.5
306     Tries to create a context from a default device and platform - never worked for me.
307    
308     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContextFromType.html>
309    
310     =item OpenCL::wait_for_events $wait_events...
311    
312     Waits for all events to complete.
313    
314     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clWaitForEvents.html>
315    
316     =back
317    
318     =head2 THE OpenCL::Platform CLASS
319    
320     =over 4
321    
322     =item $packed_value = $platform->info ($name)
323    
324     Calls C<clGetPlatformInfo> and returns the packed, raw value - for
325     strings, this will be the string, for other values you probably need to
326     use the correct C<unpack>. This might get improved in the future. Hopefully.
327    
328     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetPlatformInfo.html>
329    
330     =item @devices = $platform->devices ($type = OpenCL::DEVICE_TYPE_ALL)
331    
332     Returns a list of matching OpenCL::Device objects.
333    
334 root 1.10 =item $ctx = $platform->context_from_type ($properties, $type = OpenCL::DEVICE_TYPE_DEFAULT, $notify = undef)
335 root 1.5
336 root 1.11 Tries to create a context. Never worked for me, and you need devices explitly anyway.
337 root 1.5
338     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContextFromType.html>
339    
340 root 1.11 =item $ctx = $device->context ($properties = undef, @$devices, $notify = undef)
341    
342     Create a new OpenCL::Context object using the given device object(s)- a
343     CL_CONTEXT_PLATFORM property is supplied automatically.
344    
345     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContext.html>
346    
347 root 1.5 =back
348    
349     =head2 THE OpenCL::Device CLASS
350    
351     =over 4
352    
353     =item $packed_value = $device->info ($name)
354    
355     See C<< $platform->info >> for details.
356    
357     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetDeviceInfo.html>
358    
359     =back
360    
361     =head2 THE OpenCL::Context CLASS
362    
363     =over 4
364    
365     =item $packed_value = $ctx->info ($name)
366    
367     See C<< $platform->info >> for details.
368    
369     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetContextInfo.html>
370    
371 root 1.9 =item $queue = $ctx->queue ($device, $properties)
372 root 1.5
373 root 1.9 Create a new OpenCL::Queue object from the context and the given device.
374 root 1.5
375     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateCommandQueue.html>
376    
377     =item $ev = $ctx->user_event
378    
379     Creates a new OpenCL::UserEvent object.
380    
381     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateUserEvent.html>
382    
383     =item $buf = $ctx->buffer ($flags, $len)
384    
385     Creates a new OpenCL::Buffer object with the given flags and octet-size.
386    
387     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateBuffer.html>
388    
389     =item $buf = $ctx->buffer_sv ($flags, $data)
390    
391     Creates a new OpenCL::Buffer object and initialise it with the given data values.
392    
393 root 1.18 =item $img = $ctx->image2d ($flags, $channel_order, $channel_type, $width, $height, $row_pitch = 0, $data = undef)
394 root 1.5
395     Creates a new OpenCL::Image2D object and optionally initialises it with the given data values.
396    
397     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateImage2D.html>
398    
399 root 1.18 =item $img = $ctx->image3d ($flags, $channel_order, $channel_type, $width, $height, $depth, $row_pitch = 0, $slice_pitch = 0, $data = undef)
400 root 1.5
401     Creates a new OpenCL::Image3D object and optionally initialises it with the given data values.
402    
403     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateImage3D.html>
404    
405     =item @formats = $ctx->supported_image_formats ($flags, $image_type)
406    
407     Returns a list of matching image formats - each format is an arrayref with
408     two values, $channel_order and $channel_type, in it.
409    
410     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetSupportedImageFormats.html>
411    
412     =item $sampler = $ctx->sampler ($normalized_coords, $addressing_mode, $filter_mode)
413    
414     Creates a new OpenCL::Sampler object.
415    
416     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateSampler.html>
417    
418     =item $program = $ctx->program_with_source ($string)
419    
420     Creates a new OpenCL::Program object from the given source code.
421    
422     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateProgramWithSource.html>
423    
424     =back
425    
426     =head2 THE OpenCL::Queue CLASS
427    
428     An OpenCL::Queue represents an execution queue for OpenCL. You execute
429     requests by calling their respective C<enqueue_xxx> method and waitinf for
430     it to complete in some way.
431    
432     All the enqueue methods return an event object that can be used to wait
433     for completion, unless the method is called in void context, in which case
434     no event object is created.
435    
436     They also allow you to specify any number of other event objects that this
437     request has to wait for before it starts executing, by simply passing the
438     event objects as extra parameters to the enqueue methods.
439    
440     Queues execute in-order by default, without any parallelism, so in most
441 root 1.6 cases (i.e. you use only one queue) it's not necessary to wait for or
442     create event objects.
443 root 1.5
444     =over 4
445    
446     =item $packed_value = $ctx->info ($name)
447    
448     See C<< $platform->info >> for details.
449    
450     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetCommandQueueInfo.html>
451    
452     =item $ev = $queue->enqueue_read_buffer ($buffer, $blocking, $offset, $len, $data, $wait_events...)
453    
454     Reads data from buffer into the given string.
455    
456     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadBuffer.html>
457    
458     =item $ev = $queue->enqueue_write_buffer ($buffer, $blocking, $offset, $data, $wait_events...)
459    
460     Writes data to buffer from the given string.
461    
462     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteBuffer.html>
463    
464     =item $ev = $queue->enqueue_copy_buffer ($src, $dst, $src_offset, $dst_offset, $len, $wait_events...)
465    
466     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBuffer.html>
467    
468     =item $ev = $queue->enqueue_read_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...)
469    
470     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadImage.html>
471    
472 root 1.17 =item $ev = $queue->enqueue_write_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...)
473 root 1.5
474     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteImage.html>
475    
476 root 1.17 =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...)
477 root 1.5
478     Yeah.
479    
480     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferRect.html>
481    
482 root 1.15 =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...)
483 root 1.5
484     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferToImage.html>.
485    
486 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...)
487 root 1.5
488     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyImage.html>
489    
490 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...)
491 root 1.5
492     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyImageToBuffer.html>
493    
494     =item $ev = $queue->enqueue_task ($kernel, $wait_events...)
495    
496     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueTask.html>
497    
498     =item $ev = $queue->enqueue_nd_range_kernel ($kernel, @$global_work_offset, @$global_work_size, @$local_work_size, $wait_events...)
499    
500     Enqueues a kernel execution.
501    
502     @$global_work_size must be specified as a reference to an array of
503     integers specifying the work sizes (element counts).
504    
505     @$global_work_offset must be either C<undef> (in which case all offsets
506     are C<0>), or a reference to an array of work offsets, with the same number
507     of elements as @$global_work_size.
508    
509     @$local_work_size must be either C<undef> (in which case the
510     implementation is supposed to choose good local work sizes), or a
511     reference to an array of local work sizes, with the same number of
512     elements as @$global_work_size.
513    
514     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueNDRangeKernel.html>
515    
516     =item $ev = $queue->enqueue_marker
517    
518     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueMarker.html>
519    
520     =item $ev = $queue->enqueue_wait_for_events ($wait_events...)
521    
522     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWaitForEvents.html>
523    
524     =item $queue->enqueue_barrier
525    
526     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueBarrier.html>
527    
528     =item $queue->flush
529    
530     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clFlush.html>
531    
532     =item $queue->finish
533    
534     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clFinish.html>
535    
536     =back
537    
538     =head2 THE OpenCL::Memory CLASS
539    
540     This the superclass of all memory objects - OpenCL::Buffer, OpenCL::Image,
541     OpenCL::Image2D and OpenCL::Image3D. The subclasses of this class
542     currently only exist to allow type-checking.
543    
544     =over 4
545    
546     =item $packed_value = $memory->info ($name)
547    
548     See C<< $platform->info >> for details.
549    
550     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetMemObjectInfo.html>
551    
552     =back
553    
554     =head2 THE OpenCL::Sampler CLASS
555    
556     =over 4
557    
558     =item $packed_value = $sampler->info ($name)
559    
560     See C<< $platform->info >> for details.
561    
562     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetSamplerInfo.html>
563    
564     =back
565    
566     =head2 THE OpenCL::Program CLASS
567    
568     =over 4
569    
570     =item $packed_value = $program->info ($name)
571    
572     See C<< $platform->info >> for details.
573    
574     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetProgramInfo.html>
575    
576     =item $program->build ($device, $options = "")
577    
578     Tries to build the program with the givne options.
579    
580     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clBuildProgram.html>
581    
582     =item $packed_value = $program->build_info ($device, $name)
583    
584     Similar to C<< $platform->info >>, but returns build info for a previous
585     build attempt for the given device.
586    
587     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetBuildInfo.html>
588    
589     =item $kernel = $program->kernel ($function_name)
590    
591     Creates an OpenCL::Kernel object out of the named C<__kernel> function in
592     the program.
593    
594     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateKernel.html>
595    
596     =back
597    
598     =head2 THE OpenCL::Kernel CLASS
599    
600     =over 4
601    
602     =item $packed_value = $kernel->info ($name)
603    
604     See C<< $platform->info >> for details.
605    
606     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetKernelInfo.html>
607    
608     =item $kernel->set_TYPE ($index, $value)
609    
610     This is a family of methods to set the kernel argument with the number C<$index> to the give C<$value>.
611    
612     TYPE is one of C<char>, C<uchar>, C<short>, C<ushort>, C<int>, C<uint>,
613     C<long>, C<ulong>, C<half>, C<float>, C<double>, C<memory>, C<buffer>,
614     C<image2d>, C<image3d>, C<sampler> or C<event>.
615    
616     Chars and integers (including the half type) are specified as integers,
617     float and double as floating point values, memory/buffer/image2d/image3d
618     must be an object of that type or C<undef>, and sampler and event must be
619     objects of that type.
620    
621     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clSetKernelArg.html>
622    
623     =back
624    
625     =head2 THE OpenCL::Event CLASS
626    
627     This is the superclass for all event objects (including OpenCL::UserEvent
628     objects).
629    
630     =over 4
631    
632     =item $packed_value = $ev->info ($name)
633    
634     See C<< $platform->info >> for details.
635    
636     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetEventInfo.html>
637    
638     =item $ev->wait
639    
640     Waits for the event to complete.
641    
642     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clWaitForEvents.html>
643    
644     =back
645    
646     =head2 THE OpenCL::UserEvent CLASS
647    
648     This is a subclass of OpenCL::Event.
649 root 1.4
650 root 1.1 =over 4
651    
652 root 1.5 =item $ev->set_status ($execution_status)
653    
654     L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clSetUserEventStatus.html>
655    
656     =back
657    
658 root 1.1 =cut
659    
660     package OpenCL;
661    
662 root 1.2 use common::sense;
663    
664 root 1.1 BEGIN {
665 root 1.18 our $VERSION = '0.15';
666 root 1.1
667     require XSLoader;
668     XSLoader::load (__PACKAGE__, $VERSION);
669 root 1.3
670 root 1.5 @OpenCL::Buffer::ISA =
671     @OpenCL::Image::ISA = OpenCL::Memory::;
672 root 1.3
673 root 1.5 @OpenCL::Image2D::ISA =
674     @OpenCL::Image3D::ISA = OpenCL::Image::;
675    
676     @OpenCL::UserEvent::ISA = OpenCL::Event::;
677 root 1.1 }
678    
679     1;
680    
681     =head1 AUTHOR
682    
683     Marc Lehmann <schmorp@schmorp.de>
684     http://home.schmorp.de/
685    
686     =cut
687