ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/OpenCL/OpenCL.pm
Revision: 1.51
Committed: Tue Apr 24 13:45:58 2012 UTC (12 years ago) by root
Branch: MAIN
Changes since 1.50: +31 -10 lines
Log Message:
*** empty log message ***

File Contents

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