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

Comparing OpenCL/OpenCL.pm (file contents):
Revision 1.5 by root, Wed Nov 16 00:35:30 2011 UTC vs.
Revision 1.20 by root, Sun Nov 20 01:09:48 2011 UTC

6 6
7 use OpenCL; 7 use OpenCL;
8 8
9=head1 DESCRIPTION 9=head1 DESCRIPTION
10 10
11This is an early release which might be useful, but hasn't seen any testing. 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::Buffer 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
13=head1 HELPFUL RESOURCES 46=head2 HELPFUL RESOURCES
14 47
15The OpenCL spec used to develop this module (1.2 spec was available, but 48The OpenCL spec used to develop this module (1.2 spec was available, but
16no implementation was available to me :). 49no implementation was available to me :).
17 50
18 http://www.khronos.org/registry/cl/specs/opencl-1.1.pdf 51 http://www.khronos.org/registry/cl/specs/opencl-1.1.pdf
19 52
20OpenCL manpages: 53OpenCL manpages:
21 54
22 http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/ 55 http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/
23 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
24=head1 EXAMPLES 98=head1 EXAMPLES
25 99
26=head2 Enumerate all devices and get contexts for them. 100=head2 Enumerate all devices and get contexts for them.
27 101
102Best run this once to get a feel for the platforms and devices in your
103system.
104
28 for my $platform (OpenCL::platforms) { 105 for my $platform (OpenCL::platforms) {
29 warn $platform->info (OpenCL::PLATFORM_NAME); 106 printf "platform: %s\n", $platform->info (OpenCL::PLATFORM_NAME);
30 warn $platform->info (OpenCL::PLATFORM_EXTENSIONS); 107 printf "extensions: %s\n", $platform->info (OpenCL::PLATFORM_EXTENSIONS);
31 for my $device ($platform->devices) { 108 for my $device ($platform->devices) {
32 warn $device->info (OpenCL::DEVICE_NAME); 109 printf "+ device: %s\n", $device->info (OpenCL::DEVICE_NAME);
33 my $ctx = $device->context_simple; 110 my $ctx = $device->context;
34 # do stuff 111 # do stuff
35 } 112 }
36 } 113 }
37 114
38=head2 Get a useful context and a command queue. 115=head2 Get a useful context and a command queue.
39 116
40 my $dev = ((OpenCL::platforms)[0]->devices)[0]; 117This is a useful boilerplate for any OpenCL program that only wants to use
41 my $ctx = $dev->context_simple; 118one device,
42 my $queue = $ctx->command_queue_simple ($dev); 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
43 124
44=head2 Print all supported image formats of a context. 125=head2 Print all supported image formats of a context.
45 126
127Best run this once for your context, to see whats available and how to
128gather information.
129
46 for my $type (OpenCL::MEM_OBJECT_IMAGE2D, OpenCL::MEM_OBJECT_IMAGE3D) { 130 for my $type (OpenCL::MEM_OBJECT_IMAGE2D, OpenCL::MEM_OBJECT_IMAGE3D) {
47 say "supported image formats for ", OpenCL::enum2str $type; 131 print "supported image formats for ", OpenCL::enum2str $type, "\n";
48 132
49 for my $f ($ctx->supported_image_formats (0, $type)) { 133 for my $f ($ctx->supported_image_formats (0, $type)) {
50 printf " %-10s %-20s\n", OpenCL::enum2str $f->[0], OpenCL::enum2str $f->[1]; 134 printf " %-10s %-20s\n", OpenCL::enum2str $f->[0], OpenCL::enum2str $f->[1];
51 } 135 }
52 } 136 }
55then asynchronously. 139then asynchronously.
56 140
57 my $buf = $ctx->buffer_sv (OpenCL::MEM_COPY_HOST_PTR, "helmut"); 141 my $buf = $ctx->buffer_sv (OpenCL::MEM_COPY_HOST_PTR, "helmut");
58 142
59 $queue->enqueue_read_buffer ($buf, 1, 1, 3, my $data); 143 $queue->enqueue_read_buffer ($buf, 1, 1, 3, my $data);
60 warn $data; 144 print "$data\n";
61 145
62 my $ev = $queue->enqueue_read_buffer ($buf, 0, 1, 3, my $data); 146 my $ev = $queue->enqueue_read_buffer ($buf, 0, 1, 3, my $data);
63 $ev->wait; 147 $ev->wait;
64 warn $data; 148 print "$data\n"; # prints "elm"
65 149
66=head2 Create and build a program, then create a kernel out of one of its 150=head2 Create and build a program, then create a kernel out of one of its
67functions. 151functions.
68 152
69 my $src = ' 153 my $src = '
70 __kernel void 154 __kernel void
71 squareit (__global float *input, __global float *output) 155 squareit (__global float *input, __global float *output)
72 { 156 {
73 size_t id = get_global_id (0); 157 $id = get_global_id (0);
74 output [id] = input [id] * input [id]; 158 output [id] = input [id] * input [id];
75 } 159 }
76 '; 160 ';
77 161
78 my $prog = $ctx->program_with_source ($src); 162 my $prog = $ctx->program_with_source ($src);
79 163
164 # build croaks on compile errors, so catch it and print the compile errors
80 eval { $prog->build ($dev); 1 } 165 eval { $prog->build ($dev); 1 }
81 or die $prog->build_info ($dev, OpenCL::PROGRAM_BUILD_LOG); 166 or die $prog->build_info ($dev, OpenCL::PROGRAM_BUILD_LOG);
82 167
83 my $kernel = $prog->kernel ("squareit"); 168 my $kernel = $prog->kernel ("squareit");
84 169
85=head2 Create some input and output float buffers, then call squareit on them. 170=head2 Create some input and output float buffers, then call the
171'squareit' kernel on them.
86 172
87 my $input = $ctx->buffer_sv (OpenCL::MEM_COPY_HOST_PTR, pack "f*", 1, 2, 3, 4.5); 173 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); 174 my $output = $ctx->buffer (0, OpenCL::SIZEOF_FLOAT * 5);
89 175
90 # set buffer 176 # set buffer
96 182
97 # enqueue a synchronous read 183 # enqueue a synchronous read
98 $queue->enqueue_read_buffer ($output, 1, 0, OpenCL::SIZEOF_FLOAT * 4, my $data); 184 $queue->enqueue_read_buffer ($output, 1, 0, OpenCL::SIZEOF_FLOAT * 4, my $data);
99 185
100 # print the results: 186 # print the results:
101 say join ", ", unpack "f*", $data; 187 printf "%s\n", join ", ", unpack "f*", $data;
102 188
103=head2 The same enqueue operations as before, but assuming an out-of-order queue, 189=head2 The same enqueue operations as before, but assuming an out-of-order queue,
104showing off barriers. 190showing off barriers.
105 191
106 # execute it for all 4 numbers 192 # execute it for all 4 numbers
129 215
130=head1 DOCUMENTATION 216=head1 DOCUMENTATION
131 217
132=head2 BASIC CONVENTIONS 218=head2 BASIC CONVENTIONS
133 219
134This is not a 1:1 C-style translation of OpenCL to Perl - instead I 220This is not a one-to-one C-style translation of OpenCL to Perl - instead
135attempted to make the interface as type-safe as possible and introducing 221I attempted to make the interface as type-safe as possible by introducing
136object syntax where it makes sense. There are a number of important 222object syntax where it makes sense. There are a number of important
137differences between the OpenCL C API and this module: 223differences between the OpenCL C API and this module:
138 224
139=over 4 225=over 4
140 226
141=item * Object lifetime managament is automatic - there is no need 227=item * Object lifetime managament is automatic - there is no need
142to free objects explicitly (C<clReleaseXXX>), the release function 228to free objects explicitly (C<clReleaseXXX>), the release function
143is called automatically once all Perl references to it go away. 229is called automatically once all Perl references to it go away.
144 230
145=item * OpenCL uses CamelCase for function names (C<clGetPlatformInfo>), 231=item * OpenCL uses CamelCase for function names
232(e.g. C<clGetPlatformIDs>, C<clGetPlatformInfo>), while this module
146while this module uses underscores as word separator and often leaves out 233uses underscores as word separator and often leaves out prefixes
147prefixes (C<< $platform->info >>). 234(C<OpenCL::platforms>, C<< $platform->info >>).
148 235
149=item * OpenCL often specifies fixed vector function arguments as short 236=item * OpenCL often specifies fixed vector function arguments as short
150arrays (C<size_t origin[3]>), while this module explicitly expects the 237arrays (C<size_t origin[3]>), while this module explicitly expects the
151components as separate arguments- 238components as separate arguments (C<$orig_x, $orig_y, $orig_z>) in
239function calls.
152 240
153=item * Where possible, the row_pitch value is calculated from the perl 241=item * Structures are often specified by flattening out their components
154scalar length and need not be specified. 242as with short vectors, and returned as arrayrefs.
155 243
156=item * When enqueuing commands, the wait list is specified by adding 244=item * When enqueuing commands, the wait list is specified by adding
157extra arguments to the function - everywhere a C<$wait_events...> argument 245extra arguments to the function - anywhere a C<$wait_events...> argument
158is documented this can be any number of event objects. 246is documented this can be any number of event objects.
159 247
160=item * When enqueuing commands, if the enqueue method is called in void 248=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 249context, no event is created. In all other contexts an event is returned
162by the method. 250by the method.
165other status is returned the function will throw an exception, so you 253other status is returned the function will throw an exception, so you
166don't normally have to to any error checking. 254don't normally have to to any error checking.
167 255
168=back 256=back
169 257
258=head2 PERL AND OPENCL TYPES
259
260This handy(?) table lists OpenCL types and their perl, PDL and pack/unpack
261format equivalents:
262
263 OpenCL perl PDL pack/unpack
264 char IV - c
265 uchar IV byte C
266 short IV short s
267 ushort IV ushort S
268 int IV long? l
269 uint IV - L
270 long IV longlong q
271 ulong IV - Q
272 float NV float f
273 half IV ushort S
274 double NV double d
275
170=head2 THE OpenCL PACKAGE 276=head2 THE OpenCL PACKAGE
171 277
172=over 4 278=over 4
173 279
174=item $int = OpenCL::errno 280=item $int = OpenCL::errno
175 281
176The last error returned by a function - it's only changed on errors. 282The last error returned by a function - it's only valid after an error occured
283and before calling another OpenCL function.
177 284
178=item $str = OpenCL::err2str $errval 285=item $str = OpenCL::err2str $errval
179 286
180Comverts an error value into a human readable string. 287Comverts an error value into a human readable string.
181 288
182=item $str = OpenCL::err2str $enum 289=item $str = OpenCL::enum2str $enum
183 290
184Converts most enum values (inof parameter names, image format constants, 291Converts most enum values (inof parameter names, image format constants,
185object types, addressing and filter modes, command types etc.) into a 292object types, addressing and filter modes, command types etc.) into a
186human readbale string. When confronted with some random integer it can be 293human readbale string. When confronted with some random integer it can be
187very helpful to pass it through this function to maybe get some readable 294very helpful to pass it through this function to maybe get some readable
191 298
192Returns all available OpenCL::Platform objects. 299Returns all available OpenCL::Platform objects.
193 300
194L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetPlatformIDs.html> 301L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetPlatformIDs.html>
195 302
196=item $ctx = OpenCL::context_from_type_simple $type = OpenCL::DEVICE_TYPE_DEFAULT 303=item $ctx = OpenCL::context_from_type $properties, $type = OpenCL::DEVICE_TYPE_DEFAULT, $notify = undef
197 304
198Tries to create a context from a default device and platform - never worked for me. 305Tries to create a context from a default device and platform - never worked for me.
199 306
200L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContextFromType.html> 307L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContextFromType.html>
201 308
208=back 315=back
209 316
210=head2 THE OpenCL::Platform CLASS 317=head2 THE OpenCL::Platform CLASS
211 318
212=over 4 319=over 4
320
321=item @devices = $platform->devices ($type = OpenCL::DEVICE_TYPE_ALL)
322
323Returns a list of matching OpenCL::Device objects.
324
325=item $ctx = $platform->context_from_type ($properties, $type = OpenCL::DEVICE_TYPE_DEFAULT, $notify = undef)
326
327Tries to create a context. Never worked for me, and you need devices explitly anyway.
328
329L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContextFromType.html>
330
331=item $ctx = $device->context ($properties = undef, @$devices, $notify = undef)
332
333Create a new OpenCL::Context object using the given device object(s)- a
334CL_CONTEXT_PLATFORM property is supplied automatically.
335
336L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContext.html>
213 337
214=item $packed_value = $platform->info ($name) 338=item $packed_value = $platform->info ($name)
215 339
216Calls C<clGetPlatformInfo> and returns the packed, raw value - for 340Calls C<clGetPlatformInfo> and returns the packed, raw value - for
217strings, this will be the string, for other values you probably need to 341strings, this will be the string, for other values you probably need to
218use the correct C<unpack>. This might get improved in the future. Hopefully. 342use the correct C<unpack>.
343
344It's best to avoid this method and use one of the predefined C<get_*>
345methods.
219 346
220L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetPlatformInfo.html> 347L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetPlatformInfo.html>
221 348
222=item @devices = $platform->devices ($type = OpenCL::DEVICE_TYPE_ALL) 349=for gengetinfo begin platform
223 350
224Returns a list of matching OpenCL::Device objects.
225 351
226=item $ctx = $platform->context_from_type_simple ($type = OpenCL::DEVICE_TYPE_DEFAULT) 352=item $string = $platform->profile
227 353
228Tries to create a context. Never worked for me. 354Calls C<clGetPlatformInfo> with C<CL_PLATFORM_PROFILE> and returns the result(s).
229 355
230L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContextFromType.html> 356=item $string = $platform->version
357
358Calls C<clGetPlatformInfo> with C<CL_PLATFORM_VERSION> and returns the result(s).
359
360=item $string = $platform->name
361
362Calls C<clGetPlatformInfo> with C<CL_PLATFORM_NAME> and returns the result(s).
363
364=item $string = $platform->vendor
365
366Calls C<clGetPlatformInfo> with C<CL_PLATFORM_VENDOR> and returns the result(s).
367
368=item $string = $platform->extensions
369
370Calls C<clGetPlatformInfo> with C<CL_PLATFORM_EXTENSIONS> and returns the result(s).
371=for gengetinfo end platform
231 372
232=back 373=back
233 374
234=head2 THE OpenCL::Device CLASS 375=head2 THE OpenCL::Device CLASS
235 376
239 380
240See C<< $platform->info >> for details. 381See C<< $platform->info >> for details.
241 382
242L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetDeviceInfo.html> 383L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetDeviceInfo.html>
243 384
244=item $ctx = $device->context_simple
245
246Convenience function to create a new OpenCL::Context object.
247
248L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContext.html>
249
250=back 385=back
251 386
252=head2 THE OpenCL::Context CLASS 387=head2 THE OpenCL::Context CLASS
253 388
254=over 4 389=over 4
255 390
256=item $packed_value = $ctx->info ($name) 391=item $queue = $ctx->queue ($device, $properties)
257 392
258See C<< $platform->info >> for details.
259
260L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetContextInfo.html>
261
262=item $queue = $ctx->command_queue_simple ($device)
263
264Convenience function to create a new OpenCL::Queue object from the context and the given device. 393Create a new OpenCL::Queue object from the context and the given device.
265 394
266L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateCommandQueue.html> 395L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateCommandQueue.html>
267 396
268=item $ev = $ctx->user_event 397=item $ev = $ctx->user_event
269 398
279 408
280=item $buf = $ctx->buffer_sv ($flags, $data) 409=item $buf = $ctx->buffer_sv ($flags, $data)
281 410
282Creates a new OpenCL::Buffer object and initialise it with the given data values. 411Creates a new OpenCL::Buffer object and initialise it with the given data values.
283 412
284=item $img = $ctx->image2d ($flags, $channel_order, $channel_type, $width, $height, $data) 413=item $img = $ctx->image2d ($flags, $channel_order, $channel_type, $width, $height, $row_pitch = 0, $data = undef)
285 414
286Creates a new OpenCL::Image2D object and optionally initialises it with the given data values. 415Creates a new OpenCL::Image2D object and optionally initialises it with the given data values.
287 416
288L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateImage2D.html> 417L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateImage2D.html>
289 418
290=item $img = $ctx->image3d ($flags, $channel_order, $channel_type, $width, $height, $depth, $slice_pitch, $data) 419=item $img = $ctx->image3d ($flags, $channel_order, $channel_type, $width, $height, $depth, $row_pitch = 0, $slice_pitch = 0, $data = undef)
291 420
292Creates a new OpenCL::Image3D object and optionally initialises it with the given data values. 421Creates a new OpenCL::Image3D object and optionally initialises it with the given data values.
293 422
294L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateImage3D.html> 423L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateImage3D.html>
295 424
309=item $program = $ctx->program_with_source ($string) 438=item $program = $ctx->program_with_source ($string)
310 439
311Creates a new OpenCL::Program object from the given source code. 440Creates a new OpenCL::Program object from the given source code.
312 441
313L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateProgramWithSource.html> 442L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateProgramWithSource.html>
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/clGetContextInfo.html>
449
450=for gengetinfo begin context
451
452=for gengetinfo end context
314 453
315=back 454=back
316 455
317=head2 THE OpenCL::Queue CLASS 456=head2 THE OpenCL::Queue CLASS
318 457
327They also allow you to specify any number of other event objects that this 466They also allow you to specify any number of other event objects that this
328request has to wait for before it starts executing, by simply passing the 467request has to wait for before it starts executing, by simply passing the
329event objects as extra parameters to the enqueue methods. 468event objects as extra parameters to the enqueue methods.
330 469
331Queues execute in-order by default, without any parallelism, so in most 470Queues execute in-order by default, without any parallelism, so in most
332cases it's not necessary to wait for or create event objects. 471cases (i.e. you use only one queue) it's not necessary to wait for or
472create event objects.
333 473
334=over 4 474=over 4
335 475
336=item $packed_value = $ctx->info ($name) 476=item $packed_value = $ctx->info ($name)
337 477
357 497
358=item $ev = $queue->enqueue_read_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...) 498=item $ev = $queue->enqueue_read_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...)
359 499
360L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadImage.html> 500L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadImage.html>
361 501
362=item $ev = $queue->enqueue_write_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $data, $wait_events...) 502=item $ev = $queue->enqueue_write_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...)
363 503
364L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteImage.html> 504L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteImage.html>
365 505
366=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...) 506=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...)
367 507
368Yeah. 508Yeah.
369 509
370L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferRect.html> 510L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferRect.html>
371 511
372=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, ...) 512=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...)
373 513
374L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferToImage.html>. 514L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferToImage.html>.
375 515
376=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, ...) 516=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...)
377 517
378L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyImage.html> 518L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyImage.html>
379 519
380=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, ...) 520=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...)
381 521
382L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyImageToBuffer.html> 522L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyImageToBuffer.html>
383 523
384=item $ev = $queue->enqueue_task ($kernel, $wait_events...) 524=item $ev = $queue->enqueue_task ($kernel, $wait_events...)
385 525
439 579
440L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetMemObjectInfo.html> 580L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetMemObjectInfo.html>
441 581
442=back 582=back
443 583
584=head2 THE OpenCL::Image CLASS
585
586This is the superclass of all image objects - OpenCL::Image2D and OpenCL::Image3D.
587
588=over 4
589
590=item $packed_value = $ev->image_info ($name)
591
592See C<< $platform->info >> for details.
593
594The reason this method is not called C<info> is that there already is an
595C<< ->info >> method inherited from C<OpenCL::Memory>.
596
597L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetImageInfo.html>
598
599=back
600
444=head2 THE OpenCL::Sampler CLASS 601=head2 THE OpenCL::Sampler CLASS
445 602
446=over 4 603=over 4
447 604
448=item $packed_value = $sampler->info ($name) 605=item $packed_value = $sampler->info ($name)
492=item $packed_value = $kernel->info ($name) 649=item $packed_value = $kernel->info ($name)
493 650
494See C<< $platform->info >> for details. 651See C<< $platform->info >> for details.
495 652
496L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetKernelInfo.html> 653L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetKernelInfo.html>
654
655=item $packed_value = $kernel->work_group_info ($device, $name)
656
657See C<< $platform->info >> for details.
658
659The reason this method is not called C<info> is that there already is an
660C<< ->info >> method.
661
662L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetKernelWorkGroupInfo.html>
497 663
498=item $kernel->set_TYPE ($index, $value) 664=item $kernel->set_TYPE ($index, $value)
499 665
500This is a family of methods to set the kernel argument with the number C<$index> to the give C<$value>. 666This is a family of methods to set the kernel argument with the number C<$index> to the give C<$value>.
501 667
523 689
524See C<< $platform->info >> for details. 690See C<< $platform->info >> for details.
525 691
526L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetEventInfo.html> 692L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetEventInfo.html>
527 693
694=item $packed_value = $ev->profiling_info ($name)
695
696See C<< $platform->info >> for details.
697
698The reason this method is not called C<info> is that there already is an
699C<< ->info >> method.
700
701L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetProfilingInfo.html>
702
528=item $ev->wait 703=item $ev->wait
529 704
530Waits for the event to complete. 705Waits for the event to complete.
531 706
532L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clWaitForEvents.html> 707L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clWaitForEvents.html>
550package OpenCL; 725package OpenCL;
551 726
552use common::sense; 727use common::sense;
553 728
554BEGIN { 729BEGIN {
555 our $VERSION = '0.03'; 730 our $VERSION = '0.15';
556 731
557 require XSLoader; 732 require XSLoader;
558 XSLoader::load (__PACKAGE__, $VERSION); 733 XSLoader::load (__PACKAGE__, $VERSION);
559 734
560 @OpenCL::Buffer::ISA = 735 @OpenCL::Buffer::ISA =

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines