ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/OpenCL/OpenCL.pm
Revision: 1.41
Committed: Fri Apr 20 08:57:09 2012 UTC (12 years, 1 month ago) by root
Branch: MAIN
Changes since 1.40: +4 -3 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 =head1 NAME
2
3 OpenCL - Open Computing Language Bindings
4
5 =head1 SYNOPSIS
6
7 use OpenCL;
8
9 =head1 DESCRIPTION
10
11 This is an early release which might be useful, but hasn't seen much testing.
12
13 =head2 OpenCL FROM 10000 FEET HEIGHT
14
15 Here is a high level overview of OpenCL:
16
17 First you need to find one or more OpenCL::Platforms (kind of like
18 vendors) - usually there is only one.
19
20 Each platform gives you access to a number of OpenCL::Device objects, e.g.
21 your graphics card.
22
23 From a platform and some device(s), you create an OpenCL::Context, which is
24 a very central object in OpenCL: Once you have a context you can create
25 most other objects:
26
27 OpenCL::Program objects, which store source code and, after building for a
28 specific device ("compiling and linking"), also binary programs. For each
29 kernel function in a program you can then create an OpenCL::Kernel object
30 which represents basically a function call with argument values.
31
32 OpenCL::Memory objects of various flavours: OpenCL::Buffer objects (flat
33 memory areas, think arrays or structs) and OpenCL::Image objects (think 2d
34 or 3d array) for bulk data and input and output for kernels.
35
36 OpenCL::Sampler objects, which are kind of like texture filter modes in
37 OpenGL.
38
39 OpenCL::Queue objects - command queues, which allow you to submit memory
40 reads, writes and copies, as well as kernel calls to your devices. They
41 also offer a variety of methods to synchronise request execution, for
42 example with barriers or OpenCL::Event objects.
43
44 OpenCL::Event objects are used to signal when something is complete.
45
46 =head2 HELPFUL RESOURCES
47
48 The OpenCL spec used to develop this module (1.2 spec was available, but
49 no implementation was available to me :).
50
51 http://www.khronos.org/registry/cl/specs/opencl-1.1.pdf
52
53 OpenCL manpages:
54
55 http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/
56
57 If you are into UML class diagrams, the following diagram might help - if
58 not, it will be mildly cobfusing:
59
60 http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/classDiagram.html
61
62 Here's a tutorial from AMD (very AMD-centric, too), not sure how useful it
63 is, but at least it's free of charge:
64
65 http://developer.amd.com/zones/OpenCLZone/courses/Documents/Introduction_to_OpenCL_Programming%20Training_Guide%20%28201005%29.pdf
66
67 And 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
73 To get something done, you basically have to do this once (refer to the
74 examples below for actual code, this is just a high-level description):
75
76 Find some platform (e.g. the first one) and some device(s) (e.g. the first
77 device of the platform), and create a context from those.
78
79 Create program objects from your OpenCL source code, then build (compile)
80 the programs for each device you want to run them on.
81
82 Create kernel objects for all kernels you want to use (surprisingly, these
83 are not device-specific).
84
85 Then, to execute stuff, you repeat these steps, possibly resuing or
86 sharing some buffers:
87
88 Create some input and output buffers from your context. Set these as
89 arguments to your kernel.
90
91 Enqueue buffer writes to initialise your input buffers (when not
92 initialised at creation time).
93
94 Enqueue the kernel execution.
95
96 Enqueue buffer reads for your output buffer to read results.
97
98 =head1 EXAMPLES
99
100 =head2 Enumerate all devices and get contexts for them.
101
102 Best run this once to get a feel for the platforms and devices in your
103 system.
104
105 for my $platform (OpenCL::platforms) {
106 printf "platform: %s\n", $platform->name;
107 printf "extensions: %s\n", $platform->extensions;
108 for my $device ($platform->devices) {
109 printf "+ device: %s\n", $device->name;
110 my $ctx = $platform->context (undef, [$device]);
111 # do stuff
112 }
113 }
114
115 =head2 Get a useful context and a command queue.
116
117 This is a useful boilerplate for any OpenCL program that only wants to use
118 one device,
119
120 my ($platform) = OpenCL::platforms; # find first platform
121 my ($dev) = $platform->devices; # find first device of platform
122 my $ctx = $platform->context (undef, [$dev]); # create context out of those
123 my $queue = $ctx->queue ($dev); # create a command queue for the device
124
125 =head2 Print all supported image formats of a context.
126
127 Best run this once for your context, to see whats available and how to
128 gather 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,
139 then 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
151 functions.
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_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,
190 showing off barriers.
191
192 # execute it for all 4 numbers
193 $queue->enqueue_nd_range_kernel ($kernel, undef, [4], undef);
194
195 # enqueue a barrier to ensure in-order execution
196 $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,
205 showing off event objects and wait lists.
206
207 # execute it for all 4 numbers
208 my $ev = $queue->enqueue_nd_range_kernel ($kernel, undef, [4], undef);
209
210 # enqueue an async read
211 $ev = $queue->enqueue_read_buffer ($output, 0, 0, OpenCL::SIZEOF_FLOAT * 4, my $data, $ev);
212
213 # wait for the last event to complete
214 $ev->wait;
215
216 =head2 Use the OpenGL module to share a texture between OpenCL and OpenGL and draw some julia
217 set tunnel effect.
218
219 This is quite a long example to get you going.
220
221 use OpenGL ":all";
222 use OpenCL;
223
224 # open a window and create a gl texture
225 OpenGL::glpOpenWindow width => 256, height => 256;
226 my $texid = glGenTextures_p 1;
227 glBindTexture GL_TEXTURE_2D, $texid;
228 glTexImage2D_c GL_TEXTURE_2D, 0, GL_RGBA8, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0;
229
230 # find and use the first opencl device that let's us get a shared opengl context
231 my $platform;
232 my $dev;
233 my $ctx;
234
235 for (OpenCL::platforms) {
236 $platform = $_;
237 for ($platform->devices) {
238 $dev = $_;
239 $ctx = $platform->context ([OpenCL::GLX_DISPLAY_KHR, undef, OpenCL::GL_CONTEXT_KHR, undef], [$dev])
240 and last;
241 }
242 }
243
244 $ctx
245 or die "cannot find suitable OpenCL device\n";
246
247 my $queue = $ctx->queue ($dev);
248
249 # now attach an opencl image2d object to the opengl texture
250 my $tex = $ctx->gl_texture2d (OpenCL::MEM_WRITE_ONLY, GL_TEXTURE_2D, 0, $texid);
251
252 # now the boring opencl code
253 my $src = <<EOF;
254 kernel void
255 juliatunnel (write_only image2d_t img, float time)
256 {
257 float2 p = (float2)(get_global_id (0), get_global_id (1)) / 256.f * 2.f - 1.f;
258
259 float2 m = (float2)(1.f, p.y) / fabs (p.x);
260 m.x = fabs (fmod (m.x + time * 0.05f, 4.f)) - 2.f;
261
262 float2 z = m;
263 float2 c = (float2)(sin (time * 0.05005), cos (time * 0.06001));
264
265 for (int i = 0; i < 25 && dot (z, z) < 4.f; ++i)
266 z = (float2)(z.x * z.x - z.y * z.y, 2.f * z.x * z.y) + c;
267
268 float3 colour = (float3)(z.x, z.y, z.x * z.y);
269 write_imagef (img, (int2)(get_global_id (0), get_global_id (1)), (float4)(colour * p.x * p.x, 1.));
270 }
271 EOF
272 my $prog = $ctx->program_with_source ($src);
273 eval { $prog->build ($dev); 1 }
274 or die $prog->build_log ($dev);
275
276 my $kernel = $prog->kernel ("juliatunnel");
277
278 # program compiled, kernel ready, now draw and loop
279
280 for (my $time; ; ++$time) {
281 # acquire objects from opengl
282 $queue->enqueue_acquire_gl_objects ([$tex]);
283
284 # configure and run our kernel
285 $kernel->set_image2d (0, $tex);
286 $kernel->set_float (1, $time);
287 $queue->enqueue_nd_range_kernel ($kernel, undef, [256, 256], undef);
288
289 # release objects to opengl again
290 $queue->enqueue_release_gl_objects ([$tex]);
291
292 # wait
293 $queue->finish;
294
295 # now draw the texture, the defaults should be all right
296 glTexParameterf GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST;
297
298 glEnable GL_TEXTURE_2D;
299 glBegin GL_QUADS;
300 glTexCoord2f 0, 1; glVertex3i -1, -1, -1;
301 glTexCoord2f 0, 0; glVertex3i 1, -1, -1;
302 glTexCoord2f 1, 0; glVertex3i 1, 1, -1;
303 glTexCoord2f 1, 1; glVertex3i -1, 1, -1;
304 glEnd;
305
306 glXSwapBuffers;
307
308 select undef, undef, undef, 1/60;
309 }
310
311 =head1 DOCUMENTATION
312
313 =head2 BASIC CONVENTIONS
314
315 This is not a one-to-one C-style translation of OpenCL to Perl - instead
316 I attempted to make the interface as type-safe as possible by introducing
317 object syntax where it makes sense. There are a number of important
318 differences between the OpenCL C API and this module:
319
320 =over 4
321
322 =item * Object lifetime managament is automatic - there is no need
323 to free objects explicitly (C<clReleaseXXX>), the release function
324 is called automatically once all Perl references to it go away.
325
326 =item * OpenCL uses CamelCase for function names
327 (e.g. C<clGetPlatformIDs>, C<clGetPlatformInfo>), while this module
328 uses underscores as word separator and often leaves out prefixes
329 (C<OpenCL::platforms>, C<< $platform->info >>).
330
331 =item * OpenCL often specifies fixed vector function arguments as short
332 arrays (C<size_t origin[3]>), while this module explicitly expects the
333 components as separate arguments (C<$orig_x, $orig_y, $orig_z>) in
334 function calls.
335
336 =item * Structures are often specified by flattening out their components
337 as with short vectors, and returned as arrayrefs.
338
339 =item * When enqueuing commands, the wait list is specified by adding
340 extra arguments to the function - anywhere a C<$wait_events...> argument
341 is documented this can be any number of event objects.
342
343 =item * When enqueuing commands, if the enqueue method is called in void
344 context, no event is created. In all other contexts an event is returned
345 by the method.
346
347 =item * This module expects all functions to return C<CL_SUCCESS>. If any
348 other status is returned the function will throw an exception, so you
349 don't normally have to to any error checking.
350
351 =back
352
353 =head2 PERL AND OPENCL TYPES
354
355 This handy(?) table lists OpenCL types and their perl, PDL and pack/unpack
356 format equivalents:
357
358 OpenCL perl PDL pack/unpack
359 char IV - c
360 uchar IV byte C
361 short IV short s
362 ushort IV ushort S
363 int IV long? l
364 uint IV - L
365 long IV longlong q
366 ulong IV - Q
367 float NV float f
368 half IV ushort S
369 double NV double d
370
371 =head2 GLX SUPPORT
372
373 Due to the sad state that OpenGL support is in in Perl (mostly the OpenGL
374 module, which has little to no documentation and has little to no support
375 for glX), this module, as a special extension, treats context creation
376 properties C<OpenCL::GLX_DISPLAY_KHR> and C<OpenCL::GL_CONTEXT_KHR>
377 specially: If either or both of these are C<undef>, then the OpenCL
378 module tries to dynamically resolve C<glXGetCurrentDisplay> and
379 C<glXGetCurrentContext>, call these functions and use their return values
380 instead.
381
382 For this to work, the OpenGL library must be loaded, a GLX context must
383 have been created and be made current, and C<dlsym> must be available and
384 capable of finding the function via C<RTLD_DEFAULT>.
385
386 =head2 THE OpenCL PACKAGE
387
388 =over 4
389
390 =item $int = OpenCL::errno
391
392 The last error returned by a function - it's only valid after an error occured
393 and before calling another OpenCL function.
394
395 =item $str = OpenCL::err2str $errval
396
397 Comverts an error value into a human readable string.
398
399 =item $str = OpenCL::enum2str $enum
400
401 Converts most enum values (of parameter names, image format constants,
402 object types, addressing and filter modes, command types etc.) into a
403 human readable string. When confronted with some random integer it can be
404 very helpful to pass it through this function to maybe get some readable
405 string out of it.
406
407 =item @platforms = OpenCL::platforms
408
409 Returns all available OpenCL::Platform objects.
410
411 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetPlatformIDs.html>
412
413 =item $ctx = OpenCL::context_from_type $properties, $type = OpenCL::DEVICE_TYPE_DEFAULT, $notify = undef
414
415 Tries to create a context from a default device and platform - never worked for me.
416
417 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContextFromType.html>
418
419 =item OpenCL::wait_for_events $wait_events...
420
421 Waits for all events to complete.
422
423 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clWaitForEvents.html>
424
425 =back
426
427 =head2 THE OpenCL::Platform CLASS
428
429 =over 4
430
431 =item @devices = $platform->devices ($type = OpenCL::DEVICE_TYPE_ALL)
432
433 Returns a list of matching OpenCL::Device objects.
434
435 =item $ctx = $platform->context_from_type ($properties, $type = OpenCL::DEVICE_TYPE_DEFAULT, $notify = undef)
436
437 Tries to create a context. Never worked for me, and you need devices explicitly anyway.
438
439 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContextFromType.html>
440
441 =item $ctx = $platform->context ($properties = undef, @$devices, $notify = undef)
442
443 Create a new OpenCL::Context object using the given device object(s)- a
444 CL_CONTEXT_PLATFORM property is supplied automatically.
445
446 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContext.html>
447
448 =item $packed_value = $platform->info ($name)
449
450 Calls C<clGetPlatformInfo> and returns the packed, raw value - for
451 strings, this will be the string (possibly including terminating \0), for
452 other values you probably need to use the correct C<unpack>.
453
454 It's best to avoid this method and use one of the following convenience
455 wrappers.
456
457 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetPlatformInfo.html>
458
459 =for gengetinfo begin platform
460
461 =item $string = $platform->profile
462
463 Calls C<clGetPlatformInfo> with C<CL_PLATFORM_PROFILE> and returns the result.
464
465 =item $string = $platform->version
466
467 Calls C<clGetPlatformInfo> with C<CL_PLATFORM_VERSION> and returns the result.
468
469 =item $string = $platform->name
470
471 Calls C<clGetPlatformInfo> with C<CL_PLATFORM_NAME> and returns the result.
472
473 =item $string = $platform->vendor
474
475 Calls C<clGetPlatformInfo> with C<CL_PLATFORM_VENDOR> and returns the result.
476
477 =item $string = $platform->extensions
478
479 Calls C<clGetPlatformInfo> with C<CL_PLATFORM_EXTENSIONS> and returns the result.
480
481 =for gengetinfo end platform
482
483 =back
484
485 =head2 THE OpenCL::Device CLASS
486
487 =over 4
488
489 =item $packed_value = $device->info ($name)
490
491 See C<< $platform->info >> for details.
492
493 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetDeviceInfo.html>
494
495 =for gengetinfo begin device
496
497 =item $device_type = $device->type
498
499 Calls C<clGetDeviceInfo> with C<CL_DEVICE_TYPE> and returns the result.
500
501 =item $uint = $device->vendor_id
502
503 Calls C<clGetDeviceInfo> with C<CL_DEVICE_VENDOR_ID> and returns the result.
504
505 =item $uint = $device->max_compute_units
506
507 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_COMPUTE_UNITS> and returns the result.
508
509 =item $uint = $device->max_work_item_dimensions
510
511 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS> and returns the result.
512
513 =item $int = $device->max_work_group_size
514
515 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_WORK_GROUP_SIZE> and returns the result.
516
517 =item @ints = $device->max_work_item_sizes
518
519 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_WORK_ITEM_SIZES> and returns the result.
520
521 =item $uint = $device->preferred_vector_width_char
522
523 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR> and returns the result.
524
525 =item $uint = $device->preferred_vector_width_short
526
527 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT> and returns the result.
528
529 =item $uint = $device->preferred_vector_width_int
530
531 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT> and returns the result.
532
533 =item $uint = $device->preferred_vector_width_long
534
535 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG> and returns the result.
536
537 =item $uint = $device->preferred_vector_width_float
538
539 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT> and returns the result.
540
541 =item $uint = $device->preferred_vector_width_double
542
543 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE> and returns the result.
544
545 =item $uint = $device->max_clock_frequency
546
547 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_CLOCK_FREQUENCY> and returns the result.
548
549 =item $bitfield = $device->address_bits
550
551 Calls C<clGetDeviceInfo> with C<CL_DEVICE_ADDRESS_BITS> and returns the result.
552
553 =item $uint = $device->max_read_image_args
554
555 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_READ_IMAGE_ARGS> and returns the result.
556
557 =item $uint = $device->max_write_image_args
558
559 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_WRITE_IMAGE_ARGS> and returns the result.
560
561 =item $ulong = $device->max_mem_alloc_size
562
563 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_MEM_ALLOC_SIZE> and returns the result.
564
565 =item $int = $device->image2d_max_width
566
567 Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE2D_MAX_WIDTH> and returns the result.
568
569 =item $int = $device->image2d_max_height
570
571 Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE2D_MAX_HEIGHT> and returns the result.
572
573 =item $int = $device->image3d_max_width
574
575 Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE3D_MAX_WIDTH> and returns the result.
576
577 =item $int = $device->image3d_max_height
578
579 Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE3D_MAX_HEIGHT> and returns the result.
580
581 =item $int = $device->image3d_max_depth
582
583 Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE3D_MAX_DEPTH> and returns the result.
584
585 =item $uint = $device->image_support
586
587 Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE_SUPPORT> and returns the result.
588
589 =item $int = $device->max_parameter_size
590
591 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_PARAMETER_SIZE> and returns the result.
592
593 =item $uint = $device->max_samplers
594
595 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_SAMPLERS> and returns the result.
596
597 =item $uint = $device->mem_base_addr_align
598
599 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MEM_BASE_ADDR_ALIGN> and returns the result.
600
601 =item $uint = $device->min_data_type_align_size
602
603 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE> and returns the result.
604
605 =item $device_fp_config = $device->single_fp_config
606
607 Calls C<clGetDeviceInfo> with C<CL_DEVICE_SINGLE_FP_CONFIG> and returns the result.
608
609 =item $device_mem_cache_type = $device->global_mem_cache_type
610
611 Calls C<clGetDeviceInfo> with C<CL_DEVICE_GLOBAL_MEM_CACHE_TYPE> and returns the result.
612
613 =item $uint = $device->global_mem_cacheline_size
614
615 Calls C<clGetDeviceInfo> with C<CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE> and returns the result.
616
617 =item $ulong = $device->global_mem_cache_size
618
619 Calls C<clGetDeviceInfo> with C<CL_DEVICE_GLOBAL_MEM_CACHE_SIZE> and returns the result.
620
621 =item $ulong = $device->global_mem_size
622
623 Calls C<clGetDeviceInfo> with C<CL_DEVICE_GLOBAL_MEM_SIZE> and returns the result.
624
625 =item $ulong = $device->max_constant_buffer_size
626
627 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE> and returns the result.
628
629 =item $uint = $device->max_constant_args
630
631 Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_CONSTANT_ARGS> and returns the result.
632
633 =item $device_local_mem_type = $device->local_mem_type
634
635 Calls C<clGetDeviceInfo> with C<CL_DEVICE_LOCAL_MEM_TYPE> and returns the result.
636
637 =item $ulong = $device->local_mem_size
638
639 Calls C<clGetDeviceInfo> with C<CL_DEVICE_LOCAL_MEM_SIZE> and returns the result.
640
641 =item $boolean = $device->error_correction_support
642
643 Calls C<clGetDeviceInfo> with C<CL_DEVICE_ERROR_CORRECTION_SUPPORT> and returns the result.
644
645 =item $int = $device->profiling_timer_resolution
646
647 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PROFILING_TIMER_RESOLUTION> and returns the result.
648
649 =item $boolean = $device->endian_little
650
651 Calls C<clGetDeviceInfo> with C<CL_DEVICE_ENDIAN_LITTLE> and returns the result.
652
653 =item $boolean = $device->available
654
655 Calls C<clGetDeviceInfo> with C<CL_DEVICE_AVAILABLE> and returns the result.
656
657 =item $boolean = $device->compiler_available
658
659 Calls C<clGetDeviceInfo> with C<CL_DEVICE_COMPILER_AVAILABLE> and returns the result.
660
661 =item $device_exec_capabilities = $device->execution_capabilities
662
663 Calls C<clGetDeviceInfo> with C<CL_DEVICE_EXECUTION_CAPABILITIES> and returns the result.
664
665 =item $command_queue_properties = $device->properties
666
667 Calls C<clGetDeviceInfo> with C<CL_DEVICE_QUEUE_PROPERTIES> and returns the result.
668
669 =item $ = $device->platform
670
671 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PLATFORM> and returns the result.
672
673 =item $string = $device->name
674
675 Calls C<clGetDeviceInfo> with C<CL_DEVICE_NAME> and returns the result.
676
677 =item $string = $device->vendor
678
679 Calls C<clGetDeviceInfo> with C<CL_DEVICE_VENDOR> and returns the result.
680
681 =item $string = $device->driver_version
682
683 Calls C<clGetDeviceInfo> with C<CL_DRIVER_VERSION> and returns the result.
684
685 =item $string = $device->profile
686
687 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PROFILE> and returns the result.
688
689 =item $string = $device->version
690
691 Calls C<clGetDeviceInfo> with C<CL_DEVICE_VERSION> and returns the result.
692
693 =item $string = $device->extensions
694
695 Calls C<clGetDeviceInfo> with C<CL_DEVICE_EXTENSIONS> and returns the result.
696
697 =item $uint = $device->preferred_vector_width_half
698
699 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF> and returns the result.
700
701 =item $uint = $device->native_vector_width_char
702
703 Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR> and returns the result.
704
705 =item $uint = $device->native_vector_width_short
706
707 Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT> and returns the result.
708
709 =item $uint = $device->native_vector_width_int
710
711 Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_INT> and returns the result.
712
713 =item $uint = $device->native_vector_width_long
714
715 Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG> and returns the result.
716
717 =item $uint = $device->native_vector_width_float
718
719 Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT> and returns the result.
720
721 =item $uint = $device->native_vector_width_double
722
723 Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE> and returns the result.
724
725 =item $uint = $device->native_vector_width_half
726
727 Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF> and returns the result.
728
729 =item $device_fp_config = $device->double_fp_config
730
731 Calls C<clGetDeviceInfo> with C<CL_DEVICE_DOUBLE_FP_CONFIG> and returns the result.
732
733 =item $device_fp_config = $device->half_fp_config
734
735 Calls C<clGetDeviceInfo> with C<CL_DEVICE_HALF_FP_CONFIG> and returns the result.
736
737 =item $boolean = $device->host_unified_memory
738
739 Calls C<clGetDeviceInfo> with C<CL_DEVICE_HOST_UNIFIED_MEMORY> and returns the result.
740
741 =item $device = $device->parent_device_ext
742
743 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PARENT_DEVICE_EXT> and returns the result.
744
745 =item @device_partition_property_exts = $device->partition_types_ext
746
747 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PARTITION_TYPES_EXT> and returns the result.
748
749 =item @device_partition_property_exts = $device->affinity_domains_ext
750
751 Calls C<clGetDeviceInfo> with C<CL_DEVICE_AFFINITY_DOMAINS_EXT> and returns the result.
752
753 =item $uint = $device->reference_count_ext
754
755 Calls C<clGetDeviceInfo> with C<CL_DEVICE_REFERENCE_COUNT_EXT > and returns the result.
756
757 =item @device_partition_property_exts = $device->partition_style_ext
758
759 Calls C<clGetDeviceInfo> with C<CL_DEVICE_PARTITION_STYLE_EXT> and returns the result.
760
761 =for gengetinfo end device
762
763 =back
764
765 =head2 THE OpenCL::Context CLASS
766
767 =over 4
768
769 =item $queue = $ctx->queue ($device, $properties)
770
771 Create a new OpenCL::Queue object from the context and the given device.
772
773 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateCommandQueue.html>
774
775 =item $ev = $ctx->user_event
776
777 Creates a new OpenCL::UserEvent object.
778
779 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateUserEvent.html>
780
781 =item $buf = $ctx->buffer ($flags, $len)
782
783 Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object with the
784 given flags and octet-size.
785
786 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateBuffer.html>
787
788 =item $buf = $ctx->buffer_sv ($flags, $data)
789
790 Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object and
791 initialise it with the given data values.
792
793 =item $img = $ctx->image2d ($flags, $channel_order, $channel_type, $width, $height, $row_pitch = 0, $data = undef)
794
795 Creates a new OpenCL::Image2D object and optionally initialises it with
796 the given data values.
797
798 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateImage2D.html>
799
800 =item $img = $ctx->image3d ($flags, $channel_order, $channel_type, $width, $height, $depth, $row_pitch = 0, $slice_pitch = 0, $data = undef)
801
802 Creates a new OpenCL::Image3D object and optionally initialises it with
803 the given data values.
804
805 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateImage3D.html>
806
807 =item $buffer = $ctx->gl_buffer ($flags, $bufobj)
808
809 Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object that refers to the given
810 OpenGL buffer object.
811
812 http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateFromGLBuffer.html
813
814 =item $ctx->gl_texture2d ($flags, $target, $miplevel, $texture)
815
816 Creates a new OpenCL::Image2D object that refers to the given OpenGL
817 2D texture object.
818
819 http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateFromGLTexture2D.html
820
821 =item $ctx->gl_texture3d ($flags, $target, $miplevel, $texture)
822
823 Creates a new OpenCL::Image3D object that refers to the given OpenGL
824 3D texture object.
825
826 http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateFromGLTexture3D.html
827
828 =item $ctx->gl_renderbuffer ($flags, $renderbuffer)
829
830 Creates a new OpenCL::Image2D object that refers to the given OpenGL
831 render buffer.
832
833 http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateFromGLRenderbuffer.html
834
835 =item @formats = $ctx->supported_image_formats ($flags, $image_type)
836
837 Returns a list of matching image formats - each format is an arrayref with
838 two values, $channel_order and $channel_type, in it.
839
840 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetSupportedImageFormats.html>
841
842 =item $sampler = $ctx->sampler ($normalized_coords, $addressing_mode, $filter_mode)
843
844 Creates a new OpenCL::Sampler object.
845
846 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateSampler.html>
847
848 =item $program = $ctx->program_with_source ($string)
849
850 Creates a new OpenCL::Program object from the given source code.
851
852 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateProgramWithSource.html>
853
854 =item $packed_value = $ctx->info ($name)
855
856 See C<< $platform->info >> for details.
857
858 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetContextInfo.html>
859
860 =for gengetinfo begin context
861
862 =item $uint = $context->reference_count
863
864 Calls C<clGetContextInfo> with C<CL_CONTEXT_REFERENCE_COUNT> and returns the result.
865
866 =item @devices = $context->devices
867
868 Calls C<clGetContextInfo> with C<CL_CONTEXT_DEVICES> and returns the result.
869
870 =item @property_ints = $context->properties
871
872 Calls C<clGetContextInfo> with C<CL_CONTEXT_PROPERTIES> and returns the result.
873
874 =item $uint = $context->num_devices
875
876 Calls C<clGetContextInfo> with C<CL_CONTEXT_NUM_DEVICES> and returns the result.
877
878 =for gengetinfo end context
879
880 =back
881
882 =head2 THE OpenCL::Queue CLASS
883
884 An OpenCL::Queue represents an execution queue for OpenCL. You execute
885 requests by calling their respective C<enqueue_xxx> method and waitinf for
886 it to complete in some way.
887
888 All the enqueue methods return an event object that can be used to wait
889 for completion, unless the method is called in void context, in which case
890 no event object is created.
891
892 They also allow you to specify any number of other event objects that this
893 request has to wait for before it starts executing, by simply passing the
894 event objects as extra parameters to the enqueue methods.
895
896 Queues execute in-order by default, without any parallelism, so in most
897 cases (i.e. you use only one queue) it's not necessary to wait for or
898 create event objects.
899
900 =over 4
901
902 =item $ev = $queue->enqueue_read_buffer ($buffer, $blocking, $offset, $len, $data, $wait_events...)
903
904 Reads data from buffer into the given string.
905
906 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadBuffer.html>
907
908 =item $ev = $queue->enqueue_write_buffer ($buffer, $blocking, $offset, $data, $wait_events...)
909
910 Writes data to buffer from the given string.
911
912 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteBuffer.html>
913
914 =item $ev = $queue->enqueue_copy_buffer ($src, $dst, $src_offset, $dst_offset, $len, $wait_events...)
915
916 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBuffer.html>
917
918 =item $ev = $queue->enqueue_read_buffer_rect (OpenCL::Memory buf, cl_bool blocking, $buf_x, $buf_y, $buf_z, $host_x, $host_y, $host_z, $width, $height, $depth, $buf_row_pitch, $buf_slice_pitch, $host_row_pitch, $host_slice_pitch, $data, $wait_events...)
919
920 http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadBufferRect.html
921
922 =item $ev = $queue->enqueue_write_buffer_rect (OpenCL::Memory buf, cl_bool blocking, $buf_x, $buf_y, $buf_z, $host_x, $host_y, $host_z, $width, $height, $depth, $buf_row_pitch, $buf_slice_pitch, $host_row_pitch, $host_slice_pitch, $data, $wait_events...)
923
924 http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteBufferRect.html
925
926 =item $ev = $queue->enqueue_read_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...)
927
928 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferRect.html>
929
930 =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...)
931
932 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadImage.html>
933
934 =item $ev = $queue->enqueue_write_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...)
935
936 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteImage.html>
937
938 =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...)
939
940 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyImage.html>
941
942 =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...)
943
944 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyImageToBuffer.html>
945
946 =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...)
947
948 Yeah.
949
950 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferToImage.html>.
951
952 =item $ev = $queue->enqueue_task ($kernel, $wait_events...)
953
954 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueTask.html>
955
956 =item $ev = $queue->enqueue_nd_range_kernel ($kernel, @$global_work_offset, @$global_work_size, @$local_work_size, $wait_events...)
957
958 Enqueues a kernel execution.
959
960 @$global_work_size must be specified as a reference to an array of
961 integers specifying the work sizes (element counts).
962
963 @$global_work_offset must be either C<undef> (in which case all offsets
964 are C<0>), or a reference to an array of work offsets, with the same number
965 of elements as @$global_work_size.
966
967 @$local_work_size must be either C<undef> (in which case the
968 implementation is supposed to choose good local work sizes), or a
969 reference to an array of local work sizes, with the same number of
970 elements as @$global_work_size.
971
972 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueNDRangeKernel.html>
973
974 =item $ev = $queue->enqueue_marker ($wait_events...)
975
976 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueMarker.html>
977
978 =item $ev = $queue->enqueue_acquire_gl_objects ([object, ...], $wait_events...)
979
980 Enqueues a list (an array-ref of OpenCL::Memory objects) to be acquired
981 for subsequent OpenCL usage.
982
983 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueAcquireGLObjects.html>
984
985 =item $ev = $queue->enqueue_release_gl_objects ([object, ...], $wait_events...)
986
987 Enqueues a list (an array-ref of OpenCL::Memory objects) to be released
988 for subsequent OpenGL usage.
989
990 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReleaseGLObjects.html>
991
992 =item $ev = $queue->enqueue_wait_for_events ($wait_events...)
993
994 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWaitForEvents.html>
995
996 =item $queue->enqueue_barrier
997
998 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueBarrier.html>
999
1000 =item $queue->flush
1001
1002 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clFlush.html>
1003
1004 =item $queue->finish
1005
1006 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clFinish.html>
1007
1008 =item $packed_value = $queue->info ($name)
1009
1010 See C<< $platform->info >> for details.
1011
1012 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetCommandQueueInfo.html>
1013
1014 =for gengetinfo begin command_queue
1015
1016 =item $ctx = $command_queue->context
1017
1018 Calls C<clGetCommandQueueInfo> with C<CL_QUEUE_CONTEXT> and returns the result.
1019
1020 =item $device = $command_queue->device
1021
1022 Calls C<clGetCommandQueueInfo> with C<CL_QUEUE_DEVICE> and returns the result.
1023
1024 =item $uint = $command_queue->reference_count
1025
1026 Calls C<clGetCommandQueueInfo> with C<CL_QUEUE_REFERENCE_COUNT> and returns the result.
1027
1028 =item $command_queue_properties = $command_queue->properties
1029
1030 Calls C<clGetCommandQueueInfo> with C<CL_QUEUE_PROPERTIES> and returns the result.
1031
1032 =for gengetinfo end command_queue
1033
1034 =back
1035
1036 =head2 THE OpenCL::Memory CLASS
1037
1038 This the superclass of all memory objects - OpenCL::Buffer, OpenCL::Image,
1039 OpenCL::Image2D and OpenCL::Image3D.
1040
1041 =over 4
1042
1043 =item $packed_value = $memory->info ($name)
1044
1045 See C<< $platform->info >> for details.
1046
1047 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetMemObjectInfo.html>
1048
1049 =for gengetinfo begin mem
1050
1051 =item $mem_object_type = $mem->type
1052
1053 Calls C<clGetMemObjectInfo> with C<CL_MEM_TYPE> and returns the result.
1054
1055 =item $mem_flags = $mem->flags
1056
1057 Calls C<clGetMemObjectInfo> with C<CL_MEM_FLAGS> and returns the result.
1058
1059 =item $int = $mem->size
1060
1061 Calls C<clGetMemObjectInfo> with C<CL_MEM_SIZE> and returns the result.
1062
1063 =item $ptr_value = $mem->host_ptr
1064
1065 Calls C<clGetMemObjectInfo> with C<CL_MEM_HOST_PTR> and returns the result.
1066
1067 =item $uint = $mem->map_count
1068
1069 Calls C<clGetMemObjectInfo> with C<CL_MEM_MAP_COUNT> and returns the result.
1070
1071 =item $uint = $mem->reference_count
1072
1073 Calls C<clGetMemObjectInfo> with C<CL_MEM_REFERENCE_COUNT> and returns the result.
1074
1075 =item $ctx = $mem->context
1076
1077 Calls C<clGetMemObjectInfo> with C<CL_MEM_CONTEXT> and returns the result.
1078
1079 =item $mem = $mem->associated_memobject
1080
1081 Calls C<clGetMemObjectInfo> with C<CL_MEM_ASSOCIATED_MEMOBJECT> and returns the result.
1082
1083 =item $int = $mem->offset
1084
1085 Calls C<clGetMemObjectInfo> with C<CL_MEM_OFFSET> and returns the result.
1086
1087 =for gengetinfo end mem
1088
1089 =item ($type, $name) = $mem->gl_object_info
1090
1091 Returns the OpenGL object type (e.g. OpenCL::GL_OBJECT_TEXTURE2D) and the
1092 object "name" (e.g. the texture name) used to create this memory object.
1093
1094 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetGLObjectInfo.html>
1095
1096 =back
1097
1098 =head2 THE OpenCL::Buffer CLASS
1099
1100 This is a subclass of OpenCL::Memory, and the superclass of
1101 OpenCL::BufferObj. Its purpose is simply to distinguish between buffers
1102 and sub-buffers.
1103
1104 =head2 THE OpenCL::BufferObj CLASS
1105
1106 This is a subclass of OpenCL::Buffer and thus OpenCL::Memory. It exists
1107 because one cna create sub buffers of OpenLC::BufferObj objects, but not
1108 sub buffers from these sub buffers.
1109
1110 =over 4
1111
1112 =item $subbuf = $buf_obj->sub_buffer_region ($flags, $origin, $size)
1113
1114 Creates an OpenCL::Buffer objects from this buffer and returns it. The
1115 C<buffer_create_type> is assumed to be C<CL_BUFFER_CREATE_TYPE_REGION>.
1116
1117 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateSubBuffer.html>
1118
1119 =back
1120
1121 =head2 THE OpenCL::Image CLASS
1122
1123 This is the superclass of all image objects - OpenCL::Image2D and OpenCL::Image3D.
1124
1125 =over 4
1126
1127 =item $packed_value = $ev->image_info ($name)
1128
1129 See C<< $platform->info >> for details.
1130
1131 The reason this method is not called C<info> is that there already is an
1132 C<< ->info >> method inherited from C<OpenCL::Memory>.
1133
1134 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetImageInfo.html>
1135
1136 =for gengetinfo begin image
1137
1138 =item $int = $image->element_size
1139
1140 Calls C<clGetImageInfo> with C<CL_IMAGE_ELEMENT_SIZE> and returns the result.
1141
1142 =item $int = $image->row_pitch
1143
1144 Calls C<clGetImageInfo> with C<CL_IMAGE_ROW_PITCH> and returns the result.
1145
1146 =item $int = $image->slice_pitch
1147
1148 Calls C<clGetImageInfo> with C<CL_IMAGE_SLICE_PITCH> and returns the result.
1149
1150 =item $int = $image->width
1151
1152 Calls C<clGetImageInfo> with C<CL_IMAGE_WIDTH> and returns the result.
1153
1154 =item $int = $image->height
1155
1156 Calls C<clGetImageInfo> with C<CL_IMAGE_HEIGHT> and returns the result.
1157
1158 =item $int = $image->depth
1159
1160 Calls C<clGetImageInfo> with C<CL_IMAGE_DEPTH> and returns the result.
1161
1162 =for gengetinfo end image
1163
1164 =for gengetinfo begin gl_texture
1165
1166 =item $GLenum = $gl_texture->target
1167
1168 Calls C<clGetGLTextureInfo> with C<CL_GL_TEXTURE_TARGET> and returns the result.
1169
1170 =item $GLint = $gl_texture->gl_mipmap_level
1171
1172 Calls C<clGetGLTextureInfo> with C<CL_GL_MIPMAP_LEVEL> and returns the result.
1173
1174 =for gengetinfo end gl_texture
1175
1176 =back
1177
1178 =head2 THE OpenCL::Sampler CLASS
1179
1180 =over 4
1181
1182 =item $packed_value = $sampler->info ($name)
1183
1184 See C<< $platform->info >> for details.
1185
1186 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetSamplerInfo.html>
1187
1188 =for gengetinfo begin sampler
1189
1190 =item $uint = $sampler->reference_count
1191
1192 Calls C<clGetSamplerInfo> with C<CL_SAMPLER_REFERENCE_COUNT> and returns the result.
1193
1194 =item $ctx = $sampler->context
1195
1196 Calls C<clGetSamplerInfo> with C<CL_SAMPLER_CONTEXT> and returns the result.
1197
1198 =item $addressing_mode = $sampler->normalized_coords
1199
1200 Calls C<clGetSamplerInfo> with C<CL_SAMPLER_NORMALIZED_COORDS> and returns the result.
1201
1202 =item $filter_mode = $sampler->addressing_mode
1203
1204 Calls C<clGetSamplerInfo> with C<CL_SAMPLER_ADDRESSING_MODE> and returns the result.
1205
1206 =item $boolean = $sampler->filter_mode
1207
1208 Calls C<clGetSamplerInfo> with C<CL_SAMPLER_FILTER_MODE> and returns the result.
1209
1210 =for gengetinfo end sampler
1211
1212 =back
1213
1214 =head2 THE OpenCL::Program CLASS
1215
1216 =over 4
1217
1218 =item $program->build ($device, $options = "")
1219
1220 Tries to build the program with the givne options.
1221
1222 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clBuildProgram.html>
1223
1224 =item $packed_value = $program->build_info ($device, $name)
1225
1226 Similar to C<< $platform->info >>, but returns build info for a previous
1227 build attempt for the given device.
1228
1229 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetBuildInfo.html>
1230
1231 =item $kernel = $program->kernel ($function_name)
1232
1233 Creates an OpenCL::Kernel object out of the named C<__kernel> function in
1234 the program.
1235
1236 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateKernel.html>
1237
1238 =for gengetinfo begin program_build
1239
1240 =item $build_status = $program->build_status ($device)
1241
1242 Calls C<clGetProgramBuildInfo> with C<CL_PROGRAM_BUILD_STATUS> and returns the result.
1243
1244 =item $string = $program->build_options ($device)
1245
1246 Calls C<clGetProgramBuildInfo> with C<CL_PROGRAM_BUILD_OPTIONS> and returns the result.
1247
1248 =item $string = $program->build_log ($device)
1249
1250 Calls C<clGetProgramBuildInfo> with C<CL_PROGRAM_BUILD_LOG> and returns the result.
1251
1252 =for gengetinfo end program_build
1253
1254 =item $packed_value = $program->info ($name)
1255
1256 See C<< $platform->info >> for details.
1257
1258 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetProgramInfo.html>
1259
1260 =for gengetinfo begin program
1261
1262 =item $uint = $program->reference_count
1263
1264 Calls C<clGetProgramInfo> with C<CL_PROGRAM_REFERENCE_COUNT> and returns the result.
1265
1266 =item $ctx = $program->context
1267
1268 Calls C<clGetProgramInfo> with C<CL_PROGRAM_CONTEXT> and returns the result.
1269
1270 =item $uint = $program->num_devices
1271
1272 Calls C<clGetProgramInfo> with C<CL_PROGRAM_NUM_DEVICES> and returns the result.
1273
1274 =item @devices = $program->devices
1275
1276 Calls C<clGetProgramInfo> with C<CL_PROGRAM_DEVICES> and returns the result.
1277
1278 =item $string = $program->source
1279
1280 Calls C<clGetProgramInfo> with C<CL_PROGRAM_SOURCE> and returns the result.
1281
1282 =item @ints = $program->binary_sizes
1283
1284 Calls C<clGetProgramInfo> with C<CL_PROGRAM_BINARY_SIZES> and returns the result.
1285
1286 =for gengetinfo end program
1287
1288 =item @blobs = $program->binaries
1289
1290 Returns a string for the compiled binary for every device associated with
1291 the program, empty strings indicate missing programs, and an empty result
1292 means no program binaries are available.
1293
1294 These "binaries" are often, in fact, informative low-level assembly
1295 sources.
1296
1297 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetProgramInfo.html>
1298
1299 =back
1300
1301 =head2 THE OpenCL::Kernel CLASS
1302
1303 =over 4
1304
1305 =item $packed_value = $kernel->info ($name)
1306
1307 See C<< $platform->info >> for details.
1308
1309 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetKernelInfo.html>
1310
1311 =for gengetinfo begin kernel
1312
1313 =item $string = $kernel->function_name
1314
1315 Calls C<clGetKernelInfo> with C<CL_KERNEL_FUNCTION_NAME> and returns the result.
1316
1317 =item $uint = $kernel->num_args
1318
1319 Calls C<clGetKernelInfo> with C<CL_KERNEL_NUM_ARGS> and returns the result.
1320
1321 =item $uint = $kernel->reference_count
1322
1323 Calls C<clGetKernelInfo> with C<CL_KERNEL_REFERENCE_COUNT> and returns the result.
1324
1325 =item $ctx = $kernel->context
1326
1327 Calls C<clGetKernelInfo> with C<CL_KERNEL_CONTEXT> and returns the result.
1328
1329 =item $program = $kernel->program
1330
1331 Calls C<clGetKernelInfo> with C<CL_KERNEL_PROGRAM> and returns the result.
1332
1333 =for gengetinfo end kernel
1334
1335 =item $packed_value = $kernel->work_group_info ($device, $name)
1336
1337 See C<< $platform->info >> for details.
1338
1339 The reason this method is not called C<info> is that there already is an
1340 C<< ->info >> method.
1341
1342 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetKernelWorkGroupInfo.html>
1343
1344 =for gengetinfo begin kernel_work_group
1345
1346 =item $int = $kernel->work_group_size ($device)
1347
1348 Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_WORK_GROUP_SIZE> and returns the result.
1349
1350 =item @ints = $kernel->compile_work_group_size ($device)
1351
1352 Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_COMPILE_WORK_GROUP_SIZE> and returns the result.
1353
1354 =item $ulong = $kernel->local_mem_size ($device)
1355
1356 Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_LOCAL_MEM_SIZE> and returns the result.
1357
1358 =item $int = $kernel->preferred_work_group_size_multiple ($device)
1359
1360 Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE> and returns the result.
1361
1362 =item $ulong = $kernel->private_mem_size ($device)
1363
1364 Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_PRIVATE_MEM_SIZE> and returns the result.
1365
1366 =for gengetinfo end kernel_work_group
1367
1368 =item $kernel->set_TYPE ($index, $value)
1369
1370 This is a family of methods to set the kernel argument with the number C<$index> to the give C<$value>.
1371
1372 TYPE is one of C<char>, C<uchar>, C<short>, C<ushort>, C<int>, C<uint>,
1373 C<long>, C<ulong>, C<half>, C<float>, C<double>, C<memory>, C<buffer>,
1374 C<image2d>, C<image3d>, C<sampler>, C<local> or C<event>.
1375
1376 Chars and integers (including the half type) are specified as integers,
1377 float and double as floating point values, memory/buffer/image2d/image3d
1378 must be an object of that type or C<undef>, local-memory arguments are
1379 set by specifying the size, and sampler and event must be objects of that
1380 type.
1381
1382 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clSetKernelArg.html>
1383
1384 =back
1385
1386 =head2 THE OpenCL::Event CLASS
1387
1388 This is the superclass for all event objects (including OpenCL::UserEvent
1389 objects).
1390
1391 =over 4
1392
1393 =item $ev->wait
1394
1395 Waits for the event to complete.
1396
1397 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clWaitForEvents.html>
1398
1399 =item $packed_value = $ev->info ($name)
1400
1401 See C<< $platform->info >> for details.
1402
1403 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetEventInfo.html>
1404
1405 =for gengetinfo begin event
1406
1407 =item $queue = $event->command_queue
1408
1409 Calls C<clGetEventInfo> with C<CL_EVENT_COMMAND_QUEUE> and returns the result.
1410
1411 =item $command_type = $event->command_type
1412
1413 Calls C<clGetEventInfo> with C<CL_EVENT_COMMAND_TYPE> and returns the result.
1414
1415 =item $uint = $event->reference_count
1416
1417 Calls C<clGetEventInfo> with C<CL_EVENT_REFERENCE_COUNT> and returns the result.
1418
1419 =item $uint = $event->command_execution_status
1420
1421 Calls C<clGetEventInfo> with C<CL_EVENT_COMMAND_EXECUTION_STATUS> and returns the result.
1422
1423 =item $ctx = $event->context
1424
1425 Calls C<clGetEventInfo> with C<CL_EVENT_CONTEXT> and returns the result.
1426
1427 =for gengetinfo end event
1428
1429 =item $packed_value = $ev->profiling_info ($name)
1430
1431 See C<< $platform->info >> for details.
1432
1433 The reason this method is not called C<info> is that there already is an
1434 C<< ->info >> method.
1435
1436 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetProfilingInfo.html>
1437
1438 =for gengetinfo begin profiling
1439
1440 =item $ulong = $event->profiling_command_queued
1441
1442 Calls C<clGetEventProfilingInfo> with C<CL_PROFILING_COMMAND_QUEUED> and returns the result.
1443
1444 =item $ulong = $event->profiling_command_submit
1445
1446 Calls C<clGetEventProfilingInfo> with C<CL_PROFILING_COMMAND_SUBMIT> and returns the result.
1447
1448 =item $ulong = $event->profiling_command_start
1449
1450 Calls C<clGetEventProfilingInfo> with C<CL_PROFILING_COMMAND_START> and returns the result.
1451
1452 =item $ulong = $event->profiling_command_end
1453
1454 Calls C<clGetEventProfilingInfo> with C<CL_PROFILING_COMMAND_END> and returns the result.
1455
1456 =for gengetinfo end profiling
1457
1458 =back
1459
1460 =head2 THE OpenCL::UserEvent CLASS
1461
1462 This is a subclass of OpenCL::Event.
1463
1464 =over 4
1465
1466 =item $ev->set_status ($execution_status)
1467
1468 L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clSetUserEventStatus.html>
1469
1470 =back
1471
1472 =cut
1473
1474 package OpenCL;
1475
1476 use common::sense;
1477
1478 BEGIN {
1479 our $VERSION = '0.95';
1480
1481 require XSLoader;
1482 XSLoader::load (__PACKAGE__, $VERSION);
1483
1484 @OpenCL::Buffer::ISA =
1485 @OpenCL::Image::ISA = OpenCL::Memory::;
1486
1487 @OpenCL::BufferObj::ISA = OpenCL::Buffer::;
1488
1489 @OpenCL::Image2D::ISA =
1490 @OpenCL::Image3D::ISA = OpenCL::Image::;
1491
1492 @OpenCL::UserEvent::ISA = OpenCL::Event::;
1493 }
1494
1495 1;
1496
1497 =head1 AUTHOR
1498
1499 Marc Lehmann <schmorp@schmorp.de>
1500 http://home.schmorp.de/
1501
1502 =cut
1503