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

Comparing OpenCL/OpenCL.pm (file contents):
Revision 1.60 by root, Wed Apr 25 21:48:44 2012 UTC vs.
Revision 1.88 by root, Tue Oct 22 17:25:38 2013 UTC

28specific device ("compiling and linking"), also binary programs. For each 28specific device ("compiling and linking"), also binary programs. For each
29kernel function in a program you can then create an OpenCL::Kernel object 29kernel function in a program you can then create an OpenCL::Kernel object
30which represents basically a function call with argument values. 30which represents basically a function call with argument values.
31 31
32OpenCL::Memory objects of various flavours: OpenCL::Buffer objects (flat 32OpenCL::Memory objects of various flavours: OpenCL::Buffer objects (flat
33memory areas, think arrays or structs) and OpenCL::Image objects (think 2d 33memory areas, think arrays or structs) and OpenCL::Image objects (think 2D
34or 3d array) for bulk data and input and output for kernels. 34or 3D array) for bulk data and input and output for kernels.
35 35
36OpenCL::Sampler objects, which are kind of like texture filter modes in 36OpenCL::Sampler objects, which are kind of like texture filter modes in
37OpenGL. 37OpenGL.
38 38
39OpenCL::Queue objects - command queues, which allow you to submit memory 39OpenCL::Queue objects - command queues, which allow you to submit memory
43 43
44OpenCL::Event objects are used to signal when something is complete. 44OpenCL::Event objects are used to signal when something is complete.
45 45
46=head2 HELPFUL RESOURCES 46=head2 HELPFUL RESOURCES
47 47
48The OpenCL specs used to develop this module: 48The OpenCL specs used to develop this module - download these and keept
49hema round, they are required reference material:
49 50
50 http://www.khronos.org/registry/cl/specs/opencl-1.1.pdf 51 http://www.khronos.org/registry/cl/specs/opencl-1.1.pdf
51 http://www.khronos.org/registry/cl/specs/opencl-1.2.pdf 52 http://www.khronos.org/registry/cl/specs/opencl-1.2.pdf
52 http://www.khronos.org/registry/cl/specs/opencl-1.2-extensions.pdf 53 http://www.khronos.org/registry/cl/specs/opencl-1.2-extensions.pdf
53 54
210 211
211 # wait for the last event to complete 212 # wait for the last event to complete
212 $ev->wait; 213 $ev->wait;
213 214
214=head2 Use the OpenGL module to share a texture between OpenCL and OpenGL and draw some julia 215=head2 Use the OpenGL module to share a texture between OpenCL and OpenGL and draw some julia
215set tunnel effect. 216set flight effect.
216 217
217This is quite a long example to get you going. 218This is quite a long example to get you going - you can also download it
219from L<http://cvs.schmorp.de/OpenCL/examples/juliaflight>.
218 220
219 use OpenGL ":all"; 221 use OpenGL ":all";
220 use OpenCL; 222 use OpenCL;
221 223
224 my $S = $ARGV[0] || 256; # window/texture size, smaller is faster
225
222 # open a window and create a gl texture 226 # open a window and create a gl texture
223 OpenGL::glpOpenWindow width => 256, height => 256; 227 OpenGL::glpOpenWindow width => $S, height => $S;
224 my $texid = glGenTextures_p 1; 228 my $texid = glGenTextures_p 1;
225 glBindTexture GL_TEXTURE_2D, $texid; 229 glBindTexture GL_TEXTURE_2D, $texid;
226 glTexImage2D_c GL_TEXTURE_2D, 0, GL_RGBA8, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0; 230 glTexImage2D_c GL_TEXTURE_2D, 0, GL_RGBA8, $S, $S, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0;
227 231
228 # find and use the first opencl device that let's us get a shared opengl context 232 # find and use the first opencl device that let's us get a shared opengl context
229 my $platform; 233 my $platform;
230 my $dev; 234 my $dev;
231 my $ctx; 235 my $ctx;
232 236
237 sub get_context {
233 for (OpenCL::platforms) { 238 for (OpenCL::platforms) {
234 $platform = $_; 239 $platform = $_;
235 for ($platform->devices) { 240 for ($platform->devices) {
236 $dev = $_; 241 $dev = $_;
237 $ctx = $platform->context ([OpenCL::GLX_DISPLAY_KHR, undef, OpenCL::GL_CONTEXT_KHR, undef], [$dev]) 242 $ctx = eval { $platform->context ([OpenCL::GLX_DISPLAY_KHR, undef, OpenCL::GL_CONTEXT_KHR, undef], [$dev]) }
238 and last; 243 and return;
244 }
239 } 245 }
246
247 die "cannot find suitable OpenCL device\n";
240 } 248 }
241 249
242 $ctx 250 get_context;
243 or die "cannot find suitable OpenCL device\n";
244 251
245 my $queue = $ctx->queue ($dev); 252 my $queue = $ctx->queue ($dev);
246 253
247 # now attach an opencl image2d object to the opengl texture 254 # now attach an opencl image2d object to the opengl texture
248 my $tex = $ctx->gl_texture2d (OpenCL::MEM_WRITE_ONLY, GL_TEXTURE_2D, 0, $texid); 255 my $tex = $ctx->gl_texture2d (OpenCL::MEM_WRITE_ONLY, GL_TEXTURE_2D, 0, $texid);
250 # now the boring opencl code 257 # now the boring opencl code
251 my $src = <<EOF; 258 my $src = <<EOF;
252 kernel void 259 kernel void
253 juliatunnel (write_only image2d_t img, float time) 260 juliatunnel (write_only image2d_t img, float time)
254 { 261 {
255 float2 p = (float2)(get_global_id (0), get_global_id (1)) / 256.f * 2.f - 1.f; 262 int2 xy = (int2)(get_global_id (0), get_global_id (1));
263 float2 p = convert_float2 (xy) / $S.f * 2.f - 1.f;
256 264
257 float2 m = (float2)(1.f, p.y) / fabs (p.x); 265 float2 m = (float2)(1.f, p.y) / fabs (p.x); // tunnel
258 m.x = fabs (fmod (m.x + time * 0.05f, 4.f)) - 2.f; 266 m.x = fabs (fmod (m.x + time * 0.05f, 4.f) - 2.f);
259 267
260 float2 z = m; 268 float2 z = m;
261 float2 c = (float2)(sin (time * 0.05005), cos (time * 0.06001)); 269 float2 c = (float2)(sin (time * 0.01133f), cos (time * 0.02521f));
262 270
263 for (int i = 0; i < 25 && dot (z, z) < 4.f; ++i) 271 for (int i = 0; i < 25 && dot (z, z) < 4.f; ++i) // standard julia
264 z = (float2)(z.x * z.x - z.y * z.y, 2.f * z.x * z.y) + c; 272 z = (float2)(z.x * z.x - z.y * z.y, 2.f * z.x * z.y) + c;
265 273
266 float3 colour = (float3)(z.x, z.y, z.x * z.y); 274 float3 colour = (float3)(z.x, z.y, atan2 (z.y, z.x));
267 write_imagef (img, (int2)(get_global_id (0), get_global_id (1)), (float4)(colour * p.x * p.x, 1.)); 275 write_imagef (img, xy, (float4)(colour * p.x * p.x, 1.));
268 } 276 }
269 EOF 277 EOF
270 278
271 my $prog = $ctx->build_program ($src); 279 my $prog = $ctx->build_program ($src);
272 my $kernel = $prog->kernel ("juliatunnel"); 280 my $kernel = $prog->kernel ("juliatunnel");
276 for (my $time; ; ++$time) { 284 for (my $time; ; ++$time) {
277 # acquire objects from opengl 285 # acquire objects from opengl
278 $queue->acquire_gl_objects ([$tex]); 286 $queue->acquire_gl_objects ([$tex]);
279 287
280 # configure and run our kernel 288 # configure and run our kernel
281 $kernel->set_image2d (0, $tex); 289 $kernel->setf ("mf", $tex, $time*2); # mf = memory object, float
282 $kernel->set_float (1, $time);
283 $queue->nd_range_kernel ($kernel, undef, [256, 256], undef); 290 $queue->nd_range_kernel ($kernel, undef, [$S, $S], undef);
284 291
285 # release objects to opengl again 292 # release objects to opengl again
286 $queue->release_gl_objects ([$tex]); 293 $queue->release_gl_objects ([$tex]);
287 294
288 # wait 295 # wait
302 glXSwapBuffers; 309 glXSwapBuffers;
303 310
304 select undef, undef, undef, 1/60; 311 select undef, undef, undef, 1/60;
305 } 312 }
306 313
314=head2 How to modify the previous example to not rely on GL sharing.
315
316For those poor souls with only a sucky CPU OpenCL implementation, you
317currently have to read the image into some perl scalar, and then modify a
318texture or use glDrawPixels or so).
319
320First, when you don't need gl sharing, you can create the context much simpler:
321
322 $ctx = $platform->context (undef, [$dev])
323
324To use a texture, you would modify the above example by creating an
325OpenCL::Image manually instead of deriving it from a texture:
326
327 my $tex = $ctx->image2d (OpenCL::MEM_WRITE_ONLY, OpenCL::RGBA, OpenCL::UNORM_INT8, $S, $S);
328
329And in the draw loop, intead of acquire_gl_objects/release_gl_objects, you
330would read the image2d after the kernel has written it:
331
332 $queue->read_image ($tex, 0, 0, 0, 0, $S, $S, 1, 0, 0, my $data);
333
334And then you would upload the pixel data to the texture (or use glDrawPixels):
335
336 glTexSubImage2D_s GL_TEXTURE_2D, 0, 0, 0, $S, $S, GL_RGBA, GL_UNSIGNED_BYTE, $data;
337
338The fully modified example can be found at
339L<http://cvs.schmorp.de/OpenCL/examples/juliaflight-nosharing>.
340
341=head2 Julia sets look soooo 80ies.
342
343Then colour them differently, e.g. using orbit traps! Replace the loop and
344colour calculation from the previous examples by this:
345
346 float2 dm = (float2)(1.f, 1.f);
347
348 for (int i = 0; i < 25; ++i)
349 {
350 z = (float2)(z.x * z.x - z.y * z.y, 2.f * z.x * z.y) + c;
351 dm = fmin (dm, (float2)(fabs (dot (z, z) - 1.f), fabs (z.x - 1.f)));
352 }
353
354 float3 colour = (float3)(dm.x * dm.y, dm.x * dm.y, dm.x);
355
356Also try C<-10.f> instead of C<-1.f>.
357
307=head1 DOCUMENTATION 358=head1 DOCUMENTATION
308 359
309=head2 BASIC CONVENTIONS 360=head2 BASIC CONVENTIONS
310 361
311This is not a one-to-one C-style translation of OpenCL to Perl - instead 362This is not a one-to-one C-style translation of OpenCL to Perl - instead
340 391
341=item * When enqueuing commands, if the enqueue method is called in void 392=item * When enqueuing commands, if the enqueue method is called in void
342context, no event is created. In all other contexts an event is returned 393context, no event is created. In all other contexts an event is returned
343by the method. 394by the method.
344 395
345=item * This module expects all functions to return C<CL_SUCCESS>. If any 396=item * This module expects all functions to return C<OpenCL::SUCCESS>. If any
346other status is returned the function will throw an exception, so you 397other status is returned the function will throw an exception, so you
347don't normally have to to any error checking. 398don't normally have to to any error checking.
348 399
349=back 400=back
401
402=head2 CONSTANTS
403
404All C<CL_xxx> constants that this module supports are always available
405in the C<OpenCL> namespace as C<OpenCL::xxx> (i.e. without the C<CL_>
406prefix). Constants which are not defined in the header files used during
407compilation, or otherwise are not available, will have the value C<0> (in
408some cases, this will make them indistinguishable from real constants,
409sorry).
410
411The latest version of this module knows and exports the constants
412listed in L<http://cvs.schmorp.de/OpenCL/constiv.h>.
413
414=head2 OPENCL 1.1 VS. OPENCL 1.2
415
416This module supports both OpenCL version 1.1 and 1.2, although the OpenCL
4171.2 interface hasn't been tested much for lack of availability of an
418actual implementation.
419
420Every function or method in this manual page that interfaces to a
421particular OpenCL function has a link to the its C manual page.
422
423If the link contains a F<1.1>, then this function is an OpenCL 1.1
424function. Most but not all also exist in OpenCL 1.2, and this module
425tries to emulate the missing ones for you, when told to do so at
426compiletime. You can check whether a function was removed in OpenCL 1.2 by
427replacing the F<1.1> component in the URL by F<1.2>.
428
429If the link contains a F<1.2>, then this is a OpenCL 1.2-only
430function. Even if the module was compiled with OpenCL 1.2 header files
431and has an 1.2 OpenCL library, calling such a function on a platform that
432doesn't implement 1.2 causes undefined behaviour, usually a crash (But
433this is not guaranteed).
434
435You can find out whether this module was compiled to prefer 1.1
436functionality by ooking at C<OpenCL::PREFER_1_1> - if it is true, then
4371.1 functions generally are implemented using 1.1 OpenCL functions. If it
438is false, then 1.1 functions missing from 1.2 are emulated by calling 1.2
439fucntions.
440
441This is a somewhat sorry state of affairs, but the Khronos group choose to
442make every release of OpenCL source and binary incompatible with previous
443releases.
350 444
351=head2 PERL AND OPENCL TYPES 445=head2 PERL AND OPENCL TYPES
352 446
353This handy(?) table lists OpenCL types and their perl, PDL and pack/unpack 447This handy(?) table lists OpenCL types and their perl, PDL and pack/unpack
354format equivalents: 448format equivalents:
386OpenCL can generate a number of (potentially) asynchronous events, for 480OpenCL can generate a number of (potentially) asynchronous events, for
387example, after compiling a program, to signal a context-related error or, 481example, after compiling a program, to signal a context-related error or,
388perhaps most important, to signal completion of queued jobs (by setting 482perhaps most important, to signal completion of queued jobs (by setting
389callbacks on OpenCL::Event objects). 483callbacks on OpenCL::Event objects).
390 484
485The OpenCL module converts all these callbacks into events - you can
486still register callbacks, but they are not executed when your OpenCL
487implementation calls the actual callback, but only later. Therefore, none
488of the limitations of OpenCL callbacks apply to the perl implementation:
489it is perfectly safe to make blocking operations from event callbacks, and
490enqueued operations don't need to be flushed.
491
391To facilitate this, this module maintains an event queue - each 492To facilitate this, this module maintains an event queue - each
392time an asynchronous event happens, it is queued, and perl will be 493time an asynchronous event happens, it is queued, and perl will be
393interrupted. This is implemented via the L<Async::Interrupt> module. In 494interrupted. This is implemented via the L<Async::Interrupt> module. In
394addition, this module has L<AnyEvent> support, so it can seamlessly 495addition, this module has L<AnyEvent> support, so it can seamlessly
395integrate itself into many event loops. 496integrate itself into many event loops.
396 497
397Since this module is a bit hard to understand, here are some case examples: 498Since L<Async::Interrupt> is a bit hard to understand, here are some case examples:
398 499
399=head3 Don't use callbacks. 500=head3 Don't use callbacks.
400 501
401When your program never uses any callbacks, then there will never be any 502When your program never uses any callbacks, then there will never be any
402notifications you need to take care of, and therefore no need to worry 503notifications you need to take care of, and therefore no need to worry
493=cut 594=cut
494 595
495package OpenCL; 596package OpenCL;
496 597
497use common::sense; 598use common::sense;
599use Carp ();
498use Async::Interrupt (); 600use Async::Interrupt ();
499 601
500our $POLL_FUNC; # set by XS 602our $POLL_FUNC; # set by XS
501 603
502BEGIN { 604BEGIN {
503 our $VERSION = '0.97'; 605 our $VERSION = '1.01';
504 606
505 require XSLoader; 607 require XSLoader;
506 XSLoader::load (__PACKAGE__, $VERSION); 608 XSLoader::load (__PACKAGE__, $VERSION);
507 609
508 @OpenCL::Platform::ISA = 610 @OpenCL::Platform::ISA =
513 @OpenCL::Sampler::ISA = 615 @OpenCL::Sampler::ISA =
514 @OpenCL::Program::ISA = 616 @OpenCL::Program::ISA =
515 @OpenCL::Kernel::ISA = 617 @OpenCL::Kernel::ISA =
516 @OpenCL::Event::ISA = OpenCL::Object::; 618 @OpenCL::Event::ISA = OpenCL::Object::;
517 619
620 @OpenCL::SubDevice::ISA = OpenCL::Device::;
621
518 @OpenCL::Buffer::ISA = 622 @OpenCL::Buffer::ISA =
519 @OpenCL::Image::ISA = OpenCL::Memory::; 623 @OpenCL::Image::ISA = OpenCL::Memory::;
520 624
521 @OpenCL::BufferObj::ISA = OpenCL::Buffer::; 625 @OpenCL::BufferObj::ISA = OpenCL::Buffer::;
522 626
526 @OpenCL::Image1D::ISA = 630 @OpenCL::Image1D::ISA =
527 @OpenCL::Image1DArray::ISA = 631 @OpenCL::Image1DArray::ISA =
528 @OpenCL::Image1DBuffer::ISA = OpenCL::Image::; 632 @OpenCL::Image1DBuffer::ISA = OpenCL::Image::;
529 633
530 @OpenCL::UserEvent::ISA = OpenCL::Event::; 634 @OpenCL::UserEvent::ISA = OpenCL::Event::;
635
636 @OpenCL::MappedBuffer::ISA =
637 @OpenCL::MappedImage::ISA = OpenCL::Mapped::;
531} 638}
532 639
533=head2 THE OpenCL PACKAGE 640=head2 THE OpenCL PACKAGE
534 641
535=over 4 642=over 4
537=item $int = OpenCL::errno 644=item $int = OpenCL::errno
538 645
539The last error returned by a function - it's only valid after an error occured 646The last error returned by a function - it's only valid after an error occured
540and before calling another OpenCL function. 647and before calling another OpenCL function.
541 648
542=item $str = OpenCL::err2str $errval 649=item $str = OpenCL::err2str [$errval]
543 650
544Comverts an error value into a human readable string. 651Converts an error value into a human readable string. If no error value is
652given, then the last error will be used (as returned by OpenCL::errno).
653
654The latest version of this module knows the error constants
655listed in L<http://cvs.schmorp.de/OpenCL/errstr.h>.
545 656
546=item $str = OpenCL::enum2str $enum 657=item $str = OpenCL::enum2str $enum
547 658
548Converts most enum values (of parameter names, image format constants, 659Converts most enum values (of parameter names, image format constants,
549object types, addressing and filter modes, command types etc.) into a 660object types, addressing and filter modes, command types etc.) into a
550human readable string. When confronted with some random integer it can be 661human readable string. When confronted with some random integer it can be
551very helpful to pass it through this function to maybe get some readable 662very helpful to pass it through this function to maybe get some readable
552string out of it. 663string out of it.
553 664
665The latest version of this module knows the enumaration constants
666listed in L<http://cvs.schmorp.de/OpenCL/enumstr.h>.
667
554=item @platforms = OpenCL::platforms 668=item @platforms = OpenCL::platforms
555 669
556Returns all available OpenCL::Platform objects. 670Returns all available OpenCL::Platform objects.
557 671
558L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetPlatformIDs.html> 672L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetPlatformIDs.html>
559 673
560=item $ctx = OpenCL::context_from_type $properties, $type = OpenCL::DEVICE_TYPE_DEFAULT, $callback->($err, $pvt) = $print_stderr 674=item $ctx = OpenCL::context_from_type $properties, $type = OpenCL::DEVICE_TYPE_DEFAULT, $callback->($err, $pvt) = $print_stderr
561 675
562Tries to create a context from a default device and platform type - never worked for me. 676Tries to create a context from a default device and platform type - never worked for me.
677Consider using C<< $platform->context_from_type >> instead.
678
679type: OpenCL::DEVICE_TYPE_DEFAULT, OpenCL::DEVICE_TYPE_CPU, OpenCL::DEVICE_TYPE_GPU,
680OpenCL::DEVICE_TYPE_ACCELERATOR, OpenCL::DEVICE_TYPE_CUSTOM, OpenCL::DEVICE_TYPE_ALL.
563 681
564L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContextFromType.html> 682L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContextFromType.html>
565 683
566=item $ctx = OpenCL::context $properties, \@devices, $callback->($err, $pvt) = $print_stderr) 684=item $ctx = OpenCL::context $properties, \@devices, $callback->($err, $pvt) = $print_stderr)
567 685
568Create a new OpenCL::Context object using the given device object(s). This 686Create a new OpenCL::Context object using the given device object(s).
569function isn't implemented yet, use C<< $platform->context >> instead. 687Consider using C<< $platform->context >> instead.
570 688
571L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContext.html> 689L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContext.html>
572 690
573=item OpenCL::wait_for_events $wait_events... 691=item OpenCL::wait_for_events $wait_events...
574 692
655L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContextFromType.html> 773L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContextFromType.html>
656 774
657=item $ctx = $platform->context ($properties, \@devices, $callback->($err, $pvt) = $print_stderr) 775=item $ctx = $platform->context ($properties, \@devices, $callback->($err, $pvt) = $print_stderr)
658 776
659Create a new OpenCL::Context object using the given device object(s)- a 777Create a new OpenCL::Context object using the given device object(s)- a
660CL_CONTEXT_PLATFORM property is supplied automatically. 778OpenCL::CONTEXT_PLATFORM property is supplied automatically.
661 779
662L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContext.html> 780L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContext.html>
663 781
664=item $packed_value = $platform->info ($name) 782=item $packed_value = $platform->info ($name)
665 783
681 799
682=for gengetinfo begin platform 800=for gengetinfo begin platform
683 801
684=item $string = $platform->profile 802=item $string = $platform->profile
685 803
686Calls C<clGetPlatformInfo> with C<CL_PLATFORM_PROFILE> and returns the result. 804Calls C<clGetPlatformInfo> with C<OpenCL::PLATFORM_PROFILE> and returns the result.
687 805
688=item $string = $platform->version 806=item $string = $platform->version
689 807
690Calls C<clGetPlatformInfo> with C<CL_PLATFORM_VERSION> and returns the result. 808Calls C<clGetPlatformInfo> with C<OpenCL::PLATFORM_VERSION> and returns the result.
691 809
692=item $string = $platform->name 810=item $string = $platform->name
693 811
694Calls C<clGetPlatformInfo> with C<CL_PLATFORM_NAME> and returns the result. 812Calls C<clGetPlatformInfo> with C<OpenCL::PLATFORM_NAME> and returns the result.
695 813
696=item $string = $platform->vendor 814=item $string = $platform->vendor
697 815
698Calls C<clGetPlatformInfo> with C<CL_PLATFORM_VENDOR> and returns the result. 816Calls C<clGetPlatformInfo> with C<OpenCL::PLATFORM_VENDOR> and returns the result.
699 817
700=item $string = $platform->extensions 818=item $string = $platform->extensions
701 819
702Calls C<clGetPlatformInfo> with C<CL_PLATFORM_EXTENSIONS> and returns the result. 820Calls C<clGetPlatformInfo> with C<OpenCL::PLATFORM_EXTENSIONS> and returns the result.
703 821
704=for gengetinfo end platform 822=for gengetinfo end platform
705 823
706=back 824=back
707 825
711 829
712=item $packed_value = $device->info ($name) 830=item $packed_value = $device->info ($name)
713 831
714See C<< $platform->info >> for details. 832See C<< $platform->info >> for details.
715 833
834type: OpenCL::DEVICE_TYPE_DEFAULT, OpenCL::DEVICE_TYPE_CPU,
835OpenCL::DEVICE_TYPE_GPU, OpenCL::DEVICE_TYPE_ACCELERATOR,
836OpenCL::DEVICE_TYPE_CUSTOM, OpenCL::DEVICE_TYPE_ALL.
837
838fp_config: OpenCL::FP_DENORM, OpenCL::FP_INF_NAN, OpenCL::FP_ROUND_TO_NEAREST,
839OpenCL::FP_ROUND_TO_ZERO, OpenCL::FP_ROUND_TO_INF, OpenCL::FP_FMA,
840OpenCL::FP_SOFT_FLOAT, OpenCL::FP_CORRECTLY_ROUNDED_DIVIDE_SQRT.
841
842mem_cache_type: OpenCL::NONE, OpenCL::READ_ONLY_CACHE, OpenCL::READ_WRITE_CACHE.
843
844local_mem_type: OpenCL::LOCAL, OpenCL::GLOBAL.
845
846exec_capabilities: OpenCL::EXEC_KERNEL, OpenCL::EXEC_NATIVE_KERNEL.
847
848command_queue_properties: OpenCL::QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE,
849OpenCL::QUEUE_PROFILING_ENABLE.
850
851partition_properties: OpenCL::DEVICE_PARTITION_EQUALLY,
852OpenCL::DEVICE_PARTITION_BY_COUNTS, OpenCL::DEVICE_PARTITION_BY_COUNTS_LIST_END,
853OpenCL::DEVICE_PARTITION_BY_AFFINITY_DOMAIN.
854
855affinity_domain: OpenCL::DEVICE_AFFINITY_DOMAIN_NUMA,
856OpenCL::DEVICE_AFFINITY_DOMAIN_L4_CACHE, OpenCL::DEVICE_AFFINITY_DOMAIN_L3_CACHE,
857OpenCL::DEVICE_AFFINITY_DOMAIN_L2_CACHE, OpenCL::DEVICE_AFFINITY_DOMAIN_L1_CACHE,
858OpenCL::DEVICE_AFFINITY_DOMAIN_NEXT_PARTITIONABLE.
859
716L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetDeviceInfo.html> 860L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetDeviceInfo.html>
717 861
862=item @devices = $device->sub_devices (\@properties)
863
864Creates OpencL::SubDevice objects by partitioning an existing device.
865
866L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateSubDevices.html>
867
718=for gengetinfo begin device 868=for gengetinfo begin device
719 869
720=item $device_type = $device->type 870=item $device_type = $device->type
721 871
722Calls C<clGetDeviceInfo> with C<CL_DEVICE_TYPE> and returns the result. 872Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_TYPE> and returns the result.
723 873
724=item $uint = $device->vendor_id 874=item $uint = $device->vendor_id
725 875
726Calls C<clGetDeviceInfo> with C<CL_DEVICE_VENDOR_ID> and returns the result. 876Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_VENDOR_ID> and returns the result.
727 877
728=item $uint = $device->max_compute_units 878=item $uint = $device->max_compute_units
729 879
730Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_COMPUTE_UNITS> and returns the result. 880Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_COMPUTE_UNITS> and returns the result.
731 881
732=item $uint = $device->max_work_item_dimensions 882=item $uint = $device->max_work_item_dimensions
733 883
734Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS> and returns the result. 884Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_WORK_ITEM_DIMENSIONS> and returns the result.
735 885
736=item $int = $device->max_work_group_size 886=item $int = $device->max_work_group_size
737 887
738Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_WORK_GROUP_SIZE> and returns the result. 888Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_WORK_GROUP_SIZE> and returns the result.
739 889
740=item @ints = $device->max_work_item_sizes 890=item @ints = $device->max_work_item_sizes
741 891
742Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_WORK_ITEM_SIZES> and returns the result. 892Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_WORK_ITEM_SIZES> and returns the result.
743 893
744=item $uint = $device->preferred_vector_width_char 894=item $uint = $device->preferred_vector_width_char
745 895
746Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR> and returns the result. 896Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PREFERRED_VECTOR_WIDTH_CHAR> and returns the result.
747 897
748=item $uint = $device->preferred_vector_width_short 898=item $uint = $device->preferred_vector_width_short
749 899
750Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT> and returns the result. 900Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PREFERRED_VECTOR_WIDTH_SHORT> and returns the result.
751 901
752=item $uint = $device->preferred_vector_width_int 902=item $uint = $device->preferred_vector_width_int
753 903
754Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT> and returns the result. 904Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PREFERRED_VECTOR_WIDTH_INT> and returns the result.
755 905
756=item $uint = $device->preferred_vector_width_long 906=item $uint = $device->preferred_vector_width_long
757 907
758Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG> and returns the result. 908Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PREFERRED_VECTOR_WIDTH_LONG> and returns the result.
759 909
760=item $uint = $device->preferred_vector_width_float 910=item $uint = $device->preferred_vector_width_float
761 911
762Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT> and returns the result. 912Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT> and returns the result.
763 913
764=item $uint = $device->preferred_vector_width_double 914=item $uint = $device->preferred_vector_width_double
765 915
766Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE> and returns the result. 916Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE> and returns the result.
767 917
768=item $uint = $device->max_clock_frequency 918=item $uint = $device->max_clock_frequency
769 919
770Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_CLOCK_FREQUENCY> and returns the result. 920Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_CLOCK_FREQUENCY> and returns the result.
771 921
772=item $bitfield = $device->address_bits 922=item $bitfield = $device->address_bits
773 923
774Calls C<clGetDeviceInfo> with C<CL_DEVICE_ADDRESS_BITS> and returns the result. 924Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_ADDRESS_BITS> and returns the result.
775 925
776=item $uint = $device->max_read_image_args 926=item $uint = $device->max_read_image_args
777 927
778Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_READ_IMAGE_ARGS> and returns the result. 928Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_READ_IMAGE_ARGS> and returns the result.
779 929
780=item $uint = $device->max_write_image_args 930=item $uint = $device->max_write_image_args
781 931
782Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_WRITE_IMAGE_ARGS> and returns the result. 932Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_WRITE_IMAGE_ARGS> and returns the result.
783 933
784=item $ulong = $device->max_mem_alloc_size 934=item $ulong = $device->max_mem_alloc_size
785 935
786Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_MEM_ALLOC_SIZE> and returns the result. 936Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_MEM_ALLOC_SIZE> and returns the result.
787 937
788=item $int = $device->image2d_max_width 938=item $int = $device->image2d_max_width
789 939
790Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE2D_MAX_WIDTH> and returns the result. 940Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_IMAGE2D_MAX_WIDTH> and returns the result.
791 941
792=item $int = $device->image2d_max_height 942=item $int = $device->image2d_max_height
793 943
794Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE2D_MAX_HEIGHT> and returns the result. 944Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_IMAGE2D_MAX_HEIGHT> and returns the result.
795 945
796=item $int = $device->image3d_max_width 946=item $int = $device->image3d_max_width
797 947
798Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE3D_MAX_WIDTH> and returns the result. 948Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_IMAGE3D_MAX_WIDTH> and returns the result.
799 949
800=item $int = $device->image3d_max_height 950=item $int = $device->image3d_max_height
801 951
802Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE3D_MAX_HEIGHT> and returns the result. 952Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_IMAGE3D_MAX_HEIGHT> and returns the result.
803 953
804=item $int = $device->image3d_max_depth 954=item $int = $device->image3d_max_depth
805 955
806Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE3D_MAX_DEPTH> and returns the result. 956Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_IMAGE3D_MAX_DEPTH> and returns the result.
807 957
808=item $uint = $device->image_support 958=item $uint = $device->image_support
809 959
810Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE_SUPPORT> and returns the result. 960Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_IMAGE_SUPPORT> and returns the result.
811 961
812=item $int = $device->max_parameter_size 962=item $int = $device->max_parameter_size
813 963
814Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_PARAMETER_SIZE> and returns the result. 964Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_PARAMETER_SIZE> and returns the result.
815 965
816=item $uint = $device->max_samplers 966=item $uint = $device->max_samplers
817 967
818Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_SAMPLERS> and returns the result. 968Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_SAMPLERS> and returns the result.
819 969
820=item $uint = $device->mem_base_addr_align 970=item $uint = $device->mem_base_addr_align
821 971
822Calls C<clGetDeviceInfo> with C<CL_DEVICE_MEM_BASE_ADDR_ALIGN> and returns the result. 972Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MEM_BASE_ADDR_ALIGN> and returns the result.
823 973
824=item $uint = $device->min_data_type_align_size 974=item $uint = $device->min_data_type_align_size
825 975
826Calls C<clGetDeviceInfo> with C<CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE> and returns the result. 976Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MIN_DATA_TYPE_ALIGN_SIZE> and returns the result.
827 977
828=item $device_fp_config = $device->single_fp_config 978=item $device_fp_config = $device->single_fp_config
829 979
830Calls C<clGetDeviceInfo> with C<CL_DEVICE_SINGLE_FP_CONFIG> and returns the result. 980Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_SINGLE_FP_CONFIG> and returns the result.
831 981
832=item $device_mem_cache_type = $device->global_mem_cache_type 982=item $device_mem_cache_type = $device->global_mem_cache_type
833 983
834Calls C<clGetDeviceInfo> with C<CL_DEVICE_GLOBAL_MEM_CACHE_TYPE> and returns the result. 984Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_GLOBAL_MEM_CACHE_TYPE> and returns the result.
835 985
836=item $uint = $device->global_mem_cacheline_size 986=item $uint = $device->global_mem_cacheline_size
837 987
838Calls C<clGetDeviceInfo> with C<CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE> and returns the result. 988Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_GLOBAL_MEM_CACHELINE_SIZE> and returns the result.
839 989
840=item $ulong = $device->global_mem_cache_size 990=item $ulong = $device->global_mem_cache_size
841 991
842Calls C<clGetDeviceInfo> with C<CL_DEVICE_GLOBAL_MEM_CACHE_SIZE> and returns the result. 992Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_GLOBAL_MEM_CACHE_SIZE> and returns the result.
843 993
844=item $ulong = $device->global_mem_size 994=item $ulong = $device->global_mem_size
845 995
846Calls C<clGetDeviceInfo> with C<CL_DEVICE_GLOBAL_MEM_SIZE> and returns the result. 996Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_GLOBAL_MEM_SIZE> and returns the result.
847 997
848=item $ulong = $device->max_constant_buffer_size 998=item $ulong = $device->max_constant_buffer_size
849 999
850Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE> and returns the result. 1000Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_CONSTANT_BUFFER_SIZE> and returns the result.
851 1001
852=item $uint = $device->max_constant_args 1002=item $uint = $device->max_constant_args
853 1003
854Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_CONSTANT_ARGS> and returns the result. 1004Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_CONSTANT_ARGS> and returns the result.
855 1005
856=item $device_local_mem_type = $device->local_mem_type 1006=item $device_local_mem_type = $device->local_mem_type
857 1007
858Calls C<clGetDeviceInfo> with C<CL_DEVICE_LOCAL_MEM_TYPE> and returns the result. 1008Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_LOCAL_MEM_TYPE> and returns the result.
859 1009
860=item $ulong = $device->local_mem_size 1010=item $ulong = $device->local_mem_size
861 1011
862Calls C<clGetDeviceInfo> with C<CL_DEVICE_LOCAL_MEM_SIZE> and returns the result. 1012Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_LOCAL_MEM_SIZE> and returns the result.
863 1013
864=item $boolean = $device->error_correction_support 1014=item $boolean = $device->error_correction_support
865 1015
866Calls C<clGetDeviceInfo> with C<CL_DEVICE_ERROR_CORRECTION_SUPPORT> and returns the result. 1016Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_ERROR_CORRECTION_SUPPORT> and returns the result.
867 1017
868=item $int = $device->profiling_timer_resolution 1018=item $int = $device->profiling_timer_resolution
869 1019
870Calls C<clGetDeviceInfo> with C<CL_DEVICE_PROFILING_TIMER_RESOLUTION> and returns the result. 1020Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PROFILING_TIMER_RESOLUTION> and returns the result.
871 1021
872=item $boolean = $device->endian_little 1022=item $boolean = $device->endian_little
873 1023
874Calls C<clGetDeviceInfo> with C<CL_DEVICE_ENDIAN_LITTLE> and returns the result. 1024Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_ENDIAN_LITTLE> and returns the result.
875 1025
876=item $boolean = $device->available 1026=item $boolean = $device->available
877 1027
878Calls C<clGetDeviceInfo> with C<CL_DEVICE_AVAILABLE> and returns the result. 1028Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_AVAILABLE> and returns the result.
879 1029
880=item $boolean = $device->compiler_available 1030=item $boolean = $device->compiler_available
881 1031
882Calls C<clGetDeviceInfo> with C<CL_DEVICE_COMPILER_AVAILABLE> and returns the result. 1032Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_COMPILER_AVAILABLE> and returns the result.
883 1033
884=item $device_exec_capabilities = $device->execution_capabilities 1034=item $device_exec_capabilities = $device->execution_capabilities
885 1035
886Calls C<clGetDeviceInfo> with C<CL_DEVICE_EXECUTION_CAPABILITIES> and returns the result. 1036Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_EXECUTION_CAPABILITIES> and returns the result.
887 1037
888=item $command_queue_properties = $device->properties 1038=item $command_queue_properties = $device->properties
889 1039
890Calls C<clGetDeviceInfo> with C<CL_DEVICE_QUEUE_PROPERTIES> and returns the result. 1040Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_QUEUE_PROPERTIES> and returns the result.
891 1041
892=item $ = $device->platform 1042=item $ = $device->platform
893 1043
894Calls C<clGetDeviceInfo> with C<CL_DEVICE_PLATFORM> and returns the result. 1044Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PLATFORM> and returns the result.
895 1045
896=item $string = $device->name 1046=item $string = $device->name
897 1047
898Calls C<clGetDeviceInfo> with C<CL_DEVICE_NAME> and returns the result. 1048Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_NAME> and returns the result.
899 1049
900=item $string = $device->vendor 1050=item $string = $device->vendor
901 1051
902Calls C<clGetDeviceInfo> with C<CL_DEVICE_VENDOR> and returns the result. 1052Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_VENDOR> and returns the result.
903 1053
904=item $string = $device->driver_version 1054=item $string = $device->driver_version
905 1055
906Calls C<clGetDeviceInfo> with C<CL_DRIVER_VERSION> and returns the result. 1056Calls C<clGetDeviceInfo> with C<OpenCL::DRIVER_VERSION> and returns the result.
907 1057
908=item $string = $device->profile 1058=item $string = $device->profile
909 1059
910Calls C<clGetDeviceInfo> with C<CL_DEVICE_PROFILE> and returns the result. 1060Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PROFILE> and returns the result.
911 1061
912=item $string = $device->version 1062=item $string = $device->version
913 1063
914Calls C<clGetDeviceInfo> with C<CL_DEVICE_VERSION> and returns the result. 1064Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_VERSION> and returns the result.
915 1065
916=item $string = $device->extensions 1066=item $string = $device->extensions
917 1067
918Calls C<clGetDeviceInfo> with C<CL_DEVICE_EXTENSIONS> and returns the result. 1068Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_EXTENSIONS> and returns the result.
919 1069
920=item $uint = $device->preferred_vector_width_half 1070=item $uint = $device->preferred_vector_width_half
921 1071
922Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF> and returns the result. 1072Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PREFERRED_VECTOR_WIDTH_HALF> and returns the result.
923 1073
924=item $uint = $device->native_vector_width_char 1074=item $uint = $device->native_vector_width_char
925 1075
926Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR> and returns the result. 1076Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_NATIVE_VECTOR_WIDTH_CHAR> and returns the result.
927 1077
928=item $uint = $device->native_vector_width_short 1078=item $uint = $device->native_vector_width_short
929 1079
930Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT> and returns the result. 1080Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_NATIVE_VECTOR_WIDTH_SHORT> and returns the result.
931 1081
932=item $uint = $device->native_vector_width_int 1082=item $uint = $device->native_vector_width_int
933 1083
934Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_INT> and returns the result. 1084Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_NATIVE_VECTOR_WIDTH_INT> and returns the result.
935 1085
936=item $uint = $device->native_vector_width_long 1086=item $uint = $device->native_vector_width_long
937 1087
938Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG> and returns the result. 1088Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_NATIVE_VECTOR_WIDTH_LONG> and returns the result.
939 1089
940=item $uint = $device->native_vector_width_float 1090=item $uint = $device->native_vector_width_float
941 1091
942Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT> and returns the result. 1092Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_NATIVE_VECTOR_WIDTH_FLOAT> and returns the result.
943 1093
944=item $uint = $device->native_vector_width_double 1094=item $uint = $device->native_vector_width_double
945 1095
946Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE> and returns the result. 1096Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE> and returns the result.
947 1097
948=item $uint = $device->native_vector_width_half 1098=item $uint = $device->native_vector_width_half
949 1099
950Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF> and returns the result. 1100Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_NATIVE_VECTOR_WIDTH_HALF> and returns the result.
951 1101
952=item $device_fp_config = $device->double_fp_config 1102=item $device_fp_config = $device->double_fp_config
953 1103
954Calls C<clGetDeviceInfo> with C<CL_DEVICE_DOUBLE_FP_CONFIG> and returns the result. 1104Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_DOUBLE_FP_CONFIG> and returns the result.
955 1105
956=item $device_fp_config = $device->half_fp_config 1106=item $device_fp_config = $device->half_fp_config
957 1107
958Calls C<clGetDeviceInfo> with C<CL_DEVICE_HALF_FP_CONFIG> and returns the result. 1108Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_HALF_FP_CONFIG> and returns the result.
959 1109
960=item $boolean = $device->host_unified_memory 1110=item $boolean = $device->host_unified_memory
961 1111
962Calls C<clGetDeviceInfo> with C<CL_DEVICE_HOST_UNIFIED_MEMORY> and returns the result. 1112Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_HOST_UNIFIED_MEMORY> and returns the result.
963 1113
964=item $device = $device->parent_device_ext 1114=item $device = $device->parent_device_ext
965 1115
966Calls C<clGetDeviceInfo> with C<CL_DEVICE_PARENT_DEVICE_EXT> and returns the result. 1116Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PARENT_DEVICE_EXT> and returns the result.
967 1117
968=item @device_partition_property_exts = $device->partition_types_ext 1118=item @device_partition_property_exts = $device->partition_types_ext
969 1119
970Calls C<clGetDeviceInfo> with C<CL_DEVICE_PARTITION_TYPES_EXT> and returns the result. 1120Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PARTITION_TYPES_EXT> and returns the result.
971 1121
972=item @device_partition_property_exts = $device->affinity_domains_ext 1122=item @device_partition_property_exts = $device->affinity_domains_ext
973 1123
974Calls C<clGetDeviceInfo> with C<CL_DEVICE_AFFINITY_DOMAINS_EXT> and returns the result. 1124Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_AFFINITY_DOMAINS_EXT> and returns the result.
975 1125
976=item $uint = $device->reference_count_ext 1126=item $uint = $device->reference_count_ext
977 1127
978Calls C<clGetDeviceInfo> with C<CL_DEVICE_REFERENCE_COUNT_EXT> and returns the result. 1128Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_REFERENCE_COUNT_EXT> and returns the result.
979 1129
980=item @device_partition_property_exts = $device->partition_style_ext 1130=item @device_partition_property_exts = $device->partition_style_ext
981 1131
982Calls C<clGetDeviceInfo> with C<CL_DEVICE_PARTITION_STYLE_EXT> and returns the result. 1132Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PARTITION_STYLE_EXT> and returns the result.
983 1133
984=for gengetinfo end device 1134=for gengetinfo end device
985 1135
986=back 1136=back
987 1137
988=head2 THE OpenCL::Context CLASS 1138=head2 THE OpenCL::Context CLASS
1139
1140An OpenCL::Context is basically a container, or manager, for a number of
1141devices of a platform. It is used to create all sorts of secondary objects
1142such as buffers, queues, programs and so on.
1143
1144All context creation functions and methods take a list of properties
1145(type-value pairs). All property values can be specified as integers -
1146some additionally support other types:
1147
1148=over 4
1149
1150=item OpenCL::CONTEXT_PLATFORM
1151
1152Also accepts OpenCL::Platform objects.
1153
1154=item OpenCL::GLX_DISPLAY_KHR
1155
1156Also accepts C<undef>, in which case a deep and troubling hack is engaged
1157to find the current glx display (see L<GLX SUPPORT>).
1158
1159=item OpenCL::GL_CONTEXT_KHR
1160
1161Also accepts C<undef>, in which case a deep and troubling hack is engaged
1162to find the current glx context (see L<GLX SUPPORT>).
1163
1164=back
989 1165
990=over 4 1166=over 4
991 1167
992=item $prog = $ctx->build_program ($program, $options = "") 1168=item $prog = $ctx->build_program ($program, $options = "")
993 1169
1002=cut 1178=cut
1003 1179
1004sub OpenCL::Context::build_program { 1180sub OpenCL::Context::build_program {
1005 my ($self, $prog, $options) = @_; 1181 my ($self, $prog, $options) = @_;
1006 1182
1007 require Carp;
1008
1009 $prog = $self->program_with_source ($prog) 1183 $prog = $self->program_with_source ($prog)
1010 unless ref $prog; 1184 unless ref $prog;
1011 1185
1012 # we build separately per device so we instantly know which one failed 1186 eval { $prog->build (undef, $options); 1 }
1187 or errno == BUILD_PROGRAM_FAILURE
1188 or errno == INVALID_BINARY # workaround nvidia bug
1189 or Carp::croak "OpenCL::Context->build_program: " . err2str;
1190
1191 # we check status for all devices
1013 for my $dev ($self->devices) { 1192 for my $dev ($self->devices) {
1014 eval { $prog->build ([$dev], $options); 1 } 1193 $prog->build_status ($dev) == BUILD_SUCCESS
1015 or Carp::croak ("Building OpenCL program for device '" . $dev->name . "' failed:\n" 1194 or Carp::croak "Building OpenCL program for device '" . $dev->name . "' failed:\n"
1016 . $prog->build_log ($dev)); 1195 . $prog->build_log ($dev);
1017 } 1196 }
1018 1197
1019 $prog 1198 $prog
1020} 1199}
1021 1200
1038=item $buf = $ctx->buffer ($flags, $len) 1217=item $buf = $ctx->buffer ($flags, $len)
1039 1218
1040Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object with the 1219Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object with the
1041given flags and octet-size. 1220given flags and octet-size.
1042 1221
1222flags: OpenCL::MEM_READ_WRITE, OpenCL::MEM_WRITE_ONLY, OpenCL::MEM_READ_ONLY,
1223OpenCL::MEM_USE_HOST_PTR, OpenCL::MEM_ALLOC_HOST_PTR, OpenCL::MEM_COPY_HOST_PTR,
1224OpenCL::MEM_HOST_WRITE_ONLY, OpenCL::MEM_HOST_READ_ONLY, OpenCL::MEM_HOST_NO_ACCESS.
1225
1043L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateBuffer.html> 1226L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateBuffer.html>
1227
1228A somewhat informative thread on the flags is:
1229
1230L<http://www.khronos.org/message_boards/viewtopic.php?f=28&t=2440>
1044 1231
1045=item $buf = $ctx->buffer_sv ($flags, $data) 1232=item $buf = $ctx->buffer_sv ($flags, $data)
1046 1233
1047Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object and 1234Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object and
1048initialise it with the given data values. 1235initialise it with the given data values.
1050=item $img = $ctx->image ($self, $flags, $channel_order, $channel_type, $type, $width, $height, $depth = 0, $array_size = 0, $row_pitch = 0, $slice_pitch = 0, $num_mip_level = 0, $num_samples = 0, $*data = &PL_sv_undef) 1237=item $img = $ctx->image ($self, $flags, $channel_order, $channel_type, $type, $width, $height, $depth = 0, $array_size = 0, $row_pitch = 0, $slice_pitch = 0, $num_mip_level = 0, $num_samples = 0, $*data = &PL_sv_undef)
1051 1238
1052Creates a new OpenCL::Image object and optionally initialises it with 1239Creates a new OpenCL::Image object and optionally initialises it with
1053the given data values. 1240the given data values.
1054 1241
1242channel_order: OpenCL::R, OpenCL::A, OpenCL::RG, OpenCL::RA, OpenCL::RGB,
1243OpenCL::RGBA, OpenCL::BGRA, OpenCL::ARGB, OpenCL::INTENSITY, OpenCL::LUMINANCE,
1244OpenCL::Rx, OpenCL::RGx, OpenCL::RGBx.
1245
1246channel_type: OpenCL::SNORM_INT8, OpenCL::SNORM_INT16, OpenCL::UNORM_INT8,
1247OpenCL::UNORM_INT16, OpenCL::UNORM_SHORT_565, OpenCL::UNORM_SHORT_555,
1248OpenCL::UNORM_INT_101010, OpenCL::SIGNED_INT8, OpenCL::SIGNED_INT16,
1249OpenCL::SIGNED_INT32, OpenCL::UNSIGNED_INT8, OpenCL::UNSIGNED_INT16,
1250OpenCL::UNSIGNED_INT32, OpenCL::HALF_FLOAT, OpenCL::FLOAT.
1251
1252type: OpenCL::MEM_OBJECT_BUFFER, OpenCL::MEM_OBJECT_IMAGE2D,
1253OpenCL::MEM_OBJECT_IMAGE3D, OpenCL::MEM_OBJECT_IMAGE2D_ARRAY,
1254OpenCL::MEM_OBJECT_IMAGE1D, OpenCL::MEM_OBJECT_IMAGE1D_ARRAY,
1255OpenCL::MEM_OBJECT_IMAGE1D_BUFFER.
1256
1055L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateImage.html> 1257L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateImage.html>
1056 1258
1057=item $img = $ctx->image2d ($flags, $channel_order, $channel_type, $width, $height, $row_pitch = 0, $data = undef) 1259=item $img = $ctx->image2d ($flags, $channel_order, $channel_type, $width, $height, $row_pitch = 0, $data = undef)
1058 1260
1059Creates a new OpenCL::Image2D object and optionally initialises it with 1261Creates a new OpenCL::Image2D object and optionally initialises it with
1071=item $buffer = $ctx->gl_buffer ($flags, $bufobj) 1273=item $buffer = $ctx->gl_buffer ($flags, $bufobj)
1072 1274
1073Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object that refers to the given 1275Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object that refers to the given
1074OpenGL buffer object. 1276OpenGL buffer object.
1075 1277
1278flags: OpenCL::MEM_READ_WRITE, OpenCL::MEM_READ_ONLY, OpenCL::MEM_WRITE_ONLY.
1279
1076http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateFromGLBuffer.html 1280http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateFromGLBuffer.html
1077 1281
1078=item $img = $ctx->gl_texture ($flags, $target, $miplevel, $texture) 1282=item $img = $ctx->gl_texture ($flags, $target, $miplevel, $texture)
1079 1283
1080Creates a new OpenCL::Image object that refers to the given OpenGL 1284Creates a new OpenCL::Image object that refers to the given OpenGL
1081texture object or buffer. 1285texture object or buffer.
1082 1286
1287target: GL_TEXTURE_1D, GL_TEXTURE_1D_ARRAY, GL_TEXTURE_BUFFER,
1288GL_TEXTURE_2D, GL_TEXTURE_2D_ARRAY, GL_TEXTURE_3D,
1289GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
1290GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
1291GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
1292GL_TEXTURE_RECTANGLE/GL_TEXTURE_RECTANGLE_ARB.
1293
1083http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateFromGLTexture.html 1294http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateFromGLTexture.html
1084 1295
1085=item $img = $ctx->gl_texture2d ($flags, $target, $miplevel, $texture) 1296=item $img = $ctx->gl_texture2d ($flags, $target, $miplevel, $texture)
1086 1297
1087Creates a new OpenCL::Image2D object that refers to the given OpenGL 1298Creates a new OpenCL::Image2D object that refers to the given OpenGL
1112 1323
1113=item $sampler = $ctx->sampler ($normalized_coords, $addressing_mode, $filter_mode) 1324=item $sampler = $ctx->sampler ($normalized_coords, $addressing_mode, $filter_mode)
1114 1325
1115Creates a new OpenCL::Sampler object. 1326Creates a new OpenCL::Sampler object.
1116 1327
1328addressing_mode: OpenCL::ADDRESS_NONE, OpenCL::ADDRESS_CLAMP_TO_EDGE,
1329OpenCL::ADDRESS_CLAMP, OpenCL::ADDRESS_REPEAT, OpenCL::ADDRESS_MIRRORED_REPEAT.
1330
1331filter_mode: OpenCL::FILTER_NEAREST, OpenCL::FILTER_LINEAR.
1332
1117L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateSampler.html> 1333L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateSampler.html>
1118 1334
1119=item $program = $ctx->program_with_source ($string) 1335=item $program = $ctx->program_with_source ($string)
1120 1336
1121Creates a new OpenCL::Program object from the given source code. 1337Creates a new OpenCL::Program object from the given source code.
1122 1338
1123L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateProgramWithSource.html> 1339L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateProgramWithSource.html>
1124 1340
1341=item ($program, \@status) = $ctx->program_with_binary (\@devices, \@binaries)
1342
1343Creates a new OpenCL::Program object from the given binaries.
1344
1345L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateProgramWithBinary.html>
1346
1347Example: clone an existing program object that contains a successfully
1348compiled program, no matter how useless this is.
1349
1350 my $clone = $ctx->program_with_binary ([$prog->devices], [$prog->binaries]);
1351
1352=item $program = $ctx->program_with_built_in_kernels (\@devices, $kernel_names)
1353
1354Creates a new OpenCL::Program object from the given built-in kernel names.
1355
1356L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateProgramWithBuiltInKernels.html>
1357
1358=item $program = $ctx->link_program (\@devices, $options, \@programs, $cb->($program) = undef)
1359
1360Links all (already compiled) program objects specified in C<@programs>
1361together and returns a new OpenCL::Program object with the result.
1362
1363L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clLinkProgram.html>
1364
1125=item $packed_value = $ctx->info ($name) 1365=item $packed_value = $ctx->info ($name)
1126 1366
1127See C<< $platform->info >> for details. 1367See C<< $platform->info >> for details.
1128 1368
1129L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetContextInfo.html> 1369L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetContextInfo.html>
1130 1370
1131=for gengetinfo begin context 1371=for gengetinfo begin context
1132 1372
1133=item $uint = $context->reference_count 1373=item $uint = $context->reference_count
1134 1374
1135Calls C<clGetContextInfo> with C<CL_CONTEXT_REFERENCE_COUNT> and returns the result. 1375Calls C<clGetContextInfo> with C<OpenCL::CONTEXT_REFERENCE_COUNT> and returns the result.
1136 1376
1137=item @devices = $context->devices 1377=item @devices = $context->devices
1138 1378
1139Calls C<clGetContextInfo> with C<CL_CONTEXT_DEVICES> and returns the result. 1379Calls C<clGetContextInfo> with C<OpenCL::CONTEXT_DEVICES> and returns the result.
1140 1380
1141=item @property_ints = $context->properties 1381=item @property_ints = $context->properties
1142 1382
1143Calls C<clGetContextInfo> with C<CL_CONTEXT_PROPERTIES> and returns the result. 1383Calls C<clGetContextInfo> with C<OpenCL::CONTEXT_PROPERTIES> and returns the result.
1144 1384
1145=item $uint = $context->num_devices 1385=item $uint = $context->num_devices
1146 1386
1147Calls C<clGetContextInfo> with C<CL_CONTEXT_NUM_DEVICES> and returns the result. 1387Calls C<clGetContextInfo> with C<OpenCL::CONTEXT_NUM_DEVICES> and returns the result.
1148 1388
1149=for gengetinfo end context 1389=for gengetinfo end context
1150 1390
1151=back 1391=back
1152 1392
1191 1431
1192=item $ev = $queue->copy_buffer ($src, $dst, $src_offset, $dst_offset, $len, $wait_events...) 1432=item $ev = $queue->copy_buffer ($src, $dst, $src_offset, $dst_offset, $len, $wait_events...)
1193 1433
1194L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBuffer.html> 1434L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBuffer.html>
1195 1435
1196=item $ev = $queue->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...) 1436$eue->read_buffer_rect ($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...)
1197 1437
1198http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadBufferRect.html 1438http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadBufferRect.html
1199 1439
1200=item $ev = $queue->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...) 1440=item $ev = $queue->write_buffer_rect ($buf, $blocking, $buf_y, $host_x, $host_z, $height, $buf_row_pitch, $host_row_pitch, $data, $wait_events...)
1201 1441
1202http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteBufferRect.html 1442http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteBufferRect.html
1203 1443
1444=item $ev = $queue->copy_buffer_to_image ($src_buffer, $dst_image, $src_offset, $dst_x, $dst_y, $dst_z, $width, $height, $depth, $wait_events...)
1445
1446L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferToImage.html>
1447
1204=item $ev = $queue->read_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...) 1448=item $ev = $queue->read_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...)
1205 1449
1206L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferRect.html> 1450C<$row_pitch> (and C<$slice_pitch>) can be C<0>, in which case the OpenCL
1207 1451module uses the image width (and height) to supply default values.
1208=item $ev = $queue->copy_buffer_to_image ($src_buffer, $dst_image, $src_offset, $dst_x, $dst_y, $dst_z, $width, $height, $depth, $wait_events...)
1209 1452
1210L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadImage.html> 1453L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadImage.html>
1211 1454
1212=item $ev = $queue->write_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...) 1455=item $ev = $queue->write_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...)
1213 1456
1457C<$row_pitch> (and C<$slice_pitch>) can be C<0>, in which case the OpenCL
1458module uses the image width (and height) to supply default values.
1214L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteImage.html> 1459L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteImage.html>
1215 1460
1216=item $ev = $queue->copy_image ($src_image, $dst_image, $src_x, $src_y, $src_z, $dst_x, $dst_y, $dst_z, $width, $height, $depth, $wait_events...) 1461=item $ev = $queue->copy_image ($src_image, $dst_image, $src_x, $src_y, $src_z, $dst_x, $dst_y, $dst_z, $width, $height, $depth, $wait_events...)
1217 1462
1218L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyImage.html> 1463L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyImage.html>
1263reference to an array of local work sizes, with the same number of 1508reference to an array of local work sizes, with the same number of
1264elements as \@global_work_size. 1509elements as \@global_work_size.
1265 1510
1266L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueNDRangeKernel.html> 1511L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueNDRangeKernel.html>
1267 1512
1513=item $ev = $queue->migrate_mem_objects (\@mem_objects, $flags, $wait_events...)
1514
1515Migrates a number of OpenCL::Memory objects to or from the device.
1516
1517flags: OpenCL::MIGRATE_MEM_OBJECT_HOST, OpenCL::MIGRATE_MEM_OBJECT_CONTENT_UNDEFINED
1518
1519L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueMigrateMemObjects.html>
1520
1268=item $ev = $queue->acquire_gl_objects ([object, ...], $wait_events...) 1521=item $ev = $queue->acquire_gl_objects ([object, ...], $wait_events...)
1269 1522
1270Enqueues a list (an array-ref of OpenCL::Memory objects) to be acquired 1523Enqueues a list (an array-ref of OpenCL::Memory objects) to be acquired
1271for subsequent OpenCL usage. 1524for subsequent OpenCL usage.
1272 1525
1307 1560
1308=for gengetinfo begin command_queue 1561=for gengetinfo begin command_queue
1309 1562
1310=item $ctx = $command_queue->context 1563=item $ctx = $command_queue->context
1311 1564
1312Calls C<clGetCommandQueueInfo> with C<CL_QUEUE_CONTEXT> and returns the result. 1565Calls C<clGetCommandQueueInfo> with C<OpenCL::QUEUE_CONTEXT> and returns the result.
1313 1566
1314=item $device = $command_queue->device 1567=item $device = $command_queue->device
1315 1568
1316Calls C<clGetCommandQueueInfo> with C<CL_QUEUE_DEVICE> and returns the result. 1569Calls C<clGetCommandQueueInfo> with C<OpenCL::QUEUE_DEVICE> and returns the result.
1317 1570
1318=item $uint = $command_queue->reference_count 1571=item $uint = $command_queue->reference_count
1319 1572
1320Calls C<clGetCommandQueueInfo> with C<CL_QUEUE_REFERENCE_COUNT> and returns the result. 1573Calls C<clGetCommandQueueInfo> with C<OpenCL::QUEUE_REFERENCE_COUNT> and returns the result.
1321 1574
1322=item $command_queue_properties = $command_queue->properties 1575=item $command_queue_properties = $command_queue->properties
1323 1576
1324Calls C<clGetCommandQueueInfo> with C<CL_QUEUE_PROPERTIES> and returns the result. 1577Calls C<clGetCommandQueueInfo> with C<OpenCL::QUEUE_PROPERTIES> and returns the result.
1325 1578
1326=for gengetinfo end command_queue 1579=for gengetinfo end command_queue
1580
1581=back
1582
1583=head3 MEMORY MAPPED BUFFERS
1584
1585OpenCL allows you to map buffers and images to host memory (read: perl
1586scalars). This is done much like reading or copying a buffer, by enqueuing
1587a map or unmap operation on the command queue.
1588
1589The map operations return an C<OpenCL::Mapped> object - see L<THE
1590OpenCL::Mapped CLASS> section for details on what to do with these
1591objects.
1592
1593The object will be unmapped automatically when the mapped object is
1594destroyed (you can use a barrier to make sure the unmap has finished,
1595before using the buffer in a kernel), but you can also enqueue an unmap
1596operation manually.
1597
1598=over 4
1599
1600=item $mapped_buffer = $queue->map_buffer ($buf, $blocking=1, $map_flags=OpenCL::MAP_READ|OpenCL::MAP_WRITE, $offset=0, $size=undef, $wait_events...)
1601
1602Maps the given buffer into host memory and returns an
1603C<OpenCL::MappedBuffer> object. If C<$size> is specified as undef, then
1604the map will extend to the end of the buffer.
1605
1606map_flags: OpenCL::MAP_READ, OpenCL::MAP_WRITE, OpenCL::MAP_WRITE_INVALIDATE_REGION.
1607
1608L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueMapBuffer.html>
1609
1610Example: map the buffer $buf fully and replace the first 4 bytes by "abcd", then unmap.
1611
1612 {
1613 my $mapped = $queue->map_buffer ($buf, 1, OpenCL::MAP_WRITE);
1614 substr $$mapped, 0, 4, "abcd";
1615 } # asynchronously unmap because $mapped is destroyed
1616
1617=item $mapped_image = $queue->map_image ($img, $blocking=1, $map_flags=OpenCL::MAP_READ|OpenCL::MAP_WRITE, $x=0, $y=0, $z=0, $width=undef, $height=undef, $depth=undef, $wait_events...)
1618
1619Maps the given image area into host memory and return an
1620C<OpenCL::MappedImage> object.
1621
1622If any of C<$width>, C<$height> and/or C<$depth> are C<undef> then they
1623will be replaced by the maximum possible value.
1624
1625L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueMapImage.html>
1626
1627Example: map an image (with OpenCL::UNSIGNED_INT8 channel type) and set
1628the first channel of the leftmost column to 5, then explicitly unmap
1629it. You are not necessarily meant to do it this way, this example just
1630shows you the accessors to use :)
1631
1632 my $mapped = $queue->map_image ($image, 1, OpenCL::MAP_WRITE);
1633
1634 $mapped->write ($_ * $mapped->row_pitch, pack "C", 5)
1635 for 0 .. $mapped->height - 1;
1636
1637 $mapped->unmap;.
1638 $mapped->wait; # only needed for out of order queues normally
1639
1640=item $ev = $queue->unmap ($mapped, $wait_events...)
1641
1642Unmaps the data from host memory. You must not call any methods that
1643modify the data, or modify the data scalar directly, after calling this
1644method.
1645
1646The mapped event object will always be passed as part of the
1647$wait_events. The mapped event object will be replaced by the new event
1648object that this request creates.
1327 1649
1328=back 1650=back
1329 1651
1330=head2 THE OpenCL::Memory CLASS 1652=head2 THE OpenCL::Memory CLASS
1331 1653
1338 1660
1339See C<< $platform->info >> for details. 1661See C<< $platform->info >> for details.
1340 1662
1341L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetMemObjectInfo.html> 1663L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetMemObjectInfo.html>
1342 1664
1665=item $memory->destructor_callback ($cb->())
1666
1667Sets a callback that will be invoked after the memory object is destructed.
1668
1669L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clSetMemObjectDestructorCallback.html>
1670
1343=for gengetinfo begin mem 1671=for gengetinfo begin mem
1344 1672
1345=item $mem_object_type = $mem->type 1673=item $mem_object_type = $mem->type
1346 1674
1347Calls C<clGetMemObjectInfo> with C<CL_MEM_TYPE> and returns the result. 1675Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_TYPE> and returns the result.
1348 1676
1349=item $mem_flags = $mem->flags 1677=item $mem_flags = $mem->flags
1350 1678
1351Calls C<clGetMemObjectInfo> with C<CL_MEM_FLAGS> and returns the result. 1679Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_FLAGS> and returns the result.
1352 1680
1353=item $int = $mem->size 1681=item $int = $mem->size
1354 1682
1355Calls C<clGetMemObjectInfo> with C<CL_MEM_SIZE> and returns the result. 1683Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_SIZE> and returns the result.
1356 1684
1357=item $ptr_value = $mem->host_ptr 1685=item $ptr_value = $mem->host_ptr
1358 1686
1359Calls C<clGetMemObjectInfo> with C<CL_MEM_HOST_PTR> and returns the result. 1687Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_HOST_PTR> and returns the result.
1360 1688
1361=item $uint = $mem->map_count 1689=item $uint = $mem->map_count
1362 1690
1363Calls C<clGetMemObjectInfo> with C<CL_MEM_MAP_COUNT> and returns the result. 1691Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_MAP_COUNT> and returns the result.
1364 1692
1365=item $uint = $mem->reference_count 1693=item $uint = $mem->reference_count
1366 1694
1367Calls C<clGetMemObjectInfo> with C<CL_MEM_REFERENCE_COUNT> and returns the result. 1695Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_REFERENCE_COUNT> and returns the result.
1368 1696
1369=item $ctx = $mem->context 1697=item $ctx = $mem->context
1370 1698
1371Calls C<clGetMemObjectInfo> with C<CL_MEM_CONTEXT> and returns the result. 1699Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_CONTEXT> and returns the result.
1372 1700
1373=item $mem = $mem->associated_memobject 1701=item $mem = $mem->associated_memobject
1374 1702
1375Calls C<clGetMemObjectInfo> with C<CL_MEM_ASSOCIATED_MEMOBJECT> and returns the result. 1703Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_ASSOCIATED_MEMOBJECT> and returns the result.
1376 1704
1377=item $int = $mem->offset 1705=item $int = $mem->offset
1378 1706
1379Calls C<clGetMemObjectInfo> with C<CL_MEM_OFFSET> and returns the result. 1707Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_OFFSET> and returns the result.
1380 1708
1381=for gengetinfo end mem 1709=for gengetinfo end mem
1382 1710
1383=item ($type, $name) = $mem->gl_object_info 1711=item ($type, $name) = $mem->gl_object_info
1384 1712
1404=over 4 1732=over 4
1405 1733
1406=item $subbuf = $buf_obj->sub_buffer_region ($flags, $origin, $size) 1734=item $subbuf = $buf_obj->sub_buffer_region ($flags, $origin, $size)
1407 1735
1408Creates an OpenCL::Buffer objects from this buffer and returns it. The 1736Creates an OpenCL::Buffer objects from this buffer and returns it. The
1409C<buffer_create_type> is assumed to be C<CL_BUFFER_CREATE_TYPE_REGION>. 1737C<buffer_create_type> is assumed to be C<OpenCL::BUFFER_CREATE_TYPE_REGION>.
1410 1738
1411L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateSubBuffer.html> 1739L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateSubBuffer.html>
1412 1740
1413=back 1741=back
1414 1742
1430L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetImageInfo.html> 1758L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetImageInfo.html>
1431 1759
1432=item ($channel_order, $channel_data_type) = $image->format 1760=item ($channel_order, $channel_data_type) = $image->format
1433 1761
1434Returns the channel order and type used to create the image by calling 1762Returns the channel order and type used to create the image by calling
1435C<clGetImageInfo> with C<CL_IMAGE_FORMAT>. 1763C<clGetImageInfo> with C<OpenCL::IMAGE_FORMAT>.
1436 1764
1437=for gengetinfo begin image 1765=for gengetinfo begin image
1438 1766
1439=item $int = $image->element_size 1767=item $int = $image->element_size
1440 1768
1441Calls C<clGetImageInfo> with C<CL_IMAGE_ELEMENT_SIZE> and returns the result. 1769Calls C<clGetImageInfo> with C<OpenCL::IMAGE_ELEMENT_SIZE> and returns the result.
1442 1770
1443=item $int = $image->row_pitch 1771=item $int = $image->row_pitch
1444 1772
1445Calls C<clGetImageInfo> with C<CL_IMAGE_ROW_PITCH> and returns the result. 1773Calls C<clGetImageInfo> with C<OpenCL::IMAGE_ROW_PITCH> and returns the result.
1446 1774
1447=item $int = $image->slice_pitch 1775=item $int = $image->slice_pitch
1448 1776
1449Calls C<clGetImageInfo> with C<CL_IMAGE_SLICE_PITCH> and returns the result. 1777Calls C<clGetImageInfo> with C<OpenCL::IMAGE_SLICE_PITCH> and returns the result.
1450 1778
1451=item $int = $image->width 1779=item $int = $image->width
1452 1780
1453Calls C<clGetImageInfo> with C<CL_IMAGE_WIDTH> and returns the result. 1781Calls C<clGetImageInfo> with C<OpenCL::IMAGE_WIDTH> and returns the result.
1454 1782
1455=item $int = $image->height 1783=item $int = $image->height
1456 1784
1457Calls C<clGetImageInfo> with C<CL_IMAGE_HEIGHT> and returns the result. 1785Calls C<clGetImageInfo> with C<OpenCL::IMAGE_HEIGHT> and returns the result.
1458 1786
1459=item $int = $image->depth 1787=item $int = $image->depth
1460 1788
1461Calls C<clGetImageInfo> with C<CL_IMAGE_DEPTH> and returns the result. 1789Calls C<clGetImageInfo> with C<OpenCL::IMAGE_DEPTH> and returns the result.
1462 1790
1463=for gengetinfo end image 1791=for gengetinfo end image
1464 1792
1465=for gengetinfo begin gl_texture 1793=for gengetinfo begin gl_texture
1466 1794
1467=item $GLenum = $gl_texture->target 1795=item $GLenum = $gl_texture->target
1468 1796
1469Calls C<clGetGLTextureInfo> with C<CL_GL_TEXTURE_TARGET> and returns the result. 1797Calls C<clGetGLTextureInfo> with C<OpenCL::GL_TEXTURE_TARGET> and returns the result.
1470 1798
1471=item $GLint = $gl_texture->gl_mipmap_level 1799=item $GLint = $gl_texture->gl_mipmap_level
1472 1800
1473Calls C<clGetGLTextureInfo> with C<CL_GL_MIPMAP_LEVEL> and returns the result. 1801Calls C<clGetGLTextureInfo> with C<OpenCL::GL_MIPMAP_LEVEL> and returns the result.
1474 1802
1475=for gengetinfo end gl_texture 1803=for gengetinfo end gl_texture
1476 1804
1477=back 1805=back
1478 1806
1488 1816
1489=for gengetinfo begin sampler 1817=for gengetinfo begin sampler
1490 1818
1491=item $uint = $sampler->reference_count 1819=item $uint = $sampler->reference_count
1492 1820
1493Calls C<clGetSamplerInfo> with C<CL_SAMPLER_REFERENCE_COUNT> and returns the result. 1821Calls C<clGetSamplerInfo> with C<OpenCL::SAMPLER_REFERENCE_COUNT> and returns the result.
1494 1822
1495=item $ctx = $sampler->context 1823=item $ctx = $sampler->context
1496 1824
1497Calls C<clGetSamplerInfo> with C<CL_SAMPLER_CONTEXT> and returns the result. 1825Calls C<clGetSamplerInfo> with C<OpenCL::SAMPLER_CONTEXT> and returns the result.
1498 1826
1499=item $addressing_mode = $sampler->normalized_coords 1827=item $addressing_mode = $sampler->normalized_coords
1500 1828
1501Calls C<clGetSamplerInfo> with C<CL_SAMPLER_NORMALIZED_COORDS> and returns the result. 1829Calls C<clGetSamplerInfo> with C<OpenCL::SAMPLER_NORMALIZED_COORDS> and returns the result.
1502 1830
1503=item $filter_mode = $sampler->addressing_mode 1831=item $filter_mode = $sampler->addressing_mode
1504 1832
1505Calls C<clGetSamplerInfo> with C<CL_SAMPLER_ADDRESSING_MODE> and returns the result. 1833Calls C<clGetSamplerInfo> with C<OpenCL::SAMPLER_ADDRESSING_MODE> and returns the result.
1506 1834
1507=item $boolean = $sampler->filter_mode 1835=item $boolean = $sampler->filter_mode
1508 1836
1509Calls C<clGetSamplerInfo> with C<CL_SAMPLER_FILTER_MODE> and returns the result. 1837Calls C<clGetSamplerInfo> with C<OpenCL::SAMPLER_FILTER_MODE> and returns the result.
1510 1838
1511=for gengetinfo end sampler 1839=for gengetinfo end sampler
1512 1840
1513=back 1841=back
1514 1842
1524If a callback is specified, then it will be called when compilation is 1852If a callback is specified, then it will be called when compilation is
1525finished. Note that many OpenCL implementations block your program while 1853finished. Note that many OpenCL implementations block your program while
1526compiling whether you use a callback or not. See C<build_async> if you 1854compiling whether you use a callback or not. See C<build_async> if you
1527want to make sure the build is done in the background. 1855want to make sure the build is done in the background.
1528 1856
1529Note that some OpenCL implementations atc up badly, and don't call the 1857Note that some OpenCL implementations act up badly, and don't call the
1530callback in some error cases (but call it in others). This implementation 1858callback in some error cases (but call it in others). This implementation
1531assumes the callback will always be called, and leaks memory if this is 1859assumes the callback will always be called, and leaks memory if this is
1532not so. So best make sure you don't pass in invalid values. 1860not so. So best make sure you don't pass in invalid values.
1533 1861
1862Some implementations fail with C<OpenCL::INVALID_BINARY> when the
1863compilation state is successful but some later stage fails.
1864
1865options: C<-D name>, C<-D name=definition>, C<-I dir>,
1866C<-cl-single-precision-constant>, C<-cl-denorms-are-zero>,
1867C<-cl-fp32-correctly-rounded-divide-sqrt>, C<-cl-opt-disable>,
1868C<-cl-mad-enable>, C<-cl-no-signed-zeros>, C<-cl-unsafe-math-optimizations>,
1869C<-cl-finite-math-only>, C<-cl-fast-relaxed-math>,
1870C<-w>, C<-Werror>, C<-cl-std=CL1.1/CL1.2>, C<-cl-kernel-arg-info>,
1871C<-create-library>, C<-enable-link-options>.
1872
1873build_status: OpenCL::BUILD_SUCCESS, OpenCL::BUILD_NONE,
1874OpenCL::BUILD_ERROR, OpenCL::BUILD_IN_PROGRESS.
1875
1534L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clBuildProgram.html> 1876L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clBuildProgram.html>
1535 1877
1536=item $program->build_async (\@devices = undef, $options = "", $cb->($program) = undef) 1878=item $program->build_async (\@devices = undef, $options = "", $cb->($program) = undef)
1537 1879
1538Similar to C<< ->build >>, except it starts a thread, and never fails (you 1880Similar to C<< ->build >>, except it starts a thread, and never fails (you
1539need to check the compilation status form the callback, or by polling). 1881need to check the compilation status form the callback, or by polling).
1540 1882
1883=item $program->compile (\@devices = undef, $options = "", \%headers = undef, $cb->($program) = undef)
1884
1885Compiles the given program for the given devices (or all devices if
1886undef). If C<$headers> is given, it must be a hashref with include name =>
1887OpenCL::Program pairs.
1888
1889L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCompileProgram.html>
1890
1541=item $packed_value = $program->build_info ($device, $name) 1891=item $packed_value = $program->build_info ($device, $name)
1542 1892
1543Similar to C<< $platform->info >>, but returns build info for a previous 1893Similar to C<< $platform->info >>, but returns build info for a previous
1544build attempt for the given device. 1894build attempt for the given device.
1545 1895
1896binary_type: OpenCL::PROGRAM_BINARY_TYPE_NONE,
1897OpenCL::PROGRAM_BINARY_TYPE_COMPILED_OBJECT,
1898OpenCL::PROGRAM_BINARY_TYPE_LIBRARY,
1899OpenCL::PROGRAM_BINARY_TYPE_EXECUTABLE.
1900
1546L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetBuildInfo.html> 1901L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetBuildInfo.html>
1547 1902
1548=item $kernel = $program->kernel ($function_name) 1903=item $kernel = $program->kernel ($function_name)
1549 1904
1550Creates an OpenCL::Kernel object out of the named C<__kernel> function in 1905Creates an OpenCL::Kernel object out of the named C<__kernel> function in
1560 1915
1561=for gengetinfo begin program_build 1916=for gengetinfo begin program_build
1562 1917
1563=item $build_status = $program->build_status ($device) 1918=item $build_status = $program->build_status ($device)
1564 1919
1565Calls C<clGetProgramBuildInfo> with C<CL_PROGRAM_BUILD_STATUS> and returns the result. 1920Calls C<clGetProgramBuildInfo> with C<OpenCL::PROGRAM_BUILD_STATUS> and returns the result.
1566 1921
1567=item $string = $program->build_options ($device) 1922=item $string = $program->build_options ($device)
1568 1923
1569Calls C<clGetProgramBuildInfo> with C<CL_PROGRAM_BUILD_OPTIONS> and returns the result. 1924Calls C<clGetProgramBuildInfo> with C<OpenCL::PROGRAM_BUILD_OPTIONS> and returns the result.
1570 1925
1571=item $string = $program->build_log ($device) 1926=item $string = $program->build_log ($device)
1572 1927
1573Calls C<clGetProgramBuildInfo> with C<CL_PROGRAM_BUILD_LOG> and returns the result. 1928Calls C<clGetProgramBuildInfo> with C<OpenCL::PROGRAM_BUILD_LOG> and returns the result.
1929
1930=item $binary_type = $program->binary_type ($device)
1931
1932Calls C<clGetProgramBuildInfo> with C<OpenCL::PROGRAM_BINARY_TYPE> and returns the result.
1574 1933
1575=for gengetinfo end program_build 1934=for gengetinfo end program_build
1576 1935
1577=item $packed_value = $program->info ($name) 1936=item $packed_value = $program->info ($name)
1578 1937
1582 1941
1583=for gengetinfo begin program 1942=for gengetinfo begin program
1584 1943
1585=item $uint = $program->reference_count 1944=item $uint = $program->reference_count
1586 1945
1587Calls C<clGetProgramInfo> with C<CL_PROGRAM_REFERENCE_COUNT> and returns the result. 1946Calls C<clGetProgramInfo> with C<OpenCL::PROGRAM_REFERENCE_COUNT> and returns the result.
1588 1947
1589=item $ctx = $program->context 1948=item $ctx = $program->context
1590 1949
1591Calls C<clGetProgramInfo> with C<CL_PROGRAM_CONTEXT> and returns the result. 1950Calls C<clGetProgramInfo> with C<OpenCL::PROGRAM_CONTEXT> and returns the result.
1592 1951
1593=item $uint = $program->num_devices 1952=item $uint = $program->num_devices
1594 1953
1595Calls C<clGetProgramInfo> with C<CL_PROGRAM_NUM_DEVICES> and returns the result. 1954Calls C<clGetProgramInfo> with C<OpenCL::PROGRAM_NUM_DEVICES> and returns the result.
1596 1955
1597=item @devices = $program->devices 1956=item @devices = $program->devices
1598 1957
1599Calls C<clGetProgramInfo> with C<CL_PROGRAM_DEVICES> and returns the result. 1958Calls C<clGetProgramInfo> with C<OpenCL::PROGRAM_DEVICES> and returns the result.
1600 1959
1601=item $string = $program->source 1960=item $string = $program->source
1602 1961
1603Calls C<clGetProgramInfo> with C<CL_PROGRAM_SOURCE> and returns the result. 1962Calls C<clGetProgramInfo> with C<OpenCL::PROGRAM_SOURCE> and returns the result.
1604 1963
1605=item @ints = $program->binary_sizes 1964=item @ints = $program->binary_sizes
1606 1965
1607Calls C<clGetProgramInfo> with C<CL_PROGRAM_BINARY_SIZES> and returns the result. 1966Calls C<clGetProgramInfo> with C<OpenCL::PROGRAM_BINARY_SIZES> and returns the result.
1608 1967
1609=for gengetinfo end program 1968=for gengetinfo end program
1610 1969
1611=item @blobs = $program->binaries 1970=item @blobs = $program->binaries
1612 1971
1633 1992
1634=for gengetinfo begin kernel 1993=for gengetinfo begin kernel
1635 1994
1636=item $string = $kernel->function_name 1995=item $string = $kernel->function_name
1637 1996
1638Calls C<clGetKernelInfo> with C<CL_KERNEL_FUNCTION_NAME> and returns the result. 1997Calls C<clGetKernelInfo> with C<OpenCL::KERNEL_FUNCTION_NAME> and returns the result.
1639 1998
1640=item $uint = $kernel->num_args 1999=item $uint = $kernel->num_args
1641 2000
1642Calls C<clGetKernelInfo> with C<CL_KERNEL_NUM_ARGS> and returns the result. 2001Calls C<clGetKernelInfo> with C<OpenCL::KERNEL_NUM_ARGS> and returns the result.
1643 2002
1644=item $uint = $kernel->reference_count 2003=item $uint = $kernel->reference_count
1645 2004
1646Calls C<clGetKernelInfo> with C<CL_KERNEL_REFERENCE_COUNT> and returns the result. 2005Calls C<clGetKernelInfo> with C<OpenCL::KERNEL_REFERENCE_COUNT> and returns the result.
1647 2006
1648=item $ctx = $kernel->context 2007=item $ctx = $kernel->context
1649 2008
1650Calls C<clGetKernelInfo> with C<CL_KERNEL_CONTEXT> and returns the result. 2009Calls C<clGetKernelInfo> with C<OpenCL::KERNEL_CONTEXT> and returns the result.
1651 2010
1652=item $program = $kernel->program 2011=item $program = $kernel->program
1653 2012
1654Calls C<clGetKernelInfo> with C<CL_KERNEL_PROGRAM> and returns the result. 2013Calls C<clGetKernelInfo> with C<OpenCL::KERNEL_PROGRAM> and returns the result.
1655 2014
1656=for gengetinfo end kernel 2015=for gengetinfo end kernel
1657 2016
1658=item $packed_value = $kernel->work_group_info ($device, $name) 2017=item $packed_value = $kernel->work_group_info ($device, $name)
1659 2018
1660See C<< $platform->info >> for details. 2019See C<< $platform->info >> for details.
1661 2020
1662The reason this method is not called C<info> is that there already is an
1663C<< ->info >> method.
1664
1665L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetKernelWorkGroupInfo.html> 2021L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetKernelWorkGroupInfo.html>
1666 2022
1667=for gengetinfo begin kernel_work_group 2023=for gengetinfo begin kernel_work_group
1668 2024
1669=item $int = $kernel->work_group_size ($device) 2025=item $int = $kernel->work_group_size ($device)
1670 2026
1671Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_WORK_GROUP_SIZE> and returns the result. 2027Calls C<clGetKernelWorkGroupInfo> with C<OpenCL::KERNEL_WORK_GROUP_SIZE> and returns the result.
1672 2028
1673=item @ints = $kernel->compile_work_group_size ($device) 2029=item @ints = $kernel->compile_work_group_size ($device)
1674 2030
1675Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_COMPILE_WORK_GROUP_SIZE> and returns the result. 2031Calls C<clGetKernelWorkGroupInfo> with C<OpenCL::KERNEL_COMPILE_WORK_GROUP_SIZE> and returns the result.
1676 2032
1677=item $ulong = $kernel->local_mem_size ($device) 2033=item $ulong = $kernel->local_mem_size ($device)
1678 2034
1679Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_LOCAL_MEM_SIZE> and returns the result. 2035Calls C<clGetKernelWorkGroupInfo> with C<OpenCL::KERNEL_LOCAL_MEM_SIZE> and returns the result.
1680 2036
1681=item $int = $kernel->preferred_work_group_size_multiple ($device) 2037=item $int = $kernel->preferred_work_group_size_multiple ($device)
1682 2038
1683Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE> and returns the result. 2039Calls C<clGetKernelWorkGroupInfo> with C<OpenCL::KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE> and returns the result.
1684 2040
1685=item $ulong = $kernel->private_mem_size ($device) 2041=item $ulong = $kernel->private_mem_size ($device)
1686 2042
1687Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_PRIVATE_MEM_SIZE> and returns the result. 2043Calls C<clGetKernelWorkGroupInfo> with C<OpenCL::KERNEL_PRIVATE_MEM_SIZE> and returns the result.
1688 2044
1689=for gengetinfo end kernel_work_group 2045=for gengetinfo end kernel_work_group
2046
2047=item $packed_value = $kernel->arg_info ($idx, $name)
2048
2049See C<< $platform->info >> for details.
2050
2051L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clGetKernelArgInfo.html>
2052
2053=for gengetinfo begin kernel_arg
2054
2055=item $kernel_arg_address_qualifier = $kernel->arg_address_qualifier ($idx)
2056
2057Calls C<clGetKernelArgInfo> with C<OpenCL::KERNEL_ARG_ADDRESS_QUALIFIER> and returns the result.
2058
2059=item $kernel_arg_access_qualifier = $kernel->arg_access_qualifier ($idx)
2060
2061Calls C<clGetKernelArgInfo> with C<OpenCL::KERNEL_ARG_ACCESS_QUALIFIER> and returns the result.
2062
2063=item $string = $kernel->arg_type_name ($idx)
2064
2065Calls C<clGetKernelArgInfo> with C<OpenCL::KERNEL_ARG_TYPE_NAME> and returns the result.
2066
2067=item $kernel_arg_type_qualifier = $kernel->arg_type_qualifier ($idx)
2068
2069Calls C<clGetKernelArgInfo> with C<OpenCL::KERNEL_ARG_TYPE_QUALIFIER> and returns the result.
2070
2071=item $string = $kernel->arg_name ($idx)
2072
2073Calls C<clGetKernelArgInfo> with C<OpenCL::KERNEL_ARG_NAME> and returns the result.
2074
2075=for gengetinfo end kernel_arg
1690 2076
1691=item $kernel->setf ($format, ...) 2077=item $kernel->setf ($format, ...)
1692 2078
1693Sets the arguments of a kernel. Since OpenCL 1.1 doesn't have a generic 2079Sets the arguments of a kernel. Since OpenCL 1.1 doesn't have a generic
1694way to set arguments (and with OpenCL 1.2 it might be rather slow), you 2080way to set arguments (and with OpenCL 1.2 it might be rather slow), you
1806 2192
1807=for gengetinfo begin event 2193=for gengetinfo begin event
1808 2194
1809=item $queue = $event->command_queue 2195=item $queue = $event->command_queue
1810 2196
1811Calls C<clGetEventInfo> with C<CL_EVENT_COMMAND_QUEUE> and returns the result. 2197Calls C<clGetEventInfo> with C<OpenCL::EVENT_COMMAND_QUEUE> and returns the result.
1812 2198
1813=item $command_type = $event->command_type 2199=item $command_type = $event->command_type
1814 2200
1815Calls C<clGetEventInfo> with C<CL_EVENT_COMMAND_TYPE> and returns the result. 2201Calls C<clGetEventInfo> with C<OpenCL::EVENT_COMMAND_TYPE> and returns the result.
1816 2202
1817=item $uint = $event->reference_count 2203=item $uint = $event->reference_count
1818 2204
1819Calls C<clGetEventInfo> with C<CL_EVENT_REFERENCE_COUNT> and returns the result. 2205Calls C<clGetEventInfo> with C<OpenCL::EVENT_REFERENCE_COUNT> and returns the result.
1820 2206
1821=item $uint = $event->command_execution_status 2207=item $uint = $event->command_execution_status
1822 2208
1823Calls C<clGetEventInfo> with C<CL_EVENT_COMMAND_EXECUTION_STATUS> and returns the result. 2209Calls C<clGetEventInfo> with C<OpenCL::EVENT_COMMAND_EXECUTION_STATUS> and returns the result.
1824 2210
1825=item $ctx = $event->context 2211=item $ctx = $event->context
1826 2212
1827Calls C<clGetEventInfo> with C<CL_EVENT_CONTEXT> and returns the result. 2213Calls C<clGetEventInfo> with C<OpenCL::EVENT_CONTEXT> and returns the result.
1828 2214
1829=for gengetinfo end event 2215=for gengetinfo end event
1830 2216
1831=item $packed_value = $ev->profiling_info ($name) 2217=item $packed_value = $ev->profiling_info ($name)
1832 2218
1839 2225
1840=for gengetinfo begin profiling 2226=for gengetinfo begin profiling
1841 2227
1842=item $ulong = $event->profiling_command_queued 2228=item $ulong = $event->profiling_command_queued
1843 2229
1844Calls C<clGetEventProfilingInfo> with C<CL_PROFILING_COMMAND_QUEUED> and returns the result. 2230Calls C<clGetEventProfilingInfo> with C<OpenCL::PROFILING_COMMAND_QUEUED> and returns the result.
1845 2231
1846=item $ulong = $event->profiling_command_submit 2232=item $ulong = $event->profiling_command_submit
1847 2233
1848Calls C<clGetEventProfilingInfo> with C<CL_PROFILING_COMMAND_SUBMIT> and returns the result. 2234Calls C<clGetEventProfilingInfo> with C<OpenCL::PROFILING_COMMAND_SUBMIT> and returns the result.
1849 2235
1850=item $ulong = $event->profiling_command_start 2236=item $ulong = $event->profiling_command_start
1851 2237
1852Calls C<clGetEventProfilingInfo> with C<CL_PROFILING_COMMAND_START> and returns the result. 2238Calls C<clGetEventProfilingInfo> with C<OpenCL::PROFILING_COMMAND_START> and returns the result.
1853 2239
1854=item $ulong = $event->profiling_command_end 2240=item $ulong = $event->profiling_command_end
1855 2241
1856Calls C<clGetEventProfilingInfo> with C<CL_PROFILING_COMMAND_END> and returns the result. 2242Calls C<clGetEventProfilingInfo> with C<OpenCL::PROFILING_COMMAND_END> and returns the result.
1857 2243
1858=for gengetinfo end profiling 2244=for gengetinfo end profiling
1859 2245
1860=back 2246=back
1861 2247
1868=item $ev->set_status ($execution_status) 2254=item $ev->set_status ($execution_status)
1869 2255
1870Sets the execution status of the user event. Can only be called once, 2256Sets the execution status of the user event. Can only be called once,
1871either with OpenCL::COMPLETE or a negative number as status. 2257either with OpenCL::COMPLETE or a negative number as status.
1872 2258
2259execution_status: OpenCL::COMPLETE or a negative integer.
2260
1873L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clSetUserEventStatus.html> 2261L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clSetUserEventStatus.html>
2262
2263=back
2264
2265=head2 THE OpenCL::Mapped CLASS
2266
2267This class represents objects mapped into host memory. They are
2268represented by a blessed string scalar. The string data is the mapped
2269memory area, that is, if you read or write it, then the mapped object is
2270accessed directly.
2271
2272You must only ever use operations that modify the string in-place - for
2273example, a C<substr> that doesn't change the length, or maybe a regex that
2274doesn't change the length. Any other operation might cause the data to be
2275copied.
2276
2277When the object is destroyed it will enqueue an implicit unmap operation
2278on the queue that was used to create it.
2279
2280Keep in mind that you I<need> to unmap (or destroy) mapped objects before
2281OpenCL sees the changes, even if some implementations don't need this
2282sometimes.
2283
2284Example, replace the first two floats in the mapped buffer by 1 and 2.
2285
2286 my $mapped = $queue->map_buffer ($buf, ...
2287 $mapped->event->wait; # make sure it's there
2288
2289 # now replace first 8 bytes by new data, which is exactly 8 bytes long
2290 # we blindly assume device endianness to equal host endianness
2291 # (and of course, we assume iee 754 single precision floats :)
2292 substr $$mapped, 0, 8, pack "f*", 1, 2;
2293
2294=over 4
2295
2296=item $ev = $mapped->unmap ($wait_events...)
2297
2298Unmaps the mapped memory object, using the queue originally used to create
2299it, quite similarly to C<< $queue->unmap ($mapped, ...) >>.
2300
2301=item $bool = $mapped->mapped
2302
2303Returns whether the object is still mapped - true before an C<unmap> is
2304enqueued, false afterwards.
2305
2306=item $ev = $mapped->event
2307
2308Return the event object associated with the mapped object. Initially, this
2309will be the event object created when mapping the object, and after an
2310unmap, this will be the event object that the unmap operation created.
2311
2312=item $mapped->wait
2313
2314Same as C<< $mapped->event->wait >> - makes sure no operations on this
2315mapped object are outstanding.
2316
2317=item $bytes = $mapped->size
2318
2319Returns the size of the mapped area, in bytes. Same as C<length $$mapped>.
2320
2321=item $ptr = $mapped->ptr
2322
2323Returns the raw memory address of the mapped area.
2324
2325=item $mapped->set ($offset, $data)
2326
2327Replaces the data at the given C<$offset> in the memory area by the new
2328C<$data>. This method is safer than direct manipulation of C<$mapped>
2329because it does bounds-checking, but also slower.
2330
2331=item $data = $mapped->get ($offset, $length)
2332
2333Returns (without copying) a scalar representing the data at the given
2334C<$offset> and C<$length> in the mapped memory area. This is the same as
2335the following substr, except much slower;
2336
2337 $data = substr $$mapped, $offset, $length
2338
2339=cut
2340
2341sub OpenCL::Mapped::get {
2342 substr ${$_[0]}, $_[1], $_[2]
2343}
2344
2345=back
2346
2347=head2 THE OpenCL::MappedBuffer CLASS
2348
2349This is a subclass of OpenCL::Mapped, representing mapped buffers.
2350
2351=head2 THE OpenCL::MappedImage CLASS
2352
2353This is a subclass of OpenCL::Mapped, representing mapped images.
2354
2355=over 4
2356
2357=item $pixels = $mapped->width
2358
2359=item $pixels = $mapped->height
2360
2361=item $pixels = $mapped->depth
2362
2363Return the width/height/depth of the mapped image region, in pixels.
2364
2365=item $bytes = $mapped->row_pitch
2366
2367=item $bytes = $mapped->slice_pitch
2368
2369Return the row or slice pitch of the image that has been mapped.
2370
2371=item $bytes = $mapped->element_size
2372
2373Return the size of a single pixel.
2374
2375=item $data = $mapped->get_row ($count, $x=0, $y=0, $z=0)
2376
2377Return C<$count> pixels from the given coordinates. The pixel data must
2378be completely contained within a single row.
2379
2380If C<$count> is C<undef>, then all the remaining pixels in that row are
2381returned.
2382
2383=item $mapped->set_row ($data, $x=0, $y=0, $z=0)
2384
2385Write the given pixel data at the given coordinate. The pixel data must
2386be completely contained within a single row.
1874 2387
1875=back 2388=back
1876 2389
1877=cut 2390=cut
1878 2391

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines