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

Comparing OpenCL/OpenCL.pm (file contents):
Revision 1.55 by root, Tue Apr 24 22:45:38 2012 UTC vs.
Revision 1.73 by root, Fri May 4 14:56:50 2012 UTC

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 spec used to develop this module (1.2 spec was available, but 48The OpenCL specs used to develop this module - download these and keept
49no implementation was available to me :). 49hema round, they are required reference material:
50 50
51 http://www.khronos.org/registry/cl/specs/opencl-1.1.pdf 51 http://www.khronos.org/registry/cl/specs/opencl-1.1.pdf
52 http://www.khronos.org/registry/cl/specs/opencl-1.2.pdf
53 http://www.khronos.org/registry/cl/specs/opencl-1.2-extensions.pdf
52 54
53OpenCL manpages: 55OpenCL manpages:
54 56
55 http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/ 57 http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/
58 http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/
56 59
57If you are into UML class diagrams, the following diagram might help - if 60If you are into UML class diagrams, the following diagram might help - if
58not, it will be mildly cobfusing: 61not, it will be mildly confusing (also, the class hierarchy of this module
62is much more fine-grained):
59 63
60 http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/classDiagram.html 64 http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/classDiagram.html
61 65
62Here's a tutorial from AMD (very AMD-centric, too), not sure how useful it 66Here's a tutorial from AMD (very AMD-centric, too), not sure how useful it
63is, but at least it's free of charge: 67is, but at least it's free of charge:
64 68
65 http://developer.amd.com/zones/OpenCLZone/courses/Documents/Introduction_to_OpenCL_Programming%20Training_Guide%20%28201005%29.pdf 69 http://developer.amd.com/zones/OpenCLZone/courses/Documents/Introduction_to_OpenCL_Programming%20Training_Guide%20%28201005%29.pdf
138=head2 Create a buffer with some predefined data, read it back synchronously, 142=head2 Create a buffer with some predefined data, read it back synchronously,
139then asynchronously. 143then asynchronously.
140 144
141 my $buf = $ctx->buffer_sv (OpenCL::MEM_COPY_HOST_PTR, "helmut"); 145 my $buf = $ctx->buffer_sv (OpenCL::MEM_COPY_HOST_PTR, "helmut");
142 146
143 $queue->enqueue_read_buffer ($buf, 1, 1, 3, my $data); 147 $queue->read_buffer ($buf, 1, 1, 3, my $data);
144 print "$data\n"; 148 print "$data\n";
145 149
146 my $ev = $queue->enqueue_read_buffer ($buf, 0, 1, 3, my $data); 150 my $ev = $queue->read_buffer ($buf, 0, 1, 3, my $data);
147 $ev->wait; 151 $ev->wait;
148 print "$data\n"; # prints "elm" 152 print "$data\n"; # prints "elm"
149 153
150=head2 Create and build a program, then create a kernel out of one of its 154=head2 Create and build a program, then create a kernel out of one of its
151functions. 155functions.
171 # set buffer 175 # set buffer
172 $kernel->set_buffer (0, $input); 176 $kernel->set_buffer (0, $input);
173 $kernel->set_buffer (1, $output); 177 $kernel->set_buffer (1, $output);
174 178
175 # execute it for all 4 numbers 179 # execute it for all 4 numbers
176 $queue->enqueue_nd_range_kernel ($kernel, undef, [4], undef); 180 $queue->nd_range_kernel ($kernel, undef, [4], undef);
177 181
178 # enqueue a synchronous read 182 # enqueue a synchronous read
179 $queue->enqueue_read_buffer ($output, 1, 0, OpenCL::SIZEOF_FLOAT * 4, my $data); 183 $queue->read_buffer ($output, 1, 0, OpenCL::SIZEOF_FLOAT * 4, my $data);
180 184
181 # print the results: 185 # print the results:
182 printf "%s\n", join ", ", unpack "f*", $data; 186 printf "%s\n", join ", ", unpack "f*", $data;
183 187
184=head2 The same enqueue operations as before, but assuming an out-of-order queue, 188=head2 The same enqueue operations as before, but assuming an out-of-order queue,
185showing off barriers. 189showing off barriers.
186 190
187 # execute it for all 4 numbers 191 # execute it for all 4 numbers
188 $queue->enqueue_nd_range_kernel ($kernel, undef, [4], undef); 192 $queue->nd_range_kernel ($kernel, undef, [4], undef);
189 193
190 # enqueue a barrier to ensure in-order execution 194 # enqueue a barrier to ensure in-order execution
191 $queue->enqueue_barrier; 195 $queue->barrier;
192 196
193 # enqueue an async read 197 # enqueue an async read
194 $queue->enqueue_read_buffer ($output, 0, 0, OpenCL::SIZEOF_FLOAT * 4, my $data); 198 $queue->read_buffer ($output, 0, 0, OpenCL::SIZEOF_FLOAT * 4, my $data);
195 199
196 # wait for all requests to finish 200 # wait for all requests to finish
197 $queue->finish; 201 $queue->finish;
198 202
199=head2 The same enqueue operations as before, but assuming an out-of-order queue, 203=head2 The same enqueue operations as before, but assuming an out-of-order queue,
200showing off event objects and wait lists. 204showing off event objects and wait lists.
201 205
202 # execute it for all 4 numbers 206 # execute it for all 4 numbers
203 my $ev = $queue->enqueue_nd_range_kernel ($kernel, undef, [4], undef); 207 my $ev = $queue->nd_range_kernel ($kernel, undef, [4], undef);
204 208
205 # enqueue an async read 209 # enqueue an async read
206 $ev = $queue->enqueue_read_buffer ($output, 0, 0, OpenCL::SIZEOF_FLOAT * 4, my $data, $ev); 210 $ev = $queue->read_buffer ($output, 0, 0, OpenCL::SIZEOF_FLOAT * 4, my $data, $ev);
207 211
208 # wait for the last event to complete 212 # wait for the last event to complete
209 $ev->wait; 213 $ev->wait;
210 214
211=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
212set tunnel effect. 216set flight effect.
213 217
214This is quite a long example to get you going. 218This is quite a long example to get you going - you can download it from
219L<http://cvs.schmorp.de/OpenCL/examples/juliaflight>.
215 220
216 use OpenGL ":all"; 221 use OpenGL ":all";
217 use OpenCL; 222 use OpenCL;
218 223
224 my $S = $ARGV[0] || 256; # window/texture size, smaller is faster
225
219 # open a window and create a gl texture 226 # open a window and create a gl texture
220 OpenGL::glpOpenWindow width => 256, height => 256; 227 OpenGL::glpOpenWindow width => $S, height => $S;
221 my $texid = glGenTextures_p 1; 228 my $texid = glGenTextures_p 1;
222 glBindTexture GL_TEXTURE_2D, $texid; 229 glBindTexture GL_TEXTURE_2D, $texid;
223 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;
224 231
225 # 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
226 my $platform; 233 my $platform;
227 my $dev; 234 my $dev;
228 my $ctx; 235 my $ctx;
247 # now the boring opencl code 254 # now the boring opencl code
248 my $src = <<EOF; 255 my $src = <<EOF;
249 kernel void 256 kernel void
250 juliatunnel (write_only image2d_t img, float time) 257 juliatunnel (write_only image2d_t img, float time)
251 { 258 {
252 float2 p = (float2)(get_global_id (0), get_global_id (1)) / 256.f * 2.f - 1.f; 259 int2 xy = (int2)(get_global_id (0), get_global_id (1));
260 float2 p = convert_float2 (xy) / $S.f * 2.f - 1.f;
253 261
254 float2 m = (float2)(1.f, p.y) / fabs (p.x); 262 float2 m = (float2)(1.f, p.y) / fabs (p.x); // tunnel
255 m.x = fabs (fmod (m.x + time * 0.05f, 4.f)) - 2.f; 263 m.x = fabs (fmod (m.x + time * 0.05f, 4.f) - 2.f);
256 264
257 float2 z = m; 265 float2 z = m;
258 float2 c = (float2)(sin (time * 0.05005), cos (time * 0.06001)); 266 float2 c = (float2)(sin (time * 0.01133f), cos (time * 0.02521f));
259 267
260 for (int i = 0; i < 25 && dot (z, z) < 4.f; ++i) 268 for (int i = 0; i < 25 && dot (z, z) < 4.f; ++i) // standard julia
261 z = (float2)(z.x * z.x - z.y * z.y, 2.f * z.x * z.y) + c; 269 z = (float2)(z.x * z.x - z.y * z.y, 2.f * z.x * z.y) + c;
262 270
263 float3 colour = (float3)(z.x, z.y, z.x * z.y); 271 float3 colour = (float3)(z.x, z.y, atan2 (z.y, z.x));
264 write_imagef (img, (int2)(get_global_id (0), get_global_id (1)), (float4)(colour * p.x * p.x, 1.)); 272 write_imagef (img, xy, (float4)(colour * p.x * p.x, 1.));
265 } 273 }
266 EOF 274 EOF
267 275
268 my $prog = $ctx->build_program ($src); 276 my $prog = $ctx->build_program ($src);
269 my $kernel = $prog->kernel ("juliatunnel"); 277 my $kernel = $prog->kernel ("juliatunnel");
270 278
271 # program compiled, kernel ready, now draw and loop 279 # program compiled, kernel ready, now draw and loop
272 280
273 for (my $time; ; ++$time) { 281 for (my $time; ; ++$time) {
274 # acquire objects from opengl 282 # acquire objects from opengl
275 $queue->enqueue_acquire_gl_objects ([$tex]); 283 $queue->acquire_gl_objects ([$tex]);
276 284
277 # configure and run our kernel 285 # configure and run our kernel
278 $kernel->set_image2d (0, $tex); 286 $kernel->setf ("mf", $tex, $time*2); # mf = memory object, float
279 $kernel->set_float (1, $time);
280 $queue->enqueue_nd_range_kernel ($kernel, undef, [256, 256], undef); 287 $queue->nd_range_kernel ($kernel, undef, [$S, $S], undef);
281 288
282 # release objects to opengl again 289 # release objects to opengl again
283 $queue->enqueue_release_gl_objects ([$tex]); 290 $queue->release_gl_objects ([$tex]);
284 291
285 # wait 292 # wait
286 $queue->finish; 293 $queue->finish;
287 294
288 # now draw the texture, the defaults should be all right 295 # now draw the texture, the defaults should be all right
298 305
299 glXSwapBuffers; 306 glXSwapBuffers;
300 307
301 select undef, undef, undef, 1/60; 308 select undef, undef, undef, 1/60;
302 } 309 }
310
311=head2 How to modify the previous example to not rely on GL sharing.
312
313For those poor souls with only a sucky CPU OpenCL implementation, you
314currently have to read the image into some perl scalar, and then modify a
315texture or use glDrawPixels or so).
316
317First, when you don't need gl sharing, you can create the context much simpler:
318
319 $ctx = $platform->context (undef, [$dev])
320
321To use a texture, you would modify the above example by creating an
322OpenCL::Image manually instead of deriving it from a texture:
323
324 my $tex = $ctx->image2d (OpenCL::MEM_WRITE_ONLY, OpenCL::RGBA, OpenCL::UNORM_INT8, $S, $S);
325
326And in the draw loop, intead of acquire_gl_objects/release_gl_objects, you
327would read the image2d after the kernel has written it:
328
329 $queue->read_image ($tex, 0, 0, 0, 0, $S, $S, 1, 0, 0, my $data);
330
331And then you would upload the pixel data to the texture (or use glDrawPixels):
332
333 glTexSubImage2D_s GL_TEXTURE_2D, 0, 0, 0, $S, $S, GL_RGBA, GL_UNSIGNED_BYTE, $data;
334
335The fully modified example can be found at
336L<http://cvs.schmorp.de/OpenCL/examples/juliaflight-nosharing>.
337
338=head2 Julia sets look soooo 80ies.
339
340Then colour them differently, e.g. using orbit traps! Replace the loop and
341colour calculation from the previous examples by this:
342
343 float2 dm = (float2)(1.f, 1.f);
344
345 for (int i = 0; i < 25; ++i)
346 {
347 z = (float2)(z.x * z.x - z.y * z.y, 2.f * z.x * z.y) + c;
348 dm = fmin (dm, (float2)(fabs (dot (z, z) - 1.f), fabs (z.x - 1.f)));
349 }
350
351 float3 colour = (float3)(dm.x * dm.y, dm.x * dm.y, dm.x);
352
353Also try C<-10.f> instead of C<-1.f>.
303 354
304=head1 DOCUMENTATION 355=head1 DOCUMENTATION
305 356
306=head2 BASIC CONVENTIONS 357=head2 BASIC CONVENTIONS
307 358
417 use AnyEvent; 468 use AnyEvent;
418 469
419 # initialise AnyEvent, by creating a watcher, or: 470 # initialise AnyEvent, by creating a watcher, or:
420 AnyEvent::detect; 471 AnyEvent::detect;
421 472
422 my $e = $queue->enqueue_marker; 473 my $e = $queue->marker;
423 $e->cb (sub { 474 $e->cb (sub {
424 warn "opencl is finished\n"; 475 warn "opencl is finished\n";
425 }) 476 })
426 477
427 main Gtk2; 478 main Gtk2;
444Asynchronously means that perl might execute your callbacks at any 495Asynchronously means that perl might execute your callbacks at any
445time. For example, in the following code (I<THAT YOU SHOULD NOT COPY>), 496time. For example, in the following code (I<THAT YOU SHOULD NOT COPY>),
446the C<until> loop following the marker call will be interrupted by the 497the C<until> loop following the marker call will be interrupted by the
447callback: 498callback:
448 499
449 my $e = $queue->enqueue_marker; 500 my $e = $queue->marker;
450 my $flag; 501 my $flag;
451 $e->cb (sub { $flag = 1 }); 502 $e->cb (sub { $flag = 1 });
452 1 until $flag; 503 1 until $flag;
453 # $flag is now 1 504 # $flag is now 1
454 505
490=cut 541=cut
491 542
492package OpenCL; 543package OpenCL;
493 544
494use common::sense; 545use common::sense;
546use Carp ();
495use Async::Interrupt (); 547use Async::Interrupt ();
496 548
497our $POLL_FUNC; # set by XS 549our $POLL_FUNC; # set by XS
498 550
499BEGIN { 551BEGIN {
500 our $VERSION = '0.97'; 552 our $VERSION = '0.99';
501 553
502 require XSLoader; 554 require XSLoader;
503 XSLoader::load (__PACKAGE__, $VERSION); 555 XSLoader::load (__PACKAGE__, $VERSION);
504 556
505 @OpenCL::Platform::ISA = 557 @OpenCL::Platform::ISA =
510 @OpenCL::Sampler::ISA = 562 @OpenCL::Sampler::ISA =
511 @OpenCL::Program::ISA = 563 @OpenCL::Program::ISA =
512 @OpenCL::Kernel::ISA = 564 @OpenCL::Kernel::ISA =
513 @OpenCL::Event::ISA = OpenCL::Object::; 565 @OpenCL::Event::ISA = OpenCL::Object::;
514 566
567 @OpenCL::SubDevice::ISA = OpenCL::Device::;
568
515 @OpenCL::Buffer::ISA = 569 @OpenCL::Buffer::ISA =
516 @OpenCL::Image::ISA = OpenCL::Memory::; 570 @OpenCL::Image::ISA = OpenCL::Memory::;
517 571
518 @OpenCL::BufferObj::ISA = OpenCL::Buffer::; 572 @OpenCL::BufferObj::ISA = OpenCL::Buffer::;
519 573
523 @OpenCL::Image1D::ISA = 577 @OpenCL::Image1D::ISA =
524 @OpenCL::Image1DArray::ISA = 578 @OpenCL::Image1DArray::ISA =
525 @OpenCL::Image1DBuffer::ISA = OpenCL::Image::; 579 @OpenCL::Image1DBuffer::ISA = OpenCL::Image::;
526 580
527 @OpenCL::UserEvent::ISA = OpenCL::Event::; 581 @OpenCL::UserEvent::ISA = OpenCL::Event::;
582
583 @OpenCL::MappedBuffer::ISA =
584 @OpenCL::MappedImage::ISA = OpenCL::Mapped::;
528} 585}
529 586
530=head2 THE OpenCL PACKAGE 587=head2 THE OpenCL PACKAGE
531 588
532=over 4 589=over 4
534=item $int = OpenCL::errno 591=item $int = OpenCL::errno
535 592
536The last error returned by a function - it's only valid after an error occured 593The last error returned by a function - it's only valid after an error occured
537and before calling another OpenCL function. 594and before calling another OpenCL function.
538 595
539=item $str = OpenCL::err2str $errval 596=item $str = OpenCL::err2str [$errval]
540 597
541Comverts an error value into a human readable string. 598Converts an error value into a human readable string. IF no error value is
599given, then the last error will be used (as returned by OpenCL::errno).
542 600
543=item $str = OpenCL::enum2str $enum 601=item $str = OpenCL::enum2str $enum
544 602
545Converts most enum values (of parameter names, image format constants, 603Converts most enum values (of parameter names, image format constants,
546object types, addressing and filter modes, command types etc.) into a 604object types, addressing and filter modes, command types etc.) into a
552 610
553Returns all available OpenCL::Platform objects. 611Returns all available OpenCL::Platform objects.
554 612
555L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetPlatformIDs.html> 613L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetPlatformIDs.html>
556 614
557=item $ctx = OpenCL::context_from_type $properties, $type = OpenCL::DEVICE_TYPE_DEFAULT, $notify = $print_stderr 615=item $ctx = OpenCL::context_from_type $properties, $type = OpenCL::DEVICE_TYPE_DEFAULT, $callback->($err, $pvt) = $print_stderr
558 616
559Tries to create a context from a default device and platform - never worked for me. 617Tries to create a context from a default device and platform type - never worked for me.
618
619type: OpenCL::DEVICE_TYPE_DEFAULT, OpenCL::DEVICE_TYPE_CPU, OpenCL::DEVICE_TYPE_GPU,
620OpenCL::DEVICE_TYPE_ACCELERATOR, OpenCL::DEVICE_TYPE_CUSTOM, OpenCL::DEVICE_TYPE_ALL.
560 621
561L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContextFromType.html> 622L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContextFromType.html>
623
624=item $ctx = OpenCL::context $properties, \@devices, $callback->($err, $pvt) = $print_stderr)
625
626Create a new OpenCL::Context object using the given device object(s). This
627function isn't implemented yet, use C<< $platform->context >> instead.
628
629L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContext.html>
562 630
563=item OpenCL::wait_for_events $wait_events... 631=item OpenCL::wait_for_events $wait_events...
564 632
565Waits for all events to complete. 633Waits for all events to complete.
566 634
636 704
637=item @devices = $platform->devices ($type = OpenCL::DEVICE_TYPE_ALL) 705=item @devices = $platform->devices ($type = OpenCL::DEVICE_TYPE_ALL)
638 706
639Returns a list of matching OpenCL::Device objects. 707Returns a list of matching OpenCL::Device objects.
640 708
641=item $ctx = $platform->context_from_type ($properties, $type = OpenCL::DEVICE_TYPE_DEFAULT, $notify = $print_stderr) 709=item $ctx = $platform->context_from_type ($properties, $type = OpenCL::DEVICE_TYPE_DEFAULT, $callback->($err, $pvt) = $print_stderr)
642 710
643Tries to create a context. Never worked for me, and you need devices explicitly anyway. 711Tries to create a context. Never worked for me, and you need devices explicitly anyway.
644 712
645L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContextFromType.html> 713L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContextFromType.html>
646 714
647=item $ctx = $platform->context ($properties, @$devices, $notify = $print_stderr) 715=item $ctx = $platform->context ($properties, \@devices, $callback->($err, $pvt) = $print_stderr)
648 716
649Create a new OpenCL::Context object using the given device object(s)- a 717Create a new OpenCL::Context object using the given device object(s)- a
650CL_CONTEXT_PLATFORM property is supplied automatically. 718CL_CONTEXT_PLATFORM property is supplied automatically.
651 719
652L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContext.html> 720L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateContext.html>
671 739
672=for gengetinfo begin platform 740=for gengetinfo begin platform
673 741
674=item $string = $platform->profile 742=item $string = $platform->profile
675 743
676Calls C<clGetPlatformInfo> with C<CL_PLATFORM_PROFILE> and returns the result. 744Calls C<clGetPlatformInfo> with C<OpenCL::PLATFORM_PROFILE> and returns the result.
677 745
678=item $string = $platform->version 746=item $string = $platform->version
679 747
680Calls C<clGetPlatformInfo> with C<CL_PLATFORM_VERSION> and returns the result. 748Calls C<clGetPlatformInfo> with C<OpenCL::PLATFORM_VERSION> and returns the result.
681 749
682=item $string = $platform->name 750=item $string = $platform->name
683 751
684Calls C<clGetPlatformInfo> with C<CL_PLATFORM_NAME> and returns the result. 752Calls C<clGetPlatformInfo> with C<OpenCL::PLATFORM_NAME> and returns the result.
685 753
686=item $string = $platform->vendor 754=item $string = $platform->vendor
687 755
688Calls C<clGetPlatformInfo> with C<CL_PLATFORM_VENDOR> and returns the result. 756Calls C<clGetPlatformInfo> with C<OpenCL::PLATFORM_VENDOR> and returns the result.
689 757
690=item $string = $platform->extensions 758=item $string = $platform->extensions
691 759
692Calls C<clGetPlatformInfo> with C<CL_PLATFORM_EXTENSIONS> and returns the result. 760Calls C<clGetPlatformInfo> with C<OpenCL::PLATFORM_EXTENSIONS> and returns the result.
693 761
694=for gengetinfo end platform 762=for gengetinfo end platform
695 763
696=back 764=back
697 765
703 771
704See C<< $platform->info >> for details. 772See C<< $platform->info >> for details.
705 773
706L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetDeviceInfo.html> 774L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetDeviceInfo.html>
707 775
776=item @devices = $device->sub_devices (\@properties)
777
778Creates OpencL::SubDevice objects by partitioning an existing device.
779
780L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateSubDevices.html>
781
708=for gengetinfo begin device 782=for gengetinfo begin device
709 783
710=item $device_type = $device->type 784=item $device_type = $device->type
711 785
712Calls C<clGetDeviceInfo> with C<CL_DEVICE_TYPE> and returns the result. 786Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_TYPE> and returns the result.
713 787
714=item $uint = $device->vendor_id 788=item $uint = $device->vendor_id
715 789
716Calls C<clGetDeviceInfo> with C<CL_DEVICE_VENDOR_ID> and returns the result. 790Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_VENDOR_ID> and returns the result.
717 791
718=item $uint = $device->max_compute_units 792=item $uint = $device->max_compute_units
719 793
720Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_COMPUTE_UNITS> and returns the result. 794Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_COMPUTE_UNITS> and returns the result.
721 795
722=item $uint = $device->max_work_item_dimensions 796=item $uint = $device->max_work_item_dimensions
723 797
724Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS> and returns the result. 798Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_WORK_ITEM_DIMENSIONS> and returns the result.
725 799
726=item $int = $device->max_work_group_size 800=item $int = $device->max_work_group_size
727 801
728Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_WORK_GROUP_SIZE> and returns the result. 802Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_WORK_GROUP_SIZE> and returns the result.
729 803
730=item @ints = $device->max_work_item_sizes 804=item @ints = $device->max_work_item_sizes
731 805
732Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_WORK_ITEM_SIZES> and returns the result. 806Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_WORK_ITEM_SIZES> and returns the result.
733 807
734=item $uint = $device->preferred_vector_width_char 808=item $uint = $device->preferred_vector_width_char
735 809
736Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR> and returns the result. 810Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PREFERRED_VECTOR_WIDTH_CHAR> and returns the result.
737 811
738=item $uint = $device->preferred_vector_width_short 812=item $uint = $device->preferred_vector_width_short
739 813
740Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT> and returns the result. 814Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PREFERRED_VECTOR_WIDTH_SHORT> and returns the result.
741 815
742=item $uint = $device->preferred_vector_width_int 816=item $uint = $device->preferred_vector_width_int
743 817
744Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT> and returns the result. 818Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PREFERRED_VECTOR_WIDTH_INT> and returns the result.
745 819
746=item $uint = $device->preferred_vector_width_long 820=item $uint = $device->preferred_vector_width_long
747 821
748Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG> and returns the result. 822Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PREFERRED_VECTOR_WIDTH_LONG> and returns the result.
749 823
750=item $uint = $device->preferred_vector_width_float 824=item $uint = $device->preferred_vector_width_float
751 825
752Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT> and returns the result. 826Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT> and returns the result.
753 827
754=item $uint = $device->preferred_vector_width_double 828=item $uint = $device->preferred_vector_width_double
755 829
756Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE> and returns the result. 830Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE> and returns the result.
757 831
758=item $uint = $device->max_clock_frequency 832=item $uint = $device->max_clock_frequency
759 833
760Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_CLOCK_FREQUENCY> and returns the result. 834Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_CLOCK_FREQUENCY> and returns the result.
761 835
762=item $bitfield = $device->address_bits 836=item $bitfield = $device->address_bits
763 837
764Calls C<clGetDeviceInfo> with C<CL_DEVICE_ADDRESS_BITS> and returns the result. 838Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_ADDRESS_BITS> and returns the result.
765 839
766=item $uint = $device->max_read_image_args 840=item $uint = $device->max_read_image_args
767 841
768Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_READ_IMAGE_ARGS> and returns the result. 842Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_READ_IMAGE_ARGS> and returns the result.
769 843
770=item $uint = $device->max_write_image_args 844=item $uint = $device->max_write_image_args
771 845
772Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_WRITE_IMAGE_ARGS> and returns the result. 846Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_WRITE_IMAGE_ARGS> and returns the result.
773 847
774=item $ulong = $device->max_mem_alloc_size 848=item $ulong = $device->max_mem_alloc_size
775 849
776Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_MEM_ALLOC_SIZE> and returns the result. 850Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_MEM_ALLOC_SIZE> and returns the result.
777 851
778=item $int = $device->image2d_max_width 852=item $int = $device->image2d_max_width
779 853
780Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE2D_MAX_WIDTH> and returns the result. 854Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_IMAGE2D_MAX_WIDTH> and returns the result.
781 855
782=item $int = $device->image2d_max_height 856=item $int = $device->image2d_max_height
783 857
784Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE2D_MAX_HEIGHT> and returns the result. 858Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_IMAGE2D_MAX_HEIGHT> and returns the result.
785 859
786=item $int = $device->image3d_max_width 860=item $int = $device->image3d_max_width
787 861
788Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE3D_MAX_WIDTH> and returns the result. 862Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_IMAGE3D_MAX_WIDTH> and returns the result.
789 863
790=item $int = $device->image3d_max_height 864=item $int = $device->image3d_max_height
791 865
792Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE3D_MAX_HEIGHT> and returns the result. 866Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_IMAGE3D_MAX_HEIGHT> and returns the result.
793 867
794=item $int = $device->image3d_max_depth 868=item $int = $device->image3d_max_depth
795 869
796Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE3D_MAX_DEPTH> and returns the result. 870Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_IMAGE3D_MAX_DEPTH> and returns the result.
797 871
798=item $uint = $device->image_support 872=item $uint = $device->image_support
799 873
800Calls C<clGetDeviceInfo> with C<CL_DEVICE_IMAGE_SUPPORT> and returns the result. 874Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_IMAGE_SUPPORT> and returns the result.
801 875
802=item $int = $device->max_parameter_size 876=item $int = $device->max_parameter_size
803 877
804Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_PARAMETER_SIZE> and returns the result. 878Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_PARAMETER_SIZE> and returns the result.
805 879
806=item $uint = $device->max_samplers 880=item $uint = $device->max_samplers
807 881
808Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_SAMPLERS> and returns the result. 882Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_SAMPLERS> and returns the result.
809 883
810=item $uint = $device->mem_base_addr_align 884=item $uint = $device->mem_base_addr_align
811 885
812Calls C<clGetDeviceInfo> with C<CL_DEVICE_MEM_BASE_ADDR_ALIGN> and returns the result. 886Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MEM_BASE_ADDR_ALIGN> and returns the result.
813 887
814=item $uint = $device->min_data_type_align_size 888=item $uint = $device->min_data_type_align_size
815 889
816Calls C<clGetDeviceInfo> with C<CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE> and returns the result. 890Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MIN_DATA_TYPE_ALIGN_SIZE> and returns the result.
817 891
818=item $device_fp_config = $device->single_fp_config 892=item $device_fp_config = $device->single_fp_config
819 893
820Calls C<clGetDeviceInfo> with C<CL_DEVICE_SINGLE_FP_CONFIG> and returns the result. 894Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_SINGLE_FP_CONFIG> and returns the result.
821 895
822=item $device_mem_cache_type = $device->global_mem_cache_type 896=item $device_mem_cache_type = $device->global_mem_cache_type
823 897
824Calls C<clGetDeviceInfo> with C<CL_DEVICE_GLOBAL_MEM_CACHE_TYPE> and returns the result. 898Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_GLOBAL_MEM_CACHE_TYPE> and returns the result.
825 899
826=item $uint = $device->global_mem_cacheline_size 900=item $uint = $device->global_mem_cacheline_size
827 901
828Calls C<clGetDeviceInfo> with C<CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE> and returns the result. 902Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_GLOBAL_MEM_CACHELINE_SIZE> and returns the result.
829 903
830=item $ulong = $device->global_mem_cache_size 904=item $ulong = $device->global_mem_cache_size
831 905
832Calls C<clGetDeviceInfo> with C<CL_DEVICE_GLOBAL_MEM_CACHE_SIZE> and returns the result. 906Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_GLOBAL_MEM_CACHE_SIZE> and returns the result.
833 907
834=item $ulong = $device->global_mem_size 908=item $ulong = $device->global_mem_size
835 909
836Calls C<clGetDeviceInfo> with C<CL_DEVICE_GLOBAL_MEM_SIZE> and returns the result. 910Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_GLOBAL_MEM_SIZE> and returns the result.
837 911
838=item $ulong = $device->max_constant_buffer_size 912=item $ulong = $device->max_constant_buffer_size
839 913
840Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE> and returns the result. 914Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_CONSTANT_BUFFER_SIZE> and returns the result.
841 915
842=item $uint = $device->max_constant_args 916=item $uint = $device->max_constant_args
843 917
844Calls C<clGetDeviceInfo> with C<CL_DEVICE_MAX_CONSTANT_ARGS> and returns the result. 918Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_MAX_CONSTANT_ARGS> and returns the result.
845 919
846=item $device_local_mem_type = $device->local_mem_type 920=item $device_local_mem_type = $device->local_mem_type
847 921
848Calls C<clGetDeviceInfo> with C<CL_DEVICE_LOCAL_MEM_TYPE> and returns the result. 922Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_LOCAL_MEM_TYPE> and returns the result.
849 923
850=item $ulong = $device->local_mem_size 924=item $ulong = $device->local_mem_size
851 925
852Calls C<clGetDeviceInfo> with C<CL_DEVICE_LOCAL_MEM_SIZE> and returns the result. 926Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_LOCAL_MEM_SIZE> and returns the result.
853 927
854=item $boolean = $device->error_correction_support 928=item $boolean = $device->error_correction_support
855 929
856Calls C<clGetDeviceInfo> with C<CL_DEVICE_ERROR_CORRECTION_SUPPORT> and returns the result. 930Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_ERROR_CORRECTION_SUPPORT> and returns the result.
857 931
858=item $int = $device->profiling_timer_resolution 932=item $int = $device->profiling_timer_resolution
859 933
860Calls C<clGetDeviceInfo> with C<CL_DEVICE_PROFILING_TIMER_RESOLUTION> and returns the result. 934Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PROFILING_TIMER_RESOLUTION> and returns the result.
861 935
862=item $boolean = $device->endian_little 936=item $boolean = $device->endian_little
863 937
864Calls C<clGetDeviceInfo> with C<CL_DEVICE_ENDIAN_LITTLE> and returns the result. 938Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_ENDIAN_LITTLE> and returns the result.
865 939
866=item $boolean = $device->available 940=item $boolean = $device->available
867 941
868Calls C<clGetDeviceInfo> with C<CL_DEVICE_AVAILABLE> and returns the result. 942Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_AVAILABLE> and returns the result.
869 943
870=item $boolean = $device->compiler_available 944=item $boolean = $device->compiler_available
871 945
872Calls C<clGetDeviceInfo> with C<CL_DEVICE_COMPILER_AVAILABLE> and returns the result. 946Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_COMPILER_AVAILABLE> and returns the result.
873 947
874=item $device_exec_capabilities = $device->execution_capabilities 948=item $device_exec_capabilities = $device->execution_capabilities
875 949
876Calls C<clGetDeviceInfo> with C<CL_DEVICE_EXECUTION_CAPABILITIES> and returns the result. 950Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_EXECUTION_CAPABILITIES> and returns the result.
877 951
878=item $command_queue_properties = $device->properties 952=item $command_queue_properties = $device->properties
879 953
880Calls C<clGetDeviceInfo> with C<CL_DEVICE_QUEUE_PROPERTIES> and returns the result. 954Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_QUEUE_PROPERTIES> and returns the result.
881 955
882=item $ = $device->platform 956=item $ = $device->platform
883 957
884Calls C<clGetDeviceInfo> with C<CL_DEVICE_PLATFORM> and returns the result. 958Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PLATFORM> and returns the result.
885 959
886=item $string = $device->name 960=item $string = $device->name
887 961
888Calls C<clGetDeviceInfo> with C<CL_DEVICE_NAME> and returns the result. 962Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_NAME> and returns the result.
889 963
890=item $string = $device->vendor 964=item $string = $device->vendor
891 965
892Calls C<clGetDeviceInfo> with C<CL_DEVICE_VENDOR> and returns the result. 966Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_VENDOR> and returns the result.
893 967
894=item $string = $device->driver_version 968=item $string = $device->driver_version
895 969
896Calls C<clGetDeviceInfo> with C<CL_DRIVER_VERSION> and returns the result. 970Calls C<clGetDeviceInfo> with C<OpenCL::DRIVER_VERSION> and returns the result.
897 971
898=item $string = $device->profile 972=item $string = $device->profile
899 973
900Calls C<clGetDeviceInfo> with C<CL_DEVICE_PROFILE> and returns the result. 974Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PROFILE> and returns the result.
901 975
902=item $string = $device->version 976=item $string = $device->version
903 977
904Calls C<clGetDeviceInfo> with C<CL_DEVICE_VERSION> and returns the result. 978Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_VERSION> and returns the result.
905 979
906=item $string = $device->extensions 980=item $string = $device->extensions
907 981
908Calls C<clGetDeviceInfo> with C<CL_DEVICE_EXTENSIONS> and returns the result. 982Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_EXTENSIONS> and returns the result.
909 983
910=item $uint = $device->preferred_vector_width_half 984=item $uint = $device->preferred_vector_width_half
911 985
912Calls C<clGetDeviceInfo> with C<CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF> and returns the result. 986Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PREFERRED_VECTOR_WIDTH_HALF> and returns the result.
913 987
914=item $uint = $device->native_vector_width_char 988=item $uint = $device->native_vector_width_char
915 989
916Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR> and returns the result. 990Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_NATIVE_VECTOR_WIDTH_CHAR> and returns the result.
917 991
918=item $uint = $device->native_vector_width_short 992=item $uint = $device->native_vector_width_short
919 993
920Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT> and returns the result. 994Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_NATIVE_VECTOR_WIDTH_SHORT> and returns the result.
921 995
922=item $uint = $device->native_vector_width_int 996=item $uint = $device->native_vector_width_int
923 997
924Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_INT> and returns the result. 998Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_NATIVE_VECTOR_WIDTH_INT> and returns the result.
925 999
926=item $uint = $device->native_vector_width_long 1000=item $uint = $device->native_vector_width_long
927 1001
928Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG> and returns the result. 1002Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_NATIVE_VECTOR_WIDTH_LONG> and returns the result.
929 1003
930=item $uint = $device->native_vector_width_float 1004=item $uint = $device->native_vector_width_float
931 1005
932Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT> and returns the result. 1006Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_NATIVE_VECTOR_WIDTH_FLOAT> and returns the result.
933 1007
934=item $uint = $device->native_vector_width_double 1008=item $uint = $device->native_vector_width_double
935 1009
936Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE> and returns the result. 1010Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE> and returns the result.
937 1011
938=item $uint = $device->native_vector_width_half 1012=item $uint = $device->native_vector_width_half
939 1013
940Calls C<clGetDeviceInfo> with C<CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF> and returns the result. 1014Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_NATIVE_VECTOR_WIDTH_HALF> and returns the result.
941 1015
942=item $device_fp_config = $device->double_fp_config 1016=item $device_fp_config = $device->double_fp_config
943 1017
944Calls C<clGetDeviceInfo> with C<CL_DEVICE_DOUBLE_FP_CONFIG> and returns the result. 1018Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_DOUBLE_FP_CONFIG> and returns the result.
945 1019
946=item $device_fp_config = $device->half_fp_config 1020=item $device_fp_config = $device->half_fp_config
947 1021
948Calls C<clGetDeviceInfo> with C<CL_DEVICE_HALF_FP_CONFIG> and returns the result. 1022Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_HALF_FP_CONFIG> and returns the result.
949 1023
950=item $boolean = $device->host_unified_memory 1024=item $boolean = $device->host_unified_memory
951 1025
952Calls C<clGetDeviceInfo> with C<CL_DEVICE_HOST_UNIFIED_MEMORY> and returns the result. 1026Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_HOST_UNIFIED_MEMORY> and returns the result.
953 1027
954=item $device = $device->parent_device_ext 1028=item $device = $device->parent_device_ext
955 1029
956Calls C<clGetDeviceInfo> with C<CL_DEVICE_PARENT_DEVICE_EXT> and returns the result. 1030Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PARENT_DEVICE_EXT> and returns the result.
957 1031
958=item @device_partition_property_exts = $device->partition_types_ext 1032=item @device_partition_property_exts = $device->partition_types_ext
959 1033
960Calls C<clGetDeviceInfo> with C<CL_DEVICE_PARTITION_TYPES_EXT> and returns the result. 1034Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PARTITION_TYPES_EXT> and returns the result.
961 1035
962=item @device_partition_property_exts = $device->affinity_domains_ext 1036=item @device_partition_property_exts = $device->affinity_domains_ext
963 1037
964Calls C<clGetDeviceInfo> with C<CL_DEVICE_AFFINITY_DOMAINS_EXT> and returns the result. 1038Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_AFFINITY_DOMAINS_EXT> and returns the result.
965 1039
966=item $uint = $device->reference_count_ext 1040=item $uint = $device->reference_count_ext
967 1041
968Calls C<clGetDeviceInfo> with C<CL_DEVICE_REFERENCE_COUNT_EXT> and returns the result. 1042Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_REFERENCE_COUNT_EXT> and returns the result.
969 1043
970=item @device_partition_property_exts = $device->partition_style_ext 1044=item @device_partition_property_exts = $device->partition_style_ext
971 1045
972Calls C<clGetDeviceInfo> with C<CL_DEVICE_PARTITION_STYLE_EXT> and returns the result. 1046Calls C<clGetDeviceInfo> with C<OpenCL::DEVICE_PARTITION_STYLE_EXT> and returns the result.
973 1047
974=for gengetinfo end device 1048=for gengetinfo end device
975 1049
976=back 1050=back
977 1051
978=head2 THE OpenCL::Context CLASS 1052=head2 THE OpenCL::Context CLASS
1053
1054An OpenCL::Context is basically a container, or manager, for a number of
1055devices of a platform. It is used to create all sorts of secondary objects
1056such as buffers, queues, programs and so on.
1057
1058All context creation functions and methods take a list of properties
1059(type-value pairs). All property values can be specified as integers -
1060some additionally support other types:
1061
1062=over 4
1063
1064=item OpenCL::CONTEXT_PLATFORM
1065
1066Also accepts OpenCL::Platform objects.
1067
1068=item OpenCL::GLX_DISPLAY_KHR
1069
1070Also accepts C<undef>, in which case a deep and troubling hack is engaged
1071to find the current glx display (see L<GLX SUPPORT>).
1072
1073=item OpenCL::GL_CONTEXT_KHR
1074
1075Also accepts C<undef>, in which case a deep and troubling hack is engaged
1076to find the current glx context (see L<GLX SUPPORT>).
1077
1078=back
979 1079
980=over 4 1080=over 4
981 1081
982=item $prog = $ctx->build_program ($program, $options = "") 1082=item $prog = $ctx->build_program ($program, $options = "")
983 1083
992=cut 1092=cut
993 1093
994sub OpenCL::Context::build_program { 1094sub OpenCL::Context::build_program {
995 my ($self, $prog, $options) = @_; 1095 my ($self, $prog, $options) = @_;
996 1096
997 require Carp;
998
999 $prog = $self->program_with_source ($prog) 1097 $prog = $self->program_with_source ($prog)
1000 unless ref $prog; 1098 unless ref $prog;
1001 1099
1002 # we build separately per device so we instantly know which one failed 1100 eval { $prog->build (undef, $options); 1 }
1101 or errno == BUILD_PROGRAM_FAILURE
1102 or errno == INVALID_BINARY # workaround nvidia bug
1103 or Carp::croak "OpenCL::Context->build_program: " . err2str;
1104
1105 # we check status for all devices
1003 for my $dev ($self->devices) { 1106 for my $dev ($self->devices) {
1004 eval { $prog->build ([$dev], $options); 1 } 1107 $prog->build_status ($dev) == BUILD_SUCCESS
1005 or Carp::croak ("Building OpenCL program for device '" . $dev->name . "' failed:\n" 1108 or Carp::croak "Building OpenCL program for device '" . $dev->name . "' failed:\n"
1006 . $prog->build_log ($dev)); 1109 . $prog->build_log ($dev);
1007 } 1110 }
1008 1111
1009 $prog 1112 $prog
1010} 1113}
1011 1114
1028=item $buf = $ctx->buffer ($flags, $len) 1131=item $buf = $ctx->buffer ($flags, $len)
1029 1132
1030Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object with the 1133Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object with the
1031given flags and octet-size. 1134given flags and octet-size.
1032 1135
1136flags: OpenCL::MEM_READ_WRITE, OpenCL::MEM_WRITE_ONLY, OpenCL::MEM_READ_ONLY,
1137OpenCL::MEM_USE_HOST_PTR, OpenCL::MEM_ALLOC_HOST_PTR, OpenCL::MEM_COPY_HOST_PTR,
1138OpenCL::MEM_HOST_WRITE_ONLY, OpenCL::MEM_HOST_READ_ONLY, OpenCL::MEM_HOST_NO_ACCESS.
1139
1033L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateBuffer.html> 1140L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateBuffer.html>
1034 1141
1035=item $buf = $ctx->buffer_sv ($flags, $data) 1142=item $buf = $ctx->buffer_sv ($flags, $data)
1036 1143
1037Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object and 1144Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object and
1038initialise it with the given data values. 1145initialise it with the given data values.
1039 1146
1040=item $img = $ctx->image ($self, $flags, $channel_order, $channel_type, $type, $width, $height, $depth, $array_size = 0, $row_pitch = 0, $slice_pitch = 0, $num_mip_level = 0, $num_samples = 0, $*data = &PL_sv_undef) 1147=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)
1041 1148
1042Creates a new OpenCL::Image object and optionally initialises it with 1149Creates a new OpenCL::Image object and optionally initialises it with
1043the given data values. 1150the given data values.
1044 1151
1152channel_order: OpenCL::R, OpenCL::A, OpenCL::RG, OpenCL::RA, OpenCL::RGB,
1153OpenCL::RGBA, OpenCL::BGRA, OpenCL::ARGB, OpenCL::INTENSITY, OpenCL::LUMINANCE,
1154OpenCL::Rx, OpenCL::RGx, OpenCL::RGBx.
1155
1156channel_type: OpenCL::SNORM_INT8, OpenCL::SNORM_INT16, OpenCL::UNORM_INT8,
1157OpenCL::UNORM_INT16, OpenCL::UNORM_SHORT_565, OpenCL::UNORM_SHORT_555,
1158OpenCL::UNORM_INT_101010, OpenCL::SIGNED_INT8, OpenCL::SIGNED_INT16,
1159OpenCL::SIGNED_INT32, OpenCL::UNSIGNED_INT8, OpenCL::UNSIGNED_INT16,
1160OpenCL::UNSIGNED_INT32, OpenCL::HALF_FLOAT, OpenCL::FLOAT.
1161
1162
1163type: OpenCL::MEM_OBJECT_BUFFER, OpenCL::MEM_OBJECT_IMAGE2D,
1164OpenCL::MEM_OBJECT_IMAGE3D, OpenCL::MEM_OBJECT_IMAGE2D_ARRAY,
1165OpenCL::MEM_OBJECT_IMAGE1D, OpenCL::MEM_OBJECT_IMAGE1D_ARRAY,
1166OpenCL::MEM_OBJECT_IMAGE1D_BUFFER.
1167
1045L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateImage.html> 1168L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateImage.html>
1046 1169
1047=item $img = $ctx->image2d ($flags, $channel_order, $channel_type, $width, $height, $row_pitch = 0, $data = undef) 1170=item $img = $ctx->image2d ($flags, $channel_order, $channel_type, $width, $height, $row_pitch = 0, $data = undef)
1048 1171
1049Creates a new OpenCL::Image2D object and optionally initialises it with 1172Creates a new OpenCL::Image2D object and optionally initialises it with
1061=item $buffer = $ctx->gl_buffer ($flags, $bufobj) 1184=item $buffer = $ctx->gl_buffer ($flags, $bufobj)
1062 1185
1063Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object that refers to the given 1186Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object that refers to the given
1064OpenGL buffer object. 1187OpenGL buffer object.
1065 1188
1189flags: OpenCL::MEM_READ_WRITE, OpenCL::MEM_READ_ONLY, OpenCL::MEM_WRITE_ONLY.
1190
1066http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateFromGLBuffer.html 1191http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateFromGLBuffer.html
1067 1192
1068=item $img = $ctx->gl_texture ($flags, $target, $miplevel, $texture) 1193=item $img = $ctx->gl_texture ($flags, $target, $miplevel, $texture)
1069 1194
1070Creates a new OpenCL::Image object that refers to the given OpenGL 1195Creates a new OpenCL::Image object that refers to the given OpenGL
1071texture object or buffer. 1196texture object or buffer.
1072 1197
1198target: GL_TEXTURE_1D, GL_TEXTURE_1D_ARRAY, GL_TEXTURE_BUFFER,
1199GL_TEXTURE_2D, GL_TEXTURE_2D_ARRAY, GL_TEXTURE_3D,
1200GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
1201GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
1202GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
1203GL_TEXTURE_RECTANGLE/GL_TEXTURE_RECTANGLE_ARB.
1204
1073http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateFromGLTexture.html 1205http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateFromGLTexture.html
1074 1206
1075=item $img = $ctx->gl_texture2d ($flags, $target, $miplevel, $texture) 1207=item $img = $ctx->gl_texture2d ($flags, $target, $miplevel, $texture)
1076 1208
1077Creates a new OpenCL::Image2D object that refers to the given OpenGL 1209Creates a new OpenCL::Image2D object that refers to the given OpenGL
1102 1234
1103=item $sampler = $ctx->sampler ($normalized_coords, $addressing_mode, $filter_mode) 1235=item $sampler = $ctx->sampler ($normalized_coords, $addressing_mode, $filter_mode)
1104 1236
1105Creates a new OpenCL::Sampler object. 1237Creates a new OpenCL::Sampler object.
1106 1238
1239addressing_mode: OpenCL::ADDRESS_NONE, OpenCL::ADDRESS_CLAMP_TO_EDGE,
1240OpenCL::ADDRESS_CLAMP, OpenCL::ADDRESS_REPEAT, OpenCL::ADDRESS_MIRRORED_REPEAT.
1241
1242filter_mode: OpenCL::FILTER_NEAREST, OpenCL::FILTER_LINEAR.
1243
1107L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateSampler.html> 1244L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateSampler.html>
1108 1245
1109=item $program = $ctx->program_with_source ($string) 1246=item $program = $ctx->program_with_source ($string)
1110 1247
1111Creates a new OpenCL::Program object from the given source code. 1248Creates a new OpenCL::Program object from the given source code.
1112 1249
1113L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateProgramWithSource.html> 1250L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateProgramWithSource.html>
1114 1251
1252=item ($program, \@status) = $ctx->program_with_binary (\@devices, \@binaries)
1253
1254Creates a new OpenCL::Program object from the given binaries.
1255
1256L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateProgramWithBinary.html>
1257
1258Example: clone an existing program object that contains a successfully
1259compiled program, no matter how useless this is.
1260
1261 my $clone = $ctx->program_with_binary ([$prog->devices], [$prog->binaries]);
1262
1263=item $program = $ctx->program_with_built_in_kernels (\@devices, $kernel_names)
1264
1265Creates a new OpenCL::Program object from the given built-in kernel names.
1266
1267L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateProgramWithBuiltInKernels.html>
1268
1115=item $packed_value = $ctx->info ($name) 1269=item $packed_value = $ctx->info ($name)
1116 1270
1117See C<< $platform->info >> for details. 1271See C<< $platform->info >> for details.
1118 1272
1119L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetContextInfo.html> 1273L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetContextInfo.html>
1120 1274
1121=for gengetinfo begin context 1275=for gengetinfo begin context
1122 1276
1123=item $uint = $context->reference_count 1277=item $uint = $context->reference_count
1124 1278
1125Calls C<clGetContextInfo> with C<CL_CONTEXT_REFERENCE_COUNT> and returns the result. 1279Calls C<clGetContextInfo> with C<OpenCL::CONTEXT_REFERENCE_COUNT> and returns the result.
1126 1280
1127=item @devices = $context->devices 1281=item @devices = $context->devices
1128 1282
1129Calls C<clGetContextInfo> with C<CL_CONTEXT_DEVICES> and returns the result. 1283Calls C<clGetContextInfo> with C<OpenCL::CONTEXT_DEVICES> and returns the result.
1130 1284
1131=item @property_ints = $context->properties 1285=item @property_ints = $context->properties
1132 1286
1133Calls C<clGetContextInfo> with C<CL_CONTEXT_PROPERTIES> and returns the result. 1287Calls C<clGetContextInfo> with C<OpenCL::CONTEXT_PROPERTIES> and returns the result.
1134 1288
1135=item $uint = $context->num_devices 1289=item $uint = $context->num_devices
1136 1290
1137Calls C<clGetContextInfo> with C<CL_CONTEXT_NUM_DEVICES> and returns the result. 1291Calls C<clGetContextInfo> with C<OpenCL::CONTEXT_NUM_DEVICES> and returns the result.
1138 1292
1139=for gengetinfo end context 1293=for gengetinfo end context
1140 1294
1141=back 1295=back
1142 1296
1143=head2 THE OpenCL::Queue CLASS 1297=head2 THE OpenCL::Queue CLASS
1144 1298
1145An OpenCL::Queue represents an execution queue for OpenCL. You execute 1299An OpenCL::Queue represents an execution queue for OpenCL. You execute
1146requests by calling their respective C<enqueue_xxx> method and waitinf for 1300requests by calling their respective method and waiting for it to complete
1147it to complete in some way. 1301in some way.
1148 1302
1149All the enqueue methods return an event object that can be used to wait 1303Most methods that enqueue some request return an event object that can
1150for completion, unless the method is called in void context, in which case 1304be used to wait for completion (optionally using a callback), unless
1151no event object is created. 1305the method is called in void context, in which case no event object is
1306created.
1152 1307
1153They also allow you to specify any number of other event objects that this 1308They also allow you to specify any number of other event objects that this
1154request has to wait for before it starts executing, by simply passing the 1309request has to wait for before it starts executing, by simply passing the
1155event objects as extra parameters to the enqueue methods. To simplify 1310event objects as extra parameters to the enqueue methods. To simplify
1156program design, this module ignores any C<undef> values in the list of 1311program design, this module ignores any C<undef> values in the list of
1157events. This makes it possible to code operations such as this, without 1312events. This makes it possible to code operations such as this, without
1158having to put a valid event object into C<$event> first: 1313having to put a valid event object into C<$event> first:
1159 1314
1160 $event = $queue->enqueue_xxx (..., $event); 1315 $event = $queue->xxx (..., $event);
1161 1316
1162Queues execute in-order by default, without any parallelism, so in most 1317Queues execute in-order by default, without any parallelism, so in most
1163cases (i.e. you use only one queue) it's not necessary to wait for or 1318cases (i.e. you use only one queue) it's not necessary to wait for or
1164create event objects, althoguh an our of order queue is often a bit 1319create event objects, althoguh an our of order queue is often a bit
1165faster. 1320faster.
1166 1321
1167=over 4 1322=over 4
1168 1323
1169=item $ev = $queue->enqueue_read_buffer ($buffer, $blocking, $offset, $len, $data, $wait_events...) 1324=item $ev = $queue->read_buffer ($buffer, $blocking, $offset, $len, $data, $wait_events...)
1170 1325
1171Reads data from buffer into the given string. 1326Reads data from buffer into the given string.
1172 1327
1173L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadBuffer.html> 1328L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadBuffer.html>
1174 1329
1175=item $ev = $queue->enqueue_write_buffer ($buffer, $blocking, $offset, $data, $wait_events...) 1330=item $ev = $queue->write_buffer ($buffer, $blocking, $offset, $data, $wait_events...)
1176 1331
1177Writes data to buffer from the given string. 1332Writes data to buffer from the given string.
1178 1333
1179L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteBuffer.html> 1334L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteBuffer.html>
1180 1335
1181=item $ev = $queue->enqueue_copy_buffer ($src, $dst, $src_offset, $dst_offset, $len, $wait_events...) 1336=item $ev = $queue->copy_buffer ($src, $dst, $src_offset, $dst_offset, $len, $wait_events...)
1182 1337
1183L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBuffer.html> 1338L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBuffer.html>
1184 1339
1185=item $ev = $queue->enqueue_read_buffer_rect (OpenCL::Memory buf, cl_bool blocking, $buf_x, $buf_y, $buf_z, $host_x, $host_y, $host_z, $width, $height, $depth, $buf_row_pitch, $buf_slice_pitch, $host_row_pitch, $host_slice_pitch, $data, $wait_events...) 1340=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...)
1186 1341
1187http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadBufferRect.html 1342http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadBufferRect.html
1188 1343
1189=item $ev = $queue->enqueue_write_buffer_rect (OpenCL::Memory buf, cl_bool blocking, $buf_x, $buf_y, $buf_z, $host_x, $host_y, $host_z, $width, $height, $depth, $buf_row_pitch, $buf_slice_pitch, $host_row_pitch, $host_slice_pitch, $data, $wait_events...) 1344=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...)
1190 1345
1191http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteBufferRect.html 1346http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteBufferRect.html
1192 1347
1193=item $ev = $queue->enqueue_read_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...)
1194
1195L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferRect.html>
1196
1197=item $ev = $queue->enqueue_copy_buffer_to_image ($src_buffer, $dst_image, $src_offset, $dst_x, $dst_y, $dst_z, $width, $height, $depth, $wait_events...) 1348=item $ev = $queue->copy_buffer_to_image ($src_buffer, $dst_image, $src_offset, $dst_x, $dst_y, $dst_z, $width, $height, $depth, $wait_events...)
1349
1350L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferToImage.html>
1351
1352=item $ev = $queue->read_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...)
1353
1354C<$row_pitch> (and C<$slice_pitch>) can be C<0>, in which case the OpenCL
1355module uses the image width (and height) to supply default values.
1198 1356
1199L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadImage.html> 1357L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadImage.html>
1200 1358
1201=item $ev = $queue->enqueue_write_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...) 1359=item $ev = $queue->write_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...)
1202 1360
1361C<$row_pitch> (and C<$slice_pitch>) can be C<0>, in which case the OpenCL
1362module uses the image width (and height) to supply default values.
1203L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteImage.html> 1363L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteImage.html>
1204 1364
1205=item $ev = $queue->enqueue_copy_image ($src_image, $dst_image, $src_x, $src_y, $src_z, $dst_x, $dst_y, $dst_z, $width, $height, $depth, $wait_events...) 1365=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...)
1206 1366
1207L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyImage.html> 1367L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyImage.html>
1208 1368
1209=item $ev = $queue->enqueue_copy_image_to_buffer ($src_image, $dst_image, $src_x, $src_y, $src_z, $width, $height, $depth, $dst_offset, $wait_events...) 1369=item $ev = $queue->copy_image_to_buffer ($src_image, $dst_image, $src_x, $src_y, $src_z, $width, $height, $depth, $dst_offset, $wait_events...)
1210 1370
1211L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyImageToBuffer.html> 1371L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyImageToBuffer.html>
1212 1372
1213=item $ev = $queue->enqueue_copy_buffer_rect ($src, $dst, $src_x, $src_y, $src_z, $dst_x, $dst_y, $dst_z, $width, $height, $depth, $src_row_pitch, $src_slice_pitch, $dst_row_pitch, $dst_slice_pitch, $wait_event...) 1373=item $ev = $queue->copy_buffer_rect ($src, $dst, $src_x, $src_y, $src_z, $dst_x, $dst_y, $dst_z, $width, $height, $depth, $src_row_pitch, $src_slice_pitch, $dst_row_pitch, $dst_slice_pitch, $wait_event...)
1214 1374
1215Yeah. 1375Yeah.
1216 1376
1217L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferToImage.html>. 1377L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferToImage.html>.
1218 1378
1219=item $ev = $queue->enqueue_fill_buffer ($mem, $pattern, $offset, $size, ...) 1379=item $ev = $queue->fill_buffer ($mem, $pattern, $offset, $size, ...)
1220 1380
1221Fills the given buffer object with repeated applications of C<$pattern>, 1381Fills the given buffer object with repeated applications of C<$pattern>,
1222starting at C<$offset> for C<$size> octets. 1382starting at C<$offset> for C<$size> octets.
1223 1383
1224L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueFillBuffer.html> 1384L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueFillBuffer.html>
1225 1385
1226=item $ev = $queue->enqueue_fill_image ($img, $r, $g, $b, $a, $x, $y, $z, $width, $height, $depth, ...) 1386=item $ev = $queue->fill_image ($img, $r, $g, $b, $a, $x, $y, $z, $width, $height, $depth, ...)
1227 1387
1228Fills the given image area with the given rgba colour components. The 1388Fills the given image area with the given rgba colour components. The
1229components are normally floating point values between C<0> and C<1>, 1389components are normally floating point values between C<0> and C<1>,
1230except when the image channel data type is a signe dor unsigned 1390except when the image channel data type is a signe dor unsigned
1231unnormalised format, in which case the range is determined by the format. 1391unnormalised format, in which case the range is determined by the format.
1232 1392
1233L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueFillImage.html> 1393L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueFillImage.html>
1234 1394
1235=item $ev = $queue->enqueue_task ($kernel, $wait_events...) 1395=item $ev = $queue->task ($kernel, $wait_events...)
1236 1396
1237L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueTask.html> 1397L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueTask.html>
1238 1398
1239=item $ev = $queue->enqueue_nd_range_kernel ($kernel, @$global_work_offset, @$global_work_size, @$local_work_size, $wait_events...) 1399=item $ev = $queue->nd_range_kernel ($kernel, \@global_work_offset, \@global_work_size, \@local_work_size, $wait_events...)
1240 1400
1241Enqueues a kernel execution. 1401Enqueues a kernel execution.
1242 1402
1243@$global_work_size must be specified as a reference to an array of 1403\@global_work_size must be specified as a reference to an array of
1244integers specifying the work sizes (element counts). 1404integers specifying the work sizes (element counts).
1245 1405
1246@$global_work_offset must be either C<undef> (in which case all offsets 1406\@global_work_offset must be either C<undef> (in which case all offsets
1247are C<0>), or a reference to an array of work offsets, with the same number 1407are C<0>), or a reference to an array of work offsets, with the same number
1248of elements as @$global_work_size. 1408of elements as \@global_work_size.
1249 1409
1250@$local_work_size must be either C<undef> (in which case the 1410\@local_work_size must be either C<undef> (in which case the
1251implementation is supposed to choose good local work sizes), or a 1411implementation is supposed to choose good local work sizes), or a
1252reference to an array of local work sizes, with the same number of 1412reference to an array of local work sizes, with the same number of
1253elements as @$global_work_size. 1413elements as \@global_work_size.
1254 1414
1255L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueNDRangeKernel.html> 1415L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueNDRangeKernel.html>
1256 1416
1417=item $ev = $queue->migrate_mem_objects (\@mem_objects, $flags, $wait_events...)
1418
1419Migrates a number of OpenCL::Memory objects to or from the device.
1420
1421flags: OpenCL::MIGRATE_MEM_OBJECT_HOST, OpenCL::MIGRATE_MEM_OBJECT_CONTENT_UNDEFINED
1422
1423L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueMigrateMemObjects.html>
1424
1257=item $ev = $queue->enqueue_acquire_gl_objects ([object, ...], $wait_events...) 1425=item $ev = $queue->acquire_gl_objects ([object, ...], $wait_events...)
1258 1426
1259Enqueues a list (an array-ref of OpenCL::Memory objects) to be acquired 1427Enqueues a list (an array-ref of OpenCL::Memory objects) to be acquired
1260for subsequent OpenCL usage. 1428for subsequent OpenCL usage.
1261 1429
1262L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueAcquireGLObjects.html> 1430L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueAcquireGLObjects.html>
1263 1431
1264=item $ev = $queue->enqueue_release_gl_objects ([object, ...], $wait_events...) 1432=item $ev = $queue->release_gl_objects ([object, ...], $wait_events...)
1265 1433
1266Enqueues a list (an array-ref of OpenCL::Memory objects) to be released 1434Enqueues a list (an array-ref of OpenCL::Memory objects) to be released
1267for subsequent OpenGL usage. 1435for subsequent OpenGL usage.
1268 1436
1269L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReleaseGLObjects.html> 1437L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReleaseGLObjects.html>
1270 1438
1271=item $ev = $queue->enqueue_wait_for_events ($wait_events...) 1439=item $ev = $queue->wait_for_events ($wait_events...)
1272 1440
1273L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWaitForEvents.html> 1441L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWaitForEvents.html>
1274 1442
1275=item $ev = $queue->enqueue_marker ($wait_events...) 1443=item $ev = $queue->marker ($wait_events...)
1276 1444
1277L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueMarkerWithWaitList.html> 1445L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueMarkerWithWaitList.html>
1278 1446
1279=item $ev = $queue->enqueue_barrier ($wait_events...) 1447=item $ev = $queue->barrier ($wait_events...)
1280 1448
1281L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueBarrierWithWaitList.html> 1449L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueBarrierWithWaitList.html>
1282 1450
1283=item $queue->flush 1451=item $queue->flush
1284 1452
1296 1464
1297=for gengetinfo begin command_queue 1465=for gengetinfo begin command_queue
1298 1466
1299=item $ctx = $command_queue->context 1467=item $ctx = $command_queue->context
1300 1468
1301Calls C<clGetCommandQueueInfo> with C<CL_QUEUE_CONTEXT> and returns the result. 1469Calls C<clGetCommandQueueInfo> with C<OpenCL::QUEUE_CONTEXT> and returns the result.
1302 1470
1303=item $device = $command_queue->device 1471=item $device = $command_queue->device
1304 1472
1305Calls C<clGetCommandQueueInfo> with C<CL_QUEUE_DEVICE> and returns the result. 1473Calls C<clGetCommandQueueInfo> with C<OpenCL::QUEUE_DEVICE> and returns the result.
1306 1474
1307=item $uint = $command_queue->reference_count 1475=item $uint = $command_queue->reference_count
1308 1476
1309Calls C<clGetCommandQueueInfo> with C<CL_QUEUE_REFERENCE_COUNT> and returns the result. 1477Calls C<clGetCommandQueueInfo> with C<OpenCL::QUEUE_REFERENCE_COUNT> and returns the result.
1310 1478
1311=item $command_queue_properties = $command_queue->properties 1479=item $command_queue_properties = $command_queue->properties
1312 1480
1313Calls C<clGetCommandQueueInfo> with C<CL_QUEUE_PROPERTIES> and returns the result. 1481Calls C<clGetCommandQueueInfo> with C<OpenCL::QUEUE_PROPERTIES> and returns the result.
1314 1482
1315=for gengetinfo end command_queue 1483=for gengetinfo end command_queue
1484
1485=back
1486
1487=head3 MEMORY MAPPED BUFFERS
1488
1489OpenCL allows you to map buffers and images to host memory (read: perl
1490scalars). This is done much like reading or copying a buffer, by enqueuing
1491a map or unmap operation on the command queue.
1492
1493The map operations return an C<OpenCL::Mapped> object - see L<THE
1494OpenCL::Mapped CLASS> section for details on what to do with these
1495objects.
1496
1497The object will be unmapped automatically when the mapped object is
1498destroyed (you can use a barrier to make sure the unmap has finished,
1499before using the buffer in a kernel), but you can also enqueue an unmap
1500operation manually.
1501
1502=over 4
1503
1504=item $mapped_buffer = $queue->map_buffer ($buf, $blocking=1, $map_flags=OpenCL::MAP_READ|OpenCL::MAP_WRITE, $offset=0, $size=undef, $wait_events...)
1505
1506Maps the given buffer into host memory and returns an
1507C<OpenCL::MappedBuffer> object. If C<$size> is specified as undef, then
1508the map will extend to the end of the buffer.
1509
1510map_flags: OpenCL::MAP_READ, OpenCL::MAP_WRITE, OpenCL::MAP_WRITE_INVALIDATE_REGION.
1511
1512L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueMapBuffer.html>
1513
1514Example: map the buffer $buf fully and replace the first 4 bytes by "abcd", then unmap.
1515
1516 {
1517 my $mapped = $queue->map_buffer ($buf, 1, OpenCL::MAP_WRITE);
1518 substr $$mapped, 0, 4, "abcd";
1519 } # asynchronously unmap because $mapped is destroyed
1520
1521=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...)
1522
1523Maps the given image area into host memory and return an
1524C<OpenCL::MappedImage> object.
1525
1526If any of C<$width>, C<$height> and/or C<$depth> are C<undef> then they
1527will be replaced by the maximum possible value.
1528
1529L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueMapImage.html>
1530
1531Example: map an image (with OpenCL::UNSIGNED_INT8 channel type) and set
1532the first channel of the leftmost column to 5, then explicitly unmap
1533it. You are not necessarily meant to do it this way, this example just
1534shows you the accessors to use :)
1535
1536 my $mapped = $queue->map_image ($image, 1, OpenCL::MAP_WRITE);
1537
1538 $mapped->set ($_ * $mapped->row_pitch, pack "C", 5)
1539 for 0..$image->height;
1540
1541 $mapped->unmap;.
1542 $mapped->wait; # only needed for out of order queues normally
1543
1544=item $ev = $queue->unmap ($mapped, $wait_events...)
1545
1546Unmaps the data from host memory. You must not call any methods that
1547modify the data, or modify the data scalar directly, after calling this
1548method.
1549
1550The mapped event object will always be passed as part of the
1551$wait_events. The mapped event object will be replaced by the new event
1552object that this request creates.
1316 1553
1317=back 1554=back
1318 1555
1319=head2 THE OpenCL::Memory CLASS 1556=head2 THE OpenCL::Memory CLASS
1320 1557
1331 1568
1332=for gengetinfo begin mem 1569=for gengetinfo begin mem
1333 1570
1334=item $mem_object_type = $mem->type 1571=item $mem_object_type = $mem->type
1335 1572
1336Calls C<clGetMemObjectInfo> with C<CL_MEM_TYPE> and returns the result. 1573Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_TYPE> and returns the result.
1337 1574
1338=item $mem_flags = $mem->flags 1575=item $mem_flags = $mem->flags
1339 1576
1340Calls C<clGetMemObjectInfo> with C<CL_MEM_FLAGS> and returns the result. 1577Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_FLAGS> and returns the result.
1341 1578
1342=item $int = $mem->size 1579=item $int = $mem->size
1343 1580
1344Calls C<clGetMemObjectInfo> with C<CL_MEM_SIZE> and returns the result. 1581Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_SIZE> and returns the result.
1345 1582
1346=item $ptr_value = $mem->host_ptr 1583=item $ptr_value = $mem->host_ptr
1347 1584
1348Calls C<clGetMemObjectInfo> with C<CL_MEM_HOST_PTR> and returns the result. 1585Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_HOST_PTR> and returns the result.
1349 1586
1350=item $uint = $mem->map_count 1587=item $uint = $mem->map_count
1351 1588
1352Calls C<clGetMemObjectInfo> with C<CL_MEM_MAP_COUNT> and returns the result. 1589Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_MAP_COUNT> and returns the result.
1353 1590
1354=item $uint = $mem->reference_count 1591=item $uint = $mem->reference_count
1355 1592
1356Calls C<clGetMemObjectInfo> with C<CL_MEM_REFERENCE_COUNT> and returns the result. 1593Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_REFERENCE_COUNT> and returns the result.
1357 1594
1358=item $ctx = $mem->context 1595=item $ctx = $mem->context
1359 1596
1360Calls C<clGetMemObjectInfo> with C<CL_MEM_CONTEXT> and returns the result. 1597Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_CONTEXT> and returns the result.
1361 1598
1362=item $mem = $mem->associated_memobject 1599=item $mem = $mem->associated_memobject
1363 1600
1364Calls C<clGetMemObjectInfo> with C<CL_MEM_ASSOCIATED_MEMOBJECT> and returns the result. 1601Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_ASSOCIATED_MEMOBJECT> and returns the result.
1365 1602
1366=item $int = $mem->offset 1603=item $int = $mem->offset
1367 1604
1368Calls C<clGetMemObjectInfo> with C<CL_MEM_OFFSET> and returns the result. 1605Calls C<clGetMemObjectInfo> with C<OpenCL::MEM_OFFSET> and returns the result.
1369 1606
1370=for gengetinfo end mem 1607=for gengetinfo end mem
1371 1608
1372=item ($type, $name) = $mem->gl_object_info 1609=item ($type, $name) = $mem->gl_object_info
1373 1610
1425 1662
1426=for gengetinfo begin image 1663=for gengetinfo begin image
1427 1664
1428=item $int = $image->element_size 1665=item $int = $image->element_size
1429 1666
1430Calls C<clGetImageInfo> with C<CL_IMAGE_ELEMENT_SIZE> and returns the result. 1667Calls C<clGetImageInfo> with C<OpenCL::IMAGE_ELEMENT_SIZE> and returns the result.
1431 1668
1432=item $int = $image->row_pitch 1669=item $int = $image->row_pitch
1433 1670
1434Calls C<clGetImageInfo> with C<CL_IMAGE_ROW_PITCH> and returns the result. 1671Calls C<clGetImageInfo> with C<OpenCL::IMAGE_ROW_PITCH> and returns the result.
1435 1672
1436=item $int = $image->slice_pitch 1673=item $int = $image->slice_pitch
1437 1674
1438Calls C<clGetImageInfo> with C<CL_IMAGE_SLICE_PITCH> and returns the result. 1675Calls C<clGetImageInfo> with C<OpenCL::IMAGE_SLICE_PITCH> and returns the result.
1439 1676
1440=item $int = $image->width 1677=item $int = $image->width
1441 1678
1442Calls C<clGetImageInfo> with C<CL_IMAGE_WIDTH> and returns the result. 1679Calls C<clGetImageInfo> with C<OpenCL::IMAGE_WIDTH> and returns the result.
1443 1680
1444=item $int = $image->height 1681=item $int = $image->height
1445 1682
1446Calls C<clGetImageInfo> with C<CL_IMAGE_HEIGHT> and returns the result. 1683Calls C<clGetImageInfo> with C<OpenCL::IMAGE_HEIGHT> and returns the result.
1447 1684
1448=item $int = $image->depth 1685=item $int = $image->depth
1449 1686
1450Calls C<clGetImageInfo> with C<CL_IMAGE_DEPTH> and returns the result. 1687Calls C<clGetImageInfo> with C<OpenCL::IMAGE_DEPTH> and returns the result.
1451 1688
1452=for gengetinfo end image 1689=for gengetinfo end image
1453 1690
1454=for gengetinfo begin gl_texture 1691=for gengetinfo begin gl_texture
1455 1692
1456=item $GLenum = $gl_texture->target 1693=item $GLenum = $gl_texture->target
1457 1694
1458Calls C<clGetGLTextureInfo> with C<CL_GL_TEXTURE_TARGET> and returns the result. 1695Calls C<clGetGLTextureInfo> with C<OpenCL::GL_TEXTURE_TARGET> and returns the result.
1459 1696
1460=item $GLint = $gl_texture->gl_mipmap_level 1697=item $GLint = $gl_texture->gl_mipmap_level
1461 1698
1462Calls C<clGetGLTextureInfo> with C<CL_GL_MIPMAP_LEVEL> and returns the result. 1699Calls C<clGetGLTextureInfo> with C<OpenCL::GL_MIPMAP_LEVEL> and returns the result.
1463 1700
1464=for gengetinfo end gl_texture 1701=for gengetinfo end gl_texture
1465 1702
1466=back 1703=back
1467 1704
1477 1714
1478=for gengetinfo begin sampler 1715=for gengetinfo begin sampler
1479 1716
1480=item $uint = $sampler->reference_count 1717=item $uint = $sampler->reference_count
1481 1718
1482Calls C<clGetSamplerInfo> with C<CL_SAMPLER_REFERENCE_COUNT> and returns the result. 1719Calls C<clGetSamplerInfo> with C<OpenCL::SAMPLER_REFERENCE_COUNT> and returns the result.
1483 1720
1484=item $ctx = $sampler->context 1721=item $ctx = $sampler->context
1485 1722
1486Calls C<clGetSamplerInfo> with C<CL_SAMPLER_CONTEXT> and returns the result. 1723Calls C<clGetSamplerInfo> with C<OpenCL::SAMPLER_CONTEXT> and returns the result.
1487 1724
1488=item $addressing_mode = $sampler->normalized_coords 1725=item $addressing_mode = $sampler->normalized_coords
1489 1726
1490Calls C<clGetSamplerInfo> with C<CL_SAMPLER_NORMALIZED_COORDS> and returns the result. 1727Calls C<clGetSamplerInfo> with C<OpenCL::SAMPLER_NORMALIZED_COORDS> and returns the result.
1491 1728
1492=item $filter_mode = $sampler->addressing_mode 1729=item $filter_mode = $sampler->addressing_mode
1493 1730
1494Calls C<clGetSamplerInfo> with C<CL_SAMPLER_ADDRESSING_MODE> and returns the result. 1731Calls C<clGetSamplerInfo> with C<OpenCL::SAMPLER_ADDRESSING_MODE> and returns the result.
1495 1732
1496=item $boolean = $sampler->filter_mode 1733=item $boolean = $sampler->filter_mode
1497 1734
1498Calls C<clGetSamplerInfo> with C<CL_SAMPLER_FILTER_MODE> and returns the result. 1735Calls C<clGetSamplerInfo> with C<OpenCL::SAMPLER_FILTER_MODE> and returns the result.
1499 1736
1500=for gengetinfo end sampler 1737=for gengetinfo end sampler
1501 1738
1502=back 1739=back
1503 1740
1513If a callback is specified, then it will be called when compilation is 1750If a callback is specified, then it will be called when compilation is
1514finished. Note that many OpenCL implementations block your program while 1751finished. Note that many OpenCL implementations block your program while
1515compiling whether you use a callback or not. See C<build_async> if you 1752compiling whether you use a callback or not. See C<build_async> if you
1516want to make sure the build is done in the background. 1753want to make sure the build is done in the background.
1517 1754
1518Note that some OpenCL implementations atc up badly, and don't call the 1755Note that some OpenCL implementations act up badly, and don't call the
1519callback in some error cases (but call it in others). This implementation 1756callback in some error cases (but call it in others). This implementation
1520assumes the callback will always be called, and leaks memory if this is 1757assumes the callback will always be called, and leaks memory if this is
1521not so. So best make sure you don't pass in invalid values. 1758not so. So best make sure you don't pass in invalid values.
1522 1759
1760Some implementations fail with C<OpenCL::INVALID_BINARY> when the
1761compilation state is successful but some later stage fails.
1762
1763options: C<-D name>, C<-D name=definition>, C<-I dir>,
1764C<-cl-single-precision-constant>, C<-cl-denorms-are-zero>,
1765C<-cl-fp32-correctly-rounded-divide-sqrt>, C<-cl-opt-disable>,
1766C<-cl-mad-enable>, C<-cl-no-signed-zeros>, C<-cl-unsafe-math-optimizations>,
1767C<-cl-finite-math-only>, C<-cl-fast-relaxed-math>,
1768C<-w>, C<-Werror>, C<-cl-std=CL1.1/CL1.2>, C<-cl-kernel-arg-info>,
1769C<-create-library>, C<-enable-link-options>.
1770
1523L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clBuildProgram.html> 1771L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clBuildProgram.html>
1524 1772
1525=item $program->build_async (\@devices = undef, $options = "", $cb->($program) = undef) 1773=item $program->build_async (\@devices = undef, $options = "", $cb->($program) = undef)
1526 1774
1527Similar to C<< ->build >>, except it starts a thread, and never fails (you 1775Similar to C<< ->build >>, except it starts a thread, and never fails (you
1528need to check the compilation status form the callback, or by polling). 1776need to check the compilation status form the callback, or by polling).
1529 1777
1778build_status: OpenCL::BUILD_SUCCESS, OpenCL::BUILD_NONE,
1779OpenCL::BUILD_ERROR, OpenCL::BUILD_IN_PROGRESS.
1780
1530=item $packed_value = $program->build_info ($device, $name) 1781=item $packed_value = $program->build_info ($device, $name)
1531 1782
1532Similar to C<< $platform->info >>, but returns build info for a previous 1783Similar to C<< $platform->info >>, but returns build info for a previous
1533build attempt for the given device. 1784build attempt for the given device.
1534 1785
1549 1800
1550=for gengetinfo begin program_build 1801=for gengetinfo begin program_build
1551 1802
1552=item $build_status = $program->build_status ($device) 1803=item $build_status = $program->build_status ($device)
1553 1804
1554Calls C<clGetProgramBuildInfo> with C<CL_PROGRAM_BUILD_STATUS> and returns the result. 1805Calls C<clGetProgramBuildInfo> with C<OpenCL::PROGRAM_BUILD_STATUS> and returns the result.
1555 1806
1556=item $string = $program->build_options ($device) 1807=item $string = $program->build_options ($device)
1557 1808
1558Calls C<clGetProgramBuildInfo> with C<CL_PROGRAM_BUILD_OPTIONS> and returns the result. 1809Calls C<clGetProgramBuildInfo> with C<OpenCL::PROGRAM_BUILD_OPTIONS> and returns the result.
1559 1810
1560=item $string = $program->build_log ($device) 1811=item $string = $program->build_log ($device)
1561 1812
1562Calls C<clGetProgramBuildInfo> with C<CL_PROGRAM_BUILD_LOG> and returns the result. 1813Calls C<clGetProgramBuildInfo> with C<OpenCL::PROGRAM_BUILD_LOG> and returns the result.
1563 1814
1564=for gengetinfo end program_build 1815=for gengetinfo end program_build
1565 1816
1566=item $packed_value = $program->info ($name) 1817=item $packed_value = $program->info ($name)
1567 1818
1571 1822
1572=for gengetinfo begin program 1823=for gengetinfo begin program
1573 1824
1574=item $uint = $program->reference_count 1825=item $uint = $program->reference_count
1575 1826
1576Calls C<clGetProgramInfo> with C<CL_PROGRAM_REFERENCE_COUNT> and returns the result. 1827Calls C<clGetProgramInfo> with C<OpenCL::PROGRAM_REFERENCE_COUNT> and returns the result.
1577 1828
1578=item $ctx = $program->context 1829=item $ctx = $program->context
1579 1830
1580Calls C<clGetProgramInfo> with C<CL_PROGRAM_CONTEXT> and returns the result. 1831Calls C<clGetProgramInfo> with C<OpenCL::PROGRAM_CONTEXT> and returns the result.
1581 1832
1582=item $uint = $program->num_devices 1833=item $uint = $program->num_devices
1583 1834
1584Calls C<clGetProgramInfo> with C<CL_PROGRAM_NUM_DEVICES> and returns the result. 1835Calls C<clGetProgramInfo> with C<OpenCL::PROGRAM_NUM_DEVICES> and returns the result.
1585 1836
1586=item @devices = $program->devices 1837=item @devices = $program->devices
1587 1838
1588Calls C<clGetProgramInfo> with C<CL_PROGRAM_DEVICES> and returns the result. 1839Calls C<clGetProgramInfo> with C<OpenCL::PROGRAM_DEVICES> and returns the result.
1589 1840
1590=item $string = $program->source 1841=item $string = $program->source
1591 1842
1592Calls C<clGetProgramInfo> with C<CL_PROGRAM_SOURCE> and returns the result. 1843Calls C<clGetProgramInfo> with C<OpenCL::PROGRAM_SOURCE> and returns the result.
1593 1844
1594=item @ints = $program->binary_sizes 1845=item @ints = $program->binary_sizes
1595 1846
1596Calls C<clGetProgramInfo> with C<CL_PROGRAM_BINARY_SIZES> and returns the result. 1847Calls C<clGetProgramInfo> with C<OpenCL::PROGRAM_BINARY_SIZES> and returns the result.
1597 1848
1598=for gengetinfo end program 1849=for gengetinfo end program
1599 1850
1600=item @blobs = $program->binaries 1851=item @blobs = $program->binaries
1601 1852
1622 1873
1623=for gengetinfo begin kernel 1874=for gengetinfo begin kernel
1624 1875
1625=item $string = $kernel->function_name 1876=item $string = $kernel->function_name
1626 1877
1627Calls C<clGetKernelInfo> with C<CL_KERNEL_FUNCTION_NAME> and returns the result. 1878Calls C<clGetKernelInfo> with C<OpenCL::KERNEL_FUNCTION_NAME> and returns the result.
1628 1879
1629=item $uint = $kernel->num_args 1880=item $uint = $kernel->num_args
1630 1881
1631Calls C<clGetKernelInfo> with C<CL_KERNEL_NUM_ARGS> and returns the result. 1882Calls C<clGetKernelInfo> with C<OpenCL::KERNEL_NUM_ARGS> and returns the result.
1632 1883
1633=item $uint = $kernel->reference_count 1884=item $uint = $kernel->reference_count
1634 1885
1635Calls C<clGetKernelInfo> with C<CL_KERNEL_REFERENCE_COUNT> and returns the result. 1886Calls C<clGetKernelInfo> with C<OpenCL::KERNEL_REFERENCE_COUNT> and returns the result.
1636 1887
1637=item $ctx = $kernel->context 1888=item $ctx = $kernel->context
1638 1889
1639Calls C<clGetKernelInfo> with C<CL_KERNEL_CONTEXT> and returns the result. 1890Calls C<clGetKernelInfo> with C<OpenCL::KERNEL_CONTEXT> and returns the result.
1640 1891
1641=item $program = $kernel->program 1892=item $program = $kernel->program
1642 1893
1643Calls C<clGetKernelInfo> with C<CL_KERNEL_PROGRAM> and returns the result. 1894Calls C<clGetKernelInfo> with C<OpenCL::KERNEL_PROGRAM> and returns the result.
1644 1895
1645=for gengetinfo end kernel 1896=for gengetinfo end kernel
1646 1897
1647=item $packed_value = $kernel->work_group_info ($device, $name) 1898=item $packed_value = $kernel->work_group_info ($device, $name)
1648 1899
1649See C<< $platform->info >> for details. 1900See C<< $platform->info >> for details.
1650 1901
1651The reason this method is not called C<info> is that there already is an
1652C<< ->info >> method.
1653
1654L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetKernelWorkGroupInfo.html> 1902L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetKernelWorkGroupInfo.html>
1655 1903
1656=for gengetinfo begin kernel_work_group 1904=for gengetinfo begin kernel_work_group
1657 1905
1658=item $int = $kernel->work_group_size ($device) 1906=item $int = $kernel->work_group_size ($device)
1659 1907
1660Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_WORK_GROUP_SIZE> and returns the result. 1908Calls C<clGetKernelWorkGroupInfo> with C<OpenCL::KERNEL_WORK_GROUP_SIZE> and returns the result.
1661 1909
1662=item @ints = $kernel->compile_work_group_size ($device) 1910=item @ints = $kernel->compile_work_group_size ($device)
1663 1911
1664Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_COMPILE_WORK_GROUP_SIZE> and returns the result. 1912Calls C<clGetKernelWorkGroupInfo> with C<OpenCL::KERNEL_COMPILE_WORK_GROUP_SIZE> and returns the result.
1665 1913
1666=item $ulong = $kernel->local_mem_size ($device) 1914=item $ulong = $kernel->local_mem_size ($device)
1667 1915
1668Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_LOCAL_MEM_SIZE> and returns the result. 1916Calls C<clGetKernelWorkGroupInfo> with C<OpenCL::KERNEL_LOCAL_MEM_SIZE> and returns the result.
1669 1917
1670=item $int = $kernel->preferred_work_group_size_multiple ($device) 1918=item $int = $kernel->preferred_work_group_size_multiple ($device)
1671 1919
1672Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE> and returns the result. 1920Calls C<clGetKernelWorkGroupInfo> with C<OpenCL::KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE> and returns the result.
1673 1921
1674=item $ulong = $kernel->private_mem_size ($device) 1922=item $ulong = $kernel->private_mem_size ($device)
1675 1923
1676Calls C<clGetKernelWorkGroupInfo> with C<CL_KERNEL_PRIVATE_MEM_SIZE> and returns the result. 1924Calls C<clGetKernelWorkGroupInfo> with C<OpenCL::KERNEL_PRIVATE_MEM_SIZE> and returns the result.
1677 1925
1678=for gengetinfo end kernel_work_group 1926=for gengetinfo end kernel_work_group
1679 1927
1928=item $packed_value = $kernel->arg_info ($idx, $name)
1929
1930See C<< $platform->info >> for details.
1931
1932L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clGetKernelArgInfo.html>
1933
1934=for gengetinfo begin kernel_arg
1935
1936=item $kernel_arg_address_qualifier = $kernel->arg_address_qualifier ($idx)
1937
1938Calls C<clGetKernelArgInfo> with C<OpenCL::KERNEL_ARG_ADDRESS_QUALIFIER> and returns the result.
1939
1940=item $kernel_arg_access_qualifier = $kernel->arg_access_qualifier ($idx)
1941
1942Calls C<clGetKernelArgInfo> with C<OpenCL::KERNEL_ARG_ACCESS_QUALIFIER> and returns the result.
1943
1944=item $string = $kernel->arg_type_name ($idx)
1945
1946Calls C<clGetKernelArgInfo> with C<OpenCL::KERNEL_ARG_TYPE_NAME> and returns the result.
1947
1948=item $kernel_arg_type_qualifier = $kernel->arg_type_qualifier ($idx)
1949
1950Calls C<clGetKernelArgInfo> with C<OpenCL::KERNEL_ARG_TYPE_QUALIFIER> and returns the result.
1951
1952=item $string = $kernel->arg_name ($idx)
1953
1954Calls C<clGetKernelArgInfo> with C<OpenCL::KERNEL_ARG_NAME> and returns the result.
1955
1956=for gengetinfo end kernel_arg
1957
1958=item $kernel->setf ($format, ...)
1959
1960Sets the arguments of a kernel. Since OpenCL 1.1 doesn't have a generic
1961way to set arguments (and with OpenCL 1.2 it might be rather slow), you
1962need to specify a format argument, much as with C<printf>, to tell OpenCL
1963what type of argument it is.
1964
1965The format arguments are single letters:
1966
1967 c char
1968 C unsigned char
1969 s short
1970 S unsigned short
1971 i int
1972 I unsigned int
1973 l long
1974 L unsigned long
1975
1976 h half float (0..65535)
1977 f float
1978 d double
1979
1980 z local (octet size)
1981
1982 m memory object (buffer or image)
1983 a sampler
1984 e event
1985
1986Space characters in the format string are ignored.
1987
1988Example: set the arguments for a kernel that expects an int, two floats, a buffer and an image.
1989
1990 $kernel->setf ("i ff mm", 5, 0.5, 3, $buffer, $image);
1991
1680=item $kernel->set_TYPE ($index, $value) 1992=item $kernel->set_TYPE ($index, $value)
1681 1993
1994=item $kernel->set_char ($index, $value)
1995
1996=item $kernel->set_uchar ($index, $value)
1997
1998=item $kernel->set_short ($index, $value)
1999
2000=item $kernel->set_ushort ($index, $value)
2001
2002=item $kernel->set_int ($index, $value)
2003
2004=item $kernel->set_uint ($index, $value)
2005
2006=item $kernel->set_long ($index, $value)
2007
2008=item $kernel->set_ulong ($index, $value)
2009
2010=item $kernel->set_half ($index, $value)
2011
2012=item $kernel->set_float ($index, $value)
2013
2014=item $kernel->set_double ($index, $value)
2015
2016=item $kernel->set_memory ($index, $value)
2017
2018=item $kernel->set_buffer ($index, $value)
2019
2020=item $kernel->set_image ($index, $value)
2021
2022=item $kernel->set_sampler ($index, $value)
2023
2024=item $kernel->set_local ($index, $value)
2025
2026=item $kernel->set_event ($index, $value)
2027
1682This is a family of methods to set the kernel argument with the number C<$index> to the give C<$value>. 2028This is a family of methods to set the kernel argument with the number
1683 2029C<$index> to the give C<$value>.
1684TYPE is one of C<char>, C<uchar>, C<short>, C<ushort>, C<int>, C<uint>,
1685C<long>, C<ulong>, C<half>, C<float>, C<double>, C<memory>, C<buffer>,
1686C<image2d>, C<image3d>, C<sampler>, C<local> or C<event>.
1687 2030
1688Chars and integers (including the half type) are specified as integers, 2031Chars and integers (including the half type) are specified as integers,
1689float and double as floating point values, memory/buffer/image2d/image3d 2032float and double as floating point values, memory/buffer/image must be
1690must be an object of that type or C<undef>, local-memory arguments are 2033an object of that type or C<undef>, local-memory arguments are set by
1691set by specifying the size, and sampler and event must be objects of that 2034specifying the size, and sampler and event must be objects of that type.
1692type. 2035
2036Note that C<set_memory> works for all memory objects (all types of buffers
2037and images) - the main purpose of the more specific C<set_TYPE> functions
2038is type checking.
1693 2039
1694Setting an argument for a kernel does NOT keep a reference to the object - 2040Setting an argument for a kernel does NOT keep a reference to the object -
1695for example, if you set an argument to some image object, free the image, 2041for example, if you set an argument to some image object, free the image,
1696and call the kernel, you will run into undefined behaviour. 2042and call the kernel, you will run into undefined behaviour.
1697 2043
1727 2073
1728=for gengetinfo begin event 2074=for gengetinfo begin event
1729 2075
1730=item $queue = $event->command_queue 2076=item $queue = $event->command_queue
1731 2077
1732Calls C<clGetEventInfo> with C<CL_EVENT_COMMAND_QUEUE> and returns the result. 2078Calls C<clGetEventInfo> with C<OpenCL::EVENT_COMMAND_QUEUE> and returns the result.
1733 2079
1734=item $command_type = $event->command_type 2080=item $command_type = $event->command_type
1735 2081
1736Calls C<clGetEventInfo> with C<CL_EVENT_COMMAND_TYPE> and returns the result. 2082Calls C<clGetEventInfo> with C<OpenCL::EVENT_COMMAND_TYPE> and returns the result.
1737 2083
1738=item $uint = $event->reference_count 2084=item $uint = $event->reference_count
1739 2085
1740Calls C<clGetEventInfo> with C<CL_EVENT_REFERENCE_COUNT> and returns the result. 2086Calls C<clGetEventInfo> with C<OpenCL::EVENT_REFERENCE_COUNT> and returns the result.
1741 2087
1742=item $uint = $event->command_execution_status 2088=item $uint = $event->command_execution_status
1743 2089
1744Calls C<clGetEventInfo> with C<CL_EVENT_COMMAND_EXECUTION_STATUS> and returns the result. 2090Calls C<clGetEventInfo> with C<OpenCL::EVENT_COMMAND_EXECUTION_STATUS> and returns the result.
1745 2091
1746=item $ctx = $event->context 2092=item $ctx = $event->context
1747 2093
1748Calls C<clGetEventInfo> with C<CL_EVENT_CONTEXT> and returns the result. 2094Calls C<clGetEventInfo> with C<OpenCL::EVENT_CONTEXT> and returns the result.
1749 2095
1750=for gengetinfo end event 2096=for gengetinfo end event
1751 2097
1752=item $packed_value = $ev->profiling_info ($name) 2098=item $packed_value = $ev->profiling_info ($name)
1753 2099
1760 2106
1761=for gengetinfo begin profiling 2107=for gengetinfo begin profiling
1762 2108
1763=item $ulong = $event->profiling_command_queued 2109=item $ulong = $event->profiling_command_queued
1764 2110
1765Calls C<clGetEventProfilingInfo> with C<CL_PROFILING_COMMAND_QUEUED> and returns the result. 2111Calls C<clGetEventProfilingInfo> with C<OpenCL::PROFILING_COMMAND_QUEUED> and returns the result.
1766 2112
1767=item $ulong = $event->profiling_command_submit 2113=item $ulong = $event->profiling_command_submit
1768 2114
1769Calls C<clGetEventProfilingInfo> with C<CL_PROFILING_COMMAND_SUBMIT> and returns the result. 2115Calls C<clGetEventProfilingInfo> with C<OpenCL::PROFILING_COMMAND_SUBMIT> and returns the result.
1770 2116
1771=item $ulong = $event->profiling_command_start 2117=item $ulong = $event->profiling_command_start
1772 2118
1773Calls C<clGetEventProfilingInfo> with C<CL_PROFILING_COMMAND_START> and returns the result. 2119Calls C<clGetEventProfilingInfo> with C<OpenCL::PROFILING_COMMAND_START> and returns the result.
1774 2120
1775=item $ulong = $event->profiling_command_end 2121=item $ulong = $event->profiling_command_end
1776 2122
1777Calls C<clGetEventProfilingInfo> with C<CL_PROFILING_COMMAND_END> and returns the result. 2123Calls C<clGetEventProfilingInfo> with C<OpenCL::PROFILING_COMMAND_END> and returns the result.
1778 2124
1779=for gengetinfo end profiling 2125=for gengetinfo end profiling
1780 2126
1781=back 2127=back
1782 2128
1789=item $ev->set_status ($execution_status) 2135=item $ev->set_status ($execution_status)
1790 2136
1791Sets the execution status of the user event. Can only be called once, 2137Sets the execution status of the user event. Can only be called once,
1792either with OpenCL::COMPLETE or a negative number as status. 2138either with OpenCL::COMPLETE or a negative number as status.
1793 2139
2140execution_status: OpenCL::COMPLETE or a negative integer.
2141
1794L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clSetUserEventStatus.html> 2142L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clSetUserEventStatus.html>
1795 2143
1796=back 2144=back
2145
2146=head2 THE OpenCL::Mapped CLASS
2147
2148This class represents objects mapped into host memory. They are
2149represented by a blessed string scalar. The string data is the mapped
2150memory area, that is, if you read or write it, then the mapped object is
2151accessed directly.
2152
2153You must only ever use operations that modify the string in-place - for
2154example, a C<substr> that doesn't change the length, or maybe a regex that
2155doesn't change the length. Any other operation might cause the data to be
2156copied.
2157
2158When the object is destroyed it will enqueue an implicit unmap operation
2159on the queue that was used to create it.
2160
2161Keep in mind that you I<need> to unmap (or destroy) mapped objects before
2162OpenCL sees the changes, even if some implementations don't need this
2163sometimes.
2164
2165Example, replace the first two floats in the mapped buffer by 1 and 2.
2166
2167 my $mapped = $queue->map_buffer ($buf, ...
2168 $mapped->event->wait; # make sure it's there
2169
2170 # now replace first 8 bytes by new data, which is exactly 8 bytes long
2171 # we blindly assume device endianness to equal host endianness
2172 # (and of course, we assume iee 754 single precision floats :)
2173 substr $$mapped, 0, 8, pack "f*", 1, 2;
2174
2175=over 4
2176
2177=item $ev = $mapped->unmap ($wait_events...)
2178
2179Unmaps the mapped memory object, using the queue originally used to create
2180it, quite similarly to C<< $queue->unmap ($mapped, ...) >>.
2181
2182=item $bool = $mapped->mapped
2183
2184Returns whether the object is still mapped - true before an C<unmap> is
2185enqueued, false afterwards.
2186
2187=item $ev = $mapped->event
2188
2189Return the event object associated with the mapped object. Initially, this
2190will be the event object created when mapping the object, and after an
2191unmap, this will be the event object that the unmap operation created.
2192
2193=item $mapped->wait
2194
2195Same as C<< $mapped->event->wait >> - makes sure no operations on this
2196mapped object are outstanding.
2197
2198=item $bytes = $mapped->size
2199
2200Returns the size of the mapped area, in bytes. Same as C<length $$mapped>.
2201
2202=item $ptr = $mapped->ptr
2203
2204Returns the raw memory address of the mapped area.
2205
2206=item $mapped->set ($offset, $data)
2207
2208Replaces the data at the given C<$offset> in the memory area by the new
2209C<$data>. This method is safer than direct manipulation of C<$mapped>
2210because it does bounds-checking, but also slower.
2211
2212=item $data = $mapped->get ($offset, $length)
2213
2214Returns (without copying) a scalar representing the data at the given
2215C<$offset> and C<$length> in the mapped memory area. This is the same as
2216the following substr, except much slower;
2217
2218 $data = substr $$mapped, $offset, $length
2219
2220=cut
2221
2222sub OpenCL::Mapped::get {
2223 substr ${$_[0]}, $_[1], $_[2]
2224}
2225
2226=back
2227
2228=head2 THE OpenCL::MappedBuffer CLASS
2229
2230This is a subclass of OpenCL::Mapped, representing mapped buffers.
2231
2232=head2 THE OpenCL::MappedImage CLASS
2233
2234This is a subclass of OpenCL::Mapped, representing mapped images.
2235
2236=over 4
2237
2238=item $bytes = $mapped->row_pitch
2239
2240=item $bytes = $mapped->slice_pitch
2241
2242Return the row or slice pitch of the image that has been mapped.
2243
2244=back
2245
1797 2246
1798=cut 2247=cut
1799 2248
18001; 22491;
1801 2250

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines