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

Comparing OpenCL/OpenCL.pm (file contents):
Revision 1.3 by root, Tue Nov 15 20:38:07 2011 UTC vs.
Revision 1.8 by root, Wed Nov 16 06:22:20 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=head1 HELPFUL RESOURCES 13=head1 HELPFUL RESOURCES
14 14
15The OpenCL spec used to dveelop this module (1.2 spec was available, but 15The OpenCL spec used to develop this module (1.2 spec was available, but
16no implementation was available to me :). 16no implementation was available to me :).
17 17
18 http://www.khronos.org/registry/cl/specs/opencl-1.1.pdf 18 http://www.khronos.org/registry/cl/specs/opencl-1.1.pdf
19 19
20OpenCL manpages: 20OpenCL manpages:
21 21
22 http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/ 22 http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/
23 23
24=head1 EXAMPLES 24=head1 EXAMPLES
25 25
26Enumerate all devices and get contexts for them; 26=head2 Enumerate all devices and get contexts for them.
27 27
28 for my $platform (OpenCL::platforms) { 28 for my $platform (OpenCL::platforms) {
29 warn $platform->info (OpenCL::PLATFORM_NAME); 29 warn $platform->info (OpenCL::PLATFORM_NAME);
30 warn $platform->info (OpenCL::PLATFORM_EXTENSIONS); 30 warn $platform->info (OpenCL::PLATFORM_EXTENSIONS);
31 for my $device ($platform->devices) { 31 for my $device ($platform->devices) {
33 my $ctx = $device->context_simple; 33 my $ctx = $device->context_simple;
34 # do stuff 34 # do stuff
35 } 35 }
36 } 36 }
37 37
38Get a useful context and a command queue: 38=head2 Get a useful context and a command queue.
39 39
40 my $dev = ((OpenCL::platforms)[0]->devices)[0]; 40 my $dev = ((OpenCL::platforms)[0]->devices)[0];
41 my $ctx = $dev->context_simple; 41 my $ctx = $dev->context_simple;
42 my $queue = $ctx->command_queue_simple ($dev); 42 my $queue = $ctx->command_queue_simple ($dev);
43 43
44Create a buffer with some predefined data, read it back synchronously,
45then asynchronously:
46
47 my $buf = $ctx->buffer_sv (OpenCL::MEM_COPY_HOST_PTR, "helmut");
48
49 $queue->enqueue_read_buffer ($buf, 1, 1, 3, my $data);
50 warn $data;
51
52 my $ev = $queue->enqueue_read_buffer ($buf, 0, 1, 3, my $data);
53 $ev->wait;
54 warn $data;
55
56Print all supported image formats: 44=head2 Print all supported image formats of a context.
57 45
58 for my $type (OpenCL::MEM_OBJECT_IMAGE2D, OpenCL::MEM_OBJECT_IMAGE3D) { 46 for my $type (OpenCL::MEM_OBJECT_IMAGE2D, OpenCL::MEM_OBJECT_IMAGE3D) {
59 say "supported image formats for ", OpenCL::enum2str $type; 47 say "supported image formats for ", OpenCL::enum2str $type;
60 48
61 for my $f ($ctx->supported_image_formats (0, $type)) { 49 for my $f ($ctx->supported_image_formats (0, $type)) {
62 printf " %-10s %-20s\n", OpenCL::enum2str $f->[0], OpenCL::enum2str $f->[1]; 50 printf " %-10s %-20s\n", OpenCL::enum2str $f->[0], OpenCL::enum2str $f->[1];
63 } 51 }
64 } 52 }
65 53
54=head2 Create a buffer with some predefined data, read it back synchronously,
55then asynchronously.
56
57 my $buf = $ctx->buffer_sv (OpenCL::MEM_COPY_HOST_PTR, "helmut");
58
59 $queue->enqueue_read_buffer ($buf, 1, 1, 3, my $data);
60 warn $data;
61
62 my $ev = $queue->enqueue_read_buffer ($buf, 0, 1, 3, my $data);
63 $ev->wait;
64 warn $data;
65
66Create and build a program, then create a kernel out of one of its 66=head2 Create and build a program, then create a kernel out of one of its
67functions: 67functions.
68 68
69 my $src = ' 69 my $src = '
70 __kernel void 70 __kernel void
71 squareit (__global float *input, __global float *output) 71 squareit (__global float *input, __global float *output)
72 { 72 {
80 eval { $prog->build ($dev); 1 } 80 eval { $prog->build ($dev); 1 }
81 or die $prog->build_info ($dev, OpenCL::PROGRAM_BUILD_LOG); 81 or die $prog->build_info ($dev, OpenCL::PROGRAM_BUILD_LOG);
82 82
83 my $kernel = $prog->kernel ("squareit"); 83 my $kernel = $prog->kernel ("squareit");
84 84
85=head2 Create some input and output float buffers, then call squareit on them.
86
87 my $input = $ctx->buffer_sv (OpenCL::MEM_COPY_HOST_PTR, pack "f*", 1, 2, 3, 4.5);
88 my $output = $ctx->buffer (0, OpenCL::SIZEOF_FLOAT * 5);
89
90 # set buffer
91 $kernel->set_buffer (0, $input);
92 $kernel->set_buffer (1, $output);
93
94 # execute it for all 4 numbers
95 $queue->enqueue_nd_range_kernel ($kernel, undef, [4], undef);
96
97 # enqueue a synchronous read
98 $queue->enqueue_read_buffer ($output, 1, 0, OpenCL::SIZEOF_FLOAT * 4, my $data);
99
100 # print the results:
101 say join ", ", unpack "f*", $data;
102
103=head2 The same enqueue operations as before, but assuming an out-of-order queue,
104showing off barriers.
105
106 # execute it for all 4 numbers
107 $queue->enqueue_nd_range_kernel ($kernel, undef, [4], undef);
108
109 # enqueue a barrier to ensure in-order execution
110 $queue->enqueue_barrier;
111
112 # enqueue an async read
113 $queue->enqueue_read_buffer ($output, 0, 0, OpenCL::SIZEOF_FLOAT * 4, my $data);
114
115 # wait for all requests to finish
116 $queue->finish;
117
118=head2 The same enqueue operations as before, but assuming an out-of-order queue,
119showing off event objects and wait lists.
120
121 # execute it for all 4 numbers
122 my $ev = $queue->enqueue_nd_range_kernel ($kernel, undef, [4], undef);
123
124 # enqueue an async read
125 $ev = $queue->enqueue_read_buffer ($output, 0, 0, OpenCL::SIZEOF_FLOAT * 4, my $data, $ev);
126
127 # wait for the last event to complete
128 $ev->wait;
129
130=head1 DOCUMENTATION
131
132=head2 BASIC CONVENTIONS
133
134This is not a 1:1 C-style translation of OpenCL to Perl - instead I
135attempted to make the interface as type-safe as possible and introducing
136object syntax where it makes sense. There are a number of important
137differences between the OpenCL C API and this module:
138
85=over 4 139=over 4
140
141=item * Object lifetime managament is automatic - there is no need
142to free objects explicitly (C<clReleaseXXX>), the release function
143is called automatically once all Perl references to it go away.
144
145=item * OpenCL uses CamelCase for function names (C<clGetPlatformInfo>),
146while this module uses underscores as word separator and often leaves out
147prefixes (C<< $platform->info >>).
148
149=item * OpenCL often specifies fixed vector function arguments as short
150arrays (C<size_t origin[3]>), while this module explicitly expects the
151components as separate arguments-
152
153=item * Where possible, the row_pitch value is calculated from the perl
154scalar length and need not be specified.
155
156=item * When enqueuing commands, the wait list is specified by adding
157extra arguments to the function - everywhere a C<$wait_events...> argument
158is documented this can be any number of event objects.
159
160=item * When enqueuing commands, if the enqueue method is called in void
161context, no event is created. In all other contexts an event is returned
162by the method.
163
164=item * This module expects all functions to return C<CL_SUCCESS>. If any
165other status is returned the function will throw an exception, so you
166don't normally have to to any error checking.
167
168=back
169
170=head2 PERL AND OPENCL TYPES
171
172This handy(?) table lists OpenCL types and their perl, PDL and pack/unpack
173format equivalents:
174
175 OpenCL perl PDL pack/unpack
176 char IV - c
177 uchar IV byte C
178 short IV short s
179 ushort IV ushort S
180 int IV long? l
181 uint IV - L
182 long IV longlong q
183 ulong IV - Q
184 float NV float f
185 half IV ushort S
186 double NV double d
187
188=head2 THE OpenCL PACKAGE
189
190=over 4
191
192=item $int = OpenCL::errno
193
194The last error returned by a function - it's only changed on errors.
195
196=item $str = OpenCL::err2str $errval
197
198Comverts an error value into a human readable string.
199
200=item $str = OpenCL::err2str $enum
201
202Converts most enum values (inof parameter names, image format constants,
203object types, addressing and filter modes, command types etc.) into a
204human readbale string. When confronted with some random integer it can be
205very helpful to pass it through this function to maybe get some readable
206string out of it.
207
208=item @platforms = OpenCL::platforms
209
210Returns all available OpenCL::Platform objects.
211
212L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetPlatformIDs.html>
213
214=item $ctx = OpenCL::context_from_type_simple $type = OpenCL::DEVICE_TYPE_DEFAULT
215
216Tries to create a context from a default device and platform - never worked for me.
217
218L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContextFromType.html>
219
220=item OpenCL::wait_for_events $wait_events...
221
222Waits for all events to complete.
223
224L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clWaitForEvents.html>
225
226=back
227
228=head2 THE OpenCL::Platform CLASS
229
230=over 4
231
232=item $packed_value = $platform->info ($name)
233
234Calls C<clGetPlatformInfo> and returns the packed, raw value - for
235strings, this will be the string, for other values you probably need to
236use the correct C<unpack>. This might get improved in the future. Hopefully.
237
238L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetPlatformInfo.html>
239
240=item @devices = $platform->devices ($type = OpenCL::DEVICE_TYPE_ALL)
241
242Returns a list of matching OpenCL::Device objects.
243
244=item $ctx = $platform->context_from_type_simple ($type = OpenCL::DEVICE_TYPE_DEFAULT)
245
246Tries to create a context. Never worked for me.
247
248L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContextFromType.html>
249
250=back
251
252=head2 THE OpenCL::Device CLASS
253
254=over 4
255
256=item $packed_value = $device->info ($name)
257
258See C<< $platform->info >> for details.
259
260L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetDeviceInfo.html>
261
262=item $ctx = $device->context_simple
263
264Convenience function to create a new OpenCL::Context object.
265
266L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContext.html>
267
268=back
269
270=head2 THE OpenCL::Context CLASS
271
272=over 4
273
274=item $packed_value = $ctx->info ($name)
275
276See C<< $platform->info >> for details.
277
278L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetContextInfo.html>
279
280=item $queue = $ctx->command_queue_simple ($device)
281
282Convenience function to create a new OpenCL::Queue object from the context and the given device.
283
284L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateCommandQueue.html>
285
286=item $ev = $ctx->user_event
287
288Creates a new OpenCL::UserEvent object.
289
290L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateUserEvent.html>
291
292=item $buf = $ctx->buffer ($flags, $len)
293
294Creates a new OpenCL::Buffer object with the given flags and octet-size.
295
296L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateBuffer.html>
297
298=item $buf = $ctx->buffer_sv ($flags, $data)
299
300Creates a new OpenCL::Buffer object and initialise it with the given data values.
301
302=item $img = $ctx->image2d ($flags, $channel_order, $channel_type, $width, $height, $data)
303
304Creates a new OpenCL::Image2D object and optionally initialises it with the given data values.
305
306L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateImage2D.html>
307
308=item $img = $ctx->image3d ($flags, $channel_order, $channel_type, $width, $height, $depth, $slice_pitch, $data)
309
310Creates a new OpenCL::Image3D object and optionally initialises it with the given data values.
311
312L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateImage3D.html>
313
314=item @formats = $ctx->supported_image_formats ($flags, $image_type)
315
316Returns a list of matching image formats - each format is an arrayref with
317two values, $channel_order and $channel_type, in it.
318
319L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetSupportedImageFormats.html>
320
321=item $sampler = $ctx->sampler ($normalized_coords, $addressing_mode, $filter_mode)
322
323Creates a new OpenCL::Sampler object.
324
325L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateSampler.html>
326
327=item $program = $ctx->program_with_source ($string)
328
329Creates a new OpenCL::Program object from the given source code.
330
331L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateProgramWithSource.html>
332
333=back
334
335=head2 THE OpenCL::Queue CLASS
336
337An OpenCL::Queue represents an execution queue for OpenCL. You execute
338requests by calling their respective C<enqueue_xxx> method and waitinf for
339it to complete in some way.
340
341All the enqueue methods return an event object that can be used to wait
342for completion, unless the method is called in void context, in which case
343no event object is created.
344
345They also allow you to specify any number of other event objects that this
346request has to wait for before it starts executing, by simply passing the
347event objects as extra parameters to the enqueue methods.
348
349Queues execute in-order by default, without any parallelism, so in most
350cases (i.e. you use only one queue) it's not necessary to wait for or
351create event objects.
352
353=over 4
354
355=item $packed_value = $ctx->info ($name)
356
357See C<< $platform->info >> for details.
358
359L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetCommandQueueInfo.html>
360
361=item $ev = $queue->enqueue_read_buffer ($buffer, $blocking, $offset, $len, $data, $wait_events...)
362
363Reads data from buffer into the given string.
364
365L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadBuffer.html>
366
367=item $ev = $queue->enqueue_write_buffer ($buffer, $blocking, $offset, $data, $wait_events...)
368
369Writes data to buffer from the given string.
370
371L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteBuffer.html>
372
373=item $ev = $queue->enqueue_copy_buffer ($src, $dst, $src_offset, $dst_offset, $len, $wait_events...)
374
375L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBuffer.html>
376
377=item $ev = $queue->enqueue_read_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...)
378
379L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadImage.html>
380
381=item $ev = $queue->enqueue_write_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $data, $wait_events...)
382
383L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteImage.html>
384
385=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, 4dst_row_pitch, $dst_slice_pitch, $ait_event...)
386
387Yeah.
388
389L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferRect.html>
390
391=item $ev = $queue->enqueue_copy_buffer_to_image (OpenCL::Buffer src, OpenCL::Image dst, size_t src_offset, size_t dst_x, size_t dst_y, size_t dst_z, size_t width, size_t height, size_t depth, ...)
392
393L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferToImage.html>.
394
395=item $ev = $queue->enqueue_copy_image (OpenCL::Image src, OpenCL::Buffer dst, size_t src_x, size_t src_y, size_t src_z, size_t dst_x, size_t dst_y, size_t dst_z, size_t width, size_t height, size_t depth, ...)
396
397L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyImage.html>
398
399=item $ev = $queue->enqueue_copy_image_to_buffer (OpenCL::Image src, OpenCL::Buffer dst, size_t src_x, size_t src_y, size_t src_z, size_t width, size_t height, size_t depth, size_t dst_offset, ...)
400
401L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyImageToBuffer.html>
402
403=item $ev = $queue->enqueue_task ($kernel, $wait_events...)
404
405L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueTask.html>
406
407=item $ev = $queue->enqueue_nd_range_kernel ($kernel, @$global_work_offset, @$global_work_size, @$local_work_size, $wait_events...)
408
409Enqueues a kernel execution.
410
411@$global_work_size must be specified as a reference to an array of
412integers specifying the work sizes (element counts).
413
414@$global_work_offset must be either C<undef> (in which case all offsets
415are C<0>), or a reference to an array of work offsets, with the same number
416of elements as @$global_work_size.
417
418@$local_work_size must be either C<undef> (in which case the
419implementation is supposed to choose good local work sizes), or a
420reference to an array of local work sizes, with the same number of
421elements as @$global_work_size.
422
423L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueNDRangeKernel.html>
424
425=item $ev = $queue->enqueue_marker
426
427L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueMarker.html>
428
429=item $ev = $queue->enqueue_wait_for_events ($wait_events...)
430
431L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWaitForEvents.html>
432
433=item $queue->enqueue_barrier
434
435L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueBarrier.html>
436
437=item $queue->flush
438
439L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clFlush.html>
440
441=item $queue->finish
442
443L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clFinish.html>
444
445=back
446
447=head2 THE OpenCL::Memory CLASS
448
449This the superclass of all memory objects - OpenCL::Buffer, OpenCL::Image,
450OpenCL::Image2D and OpenCL::Image3D. The subclasses of this class
451currently only exist to allow type-checking.
452
453=over 4
454
455=item $packed_value = $memory->info ($name)
456
457See C<< $platform->info >> for details.
458
459L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetMemObjectInfo.html>
460
461=back
462
463=head2 THE OpenCL::Sampler CLASS
464
465=over 4
466
467=item $packed_value = $sampler->info ($name)
468
469See C<< $platform->info >> for details.
470
471L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetSamplerInfo.html>
472
473=back
474
475=head2 THE OpenCL::Program CLASS
476
477=over 4
478
479=item $packed_value = $program->info ($name)
480
481See C<< $platform->info >> for details.
482
483L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetProgramInfo.html>
484
485=item $program->build ($device, $options = "")
486
487Tries to build the program with the givne options.
488
489L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clBuildProgram.html>
490
491=item $packed_value = $program->build_info ($device, $name)
492
493Similar to C<< $platform->info >>, but returns build info for a previous
494build attempt for the given device.
495
496L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetBuildInfo.html>
497
498=item $kernel = $program->kernel ($function_name)
499
500Creates an OpenCL::Kernel object out of the named C<__kernel> function in
501the program.
502
503L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateKernel.html>
504
505=back
506
507=head2 THE OpenCL::Kernel CLASS
508
509=over 4
510
511=item $packed_value = $kernel->info ($name)
512
513See C<< $platform->info >> for details.
514
515L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetKernelInfo.html>
516
517=item $kernel->set_TYPE ($index, $value)
518
519This is a family of methods to set the kernel argument with the number C<$index> to the give C<$value>.
520
521TYPE is one of C<char>, C<uchar>, C<short>, C<ushort>, C<int>, C<uint>,
522C<long>, C<ulong>, C<half>, C<float>, C<double>, C<memory>, C<buffer>,
523C<image2d>, C<image3d>, C<sampler> or C<event>.
524
525Chars and integers (including the half type) are specified as integers,
526float and double as floating point values, memory/buffer/image2d/image3d
527must be an object of that type or C<undef>, and sampler and event must be
528objects of that type.
529
530L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clSetKernelArg.html>
531
532=back
533
534=head2 THE OpenCL::Event CLASS
535
536This is the superclass for all event objects (including OpenCL::UserEvent
537objects).
538
539=over 4
540
541=item $packed_value = $ev->info ($name)
542
543See C<< $platform->info >> for details.
544
545L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetEventInfo.html>
546
547=item $ev->wait
548
549Waits for the event to complete.
550
551L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clWaitForEvents.html>
552
553=back
554
555=head2 THE OpenCL::UserEvent CLASS
556
557This is a subclass of OpenCL::Event.
558
559=over 4
560
561=item $ev->set_status ($execution_status)
562
563L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clSetUserEventStatus.html>
564
565=back
86 566
87=cut 567=cut
88 568
89package OpenCL; 569package OpenCL;
90 570
91use common::sense; 571use common::sense;
92 572
93BEGIN { 573BEGIN {
94 our $VERSION = '0.01'; 574 our $VERSION = '0.03';
95 575
96 require XSLoader; 576 require XSLoader;
97 XSLoader::load (__PACKAGE__, $VERSION); 577 XSLoader::load (__PACKAGE__, $VERSION);
98 578
99 @OpenCL::Buffer::ISA = 579 @OpenCL::Buffer::ISA =
100 @OpenCL::Image::ISA = OpenCL::Memory::; 580 @OpenCL::Image::ISA = OpenCL::Memory::;
101 581
102 @OpenCL::Image2D::ISA = 582 @OpenCL::Image2D::ISA =
103 @OpenCL::Image3D::ISA = OpenCL::Image::; 583 @OpenCL::Image3D::ISA = OpenCL::Image::;
584
585 @OpenCL::UserEvent::ISA = OpenCL::Event::;
104} 586}
105 587
1061; 5881;
107
108=back
109 589
110=head1 AUTHOR 590=head1 AUTHOR
111 591
112 Marc Lehmann <schmorp@schmorp.de> 592 Marc Lehmann <schmorp@schmorp.de>
113 http://home.schmorp.de/ 593 http://home.schmorp.de/

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines