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