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

Comparing OpenCL/OpenCL.pm (file contents):
Revision 1.58 by root, Wed Apr 25 20:29:03 2012 UTC vs.
Revision 1.59 by root, Wed Apr 25 20:49:13 2012 UTC

141=head2 Create a buffer with some predefined data, read it back synchronously, 141=head2 Create a buffer with some predefined data, read it back synchronously,
142then asynchronously. 142then asynchronously.
143 143
144 my $buf = $ctx->buffer_sv (OpenCL::MEM_COPY_HOST_PTR, "helmut"); 144 my $buf = $ctx->buffer_sv (OpenCL::MEM_COPY_HOST_PTR, "helmut");
145 145
146 $queue->enqueue_read_buffer ($buf, 1, 1, 3, my $data); 146 $queue->read_buffer ($buf, 1, 1, 3, my $data);
147 print "$data\n"; 147 print "$data\n";
148 148
149 my $ev = $queue->enqueue_read_buffer ($buf, 0, 1, 3, my $data); 149 my $ev = $queue->read_buffer ($buf, 0, 1, 3, my $data);
150 $ev->wait; 150 $ev->wait;
151 print "$data\n"; # prints "elm" 151 print "$data\n"; # prints "elm"
152 152
153=head2 Create and build a program, then create a kernel out of one of its 153=head2 Create and build a program, then create a kernel out of one of its
154functions. 154functions.
174 # set buffer 174 # set buffer
175 $kernel->set_buffer (0, $input); 175 $kernel->set_buffer (0, $input);
176 $kernel->set_buffer (1, $output); 176 $kernel->set_buffer (1, $output);
177 177
178 # execute it for all 4 numbers 178 # execute it for all 4 numbers
179 $queue->enqueue_nd_range_kernel ($kernel, undef, [4], undef); 179 $queue->nd_range_kernel ($kernel, undef, [4], undef);
180 180
181 # enqueue a synchronous read 181 # enqueue a synchronous read
182 $queue->enqueue_read_buffer ($output, 1, 0, OpenCL::SIZEOF_FLOAT * 4, my $data); 182 $queue->read_buffer ($output, 1, 0, OpenCL::SIZEOF_FLOAT * 4, my $data);
183 183
184 # print the results: 184 # print the results:
185 printf "%s\n", join ", ", unpack "f*", $data; 185 printf "%s\n", join ", ", unpack "f*", $data;
186 186
187=head2 The same enqueue operations as before, but assuming an out-of-order queue, 187=head2 The same enqueue operations as before, but assuming an out-of-order queue,
188showing off barriers. 188showing off barriers.
189 189
190 # execute it for all 4 numbers 190 # execute it for all 4 numbers
191 $queue->enqueue_nd_range_kernel ($kernel, undef, [4], undef); 191 $queue->nd_range_kernel ($kernel, undef, [4], undef);
192 192
193 # enqueue a barrier to ensure in-order execution 193 # enqueue a barrier to ensure in-order execution
194 $queue->enqueue_barrier; 194 $queue->barrier;
195 195
196 # enqueue an async read 196 # enqueue an async read
197 $queue->enqueue_read_buffer ($output, 0, 0, OpenCL::SIZEOF_FLOAT * 4, my $data); 197 $queue->read_buffer ($output, 0, 0, OpenCL::SIZEOF_FLOAT * 4, my $data);
198 198
199 # wait for all requests to finish 199 # wait for all requests to finish
200 $queue->finish; 200 $queue->finish;
201 201
202=head2 The same enqueue operations as before, but assuming an out-of-order queue, 202=head2 The same enqueue operations as before, but assuming an out-of-order queue,
203showing off event objects and wait lists. 203showing off event objects and wait lists.
204 204
205 # execute it for all 4 numbers 205 # execute it for all 4 numbers
206 my $ev = $queue->enqueue_nd_range_kernel ($kernel, undef, [4], undef); 206 my $ev = $queue->nd_range_kernel ($kernel, undef, [4], undef);
207 207
208 # enqueue an async read 208 # enqueue an async read
209 $ev = $queue->enqueue_read_buffer ($output, 0, 0, OpenCL::SIZEOF_FLOAT * 4, my $data, $ev); 209 $ev = $queue->read_buffer ($output, 0, 0, OpenCL::SIZEOF_FLOAT * 4, my $data, $ev);
210 210
211 # wait for the last event to complete 211 # wait for the last event to complete
212 $ev->wait; 212 $ev->wait;
213 213
214=head2 Use the OpenGL module to share a texture between OpenCL and OpenGL and draw some julia 214=head2 Use the OpenGL module to share a texture between OpenCL and OpenGL and draw some julia
273 273
274 # program compiled, kernel ready, now draw and loop 274 # program compiled, kernel ready, now draw and loop
275 275
276 for (my $time; ; ++$time) { 276 for (my $time; ; ++$time) {
277 # acquire objects from opengl 277 # acquire objects from opengl
278 $queue->enqueue_acquire_gl_objects ([$tex]); 278 $queue->acquire_gl_objects ([$tex]);
279 279
280 # configure and run our kernel 280 # configure and run our kernel
281 $kernel->set_image2d (0, $tex); 281 $kernel->set_image2d (0, $tex);
282 $kernel->set_float (1, $time); 282 $kernel->set_float (1, $time);
283 $queue->enqueue_nd_range_kernel ($kernel, undef, [256, 256], undef); 283 $queue->nd_range_kernel ($kernel, undef, [256, 256], undef);
284 284
285 # release objects to opengl again 285 # release objects to opengl again
286 $queue->enqueue_release_gl_objects ([$tex]); 286 $queue->release_gl_objects ([$tex]);
287 287
288 # wait 288 # wait
289 $queue->finish; 289 $queue->finish;
290 290
291 # now draw the texture, the defaults should be all right 291 # now draw the texture, the defaults should be all right
420 use AnyEvent; 420 use AnyEvent;
421 421
422 # initialise AnyEvent, by creating a watcher, or: 422 # initialise AnyEvent, by creating a watcher, or:
423 AnyEvent::detect; 423 AnyEvent::detect;
424 424
425 my $e = $queue->enqueue_marker; 425 my $e = $queue->marker;
426 $e->cb (sub { 426 $e->cb (sub {
427 warn "opencl is finished\n"; 427 warn "opencl is finished\n";
428 }) 428 })
429 429
430 main Gtk2; 430 main Gtk2;
447Asynchronously means that perl might execute your callbacks at any 447Asynchronously means that perl might execute your callbacks at any
448time. For example, in the following code (I<THAT YOU SHOULD NOT COPY>), 448time. For example, in the following code (I<THAT YOU SHOULD NOT COPY>),
449the C<until> loop following the marker call will be interrupted by the 449the C<until> loop following the marker call will be interrupted by the
450callback: 450callback:
451 451
452 my $e = $queue->enqueue_marker; 452 my $e = $queue->marker;
453 my $flag; 453 my $flag;
454 $e->cb (sub { $flag = 1 }); 454 $e->cb (sub { $flag = 1 });
455 1 until $flag; 455 1 until $flag;
456 # $flag is now 1 456 # $flag is now 1
457 457
1045=item $buf = $ctx->buffer_sv ($flags, $data) 1045=item $buf = $ctx->buffer_sv ($flags, $data)
1046 1046
1047Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object and 1047Creates a new OpenCL::Buffer (actually OpenCL::BufferObj) object and
1048initialise it with the given data values. 1048initialise it with the given data values.
1049 1049
1050=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) 1050=item $img = $ctx->image ($self, $flags, $channel_order, $channel_type, $type, $width, $height, $depth = 0, $array_size = 0, $row_pitch = 0, $slice_pitch = 0, $num_mip_level = 0, $num_samples = 0, $*data = &PL_sv_undef)
1051 1051
1052Creates a new OpenCL::Image object and optionally initialises it with 1052Creates a new OpenCL::Image object and optionally initialises it with
1053the given data values. 1053the given data values.
1054 1054
1055L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateImage.html> 1055L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateImage.html>
1151=back 1151=back
1152 1152
1153=head2 THE OpenCL::Queue CLASS 1153=head2 THE OpenCL::Queue CLASS
1154 1154
1155An OpenCL::Queue represents an execution queue for OpenCL. You execute 1155An OpenCL::Queue represents an execution queue for OpenCL. You execute
1156requests by calling their respective C<enqueue_xxx> method and waitinf for 1156requests by calling their respective method and waiting for it to complete
1157it to complete in some way. 1157in some way.
1158 1158
1159All the enqueue methods return an event object that can be used to wait 1159Most methods that enqueue some request return an event object that can
1160for completion, unless the method is called in void context, in which case 1160be used to wait for completion (optionally using a callback), unless
1161no event object is created. 1161the method is called in void context, in which case no event object is
1162created.
1162 1163
1163They also allow you to specify any number of other event objects that this 1164They also allow you to specify any number of other event objects that this
1164request has to wait for before it starts executing, by simply passing the 1165request has to wait for before it starts executing, by simply passing the
1165event objects as extra parameters to the enqueue methods. To simplify 1166event objects as extra parameters to the enqueue methods. To simplify
1166program design, this module ignores any C<undef> values in the list of 1167program design, this module ignores any C<undef> values in the list of
1167events. This makes it possible to code operations such as this, without 1168events. This makes it possible to code operations such as this, without
1168having to put a valid event object into C<$event> first: 1169having to put a valid event object into C<$event> first:
1169 1170
1170 $event = $queue->enqueue_xxx (..., $event); 1171 $event = $queue->xxx (..., $event);
1171 1172
1172Queues execute in-order by default, without any parallelism, so in most 1173Queues execute in-order by default, without any parallelism, so in most
1173cases (i.e. you use only one queue) it's not necessary to wait for or 1174cases (i.e. you use only one queue) it's not necessary to wait for or
1174create event objects, althoguh an our of order queue is often a bit 1175create event objects, althoguh an our of order queue is often a bit
1175faster. 1176faster.
1176 1177
1177=over 4 1178=over 4
1178 1179
1179=item $ev = $queue->enqueue_read_buffer ($buffer, $blocking, $offset, $len, $data, $wait_events...) 1180=item $ev = $queue->read_buffer ($buffer, $blocking, $offset, $len, $data, $wait_events...)
1180 1181
1181Reads data from buffer into the given string. 1182Reads data from buffer into the given string.
1182 1183
1183L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadBuffer.html> 1184L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadBuffer.html>
1184 1185
1185=item $ev = $queue->enqueue_write_buffer ($buffer, $blocking, $offset, $data, $wait_events...) 1186=item $ev = $queue->write_buffer ($buffer, $blocking, $offset, $data, $wait_events...)
1186 1187
1187Writes data to buffer from the given string. 1188Writes data to buffer from the given string.
1188 1189
1189L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteBuffer.html> 1190L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteBuffer.html>
1190 1191
1191=item $ev = $queue->enqueue_copy_buffer ($src, $dst, $src_offset, $dst_offset, $len, $wait_events...) 1192=item $ev = $queue->copy_buffer ($src, $dst, $src_offset, $dst_offset, $len, $wait_events...)
1192 1193
1193L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBuffer.html> 1194L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBuffer.html>
1194 1195
1195=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...) 1196=item $ev = $queue->read_buffer_rect (OpenCL::Memory buf, cl_bool blocking, $buf_x, $buf_y, $buf_z, $host_x, $host_y, $host_z, $width, $height, $depth, $buf_row_pitch, $buf_slice_pitch, $host_row_pitch, $host_slice_pitch, $data, $wait_events...)
1196 1197
1197http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadBufferRect.html 1198http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadBufferRect.html
1198 1199
1199=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...) 1200=item $ev = $queue->write_buffer_rect (OpenCL::Memory buf, cl_bool blocking, $buf_x, $buf_y, $buf_z, $host_x, $host_y, $host_z, $width, $height, $depth, $buf_row_pitch, $buf_slice_pitch, $host_row_pitch, $host_slice_pitch, $data, $wait_events...)
1200 1201
1201http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteBufferRect.html 1202http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteBufferRect.html
1202 1203
1203=item $ev = $queue->enqueue_read_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...) 1204=item $ev = $queue->read_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...)
1204 1205
1205L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferRect.html> 1206L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferRect.html>
1206 1207
1207=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...) 1208=item $ev = $queue->copy_buffer_to_image ($src_buffer, $dst_image, $src_offset, $dst_x, $dst_y, $dst_z, $width, $height, $depth, $wait_events...)
1208 1209
1209L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadImage.html> 1210L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReadImage.html>
1210 1211
1211=item $ev = $queue->enqueue_write_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...) 1212=item $ev = $queue->write_image ($src, $blocking, $x, $y, $z, $width, $height, $depth, $row_pitch, $slice_pitch, $data, $wait_events...)
1212 1213
1213L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteImage.html> 1214L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWriteImage.html>
1214 1215
1215=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...) 1216=item $ev = $queue->copy_image ($src_image, $dst_image, $src_x, $src_y, $src_z, $dst_x, $dst_y, $dst_z, $width, $height, $depth, $wait_events...)
1216 1217
1217L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyImage.html> 1218L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyImage.html>
1218 1219
1219=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...) 1220=item $ev = $queue->copy_image_to_buffer ($src_image, $dst_image, $src_x, $src_y, $src_z, $width, $height, $depth, $dst_offset, $wait_events...)
1220 1221
1221L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyImageToBuffer.html> 1222L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyImageToBuffer.html>
1222 1223
1223=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...) 1224=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...)
1224 1225
1225Yeah. 1226Yeah.
1226 1227
1227L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferToImage.html>. 1228L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueCopyBufferToImage.html>.
1228 1229
1229=item $ev = $queue->enqueue_fill_buffer ($mem, $pattern, $offset, $size, ...) 1230=item $ev = $queue->fill_buffer ($mem, $pattern, $offset, $size, ...)
1230 1231
1231Fills the given buffer object with repeated applications of C<$pattern>, 1232Fills the given buffer object with repeated applications of C<$pattern>,
1232starting at C<$offset> for C<$size> octets. 1233starting at C<$offset> for C<$size> octets.
1233 1234
1234L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueFillBuffer.html> 1235L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueFillBuffer.html>
1235 1236
1236=item $ev = $queue->enqueue_fill_image ($img, $r, $g, $b, $a, $x, $y, $z, $width, $height, $depth, ...) 1237=item $ev = $queue->fill_image ($img, $r, $g, $b, $a, $x, $y, $z, $width, $height, $depth, ...)
1237 1238
1238Fills the given image area with the given rgba colour components. The 1239Fills the given image area with the given rgba colour components. The
1239components are normally floating point values between C<0> and C<1>, 1240components are normally floating point values between C<0> and C<1>,
1240except when the image channel data type is a signe dor unsigned 1241except when the image channel data type is a signe dor unsigned
1241unnormalised format, in which case the range is determined by the format. 1242unnormalised format, in which case the range is determined by the format.
1242 1243
1243L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueFillImage.html> 1244L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueFillImage.html>
1244 1245
1245=item $ev = $queue->enqueue_task ($kernel, $wait_events...) 1246=item $ev = $queue->task ($kernel, $wait_events...)
1246 1247
1247L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueTask.html> 1248L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueTask.html>
1248 1249
1249=item $ev = $queue->enqueue_nd_range_kernel ($kernel, \@global_work_offset, \@global_work_size, \@local_work_size, $wait_events...) 1250=item $ev = $queue->nd_range_kernel ($kernel, \@global_work_offset, \@global_work_size, \@local_work_size, $wait_events...)
1250 1251
1251Enqueues a kernel execution. 1252Enqueues a kernel execution.
1252 1253
1253\@global_work_size must be specified as a reference to an array of 1254\@global_work_size must be specified as a reference to an array of
1254integers specifying the work sizes (element counts). 1255integers specifying the work sizes (element counts).
1262reference to an array of local work sizes, with the same number of 1263reference to an array of local work sizes, with the same number of
1263elements as \@global_work_size. 1264elements as \@global_work_size.
1264 1265
1265L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueNDRangeKernel.html> 1266L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueNDRangeKernel.html>
1266 1267
1267=item $ev = $queue->enqueue_acquire_gl_objects ([object, ...], $wait_events...) 1268=item $ev = $queue->acquire_gl_objects ([object, ...], $wait_events...)
1268 1269
1269Enqueues a list (an array-ref of OpenCL::Memory objects) to be acquired 1270Enqueues a list (an array-ref of OpenCL::Memory objects) to be acquired
1270for subsequent OpenCL usage. 1271for subsequent OpenCL usage.
1271 1272
1272L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueAcquireGLObjects.html> 1273L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueAcquireGLObjects.html>
1273 1274
1274=item $ev = $queue->enqueue_release_gl_objects ([object, ...], $wait_events...) 1275=item $ev = $queue->release_gl_objects ([object, ...], $wait_events...)
1275 1276
1276Enqueues a list (an array-ref of OpenCL::Memory objects) to be released 1277Enqueues a list (an array-ref of OpenCL::Memory objects) to be released
1277for subsequent OpenGL usage. 1278for subsequent OpenGL usage.
1278 1279
1279L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReleaseGLObjects.html> 1280L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReleaseGLObjects.html>
1280 1281
1281=item $ev = $queue->enqueue_wait_for_events ($wait_events...) 1282=item $ev = $queue->wait_for_events ($wait_events...)
1282 1283
1283L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWaitForEvents.html> 1284L<http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueWaitForEvents.html>
1284 1285
1285=item $ev = $queue->enqueue_marker ($wait_events...) 1286=item $ev = $queue->marker ($wait_events...)
1286 1287
1287L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueMarkerWithWaitList.html> 1288L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueMarkerWithWaitList.html>
1288 1289
1289=item $ev = $queue->enqueue_barrier ($wait_events...) 1290=item $ev = $queue->barrier ($wait_events...)
1290 1291
1291L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueBarrierWithWaitList.html> 1292L<http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clEnqueueBarrierWithWaitList.html>
1292 1293
1293=item $queue->flush 1294=item $queue->flush
1294 1295

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines