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.19 by root, Sat Nov 19 19:54:04 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 (e.g. C<clGetPlatformIDs>, C<clGetPlatformInfo>),
232while this module uses underscores as word separator and often leaves out
233prefixes (C<OpenCL::platforms>, C<< $platform->info >>).
234
235=item * OpenCL often specifies fixed vector function arguments as short
236arrays (C<size_t origin[3]>), while this module explicitly expects the
237components as separate arguments (C<$orig_x, $orig_y, $orig_z>) in
238function calls.
239
240=item * Structures are often specified by flattening out their components
241as with short vectors, and returned as arrayrefs.
242
243=item * When enqueuing commands, the wait list is specified by adding
244extra arguments to the function - anywhere a C<$wait_events...> argument
245is documented this can be any number of event objects.
246
247=item * When enqueuing commands, if the enqueue method is called in void
248context, no event is created. In all other contexts an event is returned
249by the method.
250
251=item * This module expects all functions to return C<CL_SUCCESS>. If any
252other status is returned the function will throw an exception, so you
253don't normally have to to any error checking.
254
255=back
256
257=head2 PERL AND OPENCL TYPES
258
259This handy(?) table lists OpenCL types and their perl, PDL and pack/unpack
260format equivalents:
261
262 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
275=head2 THE OpenCL PACKAGE
276
277=over 4
278
279=item $int = OpenCL::errno
280
281The last error returned by a function - it's only valid after an error occured
282and before calling another OpenCL function.
283
284=item $str = OpenCL::err2str $errval
285
286Comverts an error value into a human readable string.
287
288=item $str = OpenCL::enum2str $enum
289
290Converts most enum values (inof parameter names, image format constants,
291object types, addressing and filter modes, command types etc.) into a
292human readbale string. When confronted with some random integer it can be
293very helpful to pass it through this function to maybe get some readable
294string out of it.
295
296=item @platforms = OpenCL::platforms
297
298Returns all available OpenCL::Platform objects.
299
300L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetPlatformIDs.html>
301
302=item $ctx = OpenCL::context_from_type $properties, $type = OpenCL::DEVICE_TYPE_DEFAULT, $notify = undef
303
304Tries to create a context from a default device and platform - never worked for me.
305
306L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContextFromType.html>
307
308=item OpenCL::wait_for_events $wait_events...
309
310Waits for all events to complete.
311
312L<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
322Calls C<clGetPlatformInfo> and returns the packed, raw value - for
323strings, this will be the string, for other values you probably need to
324use the correct C<unpack>. This might get improved in the future. Hopefully.
325
326L<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
330Returns a list of matching OpenCL::Device objects.
331
332=item $ctx = $platform->context_from_type ($properties, $type = OpenCL::DEVICE_TYPE_DEFAULT, $notify = undef)
333
334Tries to create a context. Never worked for me, and you need devices explitly anyway.
335
336L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContextFromType.html>
337
338=item $ctx = $device->context ($properties = undef, @$devices, $notify = undef)
339
340Create a new OpenCL::Context object using the given device object(s)- a
341CL_CONTEXT_PLATFORM property is supplied automatically.
342
343L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContext.html>
344
345=back
346
347=head2 THE OpenCL::Device CLASS
348
349=over 4
350
351=item $packed_value = $device->info ($name)
352
353See C<< $platform->info >> for details.
354
355L<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
365See C<< $platform->info >> for details.
366
367L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetContextInfo.html>
368
369=item $queue = $ctx->queue ($device, $properties)
370
371Create a new OpenCL::Queue object from the context and the given device.
372
373L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateCommandQueue.html>
374
375=item $ev = $ctx->user_event
376
377Creates a new OpenCL::UserEvent object.
378
379L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateUserEvent.html>
380
381=item $buf = $ctx->buffer ($flags, $len)
382
383Creates a new OpenCL::Buffer object with the given flags and octet-size.
384
385L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateBuffer.html>
386
387=item $buf = $ctx->buffer_sv ($flags, $data)
388
389Creates a new OpenCL::Buffer object and initialise it with the given data values.
390
391=item $img = $ctx->image2d ($flags, $channel_order, $channel_type, $width, $height, $row_pitch = 0, $data = undef)
392
393Creates a new OpenCL::Image2D object and optionally initialises it with the given data values.
394
395L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateImage2D.html>
396
397=item $img = $ctx->image3d ($flags, $channel_order, $channel_type, $width, $height, $depth, $row_pitch = 0, $slice_pitch = 0, $data = undef)
398
399Creates a new OpenCL::Image3D object and optionally initialises it with the given data values.
400
401L<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
405Returns a list of matching image formats - each format is an arrayref with
406two values, $channel_order and $channel_type, in it.
407
408L<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
412Creates a new OpenCL::Sampler object.
413
414L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateSampler.html>
415
416=item $program = $ctx->program_with_source ($string)
417
418Creates a new OpenCL::Program object from the given source code.
419
420L<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
426An OpenCL::Queue represents an execution queue for OpenCL. You execute
427requests by calling their respective C<enqueue_xxx> method and waitinf for
428it to complete in some way.
429
430All the enqueue methods return an event object that can be used to wait
431for completion, unless the method is called in void context, in which case
432no event object is created.
433
434They also allow you to specify any number of other event objects that this
435request has to wait for before it starts executing, by simply passing the
436event objects as extra parameters to the enqueue methods.
437
438Queues execute in-order by default, without any parallelism, so in most
439cases (i.e. you use only one queue) it's not necessary to wait for or
440create event objects.
441
442=over 4
443
444=item $packed_value = $ctx->info ($name)
445
446See C<< $platform->info >> for details.
447
448L<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
452Reads data from buffer into the given string.
453
454L<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
458Writes data to buffer from the given string.
459
460L<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
464L<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
468L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadImage.html>
469
470=item $ev = $queue->enqueue_write_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...)
471
472L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteImage.html>
473
474=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
476Yeah.
477
478L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferRect.html>
479
480=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
482L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferToImage.html>.
483
484=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
486L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyImage.html>
487
488=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
490L<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
494L<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
498Enqueues a kernel execution.
499
500@$global_work_size must be specified as a reference to an array of
501integers specifying the work sizes (element counts).
502
503@$global_work_offset must be either C<undef> (in which case all offsets
504are C<0>), or a reference to an array of work offsets, with the same number
505of elements as @$global_work_size.
506
507@$local_work_size must be either C<undef> (in which case the
508implementation is supposed to choose good local work sizes), or a
509reference to an array of local work sizes, with the same number of
510elements as @$global_work_size.
511
512L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueNDRangeKernel.html>
513
514=item $ev = $queue->enqueue_marker
515
516L<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
520L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWaitForEvents.html>
521
522=item $queue->enqueue_barrier
523
524L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueBarrier.html>
525
526=item $queue->flush
527
528L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clFlush.html>
529
530=item $queue->finish
531
532L<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
538This the superclass of all memory objects - OpenCL::Buffer, OpenCL::Image,
539OpenCL::Image2D and OpenCL::Image3D. The subclasses of this class
540currently only exist to allow type-checking.
541
542=over 4
543
544=item $packed_value = $memory->info ($name)
545
546See C<< $platform->info >> for details.
547
548L<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
558See C<< $platform->info >> for details.
559
560L<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
570See C<< $platform->info >> for details.
571
572L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetProgramInfo.html>
573
574=item $program->build ($device, $options = "")
575
576Tries to build the program with the givne options.
577
578L<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
582Similar to C<< $platform->info >>, but returns build info for a previous
583build attempt for the given device.
584
585L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetBuildInfo.html>
586
587=item $kernel = $program->kernel ($function_name)
588
589Creates an OpenCL::Kernel object out of the named C<__kernel> function in
590the program.
591
592L<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
602See C<< $platform->info >> for details.
603
604L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetKernelInfo.html>
605
606=item $kernel->set_TYPE ($index, $value)
607
608This is a family of methods to set the kernel argument with the number C<$index> to the give C<$value>.
609
610TYPE is one of C<char>, C<uchar>, C<short>, C<ushort>, C<int>, C<uint>,
611C<long>, C<ulong>, C<half>, C<float>, C<double>, C<memory>, C<buffer>,
612C<image2d>, C<image3d>, C<sampler> or C<event>.
613
614Chars and integers (including the half type) are specified as integers,
615float and double as floating point values, memory/buffer/image2d/image3d
616must be an object of that type or C<undef>, and sampler and event must be
617objects of that type.
618
619L<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
625This is the superclass for all event objects (including OpenCL::UserEvent
626objects).
627
628=over 4
629
630=item $packed_value = $ev->info ($name)
631
632See C<< $platform->info >> for details.
633
634L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetEventInfo.html>
635
636=item $ev->wait
637
638Waits for the event to complete.
639
640L<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
646This is a subclass of OpenCL::Event.
647
648=over 4
649
650=item $ev->set_status ($execution_status)
651
652L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clSetUserEventStatus.html>
653
654=back
32 655
33=cut 656=cut
34 657
35package OpenCL; 658package OpenCL;
36 659
37use common::sense; 660use common::sense;
38 661
39BEGIN { 662BEGIN {
40 our $VERSION = '0.01'; 663 our $VERSION = '0.15';
41 664
42 require XSLoader; 665 require XSLoader;
43 XSLoader::load (__PACKAGE__, $VERSION); 666 XSLoader::load (__PACKAGE__, $VERSION);
667
668 @OpenCL::Buffer::ISA =
669 @OpenCL::Image::ISA = OpenCL::Memory::;
670
671 @OpenCL::Image2D::ISA =
672 @OpenCL::Image3D::ISA = OpenCL::Image::;
673
674 @OpenCL::UserEvent::ISA = OpenCL::Event::;
44} 675}
45 676
461; 6771;
47
48=back
49 678
50=head1 AUTHOR 679=head1 AUTHOR
51 680
52 Marc Lehmann <schmorp@schmorp.de> 681 Marc Lehmann <schmorp@schmorp.de>
53 http://home.schmorp.de/ 682 http://home.schmorp.de/

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines