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

Comparing OpenCL/OpenCL.pm (file contents):
Revision 1.65 by root, Mon Apr 30 23:35:16 2012 UTC vs.
Revision 1.69 by root, Thu May 3 23:30:08 2012 UTC

305 glXSwapBuffers; 305 glXSwapBuffers;
306 306
307 select undef, undef, undef, 1/60; 307 select undef, undef, undef, 1/60;
308 } 308 }
309 309
310=item How to modify the previous example to not rely on GL sharing. 310=head2 How to modify the previous example to not rely on GL sharing.
311 311
312For those poor souls with only a sucky CPU OpenCL implementation, you 312For those poor souls with only a sucky CPU OpenCL implementation, you
313currently have to read the image into some perl scalar, and then modify a 313currently have to read the image into some perl scalar, and then modify a
314texture or use glDrawPixels or so). 314texture or use glDrawPixels or so).
315 315
557 @OpenCL::Image1D::ISA = 557 @OpenCL::Image1D::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
563 @OpenCL::MappedBuffer::ISA =
564 @OpenCL::MappedImage::ISA = OpenCL::Mapped::;
562} 565}
563 566
564=head2 THE OpenCL PACKAGE 567=head2 THE OpenCL PACKAGE
565 568
566=over 4 569=over 4
1155 1158
1156Creates a new OpenCL::Program object from the given source code. 1159Creates a new OpenCL::Program object from the given source code.
1157 1160
1158L<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>
1159 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
1160=item $packed_value = $ctx->info ($name) 1174=item $packed_value = $ctx->info ($name)
1161 1175
1162See C<< $platform->info >> for details. 1176See C<< $platform->info >> for details.
1163 1177
1164L<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>
1362=item $command_queue_properties = $command_queue->properties 1376=item $command_queue_properties = $command_queue->properties
1363 1377
1364Calls C<clGetCommandQueueInfo> with C<CL_QUEUE_PROPERTIES> and returns the result. 1378Calls C<clGetCommandQueueInfo> with C<CL_QUEUE_PROPERTIES> and returns the result.
1365 1379
1366=for gengetinfo end command_queue 1380=for gengetinfo end command_queue
1381
1382=back
1383
1384=head3 MEMORY MAPPED BUFFERS
1385
1386OpenCL allows you to map buffers and images to host memory (read: perl
1387scalars). This is done much like reading or copying a buffer, by enqueuing
1388a map or unmap operation on the command queue.
1389
1390The map operations return an C<OpenCL::Mapped> object - see L<THE
1391OpenCL::Mapped CLASS> section for details on what to do with these
1392objects.
1393
1394The object will be unmapped automatically when the mapped object is
1395destroyed (you can use a barrier to make sure the unmap has finished,
1396before using the buffer in a kernel), but you can also enqueue an unmap
1397operation manually.
1398
1399=over 4
1400
1401=item $mapped_buffer = $queue->map_buffer ($buf, $blocking=1, $map_flags=OpenCL::MAP_READ|OpenCL::MAP_WRITE, $offset=0, $size=undef, $wait_events...)
1402
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.
1406
1407L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueMapBuffer.html>
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
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...)
1417
1418Maps the given image area into host memory and return an
1419C<OpenCL::MappedImage> object.
1420
1421If any of C<$width>, C<$height> and/or C<$depth> are C<undef> then they
1422will be replaced by the maximum possible value.
1423
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
1438
1439=item $ev = $queue->unmap ($mapped, $wait_events...)
1440
1441Unmaps the data from host memory. You must not call any methods that
1442modify the data, or modify the data scalar directly, after calling this
1443method.
1444
1445The mapped event object will always be passed as part of the
1446$wait_events. The mapped event object will be replaced by the new event
1447object that this request creates.
1367 1448
1368=back 1449=back
1369 1450
1370=head2 THE OpenCL::Memory CLASS 1451=head2 THE OpenCL::Memory CLASS
1371 1452
1915 1996
1916L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clSetUserEventStatus.html> 1997L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clSetUserEventStatus.html>
1917 1998
1918=back 1999=back
1919 2000
2001=head2 THE OpenCL::Mapped CLASS
2002
2003This class represents objects mapped into host memory. They are
2004represented by a blessed string scalar. The string data is the mapped
2005memory area, that is, if you read or write it, then the mapped object is
2006accessed directly.
2007
2008You must only ever use operations that modify the string in-place - for
2009example, a C<substr> that doesn't change the length, or maybe a regex that
2010doesn't change the length. Any other operation might cause the data to be
2011copied.
2012
2013When the object is destroyed it will enqueue an implicit unmap operation
2014on the queue that was used to create it.
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
2020Example, replace the first two floats in the mapped buffer by 1 and 2.
2021
2022 my $mapped = $queue->map_buffer ($buf, ...
2023 $mapped->event->wait; # make sure it's there
2024
2025 # now replace first 8 bytes by new data, which is exactly 8 bytes long
2026 # we blindly assume device endianness to equal host endianness
2027 # (and of course, we assume iee 754 single precision floats :)
2028 substr $$mapped, 0, 8, pack "f*", 1, 2;
2029
2030=over 4
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
2037=item $bool = $mapped->mapped
2038
2039Returns whether the object is still mapped - true before an C<unmap> is
2040enqueued, false afterwards.
2041
2042=item $ev = $mapped->event
2043
2044Return the event object associated with the mapped object. Initially, this
2045will be the event object created when mapping the object, and after an
2046unmap, this will be the event object that the unmap operation created.
2047
2048=item $mapped->wait
2049
2050Same as C<< $mapped->event->wait >> - makes sure no operations on this
2051mapped object are outstanding.
2052
2053=item $bytes = $mapped->size
2054
2055Returns the size of the mapped area, in bytes. Same as C<length $$mapped>.
2056
2057=item $ptr = $mapped->ptr
2058
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}
2080
2081=back
2082
2083=head2 THE OpenCL::MappedBuffer CLASS
2084
2085This is a subclass of OpenCL::Mapped, representing mapped buffers.
2086
2087=head2 THE OpenCL::MappedImage CLASS
2088
2089This is a subclass of OpenCL::Mapped, representing mapped images.
2090
2091=over 4
2092
2093=item $bytes = $mapped->row_pitch
2094
2095=item $bytes = $mapped->slice_pitch
2096
2097Return the row or slice pitch of the image that has been mapped.
2098
2099=back
2100
2101
1920=cut 2102=cut
1921 2103
19221; 21041;
1923 2105
1924=head1 AUTHOR 2106=head1 AUTHOR

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines