ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/OpenCL/OpenCL.pm
(Generate patch)

Comparing OpenCL/OpenCL.pm (file contents):
Revision 1.2 by root, Tue Nov 15 09:24:40 2011 UTC vs.
Revision 1.18 by root, Thu Nov 17 06:22:29 2011 UTC

1=head1 NAME 1=head1 NAME
2 2
3OpenCL - bindings to, well, OpenCL 3OpenCL - Open Computing Language Bindings
4 4
5=head1 SYNOPSIS 5=head1 SYNOPSIS
6 6
7 use OpenCL; 7 use OpenCL;
8 8
9=head1 DESCRIPTION 9=head1 DESCRIPTION
10 10
11This is an early release which is not useful yet. 11This is an early release which might be useful, but hasn't seen much testing.
12 12
13=head2 OpenCL FROM 10000 FEET HEIGHT
14
15Here is a high level overview of OpenCL:
16
17First you need to find one or more OpenCL::Platforms (kind of like
18vendors) - usually there is only one.
19
20Each platform gives you access to a number of OpenCL::Device objects, e.g.
21your graphics card.
22
23From a platform and some device(s), you create an OpenCL::Context, which is
24a very central object in OpenCL: Once you have a context you can create
25most other objects:
26
27OpenCL::Program objects, which store source code and, after building for a
28specific device ("compiling and linking"), also binary programs. For each
29kernel function in a program you can then create an OpenCL::Kernel object
30which represents basically a function call with argument values.
31
32OpenCL::Memory objects of various flavours: OpenCL::Buffers objects (flat
33memory areas, think arrays or structs) and OpenCL::Image objects (think 2d
34or 3d array) for bulk data and input and output for kernels.
35
36OpenCL::Sampler objects, which are kind of like texture filter modes in
37OpenGL.
38
39OpenCL::Queue objects - command queues, which allow you to submit memory
40reads, writes and copies, as well as kernel calls to your devices. They
41also offer a variety of methods to synchronise request execution, for
42example with barriers or OpenCL::Event objects.
43
44OpenCL::Event objects are used to signal when something is complete.
45
46=head2 HELPFUL RESOURCES
47
48The OpenCL spec used to develop this module (1.2 spec was available, but
49no implementation was available to me :).
50
51 http://www.khronos.org/registry/cl/specs/opencl-1.1.pdf
52
53OpenCL manpages:
54
55 http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/
56
57If you are into UML class diagrams, the following diagram might help - if
58not, it will be mildly cobfusing:
59
60 http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/classDiagram.html
61
62Here's a tutorial from AMD (very AMD-centric, too), not sure how useful it
63is, 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
67And here's NVIDIA's OpenCL Best Practises Guide:
68
69 http://developer.download.nvidia.com/compute/cuda/3_2/toolkit/docs/OpenCL_Best_Practices_Guide.pdf
70
71=head1 BASIC WORKFLOW
72
73To get something done, you basically have to do this once (refer to the
74examples below for actual code, this is just a high-level description):
75
76Find some platform (e.g. the first one) and some device(s) (e.g. the first
77device of the platform), and create a context from those.
78
79Create program objects from your OpenCL source code, then build (compile)
80the programs for each device you want to run them on.
81
82Create kernel objects for all kernels you want to use (surprisingly, these
83are not device-specific).
84
85Then, to execute stuff, you repeat these steps, possibly resuing or
86sharing some buffers:
87
88Create some input and output buffers from your context. Set these as
89arguments to your kernel.
90
91Enqueue buffer writes to initialise your input buffers (when not
92initialised at creation time).
93
94Enqueue the kernel execution.
95
96Enqueue buffer reads for your output buffer to read results.
97
98=head1 EXAMPLES
99
13Enumerate all devices and get contexts for them; 100=head2 Enumerate all devices and get contexts for them.
101
102Best run this once to get a feel for the platforms and devices in your
103system.
14 104
15 for my $platform (OpenCL::platforms) { 105 for my $platform (OpenCL::platforms) {
16 warn $platform->info (OpenCL::PLATFORM_NAME); 106 printf "platform: %s\n", $platform->info (OpenCL::PLATFORM_NAME);
17 warn $platform->info (OpenCL::PLATFORM_EXTENSIONS); 107 printf "extensions: %s\n", $platform->info (OpenCL::PLATFORM_EXTENSIONS);
18 for my $device ($platform->devices) { 108 for my $device ($platform->devices) {
19 warn $device->info (OpenCL::DEVICE_NAME); 109 printf "+ device: %s\n", $device->info (OpenCL::DEVICE_NAME);
20 my $ctx = $device->context_simple; 110 my $ctx = $device->context;
21 # do stuff 111 # do stuff
22 } 112 }
23 } 113 }
24 114
25Get a useful context and a command queue: 115=head2 Get a useful context and a command queue.
26 116
27 my $dev = ((OpenCL::platforms)[0]->devices)[0]; 117This is a useful boilerplate for any OpenCL program that only wants to use
28 my $ctx = $dev->context_simple; 118one device,
29 my $queue = $ctx->command_queue_simple ($dev);
30 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
125=head2 Print all supported image formats of a context.
126
127Best run this once for your context, to see whats available and how to
128gather information.
129
130 for my $type (OpenCL::MEM_OBJECT_IMAGE2D, OpenCL::MEM_OBJECT_IMAGE3D) {
131 print "supported image formats for ", OpenCL::enum2str $type, "\n";
132
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,
139then asynchronously.
140
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 print "$data\n";
145
146 my $ev = $queue->enqueue_read_buffer ($buf, 0, 1, 3, my $data);
147 $ev->wait;
148 print "$data\n"; # prints "elm"
149
150=head2 Create and build a program, then create a kernel out of one of its
151functions.
152
153 my $src = '
154 __kernel void
155 squareit (__global float *input, __global float *output)
156 {
157 $id = get_global_id (0);
158 output [id] = input [id] * input [id];
159 }
160 ';
161
162 my $prog = $ctx->program_with_source ($src);
163
164 # build croaks on compile errors, so catch it and print the compile errors
165 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=head2 Create some input and output float buffers, then call the
171'squareit' kernel on them.
172
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 # enqueue a synchronous read
184 $queue->enqueue_read_buffer ($output, 1, 0, OpenCL::SIZEOF_FLOAT * 4, my $data);
185
186 # print the results:
187 printf "%s\n", join ", ", unpack "f*", $data;
188
189=head2 The same enqueue operations as before, but assuming an out-of-order queue,
190showing 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 $queue->enqueue_barrier;
197
198 # 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,
205showing 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 $ev->wait;
215
216=head1 DOCUMENTATION
217
218=head2 BASIC CONVENTIONS
219
220This is not a one-to-one C-style translation of OpenCL to Perl - instead
221I attempted to make the interface as type-safe as possible by introducing
222object syntax where it makes sense. There are a number of important
223differences between the OpenCL C API and this module:
224
31=over 4 225=over 4
226
227=item * Object lifetime managament is automatic - there is no need
228to free objects explicitly (C<clReleaseXXX>), the release function
229is called automatically once all Perl references to it go away.
230
231=item * OpenCL uses CamelCase for function names (C<clGetPlatformInfo>),
232while this module uses underscores as word separator and often leaves out
233prefixes (C<< $platform->info >>).
234
235=item * OpenCL often specifies fixed vector function arguments as short
236arrays (C<$origin[3]>), while this module explicitly expects the
237components as separate arguments-
238
239=item * Structures are often specified with their components, and returned
240as arrayrefs.
241
242=item * Where possible, one of the pitch values is calculated from the
243perl scalar length and need not be specified.
244
245=item * When enqueuing commands, the wait list is specified by adding
246extra arguments to the function - anywhere a C<$wait_events...> argument
247is documented this can be any number of event objects.
248
249=item * When enqueuing commands, if the enqueue method is called in void
250context, no event is created. In all other contexts an event is returned
251by the method.
252
253=item * This module expects all functions to return C<CL_SUCCESS>. If any
254other status is returned the function will throw an exception, so you
255don't normally have to to any error checking.
256
257=back
258
259=head2 PERL AND OPENCL TYPES
260
261This handy(?) table lists OpenCL types and their perl, PDL and pack/unpack
262format equivalents:
263
264 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
277=head2 THE OpenCL PACKAGE
278
279=over 4
280
281=item $int = OpenCL::errno
282
283The last error returned by a function - it's only valid after an error occured
284and before calling another OpenCL function.
285
286=item $str = OpenCL::err2str $errval
287
288Comverts an error value into a human readable string.
289
290=item $str = OpenCL::enum2str $enum
291
292Converts most enum values (inof parameter names, image format constants,
293object types, addressing and filter modes, command types etc.) into a
294human readbale string. When confronted with some random integer it can be
295very helpful to pass it through this function to maybe get some readable
296string out of it.
297
298=item @platforms = OpenCL::platforms
299
300Returns all available OpenCL::Platform objects.
301
302L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetPlatformIDs.html>
303
304=item $ctx = OpenCL::context_from_type $properties, $type = OpenCL::DEVICE_TYPE_DEFAULT, $notify = undef
305
306Tries to create a context from a default device and platform - never worked for me.
307
308L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContextFromType.html>
309
310=item OpenCL::wait_for_events $wait_events...
311
312Waits for all events to complete.
313
314L<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
324Calls C<clGetPlatformInfo> and returns the packed, raw value - for
325strings, this will be the string, for other values you probably need to
326use the correct C<unpack>. This might get improved in the future. Hopefully.
327
328L<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
332Returns a list of matching OpenCL::Device objects.
333
334=item $ctx = $platform->context_from_type ($properties, $type = OpenCL::DEVICE_TYPE_DEFAULT, $notify = undef)
335
336Tries to create a context. Never worked for me, and you need devices explitly anyway.
337
338L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContextFromType.html>
339
340=item $ctx = $device->context ($properties = undef, @$devices, $notify = undef)
341
342Create a new OpenCL::Context object using the given device object(s)- a
343CL_CONTEXT_PLATFORM property is supplied automatically.
344
345L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContext.html>
346
347=back
348
349=head2 THE OpenCL::Device CLASS
350
351=over 4
352
353=item $packed_value = $device->info ($name)
354
355See C<< $platform->info >> for details.
356
357L<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
367See C<< $platform->info >> for details.
368
369L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetContextInfo.html>
370
371=item $queue = $ctx->queue ($device, $properties)
372
373Create a new OpenCL::Queue object from the context and the given device.
374
375L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateCommandQueue.html>
376
377=item $ev = $ctx->user_event
378
379Creates a new OpenCL::UserEvent object.
380
381L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateUserEvent.html>
382
383=item $buf = $ctx->buffer ($flags, $len)
384
385Creates a new OpenCL::Buffer object with the given flags and octet-size.
386
387L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateBuffer.html>
388
389=item $buf = $ctx->buffer_sv ($flags, $data)
390
391Creates a new OpenCL::Buffer object and initialise it with the given data values.
392
393=item $img = $ctx->image2d ($flags, $channel_order, $channel_type, $width, $height, $row_pitch = 0, $data = undef)
394
395Creates a new OpenCL::Image2D object and optionally initialises it with the given data values.
396
397L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateImage2D.html>
398
399=item $img = $ctx->image3d ($flags, $channel_order, $channel_type, $width, $height, $depth, $row_pitch = 0, $slice_pitch = 0, $data = undef)
400
401Creates a new OpenCL::Image3D object and optionally initialises it with the given data values.
402
403L<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
407Returns a list of matching image formats - each format is an arrayref with
408two values, $channel_order and $channel_type, in it.
409
410L<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
414Creates a new OpenCL::Sampler object.
415
416L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateSampler.html>
417
418=item $program = $ctx->program_with_source ($string)
419
420Creates a new OpenCL::Program object from the given source code.
421
422L<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
428An OpenCL::Queue represents an execution queue for OpenCL. You execute
429requests by calling their respective C<enqueue_xxx> method and waitinf for
430it to complete in some way.
431
432All the enqueue methods return an event object that can be used to wait
433for completion, unless the method is called in void context, in which case
434no event object is created.
435
436They also allow you to specify any number of other event objects that this
437request has to wait for before it starts executing, by simply passing the
438event objects as extra parameters to the enqueue methods.
439
440Queues execute in-order by default, without any parallelism, so in most
441cases (i.e. you use only one queue) it's not necessary to wait for or
442create event objects.
443
444=over 4
445
446=item $packed_value = $ctx->info ($name)
447
448See C<< $platform->info >> for details.
449
450L<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
454Reads data from buffer into the given string.
455
456L<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
460Writes data to buffer from the given string.
461
462L<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
466L<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
470L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadImage.html>
471
472=item $ev = $queue->enqueue_write_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...)
473
474L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteImage.html>
475
476=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
478Yeah.
479
480L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferRect.html>
481
482=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
484L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferToImage.html>.
485
486=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
488L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyImage.html>
489
490=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
492L<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
496L<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
500Enqueues a kernel execution.
501
502@$global_work_size must be specified as a reference to an array of
503integers specifying the work sizes (element counts).
504
505@$global_work_offset must be either C<undef> (in which case all offsets
506are C<0>), or a reference to an array of work offsets, with the same number
507of elements as @$global_work_size.
508
509@$local_work_size must be either C<undef> (in which case the
510implementation is supposed to choose good local work sizes), or a
511reference to an array of local work sizes, with the same number of
512elements as @$global_work_size.
513
514L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueNDRangeKernel.html>
515
516=item $ev = $queue->enqueue_marker
517
518L<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
522L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWaitForEvents.html>
523
524=item $queue->enqueue_barrier
525
526L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueBarrier.html>
527
528=item $queue->flush
529
530L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clFlush.html>
531
532=item $queue->finish
533
534L<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
540This the superclass of all memory objects - OpenCL::Buffer, OpenCL::Image,
541OpenCL::Image2D and OpenCL::Image3D. The subclasses of this class
542currently only exist to allow type-checking.
543
544=over 4
545
546=item $packed_value = $memory->info ($name)
547
548See C<< $platform->info >> for details.
549
550L<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
560See C<< $platform->info >> for details.
561
562L<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
572See C<< $platform->info >> for details.
573
574L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetProgramInfo.html>
575
576=item $program->build ($device, $options = "")
577
578Tries to build the program with the givne options.
579
580L<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
584Similar to C<< $platform->info >>, but returns build info for a previous
585build attempt for the given device.
586
587L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetBuildInfo.html>
588
589=item $kernel = $program->kernel ($function_name)
590
591Creates an OpenCL::Kernel object out of the named C<__kernel> function in
592the program.
593
594L<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
604See C<< $platform->info >> for details.
605
606L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetKernelInfo.html>
607
608=item $kernel->set_TYPE ($index, $value)
609
610This is a family of methods to set the kernel argument with the number C<$index> to the give C<$value>.
611
612TYPE is one of C<char>, C<uchar>, C<short>, C<ushort>, C<int>, C<uint>,
613C<long>, C<ulong>, C<half>, C<float>, C<double>, C<memory>, C<buffer>,
614C<image2d>, C<image3d>, C<sampler> or C<event>.
615
616Chars and integers (including the half type) are specified as integers,
617float and double as floating point values, memory/buffer/image2d/image3d
618must be an object of that type or C<undef>, and sampler and event must be
619objects of that type.
620
621L<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
627This is the superclass for all event objects (including OpenCL::UserEvent
628objects).
629
630=over 4
631
632=item $packed_value = $ev->info ($name)
633
634See C<< $platform->info >> for details.
635
636L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetEventInfo.html>
637
638=item $ev->wait
639
640Waits for the event to complete.
641
642L<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
648This is a subclass of OpenCL::Event.
649
650=over 4
651
652=item $ev->set_status ($execution_status)
653
654L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clSetUserEventStatus.html>
655
656=back
32 657
33=cut 658=cut
34 659
35package OpenCL; 660package OpenCL;
36 661
37use common::sense; 662use common::sense;
38 663
39BEGIN { 664BEGIN {
40 our $VERSION = '0.01'; 665 our $VERSION = '0.15';
41 666
42 require XSLoader; 667 require XSLoader;
43 XSLoader::load (__PACKAGE__, $VERSION); 668 XSLoader::load (__PACKAGE__, $VERSION);
669
670 @OpenCL::Buffer::ISA =
671 @OpenCL::Image::ISA = OpenCL::Memory::;
672
673 @OpenCL::Image2D::ISA =
674 @OpenCL::Image3D::ISA = OpenCL::Image::;
675
676 @OpenCL::UserEvent::ISA = OpenCL::Event::;
44} 677}
45 678
461; 6791;
47
48=back
49 680
50=head1 AUTHOR 681=head1 AUTHOR
51 682
52 Marc Lehmann <schmorp@schmorp.de> 683 Marc Lehmann <schmorp@schmorp.de>
53 http://home.schmorp.de/ 684 http://home.schmorp.de/

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines