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

Comparing OpenCL/OpenCL.pm (file contents):
Revision 1.66 by root, Tue May 1 16:37:23 2012 UTC vs.
Revision 1.70 by root, Thu May 3 23:32:47 2012 UTC

529use Async::Interrupt (); 529use Async::Interrupt ();
530 530
531our $POLL_FUNC; # set by XS 531our $POLL_FUNC; # set by XS
532 532
533BEGIN { 533BEGIN {
534 our $VERSION = '0.98'; 534 our $VERSION = '0.99';
535 535
536 require XSLoader; 536 require XSLoader;
537 XSLoader::load (__PACKAGE__, $VERSION); 537 XSLoader::load (__PACKAGE__, $VERSION);
538 538
539 @OpenCL::Platform::ISA = 539 @OpenCL::Platform::ISA =
558 @OpenCL::Image1DArray::ISA = 558 @OpenCL::Image1DArray::ISA =
559 @OpenCL::Image1DBuffer::ISA = OpenCL::Image::; 559 @OpenCL::Image1DBuffer::ISA = OpenCL::Image::;
560 560
561 @OpenCL::UserEvent::ISA = OpenCL::Event::; 561 @OpenCL::UserEvent::ISA = OpenCL::Event::;
562 562
563 @OpenCL::MappedBuffer = 563 @OpenCL::MappedBuffer::ISA =
564 @OpenCL::MappedImage = OpenCL::Mapped::; 564 @OpenCL::MappedImage::ISA = OpenCL::Mapped::;
565} 565}
566 566
567=head2 THE OpenCL PACKAGE 567=head2 THE OpenCL PACKAGE
568 568
569=over 4 569=over 4
1158 1158
1159Creates a new OpenCL::Program object from the given source code. 1159Creates a new OpenCL::Program object from the given source code.
1160 1160
1161L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateProgramWithSource.html> 1161L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateProgramWithSource.html>
1162 1162
1163=item ($program, \@status) = $ctx->program_with_binary (\@devices, \@binaries)
1164
1165Creates a new OpenCL::Program object from the given binaries.
1166
1167L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateProgramWithBinary.html>
1168
1169Example: clone an existing program object that contains a successfully
1170compiled program, no matter how useless this is.
1171
1172 my $clone = $ctx->program_with_binary ([$prog->devices], [$prog->binaries]);
1173
1163=item $packed_value = $ctx->info ($name) 1174=item $packed_value = $ctx->info ($name)
1164 1175
1165See C<< $platform->info >> for details. 1176See C<< $platform->info >> for details.
1166 1177
1167L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetContextInfo.html> 1178L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetContextInfo.html>
1374 1385
1375OpenCL allows you to map buffers and images to host memory (read: perl 1386OpenCL allows you to map buffers and images to host memory (read: perl
1376scalars). This is done much like reading or copying a buffer, by enqueuing 1387scalars). This is done much like reading or copying a buffer, by enqueuing
1377a map or unmap operation on the command queue. 1388a map or unmap operation on the command queue.
1378 1389
1379The map operations return a C<OpenCL::Mapped> object - see L<THE 1390The map operations return an C<OpenCL::Mapped> object - see L<THE
1380OpenCL::Mapped CLASS> section for details on what to do with these 1391OpenCL::Mapped CLASS> section for details on what to do with these
1381objects. 1392objects.
1382 1393
1383The object will be unmapped automatically when the mapped object is 1394The object will be unmapped automatically when the mapped object is
1384destroyed (you can use a barrier to make sure the unmap has finished, 1395destroyed (you can use a barrier to make sure the unmap has finished,
1385before using the buffer in a kernel), but you can also enqueue an unmap 1396before using the buffer in a kernel), but you can also enqueue an unmap
1386operation manually. 1397operation manually.
1387 1398
1388=over 4 1399=over 4
1389 1400
1390=item $mapped_buffer = $queue->map_buffer ($buf, $data, $blocking=1, $map_flags=OpenCL::MAP_READ|OpenCL::MAP_WRITE, $offset=0, $size=0, $wait_events...) 1401=item $mapped_buffer = $queue->map_buffer ($buf, $blocking=1, $map_flags=OpenCL::MAP_READ|OpenCL::MAP_WRITE, $offset=0, $size=undef, $wait_events...)
1391 1402
1392Maps the given buffer into host memory and returns a C<OpenCL::MappedBuffer> object. 1403Maps the given buffer into host memory and returns an
1404C<OpenCL::MappedBuffer> object. If C<$size> is specified as undef, then
1405the map will extend to the end of the buffer.
1393 1406
1394L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueMapBuffer.html> 1407L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueMapBuffer.html>
1395 1408
1409Example: map the buffer $buf fully and replace the first 4 bytes by "abcd", then unmap.
1410
1411 {
1412 my $mapped = $queue->map_buffer ($buf, 1, OpenCL::MAP_WRITE);
1413 substr $$mapped, 0, 4, "abcd";
1414 } # asynchronously unmap because $mapped is destroyed
1415
1396=item $mapped_image = $queue->map_image ($img, $data, $blocking=1, $map_flags=OpenCL::MAP_READ|OpenCL::MAP_WRITE, $x=0, $y=0, $z=0, $width=0, $height=0, $depth=0, $wait_events...) 1416=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...)
1397 1417
1398Maps the given image area into host memory and return a 1418Maps the given image area into host memory and return an
1399C<OpenCL::MappedImage> object. Although there are default values for most 1419C<OpenCL::MappedImage> object.
1400arguments, you currently have to specify all arguments, otherwise the call 1420
1401will fail. 1421If any of C<$width>, C<$height> and/or C<$depth> are C<undef> then they
1422will be replaced by the maximum possible value.
1402 1423
1403L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueMapImage.html> 1424L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueMapImage.html>
1425
1426Example: map an image (with OpenCL::UNSIGNED_INT8 channel type) and set
1427the first channel of the leftmost column to 5, then explicitly unmap
1428it. You are not necessarily meant to do it this way, this example just
1429shows you the accessors to use :)
1430
1431 my $mapped = $queue->map_image ($image, 1, OpenCL::MAP_WRITE);
1432
1433 $mapped->set ($_ * $mapped->row_pitch, pack "C", 5)
1434 for 0..$image->height;
1435
1436 $mapped->unmap;.
1437 $mapped->wait; # only needed for out of order queues normally
1404 1438
1405=item $ev = $queue->unmap ($mapped, $wait_events...) 1439=item $ev = $queue->unmap ($mapped, $wait_events...)
1406 1440
1407Unmaps the data from host memory. You must not call any methods that 1441Unmaps the data from host memory. You must not call any methods that
1408modify the data, or modify the data scalar directly, after calling this 1442modify the data, or modify the data scalar directly, after calling this
1977copied. 2011copied.
1978 2012
1979When the object is destroyed it will enqueue an implicit unmap operation 2013When the object is destroyed it will enqueue an implicit unmap operation
1980on the queue that was used to create it. 2014on the queue that was used to create it.
1981 2015
2016Keep in mind that you I<need> to unmap (or destroy) mapped objects before
2017OpenCL sees the changes, even if some implementations don't need this
2018sometimes.
2019
1982Example, replace the first two floats in the mapped buffer by 1 and 2. 2020Example, replace the first two floats in the mapped buffer by 1 and 2.
1983 2021
1984 my $mapped = $queue->map_buffer ($buf, ... 2022 my $mapped = $queue->map_buffer ($buf, ...
1985 $mapped->event->wait; # make sure it's there 2023 $mapped->event->wait; # make sure it's there
1986 2024
1989 # (and of course, we assume iee 754 single precision floats :) 2027 # (and of course, we assume iee 754 single precision floats :)
1990 substr $$mapped, 0, 8, pack "f*", 1, 2; 2028 substr $$mapped, 0, 8, pack "f*", 1, 2;
1991 2029
1992=over 4 2030=over 4
1993 2031
2032=item $ev = $mapped->unmap ($wait_events...)
2033
2034Unmaps the mapped memory object, using the queue originally used to create
2035it, quite similarly to C<< $queue->unmap ($mapped, ...) >>.
2036
1994=item $bool = $mapped->mapped 2037=item $bool = $mapped->mapped
1995 2038
1996Returns whether the object is still mapped - true before an C<unmap> is 2039Returns whether the object is still mapped - true before an C<unmap> is
1997enqueued, false afterwards. 2040enqueued, false afterwards.
1998 2041
2011 2054
2012Returns the size of the mapped area, in bytes. Same as C<length $$mapped>. 2055Returns the size of the mapped area, in bytes. Same as C<length $$mapped>.
2013 2056
2014=item $ptr = $mapped->ptr 2057=item $ptr = $mapped->ptr
2015 2058
2016Returns the raw memory address of the mapped area - same as C<$mapped+0>. 2059Returns the raw memory address of the mapped area.
2060
2061=item $mapped->set ($offset, $data)
2062
2063Replaces the data at the given C<$offset> in the memory area by the new
2064C<$data>. This method is safer than direct manipulation of C<$mapped>
2065because it does bounds-checking, but also slower.
2066
2067=item $data = $mapped->get ($offset, $length)
2068
2069Returns (without copying) a scalar representing the data at the given
2070C<$offset> and C<$length> in the mapped memory area. This is the same as
2071the following substr, except much slower;
2072
2073 $data = substr $$mapped, $offset, $length
2074
2075=cut
2076
2077sub OpenCL::Mapped::get {
2078 substr ${$_[0]}, $_[1], $_[2]
2079}
2017 2080
2018=back 2081=back
2019 2082
2020=head2 THE OpenCL::MappedBuffer CLASS 2083=head2 THE OpenCL::MappedBuffer CLASS
2021 2084
2022This is a subclass of OpenCL::Mapped, representing mapped buffers. 2085This is a subclass of OpenCL::Mapped, representing mapped buffers.
2023 2086
2087=head2 THE OpenCL::MappedImage CLASS
2088
2089This is a subclass of OpenCL::Mapped, representing mapped images.
2090
2024=over 4 2091=over 4
2025 2092
2026=back 2093=item $bytes = $mapped->row_pitch
2027 2094
2028=head2 THE OpenCL::MappedImage CLASS 2095=item $bytes = $mapped->slice_pitch
2029 2096
2030This is a subclass of OpenCL::Mapped, representing mapped images. 2097Return the row or slice pitch of the image that has been mapped.
2031
2032=over 4
2033 2098
2034=back 2099=back
2035 2100
2036 2101
2037=cut 2102=cut

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines