opencl_ruby_ffi 0.3 → 0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/opencl_ruby_ffi/Buffer.rb +2 -2
- data/lib/opencl_ruby_ffi/CommandQueue.rb +118 -63
- data/lib/opencl_ruby_ffi/Context.rb +46 -9
- data/lib/opencl_ruby_ffi/Device.rb +5 -5
- data/lib/opencl_ruby_ffi/Event.rb +18 -7
- data/lib/opencl_ruby_ffi/Image.rb +9 -9
- data/lib/opencl_ruby_ffi/Kernel.rb +14 -14
- data/lib/opencl_ruby_ffi/Mem.rb +7 -7
- data/lib/opencl_ruby_ffi/Platform.rb +41 -17
- data/lib/opencl_ruby_ffi/Program.rb +195 -30
- data/lib/opencl_ruby_ffi/Sampler.rb +1 -1
- data/lib/opencl_ruby_ffi/opencl_ruby_ffi_base.rb +8 -8
- data/lib/opencl_ruby_ffi/opencl_ruby_ffi_base_gen.rb +101 -7
- data/opencl_ruby_ffi.gemspec +1 -1
- metadata +2 -2
@@ -36,7 +36,7 @@ module OpenCL
|
|
36
36
|
def self.create_sub_buffer( buffer, type, info, options = {} )
|
37
37
|
OpenCL.error_check(OpenCL::INVALID_OPERATION) if buffer.platform.version_number < 1.1
|
38
38
|
flags = OpenCL.get_flags( options )
|
39
|
-
error = FFI::MemoryPointer
|
39
|
+
error = FFI::MemoryPointer::new( :cl_int )
|
40
40
|
buff = OpenCL.clCreateSubBuffer( buffer, flags, type, info, error)
|
41
41
|
OpenCL.error_check(error.read_cl_int)
|
42
42
|
return Buffer::new( buff, false )
|
@@ -55,7 +55,7 @@ module OpenCL
|
|
55
55
|
# * +:flags+ - a single or an Array of :cl_mem_flags specifying the flags to be used when creating the Image
|
56
56
|
def self.create_from_GL_buffer( context, bufobj, options = {} )
|
57
57
|
flags = OpenCL.get_flags( options )
|
58
|
-
error = FFI::MemoryPointer
|
58
|
+
error = FFI::MemoryPointer::new( :cl_int )
|
59
59
|
buff = OpenCL.clCreateFromGLBuffer( context, flags, bufobj, error )
|
60
60
|
OpenCL.error_check(error.read_cl_int)
|
61
61
|
return Buffer::new( buff, false )
|
@@ -11,6 +11,17 @@ module OpenCL
|
|
11
11
|
return command_queue
|
12
12
|
end
|
13
13
|
|
14
|
+
# Issues all the commands in a CommandQueue to the Device
|
15
|
+
#
|
16
|
+
# ==== Attributes
|
17
|
+
#
|
18
|
+
# * +command_queue+ - the CommandQueue to flush
|
19
|
+
def self.flush( command_queue )
|
20
|
+
error = OpenCL.clFlush( command_queue )
|
21
|
+
OpenCL.error_check( error )
|
22
|
+
return command_queue
|
23
|
+
end
|
24
|
+
|
14
25
|
# Creates a CommandQueue targeting the specified Device
|
15
26
|
#
|
16
27
|
# ==== Attributes
|
@@ -24,7 +35,7 @@ module OpenCL
|
|
24
35
|
# * +:properties+ - a single or an Array of :cl_command_queue_properties
|
25
36
|
def self.create_command_queue( context, device, options = {} )
|
26
37
|
properties = OpenCL.get_command_queue_properties( options )
|
27
|
-
error = FFI::MemoryPointer
|
38
|
+
error = FFI::MemoryPointer::new( :cl_int )
|
28
39
|
cmd = OpenCL.clCreateCommandQueue( context, device, properties, error )
|
29
40
|
OpenCL.error_check(error.read_cl_int)
|
30
41
|
return CommandQueue::new(cmd, false)
|
@@ -51,14 +62,14 @@ module OpenCL
|
|
51
62
|
num_mem_objects = [mem_objects].flatten.length
|
52
63
|
mem_list = nil
|
53
64
|
if num_mem_objects > 0 then
|
54
|
-
mem_list = FFI::MemoryPointer
|
65
|
+
mem_list = FFI::MemoryPointer::new( OpenCL::Mem, num_mem_objects )
|
55
66
|
[mem_objects].flatten.each_with_index { |e, i|
|
56
67
|
mem_list[i].write_pointer(e)
|
57
68
|
}
|
58
69
|
end
|
59
70
|
flags = OpenCL.get_flags( options )
|
60
71
|
num_events, events = OpenCL.get_event_wait_list( options )
|
61
|
-
event = FFI::MemoryPointer
|
72
|
+
event = FFI::MemoryPointer::new( Event )
|
62
73
|
error = OpenCL.clEnqueueMigrateMemObjects( command_queue, num_mem_objects, mem_list, flags, num_events, events, event )
|
63
74
|
OpenCL.error_check( error )
|
64
75
|
return OpenCL::Event::new( event.read_ptr, false )
|
@@ -95,10 +106,10 @@ module OpenCL
|
|
95
106
|
origin, region = OpenCL.get_origin_region( image, options, :origin, :region )
|
96
107
|
|
97
108
|
num_events, events = OpenCL.get_event_wait_list( options )
|
98
|
-
image_row_pitch = FFI::MemoryPointer
|
99
|
-
image_slice_pitch = FFI::MemoryPointer
|
100
|
-
event = FFI::MemoryPointer
|
101
|
-
error = FFI::MemoryPointer
|
109
|
+
image_row_pitch = FFI::MemoryPointer::new( :size_t )
|
110
|
+
image_slice_pitch = FFI::MemoryPointer::new( :size_t )
|
111
|
+
event = FFI::MemoryPointer::new( Event )
|
112
|
+
error = FFI::MemoryPointer::new( :cl_int )
|
102
113
|
OpenCL.clEnqueueMapImage( command_queue, image, blocking, map_flags, origin, region, image_row_pitch, image_slice_pitch, num_events, events, event, error )
|
103
114
|
OpenCL.error_check( error.read_cl_int )
|
104
115
|
ev = OpenCL::Event::new( event.read_ptr, false )
|
@@ -135,8 +146,8 @@ module OpenCL
|
|
135
146
|
size = buffer.size - offset
|
136
147
|
size = options[:size] - offset if options[:size]
|
137
148
|
num_events, events = OpenCL.get_event_wait_list( options )
|
138
|
-
event = FFI::MemoryPointer
|
139
|
-
error = FFI::MemoryPointer
|
149
|
+
event = FFI::MemoryPointer::new( Event )
|
150
|
+
error = FFI::MemoryPointer::new( :cl_int )
|
140
151
|
ptr = OpenCL.clEnqueueMapBuffer( command_queue, buffer, blocking, map_flags, offset, size, num_events, events, error )
|
141
152
|
OpenCL.error_check( error.read_cl_int )
|
142
153
|
ev = OpenCL::Event::new( event.read_ptr, false )
|
@@ -161,7 +172,7 @@ module OpenCL
|
|
161
172
|
# the Event associated with the command
|
162
173
|
def self.enqueue_unmap_mem_object( command_queue, mem_obj, mapped_ptr, options = {} )
|
163
174
|
num_events, events = OpenCL.get_event_wait_list( options )
|
164
|
-
event = FFI::MemoryPointer
|
175
|
+
event = FFI::MemoryPointer::new( Event )
|
165
176
|
error = OpenCL.clEnqueueUnmapMemObject( command_queue, mem_obj, mapped_ptr, num_events, events, event )
|
166
177
|
OpenCL.error_check( error )
|
167
178
|
return OpenCL::Event::new( event.read_ptr, false )
|
@@ -197,7 +208,7 @@ module OpenCL
|
|
197
208
|
blocking = OpenCL::FALSE
|
198
209
|
blocking = OpenCL::TRUE if options[:blocking] or options[:blocking_read]
|
199
210
|
|
200
|
-
buffer_origin = FFI::MemoryPointer
|
211
|
+
buffer_origin = FFI::MemoryPointer::new( :size_t, 3 )
|
201
212
|
(0..2).each { |i| buffer_origin[i].write_size_t(0) }
|
202
213
|
bo = options[:src_origin] ? options[:src_origin] : options[:buffer_origin]
|
203
214
|
if bo then
|
@@ -206,7 +217,7 @@ module OpenCL
|
|
206
217
|
}
|
207
218
|
end
|
208
219
|
|
209
|
-
host_origin = FFI::MemoryPointer
|
220
|
+
host_origin = FFI::MemoryPointer::new( :size_t, 3 )
|
210
221
|
(0..2).each { |i| host_origin[i].write_size_t(0) }
|
211
222
|
ho = options[:dst_origin] ? options[:dst_origin] : options[:host_origin]
|
212
223
|
if ho then
|
@@ -215,7 +226,7 @@ module OpenCL
|
|
215
226
|
}
|
216
227
|
end
|
217
228
|
|
218
|
-
r = FFI::MemoryPointer
|
229
|
+
r = FFI::MemoryPointer::new( :size_t, 3 )
|
219
230
|
(0..2).each { |i| r[i].write_size_t(0) }
|
220
231
|
region[0..3].each_with_index { |e, i|
|
221
232
|
r[i].write_size_t(e)
|
@@ -238,7 +249,7 @@ module OpenCL
|
|
238
249
|
host_slice_pitch = 0
|
239
250
|
end
|
240
251
|
num_events, events = OpenCL.get_event_wait_list( options )
|
241
|
-
event = FFI::MemoryPointer
|
252
|
+
event = FFI::MemoryPointer::new( Event )
|
242
253
|
error = OpenCL.clEnqueueReadBufferRect(command_queue, buffer, blocking, buffer_origin, host_origin, r, buffer_row_pitch, buffer_slice_pitch, host_row_pitch, host_slice_pitch, ptr, num_events, events, event)
|
243
254
|
OpenCL.error_check(error)
|
244
255
|
return OpenCL::Event::new(event.read_pointer, false)
|
@@ -274,7 +285,7 @@ module OpenCL
|
|
274
285
|
blocking = OpenCL::FALSE
|
275
286
|
blocking = OpenCL::TRUE if options[:blocking] or options[:blocking_write]
|
276
287
|
|
277
|
-
buffer_origin = FFI::MemoryPointer
|
288
|
+
buffer_origin = FFI::MemoryPointer::new( :size_t, 3 )
|
278
289
|
(0..2).each { |i| buffer_origin[i].write_size_t(0) }
|
279
290
|
bo = options[:dst_origin] ? options[:dst_origin] : options[:buffer_origin]
|
280
291
|
if bo then
|
@@ -283,7 +294,7 @@ module OpenCL
|
|
283
294
|
}
|
284
295
|
end
|
285
296
|
|
286
|
-
host_origin = FFI::MemoryPointer
|
297
|
+
host_origin = FFI::MemoryPointer::new( :size_t, 3 )
|
287
298
|
(0..2).each { |i| host_origin[i].write_size_t(0) }
|
288
299
|
ho = options[:src_origin] ? options[:src_origin] : options[:host_origin]
|
289
300
|
if ho then
|
@@ -292,7 +303,7 @@ module OpenCL
|
|
292
303
|
}
|
293
304
|
end
|
294
305
|
|
295
|
-
r = FFI::MemoryPointer
|
306
|
+
r = FFI::MemoryPointer::new( :size_t, 3 )
|
296
307
|
(0..2).each { |i| r[i].write_size_t(0) }
|
297
308
|
region[0..3].each_with_index { |e, i|
|
298
309
|
r[i].write_size_t(e)
|
@@ -315,7 +326,7 @@ module OpenCL
|
|
315
326
|
host_slice_pitch = 0
|
316
327
|
end
|
317
328
|
num_events, events = OpenCL.get_event_wait_list( options )
|
318
|
-
event = FFI::MemoryPointer
|
329
|
+
event = FFI::MemoryPointer::new( Event )
|
319
330
|
error = OpenCL.clEnqueueWriteBufferRect(command_queue, buffer, blocking, buffer_origin, host_origin, r, buffer_row_pitch, buffer_slice_pitch, host_row_pitch, host_slice_pitch, ptr, num_events, events, event)
|
320
331
|
OpenCL.error_check(error)
|
321
332
|
return OpenCL::Event::new(event.read_pointer, false)
|
@@ -347,7 +358,7 @@ module OpenCL
|
|
347
358
|
def self.enqueue_copy_buffer_rect(command_queue, src_buffer, dst_buffer, region, options = {})
|
348
359
|
OpenCL.error_check(OpenCL::INVALID_OPERATION) if command_queue.context.platform.version_number < 1.1
|
349
360
|
|
350
|
-
src_origin = FFI::MemoryPointer
|
361
|
+
src_origin = FFI::MemoryPointer::new( :size_t, 3 )
|
351
362
|
(0..2).each { |i| src_origin[i].write_size_t(0) }
|
352
363
|
if options[:src_origin] then
|
353
364
|
options[:src_origin].each_with_index { |e, i|
|
@@ -355,7 +366,7 @@ module OpenCL
|
|
355
366
|
}
|
356
367
|
end
|
357
368
|
|
358
|
-
dst_origin = FFI::MemoryPointer
|
369
|
+
dst_origin = FFI::MemoryPointer::new( :size_t, 3 )
|
359
370
|
(0..2).each { |i| dst_origin[i].write_size_t(0) }
|
360
371
|
if options[:dst_origin] then
|
361
372
|
options[:dst_origin].each_with_index { |e, i|
|
@@ -363,7 +374,7 @@ module OpenCL
|
|
363
374
|
}
|
364
375
|
end
|
365
376
|
|
366
|
-
r = FFI::MemoryPointer
|
377
|
+
r = FFI::MemoryPointer::new( :size_t, 3 )
|
367
378
|
(0..2).each { |i| r[i].write_size_t(0) }
|
368
379
|
region[0..3].each_with_index { |e, i|
|
369
380
|
r[i].write_size_t(e)
|
@@ -386,7 +397,7 @@ module OpenCL
|
|
386
397
|
dst_slice_pitch = 0
|
387
398
|
end
|
388
399
|
num_events, events = OpenCL.get_event_wait_list( options )
|
389
|
-
event = FFI::MemoryPointer
|
400
|
+
event = FFI::MemoryPointer::new( Event )
|
390
401
|
error = OpenCL.clEnqueueCopyBufferRect(command_queue, src_buffer, dst_buffer, src_origin, dst_origin, r, src_row_pitch, src_slice_pitch, dst_row_pitch, dst_slice_pitch, num_events, events, event)
|
391
402
|
OpenCL.error_check(error)
|
392
403
|
return OpenCL::Event::new(event.read_pointer, false)
|
@@ -419,7 +430,7 @@ module OpenCL
|
|
419
430
|
size = [ src_buffer.size - src_offset, dst_buffer.size - dst_offset ].min
|
420
431
|
size = options[:size] if options[:size]
|
421
432
|
num_events, events = OpenCL.get_event_wait_list( options )
|
422
|
-
event = FFI::MemoryPointer
|
433
|
+
event = FFI::MemoryPointer::new( Event )
|
423
434
|
error = OpenCL.clEnqueueCopyBuffer(command_queue, src_buffer, dst_buffer, src_offset, dst_offset, size, num_events, events, event)
|
424
435
|
OpenCL.error_check(error)
|
425
436
|
return OpenCL::Event::new(event.read_pointer, false)
|
@@ -454,7 +465,7 @@ module OpenCL
|
|
454
465
|
size = buffer.size - offset
|
455
466
|
size = options[:size] if options[:size]
|
456
467
|
num_events, events = OpenCL.get_event_wait_list( options )
|
457
|
-
event = FFI::MemoryPointer
|
468
|
+
event = FFI::MemoryPointer::new( Event )
|
458
469
|
error = OpenCL.clEnqueueWriteBuffer(command_queue, buffer, blocking, offset, size, ptr, num_events, events, event)
|
459
470
|
OpenCL.error_check(error)
|
460
471
|
return OpenCL::Event::new(event.read_pointer, false)
|
@@ -488,7 +499,7 @@ module OpenCL
|
|
488
499
|
size = buffer.size - offset
|
489
500
|
size = options[:size] if options[:size]
|
490
501
|
num_events, events = OpenCL.get_event_wait_list( options )
|
491
|
-
event = FFI::MemoryPointer
|
502
|
+
event = FFI::MemoryPointer::new( Event )
|
492
503
|
error = OpenCL.clEnqueueReadBuffer(command_queue, buffer, blocking, offset, size, ptr, num_events, events, event)
|
493
504
|
OpenCL.error_check(error)
|
494
505
|
return OpenCL::Event::new(event.read_pointer, false)
|
@@ -513,13 +524,13 @@ module OpenCL
|
|
513
524
|
num_objs = [mem_objects].flatten.length
|
514
525
|
objs = nil
|
515
526
|
if num_objs > 0 then
|
516
|
-
objs = FFI::MemoryPointer
|
527
|
+
objs = FFI::MemoryPointer::new( Mem, num_objs )
|
517
528
|
[mem_objects].flatten.each_with_index { |o, i|
|
518
529
|
objs[i].write_pointer(e)
|
519
530
|
}
|
520
531
|
end
|
521
532
|
num_events, events = OpenCL.get_event_wait_list( options )
|
522
|
-
event = FFI::MemoryPointer
|
533
|
+
event = FFI::MemoryPointer::new( Event )
|
523
534
|
error = OpenCL.clEnqueueAcquireGLObject( command_queue, num_objs, objs, num_events, events, event )
|
524
535
|
OpenCL.error_check(error)
|
525
536
|
return OpenCL::Event::new(event.read_pointer, false)
|
@@ -544,13 +555,13 @@ module OpenCL
|
|
544
555
|
num_objs = [mem_objects].flatten.length
|
545
556
|
objs = nil
|
546
557
|
if num_objs > 0 then
|
547
|
-
objs = FFI::MemoryPointer
|
558
|
+
objs = FFI::MemoryPointer::new( Mem, num_objs )
|
548
559
|
[mem_objects].flatten.each_with_index { |o, i|
|
549
560
|
objs[i].write_pointer(e)
|
550
561
|
}
|
551
562
|
end
|
552
563
|
num_events, events = OpenCL.get_event_wait_list( options )
|
553
|
-
event = FFI::MemoryPointer
|
564
|
+
event = FFI::MemoryPointer::new( Event )
|
554
565
|
error = OpenCL.clEnqueueReleaseGLObject( command_queue, num_objs, objs, num_events, events, event )
|
555
566
|
OpenCL.error_check(error)
|
556
567
|
return OpenCL::Event::new(event.read_pointer, false)
|
@@ -584,7 +595,7 @@ module OpenCL
|
|
584
595
|
size = (buffer.size - offset) % pattern_size
|
585
596
|
size = options[:size] if options[:size]
|
586
597
|
num_events, events = OpenCL.get_event_wait_list( options )
|
587
|
-
event = FFI::MemoryPointer
|
598
|
+
event = FFI::MemoryPointer::new( Event )
|
588
599
|
error = OpenCL.clEnqueueFillBuffer( command_queue, buffer, pattern, pattern_size, offset, size, num_events, events, event )
|
589
600
|
OpenCL.error_check(error)
|
590
601
|
return OpenCL::Event::new(event.read_pointer, false)
|
@@ -612,7 +623,7 @@ module OpenCL
|
|
612
623
|
OpenCL.error_check(OpenCL::INVALID_OPERATION) if command_queue.context.platform.version_number < 1.1
|
613
624
|
origin, region = OpenCL.get_origin_region( image, options, :origin, :region )
|
614
625
|
num_events, events = OpenCL.get_event_wait_list( options )
|
615
|
-
event = FFI::MemoryPointer
|
626
|
+
event = FFI::MemoryPointer::new( Event )
|
616
627
|
error = OpenCL.clEnqueueFillImage( command_queue, image, fill_color, origin, region, num_events, events, event )
|
617
628
|
OpenCL.error_check(error)
|
618
629
|
return OpenCL::Event::new(event.read_pointer, false)
|
@@ -642,7 +653,7 @@ module OpenCL
|
|
642
653
|
dst_offset = 0
|
643
654
|
dst_offset = options[:dst_offset] if options[:dst_offset]
|
644
655
|
num_events, events = OpenCL.get_event_wait_list( options )
|
645
|
-
event = FFI::MemoryPointer
|
656
|
+
event = FFI::MemoryPointer::new( Event )
|
646
657
|
error = OpenCL.clEnqueueCopyImageToBuffer( command_queue, src_image, dst_buffer, src_origin, region, dst_offset, num_events, events, event )
|
647
658
|
OpenCL.error_check(error)
|
648
659
|
return OpenCL::Event::new(event.read_pointer, false)
|
@@ -672,7 +683,7 @@ module OpenCL
|
|
672
683
|
src_offset = 0
|
673
684
|
src_offset = options[:src_offset] if options[:src_offset]
|
674
685
|
num_events, events = OpenCL.get_event_wait_list( options )
|
675
|
-
event = FFI::MemoryPointer
|
686
|
+
event = FFI::MemoryPointer::new( Event )
|
676
687
|
error = OpenCL.clEnqueueCopyBufferToImage( command_queue, src_buffer, dst_image, src_offset, dst_origin, region, num_events, events, event )
|
677
688
|
OpenCL.error_check(error)
|
678
689
|
return OpenCL::Event::new(event.read_pointer, false)
|
@@ -711,7 +722,7 @@ module OpenCL
|
|
711
722
|
input_slice_pitch = 0
|
712
723
|
input_slice_pitch = options[:input_slice_pitch] if options[:input_slice_pitch]
|
713
724
|
num_events, events = OpenCL.get_event_wait_list( options )
|
714
|
-
event = FFI::MemoryPointer
|
725
|
+
event = FFI::MemoryPointer::new( Event )
|
715
726
|
error = OpenCL.clEnqueueWriteImage( command_queue, image, blocking, origin, region, input_row_pitch, input_slice_pitch, ptr, num_events, events, event )
|
716
727
|
OpenCL.error_check(error)
|
717
728
|
return OpenCL::Event::new(event.read_pointer, false)
|
@@ -739,12 +750,12 @@ module OpenCL
|
|
739
750
|
def self.enqueue_copy_image( command_queue, src_image, dst_image, options = {} )
|
740
751
|
src_origin, src_region = OpenCL.get_origin_region( src_image, options, :src_origin, :region )
|
741
752
|
dst_origin, dst_region = OpenCL.get_origin_region( dst_image, options, :dst_origin, :region )
|
742
|
-
region = FFI::MemoryPointer
|
753
|
+
region = FFI::MemoryPointer::new( :size_t, 3 )
|
743
754
|
(0..2).each { |i|
|
744
755
|
region[i].write_size_t( [src_region[i].read_size_t, dst_region[i].read_size_t].min )
|
745
756
|
}
|
746
757
|
num_events, events = OpenCL.get_event_wait_list( options )
|
747
|
-
event = FFI::MemoryPointer
|
758
|
+
event = FFI::MemoryPointer::new( Event )
|
748
759
|
error = OpenCL.clEnqueueCopyImage( command_queue, src_image, dst_image, src_origin, dst_origin, region, num_events, events, event )
|
749
760
|
OpenCL.error_check(error)
|
750
761
|
return OpenCL::Event::new(event.read_pointer, false)
|
@@ -782,14 +793,13 @@ module OpenCL
|
|
782
793
|
slice_pitch = 0
|
783
794
|
slice_pitch = options[:slice_pitch] if options[:slice_pitch]
|
784
795
|
num_events, events = OpenCL.get_event_wait_list( options )
|
785
|
-
event = FFI::MemoryPointer
|
796
|
+
event = FFI::MemoryPointer::new( Event )
|
786
797
|
error = OpenCL.clEnqueueReadImage( command_queue, image, blocking, origin, region, row_pitch, slice_pitch, ptr, num_events, events, event )
|
787
798
|
OpenCL.error_check(error)
|
788
799
|
return OpenCL::Event::new(event.read_pointer, false)
|
789
800
|
end
|
790
801
|
|
791
802
|
# Enqueues a native kernel
|
792
|
-
# not yet fully implemented
|
793
803
|
#
|
794
804
|
# ==== Attributes
|
795
805
|
#
|
@@ -799,26 +809,46 @@ module OpenCL
|
|
799
809
|
#
|
800
810
|
# ==== Options
|
801
811
|
#
|
812
|
+
# * +:args+ - if provided, a list of arguments to pass to the kernel. Arguments should have a size method and be convertible to Pointer with to_ptr
|
813
|
+
# * +:mem_list+ - if provided, a hash containing Buffer objects and their index inside the argument list.
|
802
814
|
# * +:event_wait_list+ - if provided, a list of Event to wait upon before executing the command
|
803
815
|
#
|
804
816
|
# ==== Returns
|
805
817
|
#
|
806
818
|
# the Event associated with the command
|
807
819
|
def self.enqueue_native_kernel( command_queue, options = {}, &func )
|
808
|
-
|
809
|
-
|
810
|
-
|
811
|
-
|
812
|
-
|
813
|
-
|
814
|
-
|
815
|
-
|
816
|
-
|
817
|
-
|
818
|
-
|
820
|
+
arguments = options[:args]
|
821
|
+
arg_offset = []
|
822
|
+
args = nil
|
823
|
+
args_size = 0
|
824
|
+
if arguments then
|
825
|
+
[arguments].flatten.each { |e|
|
826
|
+
arg_offset.push(arg_size)
|
827
|
+
args_size += e.size
|
828
|
+
}
|
829
|
+
args = FFI::MemoryPointer::new(args_size)
|
830
|
+
[arguments].flatten.each_with_index { |e, i|
|
831
|
+
args.put_bytes(arg_offset[i], e.to_ptr.read_bytes(e.size))
|
832
|
+
}
|
833
|
+
end
|
834
|
+
num_mem_objects = 0
|
835
|
+
mem_list = nil
|
836
|
+
if options[:mem_list] then
|
837
|
+
num_mem_objects = options[:mem_list].length
|
838
|
+
if num_mem_objects > 0 then
|
839
|
+
mem_list = FFI::MemoryPointer::new( OpenCL::Mem, num_mem_objects )
|
840
|
+
mem_loc = FFI::MemoryPointer::new( Pointer, num_mem_objects )
|
841
|
+
i = 0
|
842
|
+
options[:mem_list].each { |key, value|
|
843
|
+
mem_list[i].write_pointer(key)
|
844
|
+
mem_loc[i].write_pointer(args+arg_offset[value])
|
845
|
+
i = i + 1
|
846
|
+
}
|
847
|
+
end
|
848
|
+
end
|
819
849
|
num_events, events = OpenCL.get_event_wait_list( options )
|
820
|
-
event = FFI::MemoryPointer
|
821
|
-
error = OpenCL.clEnqueueNativeKernel( command_queue, func,
|
850
|
+
event = FFI::MemoryPointer::new( Event )
|
851
|
+
error = OpenCL.clEnqueueNativeKernel( command_queue, func, args, args_size, num_mem_objects, mem_list, mem_loc, num_events, events, event )
|
822
852
|
OpenCL.error_check(error)
|
823
853
|
return OpenCL::Event::new(event.read_pointer, false)
|
824
854
|
end
|
@@ -840,7 +870,7 @@ module OpenCL
|
|
840
870
|
# the Event associated with the command
|
841
871
|
def self.enqueue_task( command_queue, kernel, options = {} )
|
842
872
|
num_events, events = OpenCL.get_event_wait_list( options )
|
843
|
-
event = FFI::MemoryPointer
|
873
|
+
event = FFI::MemoryPointer::new( Event )
|
844
874
|
error = OpenCL.clEnqueueTask( command_queue, kernel, num_events, events, event )
|
845
875
|
OpenCL.error_check(error)
|
846
876
|
return OpenCL::Event::new(event.read_pointer, false)
|
@@ -865,26 +895,26 @@ module OpenCL
|
|
865
895
|
#
|
866
896
|
# the Event associated with the command
|
867
897
|
def self.enqueue_NDrange_kernel( command_queue, kernel, global_work_size, options={} )
|
868
|
-
gws = FFI::MemoryPointer
|
898
|
+
gws = FFI::MemoryPointer::new( :size_t, global_work_size.length )
|
869
899
|
global_work_size.each_with_index { |g, i|
|
870
900
|
gws[i].write_size_t(g)
|
871
901
|
}
|
872
902
|
lws = nil
|
873
903
|
if options[:local_work_size] then
|
874
|
-
lws = FFI::MemoryPointer
|
904
|
+
lws = FFI::MemoryPointer::new( :size_t, global_work_size.length )
|
875
905
|
global_work_size.each_index { |i|
|
876
906
|
lws[i].write_size_t(options[:local_work_size][i])
|
877
907
|
}
|
878
908
|
end
|
879
909
|
gwo = nil
|
880
910
|
if options[:global_work_offset] then
|
881
|
-
gwo = FFI::MemoryPointer
|
911
|
+
gwo = FFI::MemoryPointer::new( :size_t, global_work_size.length )
|
882
912
|
global_work_size.each_index { |i|
|
883
913
|
gwo[i].write_size_t(options[:global_work_offset][i])
|
884
914
|
}
|
885
915
|
end
|
886
916
|
num_events, events = OpenCL.get_event_wait_list( options )
|
887
|
-
event = FFI::MemoryPointer
|
917
|
+
event = FFI::MemoryPointer::new( Event )
|
888
918
|
error = OpenCL.clEnqueueNDRangeKernel(command_queue, kernel, global_work_size.length, gwo, gws, lws, num_events, events, event)
|
889
919
|
OpenCL.error_check(error)
|
890
920
|
return OpenCL::Event::new(event.read_pointer, false)
|
@@ -918,7 +948,7 @@ module OpenCL
|
|
918
948
|
if command_queue.context.platform.version_number < 1.2 then
|
919
949
|
num_events = [events].flatten.length
|
920
950
|
if num_events > 0 then
|
921
|
-
evts = FFI::MemoryPointer
|
951
|
+
evts = FFI::MemoryPointer::new( Event, num_events )
|
922
952
|
[events].flatten.each_with_index { |e, i|
|
923
953
|
evts[i].write_pointer(e)
|
924
954
|
}
|
@@ -932,12 +962,12 @@ module OpenCL
|
|
932
962
|
num_events = [events].flatten.length
|
933
963
|
evts = nil
|
934
964
|
if num_events > 0 then
|
935
|
-
evts = FFI::MemoryPointer
|
965
|
+
evts = FFI::MemoryPointer::new( Event, num_events )
|
936
966
|
[events].flatten.each_with_index { |e, i|
|
937
967
|
evts[i].write_pointer(e)
|
938
968
|
}
|
939
969
|
end
|
940
|
-
event = FFI::MemoryPointer
|
970
|
+
event = FFI::MemoryPointer::new( Event )
|
941
971
|
error = OpenCL.clEnqueueBarrierWithWaitList( command_queue, num_events, evts, event )
|
942
972
|
OpenCL.error_check(error)
|
943
973
|
return OpenCL::Event::new(event.read_pointer, false)
|
@@ -955,14 +985,14 @@ module OpenCL
|
|
955
985
|
#
|
956
986
|
# an Event
|
957
987
|
def self.enqueue_marker( command_queue, events = [] )
|
958
|
-
event = FFI::MemoryPointer
|
988
|
+
event = FFI::MemoryPointer::new( Event )
|
959
989
|
if command_queue.context.platform.version_number < 1.2 then
|
960
990
|
error = OpenCL.clEnqueueMarker( command_queue, event )
|
961
991
|
else
|
962
992
|
num_events = [events].flatten.length
|
963
993
|
evts = nil
|
964
994
|
if num_events > 0 then
|
965
|
-
evts = FFI::MemoryPointer
|
995
|
+
evts = FFI::MemoryPointer::new( Event, num_events )
|
966
996
|
[events].flatten.each_with_index { |e, i|
|
967
997
|
evts[i].write_pointer(e)
|
968
998
|
}
|
@@ -978,7 +1008,7 @@ module OpenCL
|
|
978
1008
|
|
979
1009
|
# Returns the Context associated to the CommandQueue
|
980
1010
|
def context
|
981
|
-
ptr = FFI::MemoryPointer
|
1011
|
+
ptr = FFI::MemoryPointer::new( Context )
|
982
1012
|
error = OpenCL.clGetCommandQueueInfo(self, CommandQueue::CONTEXT, Context.size, ptr, nil)
|
983
1013
|
OpenCL.error_check(error)
|
984
1014
|
return OpenCL::Context::new( ptr.read_pointer )
|
@@ -986,7 +1016,7 @@ module OpenCL
|
|
986
1016
|
|
987
1017
|
# Returns the Device associated to the CommandQueue
|
988
1018
|
def device
|
989
|
-
ptr = FFI::MemoryPointer
|
1019
|
+
ptr = FFI::MemoryPointer::new( Device )
|
990
1020
|
error = OpenCL.clGetCommandQueueInfo(self, CommandQueue::DEVICE, Device.size, ptr, nil)
|
991
1021
|
OpenCL.error_check(error)
|
992
1022
|
return OpenCL::Device::new( ptr.read_pointer )
|
@@ -1534,11 +1564,36 @@ module OpenCL
|
|
1534
1564
|
return OpenCL.enqueue_migrate_mem_objects( self, mem_objects, options )
|
1535
1565
|
end
|
1536
1566
|
|
1567
|
+
# Enqueues a native kernel in the CommandQueue
|
1568
|
+
#
|
1569
|
+
# ==== Attributes
|
1570
|
+
#
|
1571
|
+
# * +options+ - a hash containing named options
|
1572
|
+
# * +func+ - a Proc object to execute
|
1573
|
+
#
|
1574
|
+
# ==== Options
|
1575
|
+
#
|
1576
|
+
# * +:args+ - if provided, a list of arguments to pass to the kernel. Arguments should have a size method and be convertible to Pointer with to_ptr
|
1577
|
+
# * +:mem_list+ - if provided, a hash containing Buffer objects and their index inside the argument list.
|
1578
|
+
# * +:event_wait_list+ - if provided, a list of Event to wait upon before executing the command
|
1579
|
+
#
|
1580
|
+
# ==== Returns
|
1581
|
+
#
|
1582
|
+
# the Event associated with the command
|
1583
|
+
def enqueue_native_kernel( options = {}, &func )
|
1584
|
+
return OpenCL.enqueue_native_kernel( self, options, &func )
|
1585
|
+
end
|
1586
|
+
|
1537
1587
|
# Blocks until all the commands in the CommandQueue have completed
|
1538
1588
|
def finish
|
1539
1589
|
return OpenCL.finish(self)
|
1540
1590
|
end
|
1541
1591
|
|
1592
|
+
# Issues all the commands in a CommandQueue to the Device
|
1593
|
+
def flush
|
1594
|
+
return OpenCL.flush( self )
|
1595
|
+
end
|
1596
|
+
|
1542
1597
|
end
|
1543
1598
|
|
1544
1599
|
end
|
@@ -14,13 +14,13 @@ module OpenCL
|
|
14
14
|
# * +:user_data+ - an FFI::Pointer or an object that can be converted into one using to_ptr. The pointer is passed to the callback.
|
15
15
|
def self.create_context(devices, options = {}, &block)
|
16
16
|
@@callbacks.push( block ) if block
|
17
|
-
pointer = FFI::MemoryPointer
|
17
|
+
pointer = FFI::MemoryPointer::new( Device, devices.size)
|
18
18
|
devices.size.times { |indx|
|
19
19
|
pointer.put_pointer(indx, devices[indx])
|
20
20
|
}
|
21
21
|
properties = OpenCL.get_context_properties( options )
|
22
22
|
user_data = options[:user_data]
|
23
|
-
error = FFI::MemoryPointer
|
23
|
+
error = FFI::MemoryPointer::new( :cl_int )
|
24
24
|
ptr = OpenCL.clCreateContext(properties, devices.size, pointer, block, user_data, error)
|
25
25
|
OpenCL.error_check(error.read_cl_int)
|
26
26
|
return OpenCL::Context::new(ptr, false)
|
@@ -42,7 +42,7 @@ module OpenCL
|
|
42
42
|
@@callbacks.push( block ) if block
|
43
43
|
properties = OpenCL.get_context_properties( options )
|
44
44
|
user_data = options[:user_data]
|
45
|
-
error = FFI::MemoryPointer
|
45
|
+
error = FFI::MemoryPointer::new( :cl_int )
|
46
46
|
ptr = OpenCL.clCreateContextFromType(properties, type, block, user_data, error)
|
47
47
|
OpenCL.error_check(error.read_cl_int)
|
48
48
|
return OpenCL::Context::new(ptr, false)
|
@@ -71,12 +71,12 @@ module OpenCL
|
|
71
71
|
# Returns the number of devices associated to the Context
|
72
72
|
def num_devices
|
73
73
|
d_n = 0
|
74
|
-
ptr = FFI::MemoryPointer
|
74
|
+
ptr = FFI::MemoryPointer::new( :size_t )
|
75
75
|
error = OpenCL.clGetContextInfo(self, Context::DEVICES, 0, nil, ptr)
|
76
76
|
OpenCL.error_check(error)
|
77
77
|
d_n = ptr.read_size_t / Platform.size
|
78
78
|
# else
|
79
|
-
# ptr = FFI::MemoryPointer
|
79
|
+
# ptr = FFI::MemoryPointer::new( :cl_uint )
|
80
80
|
# error = OpenCL.clGetContextInfo(self, Context::NUM_DEVICES, ptr.size, ptr, nil)
|
81
81
|
# OpenCL.error_check(error)
|
82
82
|
# d_n = ptr.read_cl_uint
|
@@ -87,11 +87,11 @@ module OpenCL
|
|
87
87
|
# Returns an Array of Device associated to the Context
|
88
88
|
def devices
|
89
89
|
n = self.num_devices
|
90
|
-
ptr2 = FFI::MemoryPointer
|
90
|
+
ptr2 = FFI::MemoryPointer::new( Device, n )
|
91
91
|
error = OpenCL.clGetContextInfo(self, Context::DEVICES, Device.size*n, ptr2, nil)
|
92
92
|
OpenCL.error_check(error)
|
93
93
|
return ptr2.get_array_of_pointer(0, n).collect { |device_ptr|
|
94
|
-
OpenCL::Device
|
94
|
+
OpenCL::Device::new(device_ptr)
|
95
95
|
}
|
96
96
|
end
|
97
97
|
|
@@ -106,11 +106,11 @@ module OpenCL
|
|
106
106
|
# * +:flags+ - a single or an Array of :cl_mem_flags specifying the flags to be used when creating the Buffer
|
107
107
|
def supported_image_formats( image_type, options = {} )
|
108
108
|
flags = OpenCL.get_flags( options )
|
109
|
-
num_image_formats = FFI::MemoryPointer
|
109
|
+
num_image_formats = FFI::MemoryPointer::new( :cl_uint )
|
110
110
|
error = OpenCL.clGetSupportedImageFormats( self, flags, image_type, 0, nil, num_image_formats )
|
111
111
|
OpenCL.error_check(error)
|
112
112
|
num_entries = num_image_formats.read_cl_uint
|
113
|
-
image_formats = FFI::MemoryPointer
|
113
|
+
image_formats = FFI::MemoryPointer::new( ImageFormat, num_entries )
|
114
114
|
error = OpenCL.clGetSupportedImageFormats( self, flags, image_type, num_entries, image_formats, nil )
|
115
115
|
OpenCL.error_check(error)
|
116
116
|
return num_entries.times.collect { |i|
|
@@ -301,6 +301,43 @@ module OpenCL
|
|
301
301
|
return OpenCL.create_user_event(self)
|
302
302
|
end
|
303
303
|
|
304
|
+
# Links a set of compiled programs for all device in the Context, or a subset of devices
|
305
|
+
#
|
306
|
+
# ==== Attributes
|
307
|
+
#
|
308
|
+
# * +input_programs+ - a single or an Array of Program
|
309
|
+
# * +options+ - a Hash containing named options
|
310
|
+
# * +block+ - if provided, a callback invoked when the Program is built. Signature of the callback is { |Program, FFI::Pointer to user_data| ... }
|
311
|
+
#
|
312
|
+
# ==== Options
|
313
|
+
#
|
314
|
+
# * +:device_list+ - an Array of Device to build the program for
|
315
|
+
# * +:options+ - a String containing the options to use for the build
|
316
|
+
# * +:user_data+ - a Pointer (or convertible to Pointer using to_ptr) to the memory area to pass to the callback
|
317
|
+
def link_program( input_programs, options = {}, &block)
|
318
|
+
return OpenCL.link_program(self, input_programs, options, &block)
|
319
|
+
end
|
320
|
+
|
321
|
+
# Creates a Program from binary
|
322
|
+
#
|
323
|
+
# ==== Attributes
|
324
|
+
#
|
325
|
+
# * +device_list+ - an Array of Device to create the program for. Can throw an OpenCL::Invalid value if the number of supplied devices is different from the number of supplied binaries.
|
326
|
+
# * +binaries+ - Array of binaries
|
327
|
+
def create_program_with_binary( device_list, binaries)
|
328
|
+
return OpenCL.create_program_with_binary(self, device_list, binaries)
|
329
|
+
end
|
330
|
+
|
331
|
+
# Creates a Program from a list of built in kernel names
|
332
|
+
#
|
333
|
+
# ==== Attributes
|
334
|
+
#
|
335
|
+
# * +device_list+ - an Array of Device to create the program for
|
336
|
+
# * +kernel_names+ - a single or an Array of String representing the kernel names
|
337
|
+
def self.create_program_with_built_in_kernels( device_list, kernel_names )
|
338
|
+
return OpenCL.create_program_with_built_in_kernels(self, device_list, kernel_names )
|
339
|
+
end
|
340
|
+
|
304
341
|
# Creates a Program from sources in the Context
|
305
342
|
#
|
306
343
|
# ==== Attributes
|
@@ -25,7 +25,7 @@ module OpenCL
|
|
25
25
|
error = OpenCL.clCreateSubDevice( in_device, props, device_number, devices_ptr, nil )
|
26
26
|
OpenCL.error_check(error)
|
27
27
|
devices_ptr.get_array_of_pointer(0, device_number).collect { |device_ptr|
|
28
|
-
OpenCL::Device
|
28
|
+
OpenCL::Device::new(device_ptr, false)
|
29
29
|
}
|
30
30
|
end
|
31
31
|
|
@@ -116,19 +116,19 @@ module OpenCL
|
|
116
116
|
|
117
117
|
# Returns the platform the Device belongs to
|
118
118
|
def platform
|
119
|
-
ptr = FFI::MemoryPointer
|
119
|
+
ptr = FFI::MemoryPointer::new( OpenCL::Platform )
|
120
120
|
error = OpenCL.clGetDeviceInfo(self, Device::PLATFORM, OpenCL::Platform.size, ptr, nil)
|
121
121
|
OpenCL.error_check(error)
|
122
|
-
return OpenCL::Platform
|
122
|
+
return OpenCL::Platform::new(ptr.read_pointer)
|
123
123
|
end
|
124
124
|
|
125
125
|
# Returns the parent Device if it exists
|
126
126
|
def parent_device
|
127
|
-
ptr = FFI::MemoryPointer
|
127
|
+
ptr = FFI::MemoryPointer::new( OpenCL::Device )
|
128
128
|
error = OpenCL.clGetDeviceInfo(self, Device::PARENT_DEVICE, OpenCL::Device.size, ptr, nil)
|
129
129
|
OpenCL.error_check(error)
|
130
130
|
return nil if ptr.null?
|
131
|
-
return OpenCL::Device
|
131
|
+
return OpenCL::Device::new(ptr.read_pointer)
|
132
132
|
end
|
133
133
|
|
134
134
|
# Partitions the Device in serveral sub-devices
|