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

Comparing OpenCL/OpenCL.pm (file contents):
Revision 1.50 by root, Tue Apr 24 13:30:49 2012 UTC vs.
Revision 1.53 by root, Tue Apr 24 14:30:57 2012 UTC

157 $id = get_global_id (0); 157 $id = get_global_id (0);
158 output [id] = input [id] * input [id]; 158 output [id] = input [id] * input [id];
159 } 159 }
160 '; 160 ';
161 161
162 my $prog = $ctx->program_with_source ($src); 162 my $prog = $ctx->build_program ($src);
163
164 # build croaks on compile errors, so catch it and print the compile errors
165 eval { $prog->build ($dev, "-cl-fast-relaxed-math"); 1 }
166 or die $prog->build_log;
167
168 my $kernel = $prog->kernel ("squareit"); 163 my $kernel = $prog->kernel ("squareit");
169 164
170=head2 Create some input and output float buffers, then call the 165=head2 Create some input and output float buffers, then call the
171'squareit' kernel on them. 166'squareit' kernel on them.
172 167
267 262
268 float3 colour = (float3)(z.x, z.y, z.x * z.y); 263 float3 colour = (float3)(z.x, z.y, z.x * z.y);
269 write_imagef (img, (int2)(get_global_id (0), get_global_id (1)), (float4)(colour * p.x * p.x, 1.)); 264 write_imagef (img, (int2)(get_global_id (0), get_global_id (1)), (float4)(colour * p.x * p.x, 1.));
270 } 265 }
271 EOF 266 EOF
267
272 my $prog = $ctx->program_with_source ($src); 268 my $prog = $ctx->build_program ($src);
273 eval { $prog->build ($dev); 1 }
274 or die $prog->build_log ($dev);
275
276 my $kernel = $prog->kernel ("juliatunnel"); 269 my $kernel = $prog->kernel ("juliatunnel");
277 270
278 # program compiled, kernel ready, now draw and loop 271 # program compiled, kernel ready, now draw and loop
279 272
280 for (my $time; ; ++$time) { 273 for (my $time; ; ++$time) {
383 376
384For this to work, the OpenGL library must be loaded, a GLX context must 377For this to work, the OpenGL library must be loaded, a GLX context must
385have been created and be made current, and C<dlsym> must be available and 378have been created and be made current, and C<dlsym> must be available and
386capable of finding the function via C<RTLD_DEFAULT>. 379capable of finding the function via C<RTLD_DEFAULT>.
387 380
381=cut
382
383package OpenCL;
384
385use common::sense;
386
387BEGIN {
388 our $VERSION = '0.96';
389
390 require XSLoader;
391 XSLoader::load (__PACKAGE__, $VERSION);
392
393 @OpenCL::Platform::ISA =
394 @OpenCL::Device::ISA =
395 @OpenCL::Context::ISA =
396 @OpenCL::Queue::ISA =
397 @OpenCL::Memory::ISA =
398 @OpenCL::Sampler::ISA =
399 @OpenCL::Program::ISA =
400 @OpenCL::Kernel::ISA =
401 @OpenCL::Event::ISA = OpenCL::Object::;
402
403 @OpenCL::Buffer::ISA =
404 @OpenCL::Image::ISA = OpenCL::Memory::;
405
406 @OpenCL::BufferObj::ISA = OpenCL::Buffer::;
407
408 @OpenCL::Image2D::ISA =
409 @OpenCL::Image3D::ISA =
410 @OpenCL::Image2DArray::ISA =
411 @OpenCL::Image1D::ISA =
412 @OpenCL::Image1DArray::ISA =
413 @OpenCL::Image1DBuffer::ISA = OpenCL::Image::;
414
415 @OpenCL::UserEvent::ISA = OpenCL::Event::;
416}
417
388=head2 THE OpenCL PACKAGE 418=head2 THE OpenCL PACKAGE
389 419
390=over 4 420=over 4
391 421
392=item $int = OpenCL::errno 422=item $int = OpenCL::errno
424 454
425L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clWaitForEvents.html> 455L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clWaitForEvents.html>
426 456
427=back 457=back
428 458
459=head2 THE OpenCL::Object CLASS
460
461This is the base class for all objects in the OpenCL module. The only
462method it implements is the C<id> method, which is only useful if you want
463to interface to OpenCL on the C level.
464
465=over 4
466
467=item $iv = $obj->id
468
469OpenCL objects are represented by pointers or integers on the C level. If
470you want to interface to an OpenCL object directly on the C level, then
471you need this value, which is returned by this method. You should use an
472C<IV> type in your code and cast that to the correct type.
473
474=cut
475
476sub OpenCL::Object::id {
477 ${$_[0]}
478}
479
480=back
481
429=head2 THE OpenCL::Platform CLASS 482=head2 THE OpenCL::Platform CLASS
430 483
431=over 4 484=over 4
432 485
433=item @devices = $platform->devices ($type = OpenCL::DEVICE_TYPE_ALL) 486=item @devices = $platform->devices ($type = OpenCL::DEVICE_TYPE_ALL)
772=back 825=back
773 826
774=head2 THE OpenCL::Context CLASS 827=head2 THE OpenCL::Context CLASS
775 828
776=over 4 829=over 4
830
831=item $prog = $ctx->build_program ($program, $options = "")
832
833This convenience function tries to build the program on all devices in
834the context. If the build fails, then the function will C<croak> with the
835build log. Otherwise ti returns the program object.
836
837The C<$program> can either be a C<OpenCL::Program> object or a string
838containing the program. In the latter case, a program objetc will be
839created automatically.
840
841=cut
842
843sub OpenCL::Context::build_program {
844 my ($self, $prog, $options) = @_;
845
846 $prog = $self->program_with_source ($prog)
847 unless ref $prog;
848
849 for my $dev ($self->devices) {
850 eval { $prog->build ($dev, $options); 1 }
851 or Carp::croak "Building OpenCL program for device '" . $dev->name . "' failed:\n"
852 . $prog->build_log ($dev);
853 }
854
855 $prog
856}
777 857
778=item $queue = $ctx->queue ($device, $properties) 858=item $queue = $ctx->queue ($device, $properties)
779 859
780Create a new OpenCL::Queue object from the context and the given device. 860Create a new OpenCL::Queue object from the context and the given device.
781 861
980 1060
981Yeah. 1061Yeah.
982 1062
983L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferToImage.html>. 1063L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferToImage.html>.
984 1064
1065=item $ev = $queue->enqueue_fill_buffer ($mem, $pattern, $offset, $size, ...)
1066
1067Fills the given buffer object with repeated applications of C<$pattern>,
1068starting at C<$offset> for C<$size> octets.
1069
1070L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueFillBuffer.html>
1071
1072=item $ev = $queue->enqueue_fill_image ($img, $r, $g, $b, $a, $x, $y, $z, $width, $height, $depth, ...)
1073
1074Fills the given image area with the given rgba colour components. The
1075components are normally floating point values between C<0> and C<1>,
1076except when the image channel data type is a signe dor unsigned
1077unnormalised format, in which case the range is determined by the format.
1078
1079L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueFillImage.html>
1080
985=item $ev = $queue->enqueue_task ($kernel, $wait_events...) 1081=item $ev = $queue->enqueue_task ($kernel, $wait_events...)
986 1082
987L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueTask.html> 1083L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueTask.html>
988 1084
989=item $ev = $queue->enqueue_nd_range_kernel ($kernel, @$global_work_offset, @$global_work_size, @$local_work_size, $wait_events...) 1085=item $ev = $queue->enqueue_nd_range_kernel ($kernel, @$global_work_offset, @$global_work_size, @$local_work_size, $wait_events...)
1157OpenCL::Image1DArray, OpenCL::Image1DBuffer, OpenCL::Image2D, 1253OpenCL::Image1DArray, OpenCL::Image1DBuffer, OpenCL::Image2D,
1158OpenCL::Image2DArray and OpenCL::Image3D. 1254OpenCL::Image2DArray and OpenCL::Image3D.
1159 1255
1160=over 4 1256=over 4
1161 1257
1162=item $packed_value = $ev->image_info ($name) 1258=item $packed_value = $image->image_info ($name)
1163 1259
1164See C<< $platform->info >> for details. 1260See C<< $platform->info >> for details.
1165 1261
1166The reason this method is not called C<info> is that there already is an 1262The reason this method is not called C<info> is that there already is an
1167C<< ->info >> method inherited from C<OpenCL::Memory>. 1263C<< ->info >> method inherited from C<OpenCL::Memory>.
1168 1264
1169L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetImageInfo.html> 1265L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetImageInfo.html>
1170 1266
1267=item ($channel_order, $channel_data_type) = $image->format
1268
1269Returns the channel order and type used to create the image by calling
1270C<clGetImageInfo> with C<CL_IMAGE_FORMAT>.
1271
1171=for gengetinfo begin image 1272=for gengetinfo begin image
1172 1273
1173=item $int = $image->element_size 1274=item $int = $image->element_size
1174 1275
1175Calls C<clGetImageInfo> with C<CL_IMAGE_ELEMENT_SIZE> and returns the result. 1276Calls C<clGetImageInfo> with C<CL_IMAGE_ELEMENT_SIZE> and returns the result.
1250 1351
1251=over 4 1352=over 4
1252 1353
1253=item $program->build ($device, $options = "") 1354=item $program->build ($device, $options = "")
1254 1355
1255Tries to build the program with the givne options. 1356Tries to build the program with the given options. See also the
1357C<$ctx->build> convenience function.
1256 1358
1257L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clBuildProgram.html> 1359L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clBuildProgram.html>
1258 1360
1259=item $packed_value = $program->build_info ($device, $name) 1361=item $packed_value = $program->build_info ($device, $name)
1260 1362
1514 1616
1515=back 1617=back
1516 1618
1517=cut 1619=cut
1518 1620
1519package OpenCL;
1520
1521use common::sense;
1522
1523BEGIN {
1524 our $VERSION = '0.96';
1525
1526 require XSLoader;
1527 XSLoader::load (__PACKAGE__, $VERSION);
1528
1529 @OpenCL::Buffer::ISA =
1530 @OpenCL::Image::ISA = OpenCL::Memory::;
1531
1532 @OpenCL::BufferObj::ISA = OpenCL::Buffer::;
1533
1534 @OpenCL::Image2D::ISA =
1535 @OpenCL::Image3D::ISA =
1536 @OpenCL::Image2DArray::ISA =
1537 @OpenCL::Image1D::ISA =
1538 @OpenCL::Image1DArray::ISA =
1539 @OpenCL::Image1DBuffer::ISA = OpenCL::Image::;
1540
1541 @OpenCL::UserEvent::ISA = OpenCL::Event::;
1542}
1543
15441; 16211;
1545 1622
1546=head1 AUTHOR 1623=head1 AUTHOR
1547 1624
1548 Marc Lehmann <schmorp@schmorp.de> 1625 Marc Lehmann <schmorp@schmorp.de>

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines