opencl_ruby_ffi 1.1.0 → 1.2.0
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.
- checksums.yaml +4 -4
- data/lib/opencl_ruby_ffi/Buffer.rb +4 -3
- data/lib/opencl_ruby_ffi/CommandQueue.rb +57 -56
- data/lib/opencl_ruby_ffi/Context.rb +18 -17
- data/lib/opencl_ruby_ffi/Device.rb +22 -21
- data/lib/opencl_ruby_ffi/Event.rb +12 -11
- data/lib/opencl_ruby_ffi/GLExt.rb +9 -8
- data/lib/opencl_ruby_ffi/Image.rb +11 -10
- data/lib/opencl_ruby_ffi/Kernel.rb +32 -31
- data/lib/opencl_ruby_ffi/Mem.rb +9 -8
- data/lib/opencl_ruby_ffi/Pipe.rb +2 -1
- data/lib/opencl_ruby_ffi/Platform.rb +20 -19
- data/lib/opencl_ruby_ffi/Program.rb +46 -45
- data/lib/opencl_ruby_ffi/SVM.rb +12 -11
- data/lib/opencl_ruby_ffi/Sampler.rb +4 -3
- data/lib/opencl_ruby_ffi/Stream.rb +127 -0
- data/lib/opencl_ruby_ffi/{Arithmetic_gen.rb → opencl_arithmetic_gen.rb} +737 -836
- data/lib/opencl_ruby_ffi/opencl_ruby_ffi_base.rb +49 -69
- data/lib/opencl_ruby_ffi/opencl_ruby_ffi_base_gen.rb +30 -99
- data/lib/opencl_ruby_ffi/opencl_types.rb +114 -0
- data/lib/opencl_ruby_ffi.rb +2 -1
- data/opencl_ruby_ffi.gemspec +2 -2
- metadata +5 -3
@@ -1,53 +1,38 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
class Pointer
|
4
|
-
alias_method :orig_method_missing, :method_missing
|
5
|
-
# if a missing write_type, read_type, get_array_of_type can transitively get a replacement, an alias is created and the method is called
|
6
|
-
def method_missing(m, *a, &b)
|
7
|
-
if m.to_s.match("read_")
|
8
|
-
type = m.to_s.sub("read_","")
|
9
|
-
type = FFI.find_type(type.to_sym)
|
10
|
-
type, _ = FFI::TypeDefs.find do |(name, t)|
|
11
|
-
Pointer.method_defined?("read_#{name}") if t == type
|
12
|
-
end
|
13
|
-
eval "alias :#{m} :read_#{type}" if type
|
14
|
-
return eval "read_#{type}( *a, &b)" if type
|
15
|
-
elsif m.to_s.match ("write_")
|
16
|
-
type = m.to_s.sub("write_","")
|
17
|
-
type = FFI.find_type(type.to_sym)
|
18
|
-
type, _ = FFI::TypeDefs.find do |(name, t)|
|
19
|
-
Pointer.method_defined?("write_#{name}") if t == type
|
20
|
-
end
|
21
|
-
eval "alias :#{m} :write_#{type}" if type
|
22
|
-
return eval "write_#{type}( *a, &b)" if type
|
23
|
-
elsif m.to_s.match ("get_array_of_")
|
24
|
-
type = m.to_s.sub("get_array_of_","")
|
25
|
-
type = FFI.find_type(type.to_sym)
|
26
|
-
type, _ = FFI::TypeDefs.find do |(name, t)|
|
27
|
-
Pointer.method_defined?("get_array_of_#{name}") if t == type
|
28
|
-
end
|
29
|
-
eval "alias :#{m} :get_array_of_#{type}" if type
|
30
|
-
return eval "get_array_of_#{type}( *a, &b)" if type
|
31
|
-
end
|
32
|
-
orig_method_missing m, *a, &b
|
1
|
+
using OpenCLRefinements if RUBY_VERSION.scan(/\d+/).collect(&:to_i).first >= 2
|
33
2
|
|
34
|
-
|
35
|
-
end
|
3
|
+
module OpenCL
|
36
4
|
|
37
|
-
class
|
5
|
+
class Pointer < FFI::Pointer
|
6
|
+
def initialize(*args)
|
7
|
+
if args.length == 2 then
|
8
|
+
super(OpenCL::find_type(args[0]), args[1])
|
9
|
+
else
|
10
|
+
super(*args)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
38
14
|
|
39
|
-
|
40
|
-
|
15
|
+
class Function < FFI::Function
|
16
|
+
def initialize(ret, args, *opts, &block)
|
17
|
+
super(OpenCL::find_type(ret), args.collect { |a| OpenCL::find_type(a) }, *opts, &block)
|
18
|
+
end
|
41
19
|
end
|
42
20
|
|
43
|
-
|
21
|
+
class MemoryPointer < FFI::MemoryPointer
|
44
22
|
|
45
|
-
|
23
|
+
def initialize(size, count = 1, clear = true)
|
24
|
+
if size.is_a?(Symbol)
|
25
|
+
size = OpenCL::find_type(size)
|
26
|
+
end
|
27
|
+
super(size, count, clear)
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
46
31
|
|
47
32
|
@@callbacks = []
|
48
33
|
|
49
34
|
# Maps the :cl_image_fomat type of OpenCL
|
50
|
-
class ImageFormat <
|
35
|
+
class ImageFormat < Struct
|
51
36
|
layout :image_channel_order, :cl_channel_order,
|
52
37
|
:image_channel_data_type, :cl_channel_type
|
53
38
|
|
@@ -56,10 +41,14 @@ module OpenCL
|
|
56
41
|
end
|
57
42
|
|
58
43
|
# Creates a new ImageFormat from an image channel order and data type
|
59
|
-
def initialize( image_channel_order, image_channel_data_type )
|
60
|
-
|
61
|
-
|
62
|
-
|
44
|
+
def initialize( image_channel_order, image_channel_data_type = nil )
|
45
|
+
if image_channel_order.is_a?(FFI::Pointer) and image_channel_data_type.nil? then
|
46
|
+
super(image_channel_order)
|
47
|
+
else
|
48
|
+
super()
|
49
|
+
self[:image_channel_order] = image_channel_order
|
50
|
+
self[:image_channel_data_type] = image_channel_data_type
|
51
|
+
end
|
63
52
|
end
|
64
53
|
|
65
54
|
# Returns a new ChannelOrder corresponding to the ImageFormat internal value
|
@@ -87,21 +76,10 @@ module OpenCL
|
|
87
76
|
return "{ #{self.channel_order}, #{self.channel_data_type} }"
|
88
77
|
end
|
89
78
|
|
90
|
-
# A workaroud to call the parent initialize from another function (from_pointer)
|
91
|
-
def parent_initialize(ptr)
|
92
|
-
super(ptr)
|
93
|
-
end
|
94
|
-
|
95
|
-
# Creates a new ImageFormat using an FFI::Pointer, fonctionality was lost when initialize was defined
|
96
|
-
def self.from_pointer( ptr )
|
97
|
-
object = allocate
|
98
|
-
object.parent_initialize( ptr )
|
99
|
-
object
|
100
|
-
end
|
101
79
|
end
|
102
80
|
|
103
81
|
# Map the :cl_image_desc type of OpenCL
|
104
|
-
class ImageDesc <
|
82
|
+
class ImageDesc < Struct
|
105
83
|
layout :image_type, :cl_mem_object_type,
|
106
84
|
:image_width, :size_t,
|
107
85
|
:image_height, :size_t,
|
@@ -130,7 +108,7 @@ module OpenCL
|
|
130
108
|
end
|
131
109
|
|
132
110
|
# Maps the :cl_buffer_region type of OpenCL
|
133
|
-
class BufferRegion <
|
111
|
+
class BufferRegion < Struct
|
134
112
|
layout :origin, :size_t,
|
135
113
|
:size, :size_t
|
136
114
|
|
@@ -168,7 +146,7 @@ module OpenCL
|
|
168
146
|
num_events = 0
|
169
147
|
if events and events.size > 0 then
|
170
148
|
num_events = events.size
|
171
|
-
events_p =
|
149
|
+
events_p = MemoryPointer::new( Event, num_events )
|
172
150
|
events_p.write_array_of_pointer(events)
|
173
151
|
end
|
174
152
|
return [num_events, events_p]
|
@@ -189,14 +167,14 @@ module OpenCL
|
|
189
167
|
|
190
168
|
# Extracts the origin_symbol and region_symbol named options for image from the given hash. Returns the read (or detemined suitable) origin and region in a tuple
|
191
169
|
def get_origin_region( image, options, origin_symbol, region_symbol )
|
192
|
-
origin =
|
170
|
+
origin = MemoryPointer::new( :size_t, 3 )
|
193
171
|
(0..2).each { |i| origin[i].write_size_t(0) }
|
194
172
|
if options[origin_symbol] then
|
195
173
|
options[origin_symbol].each_with_index { |e, i|
|
196
174
|
origin[i].write_size_t(e)
|
197
175
|
}
|
198
176
|
end
|
199
|
-
region =
|
177
|
+
region = MemoryPointer::new( :size_t, 3 )
|
200
178
|
(0..2).each { |i| region[i].write_size_t(1) }
|
201
179
|
if options[region_symbol] then
|
202
180
|
options[region_symbol].each_with_index { |e, i|
|
@@ -218,11 +196,11 @@ module OpenCL
|
|
218
196
|
return [origin, region]
|
219
197
|
end
|
220
198
|
|
221
|
-
# Extracts the :properties named option (for a Context) from the hash given and returns an
|
199
|
+
# Extracts the :properties named option (for a Context) from the hash given and returns an Pointer to a 0 terminated list of properties
|
222
200
|
def get_context_properties( options )
|
223
201
|
properties = nil
|
224
202
|
if options[:properties] then
|
225
|
-
properties =
|
203
|
+
properties = MemoryPointer::new( :cl_context_properties, options[:properties].length + 1 )
|
226
204
|
options[:properties].each_with_index { |e,i|
|
227
205
|
properties[i].write_cl_context_properties(e.respond_to?(:to_ptr) ? e : e.to_i)
|
228
206
|
}
|
@@ -231,7 +209,7 @@ module OpenCL
|
|
231
209
|
return properties
|
232
210
|
end
|
233
211
|
|
234
|
-
# Extracts the :device_list named option from the hash given and returns [ number of devices, an
|
212
|
+
# Extracts the :device_list named option from the hash given and returns [ number of devices, an Pointer to the list of Device or nil ]
|
235
213
|
def get_device_list( options )
|
236
214
|
devices = options[:device_list]
|
237
215
|
devices = [devices].flatten if devices
|
@@ -239,7 +217,7 @@ module OpenCL
|
|
239
217
|
num_devices = 0
|
240
218
|
if devices and devices.size > 0 then
|
241
219
|
num_devices = devices.size
|
242
|
-
devices_p =
|
220
|
+
devices_p = MemoryPointer::new( Device, num_devices)
|
243
221
|
devices_p.write_array_of_pointer(devices)
|
244
222
|
end
|
245
223
|
return [num_devices, devices_p]
|
@@ -313,10 +291,10 @@ module OpenCL
|
|
313
291
|
klass_name = "MemObject" if klass == "Mem"
|
314
292
|
s = <<EOF
|
315
293
|
def #{name.downcase}
|
316
|
-
ptr1 =
|
294
|
+
ptr1 = MemoryPointer::new( :size_t, 1)
|
317
295
|
error = OpenCL.clGet#{klass_name}Info(self, #{klass}::#{name}, 0, nil, ptr1)
|
318
296
|
error_check(error)
|
319
|
-
ptr2 =
|
297
|
+
ptr2 = MemoryPointer::new( ptr1.read_size_t )
|
320
298
|
error = OpenCL.clGet#{klass_name}Info(self, #{klass}::#{name}, ptr1.read_size_t, ptr2, nil)
|
321
299
|
error_check(error)
|
322
300
|
if(convert_type(:#{type})) then
|
@@ -335,13 +313,13 @@ EOF
|
|
335
313
|
klass_name = "MemObject" if klass == "Mem"
|
336
314
|
s = <<EOF
|
337
315
|
def #{name.downcase}
|
338
|
-
ptr1 =
|
316
|
+
ptr1 = MemoryPointer::new( :size_t, 1)
|
339
317
|
error = OpenCL.clGet#{klass_name}Info(self, #{klass}::#{name}, 0, nil, ptr1)
|
340
318
|
error_check(error)
|
341
|
-
ptr2 =
|
319
|
+
ptr2 = MemoryPointer::new( ptr1.read_size_t )
|
342
320
|
error = OpenCL.clGet#{klass_name}Info(self, #{klass}::#{name}, ptr1.read_size_t, ptr2, nil)
|
343
321
|
error_check(error)
|
344
|
-
arr = ptr2.get_array_of_#{type}(0, ptr1.read_size_t/
|
322
|
+
arr = ptr2.get_array_of_#{type}(0, ptr1.read_size_t/ OpenCL.find_type(:#{type}).size)
|
345
323
|
return arr
|
346
324
|
end
|
347
325
|
EOF
|
@@ -353,3 +331,5 @@ EOF
|
|
353
331
|
#:startdoc:
|
354
332
|
|
355
333
|
end
|
334
|
+
|
335
|
+
CL = OpenCL
|
@@ -1,8 +1,6 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
using OpenCLRefinements if RUBY_VERSION.scan(/\d+/).collect(&:to_i).first >= 2
|
3
2
|
# Maps the OpenCL API using FFI
|
4
3
|
module OpenCL
|
5
|
-
extend FFI::Library
|
6
4
|
begin
|
7
5
|
ffi_lib ENV["LIBOPENCL_SO"]
|
8
6
|
rescue LoadError => e
|
@@ -2317,77 +2315,10 @@ module OpenCL
|
|
2317
2315
|
CLASSES[-4] = MEM_OBJECT_ALLOCATION_FAILURE
|
2318
2316
|
MemObjectAllocationFailure = MEM_OBJECT_ALLOCATION_FAILURE
|
2319
2317
|
end
|
2320
|
-
|
2321
|
-
FFI.typedef :uint8, :cl_uchar
|
2322
|
-
FFI.typedef :int16, :cl_short
|
2323
|
-
FFI.typedef :uint16, :cl_ushort
|
2324
|
-
FFI.typedef :int32, :cl_int
|
2325
|
-
FFI.typedef :uint32, :cl_uint
|
2326
|
-
FFI.typedef :int64, :cl_long
|
2327
|
-
FFI.typedef :uint64, :cl_ulong
|
2328
|
-
FFI.typedef :uint16, :cl_half
|
2329
|
-
FFI.typedef :float, :cl_float
|
2330
|
-
FFI.typedef :double, :cl_double
|
2331
|
-
FFI.typedef :uint32, :cl_GLuint
|
2332
|
-
FFI.typedef :int32, :cl_GLint
|
2333
|
-
FFI.typedef :uint32, :cl_GLenum
|
2334
|
-
FFI.typedef :cl_uint, :cl_bool
|
2335
|
-
FFI.typedef :cl_ulong, :cl_bitfield
|
2336
|
-
FFI.typedef :cl_bitfield, :cl_device_type
|
2337
|
-
FFI.typedef :cl_uint, :cl_platform_info
|
2338
|
-
FFI.typedef :cl_uint, :cl_device_info
|
2339
|
-
FFI.typedef :cl_bitfield, :cl_device_fp_config
|
2340
|
-
FFI.typedef :cl_uint, :cl_device_mem_cache_type
|
2341
|
-
FFI.typedef :cl_uint, :cl_device_local_mem_type
|
2342
|
-
FFI.typedef :cl_bitfield, :cl_device_exec_capabilities
|
2343
|
-
FFI.typedef :cl_bitfield, :cl_device_svm_capabilities
|
2344
|
-
FFI.typedef :cl_bitfield, :cl_command_queue_properties
|
2345
|
-
FFI.typedef :pointer, :cl_device_partition_property
|
2346
|
-
FFI.typedef :cl_bitfield, :cl_device_affinity_domain
|
2347
|
-
FFI.typedef :pointer, :cl_context_properties
|
2348
|
-
FFI.typedef :cl_uint, :cl_context_info
|
2349
|
-
FFI.typedef :cl_bitfield, :cl_queue_properties
|
2350
|
-
FFI.typedef :cl_uint, :cl_command_queue_info
|
2351
|
-
FFI.typedef :cl_uint, :cl_channel_order
|
2352
|
-
FFI.typedef :cl_uint, :cl_channel_type
|
2353
|
-
FFI.typedef :cl_bitfield, :cl_mem_flags
|
2354
|
-
FFI.typedef :cl_bitfield, :cl_svm_mem_flags
|
2355
|
-
FFI.typedef :cl_uint, :cl_mem_object_type
|
2356
|
-
FFI.typedef :cl_uint, :cl_mem_info
|
2357
|
-
FFI.typedef :cl_bitfield, :cl_mem_migration_flags
|
2358
|
-
FFI.typedef :cl_uint, :cl_image_info
|
2359
|
-
FFI.typedef :cl_uint, :cl_buffer_create_type
|
2360
|
-
FFI.typedef :cl_uint, :cl_addressing_mode
|
2361
|
-
FFI.typedef :cl_uint, :cl_filter_mode
|
2362
|
-
FFI.typedef :cl_uint, :cl_sampler_info
|
2363
|
-
FFI.typedef :cl_bitfield, :cl_map_flags
|
2364
|
-
FFI.typedef :pointer, :cl_pipe_properties
|
2365
|
-
FFI.typedef :cl_uint, :cl_pipe_info
|
2366
|
-
FFI.typedef :cl_uint, :cl_program_info
|
2367
|
-
FFI.typedef :cl_uint, :cl_program_build_info
|
2368
|
-
FFI.typedef :cl_uint, :cl_program_binary_type
|
2369
|
-
FFI.typedef :cl_int, :cl_build_status
|
2370
|
-
FFI.typedef :cl_uint, :cl_kernel_info
|
2371
|
-
FFI.typedef :cl_uint, :cl_kernel_arg_info
|
2372
|
-
FFI.typedef :cl_uint, :cl_kernel_arg_address_qualifier
|
2373
|
-
FFI.typedef :cl_uint, :cl_kernel_arg_access_qualifier
|
2374
|
-
FFI.typedef :cl_bitfield, :cl_kernel_arg_type_qualifier
|
2375
|
-
FFI.typedef :cl_uint, :cl_kernel_work_group_info
|
2376
|
-
FFI.typedef :cl_uint, :cl_kernel_sub_group_info
|
2377
|
-
FFI.typedef :cl_uint, :cl_event_info
|
2378
|
-
FFI.typedef :cl_uint, :cl_command_type
|
2379
|
-
FFI.typedef :cl_uint, :cl_profiling_info
|
2380
|
-
FFI.typedef :cl_bitfield, :cl_sampler_properties
|
2381
|
-
FFI.typedef :cl_uint, :cl_kernel_exec_info
|
2382
|
-
FFI.typedef :cl_uint, :cl_gl_object_type
|
2383
|
-
FFI.typedef :cl_uint, :cl_gl_texture_info
|
2384
|
-
FFI.typedef :cl_uint, :cl_gl_platform_info
|
2385
|
-
FFI.typedef :cl_uint, :cl_gl_context_info
|
2386
|
-
FFI.typedef :cl_uint, :cl_queue_priority_khr
|
2387
|
-
FFI.typedef :cl_uint, :cl_queue_throttle_khr
|
2318
|
+
|
2388
2319
|
# A parent class to represent OpenCL enums that use :cl_uint
|
2389
2320
|
class Enum
|
2390
|
-
# extend
|
2321
|
+
# extend DataConverter
|
2391
2322
|
# native_type :cl_uint
|
2392
2323
|
class << self
|
2393
2324
|
attr_reader :codes
|
@@ -2434,7 +2365,7 @@ module OpenCL
|
|
2434
2365
|
|
2435
2366
|
# Enum should be considered an integer
|
2436
2367
|
def coerce(other)
|
2437
|
-
return [other,
|
2368
|
+
return [other, Pointer::new(self.to_i)] if other.is_a?(Pointer)
|
2438
2369
|
return [other, self.to_i]
|
2439
2370
|
end
|
2440
2371
|
|
@@ -2462,7 +2393,7 @@ module OpenCL
|
|
2462
2393
|
# end
|
2463
2394
|
#
|
2464
2395
|
# def self.size
|
2465
|
-
#
|
2396
|
+
# find_type(:cl_uint).size
|
2466
2397
|
# end
|
2467
2398
|
#
|
2468
2399
|
# def self.reference_required?
|
@@ -2474,13 +2405,13 @@ module OpenCL
|
|
2474
2405
|
|
2475
2406
|
# A parent class to represent enums that use cl_int
|
2476
2407
|
class EnumInt < Enum
|
2477
|
-
# extend
|
2408
|
+
# extend DataConverter
|
2478
2409
|
# native_type :cl_int
|
2479
2410
|
end
|
2480
2411
|
|
2481
2412
|
# A parent class to represent OpenCL bitfields that use :cl_bitfield
|
2482
2413
|
class Bitfield
|
2483
|
-
# extend
|
2414
|
+
# extend DataConverter
|
2484
2415
|
# native_type :cl_bitfield
|
2485
2416
|
|
2486
2417
|
# Initializes a new Bitfield to val
|
@@ -2559,7 +2490,7 @@ module OpenCL
|
|
2559
2490
|
# end
|
2560
2491
|
#
|
2561
2492
|
# def self.size
|
2562
|
-
#
|
2493
|
+
# find_type(:cl_bitfield).size
|
2563
2494
|
# end
|
2564
2495
|
#
|
2565
2496
|
# def self.reference_required?
|
@@ -2568,7 +2499,7 @@ module OpenCL
|
|
2568
2499
|
# #:startdoc:
|
2569
2500
|
|
2570
2501
|
end
|
2571
|
-
class Platform <
|
2502
|
+
class Platform < ManagedStruct
|
2572
2503
|
layout :dummy, :pointer
|
2573
2504
|
#:stopdoc:
|
2574
2505
|
PROFILE = 0x0900
|
@@ -2600,7 +2531,7 @@ module OpenCL
|
|
2600
2531
|
|
2601
2532
|
end
|
2602
2533
|
|
2603
|
-
class Device <
|
2534
|
+
class Device < ManagedStruct
|
2604
2535
|
layout :dummy, :pointer
|
2605
2536
|
#:stopdoc:
|
2606
2537
|
TYPE_DEFAULT = (1 << 0)
|
@@ -2732,7 +2663,7 @@ module OpenCL
|
|
2732
2663
|
# Creates a new Device and retains it if specified and aplicable
|
2733
2664
|
def initialize(ptr, retain = true)
|
2734
2665
|
super(ptr)
|
2735
|
-
platform =
|
2666
|
+
platform = MemoryPointer::new( Platform )
|
2736
2667
|
OpenCL.clGetDeviceInfo( ptr, OpenCL::Device::PLATFORM, platform.size, platform, nil)
|
2737
2668
|
p = OpenCL::Platform::new(platform.read_pointer)
|
2738
2669
|
if p.version_number >= 1.2 and retain then
|
@@ -2744,7 +2675,7 @@ module OpenCL
|
|
2744
2675
|
|
2745
2676
|
# method called at Device deletion, releases the object if aplicable
|
2746
2677
|
def self.release(ptr)
|
2747
|
-
platform =
|
2678
|
+
platform = MemoryPointer::new( Platform )
|
2748
2679
|
OpenCL.clGetDeviceInfo( ptr, OpenCL::Device::PLATFORM, platform.size, platform, nil)
|
2749
2680
|
p = OpenCL::Platform::new(platform.read_pointer)
|
2750
2681
|
if p.version_number >= 1.2 then
|
@@ -2889,7 +2820,7 @@ module OpenCL
|
|
2889
2820
|
end
|
2890
2821
|
|
2891
2822
|
end
|
2892
|
-
class Context <
|
2823
|
+
class Context < ManagedStruct
|
2893
2824
|
layout :dummy, :pointer
|
2894
2825
|
#:stopdoc:
|
2895
2826
|
REFERENCE_COUNT = 0x1080
|
@@ -2911,7 +2842,7 @@ module OpenCL
|
|
2911
2842
|
# method called at Context deletion, releases the object if aplicable
|
2912
2843
|
def self.release(ptr)
|
2913
2844
|
#STDERR.puts "Releasing Context: #{ptr}"
|
2914
|
-
#ref_count =
|
2845
|
+
#ref_count = MemoryPointer::new( :cl_uint )
|
2915
2846
|
#OpenCL.clGetContextInfo(ptr, OpenCL::Context::REFERENCE_COUNT, ref_count.size, ref_count, nil)
|
2916
2847
|
#STDERR.puts "reference counter: #{ref_count.read_cl_uint}"
|
2917
2848
|
error = OpenCL.clReleaseContext(ptr)
|
@@ -2964,7 +2895,7 @@ module OpenCL
|
|
2964
2895
|
end
|
2965
2896
|
end
|
2966
2897
|
|
2967
|
-
class CommandQueue <
|
2898
|
+
class CommandQueue < ManagedStruct
|
2968
2899
|
layout :dummy, :pointer
|
2969
2900
|
#:stopdoc:
|
2970
2901
|
OUT_OF_ORDER_EXEC_MODE_ENABLE = (1 << 0)
|
@@ -2995,7 +2926,7 @@ module OpenCL
|
|
2995
2926
|
# method called at CommandQueue deletion, releases the object if aplicable
|
2996
2927
|
def self.release(ptr)
|
2997
2928
|
#STDERR.puts "Releasing CommandQueue: #{ptr}"
|
2998
|
-
#ref_count =
|
2929
|
+
#ref_count = MemoryPointer::new( :cl_uint )
|
2999
2930
|
#OpenCL.clGetCommandQueueInfo(ptr, OpenCL::CommandQueue::REFERENCE_COUNT, ref_count.size, ref_count, nil)
|
3000
2931
|
#STDERR.puts "reference counter: #{ref_count.read_cl_uint}"
|
3001
2932
|
error = OpenCL.clReleaseCommandQueue(ptr)
|
@@ -3050,7 +2981,7 @@ module OpenCL
|
|
3050
2981
|
@codes[(1 << 2)] = 'THROTTLE_LOW_KHR'
|
3051
2982
|
end
|
3052
2983
|
end
|
3053
|
-
class Mem <
|
2984
|
+
class Mem < ManagedStruct
|
3054
2985
|
layout :dummy, :pointer
|
3055
2986
|
#:stopdoc:
|
3056
2987
|
READ_WRITE = (1 << 0)
|
@@ -3099,7 +3030,7 @@ module OpenCL
|
|
3099
3030
|
# method called at Mem deletion, releases the object if aplicable
|
3100
3031
|
def self.release(ptr)
|
3101
3032
|
#STDERR.puts "Releasing Mem: #{ptr}"
|
3102
|
-
#ref_count =
|
3033
|
+
#ref_count = MemoryPointer::new( :cl_uint )
|
3103
3034
|
#OpenCL.clGetMemObjectInfo(ptr, OpenCL::Mem::REFERENCE_COUNT, ref_count.size, ref_count, nil)
|
3104
3035
|
#STDERR.puts "reference counter: #{ref_count.read_cl_uint}"
|
3105
3036
|
error = OpenCL.clReleaseMemObject(ptr)
|
@@ -3196,7 +3127,7 @@ module OpenCL
|
|
3196
3127
|
end
|
3197
3128
|
|
3198
3129
|
end
|
3199
|
-
class Program <
|
3130
|
+
class Program < ManagedStruct
|
3200
3131
|
layout :dummy, :pointer
|
3201
3132
|
#:stopdoc:
|
3202
3133
|
REFERENCE_COUNT = 0x1160
|
@@ -3230,7 +3161,7 @@ module OpenCL
|
|
3230
3161
|
# method called at Program deletion, releases the object if aplicable
|
3231
3162
|
def self.release(ptr)
|
3232
3163
|
#STDERR.puts "Releasing Program: #{ptr}"
|
3233
|
-
#ref_count =
|
3164
|
+
#ref_count = MemoryPointer::new( :cl_uint )
|
3234
3165
|
#OpenCL.clGetProgramInfo(ptr, OpenCL::Program::REFERENCE_COUNT, ref_count.size, ref_count, nil)
|
3235
3166
|
#STDERR.puts "reference counter: #{ref_count.read_cl_uint}"
|
3236
3167
|
error = OpenCL.clReleaseProgram(ptr)
|
@@ -3266,7 +3197,7 @@ module OpenCL
|
|
3266
3197
|
end
|
3267
3198
|
|
3268
3199
|
end
|
3269
|
-
class Kernel <
|
3200
|
+
class Kernel < ManagedStruct
|
3270
3201
|
layout :dummy, :pointer
|
3271
3202
|
#:stopdoc:
|
3272
3203
|
FUNCTION_NAME = 0x1190
|
@@ -3317,7 +3248,7 @@ module OpenCL
|
|
3317
3248
|
# method called at Kernel deletion, releases the object if aplicable
|
3318
3249
|
def self.release(ptr)
|
3319
3250
|
#STDERR.puts "Releasing Kernel: #{ptr}"
|
3320
|
-
#ref_count =
|
3251
|
+
#ref_count = MemoryPointer::new( :cl_uint )
|
3321
3252
|
#OpenCL.clGetKernelInfo(ptr, OpenCL::Kernel::REFERENCE_COUNT, ref_count.size, ref_count, nil)
|
3322
3253
|
#STDERR.puts "reference counter: #{ref_count.read_cl_uint}"
|
3323
3254
|
error = OpenCL.clReleaseKernel(ptr)
|
@@ -3405,7 +3336,7 @@ module OpenCL
|
|
3405
3336
|
|
3406
3337
|
end
|
3407
3338
|
end
|
3408
|
-
class Event <
|
3339
|
+
class Event < ManagedStruct
|
3409
3340
|
layout :dummy, :pointer
|
3410
3341
|
#:stopdoc:
|
3411
3342
|
COMMAND_QUEUE = 0x11D0
|
@@ -3424,7 +3355,7 @@ module OpenCL
|
|
3424
3355
|
# method called at Event deletion, releases the object if aplicable
|
3425
3356
|
def self.release(ptr)
|
3426
3357
|
#STDERR.puts "Releasing Event: #{ptr}"
|
3427
|
-
#ref_count =
|
3358
|
+
#ref_count = MemoryPointer::new( :cl_uint )
|
3428
3359
|
#OpenCL.clGetEventInfo(ptr, OpenCL::Event::REFERENCE_COUNT, ref_count.size, ref_count, nil)
|
3429
3360
|
#STDERR.puts "reference counter: #{ref_count.read_cl_uint}"
|
3430
3361
|
error = OpenCL.clReleaseEvent(ptr)
|
@@ -3443,7 +3374,7 @@ module OpenCL
|
|
3443
3374
|
|
3444
3375
|
end
|
3445
3376
|
|
3446
|
-
class Sampler <
|
3377
|
+
class Sampler < ManagedStruct
|
3447
3378
|
layout :dummy, :pointer
|
3448
3379
|
#:stopdoc:
|
3449
3380
|
REFERENCE_COUNT = 0x1150
|
@@ -3465,7 +3396,7 @@ module OpenCL
|
|
3465
3396
|
# method called at Sampler deletion, releases the object if aplicable
|
3466
3397
|
def self.release(ptr)
|
3467
3398
|
#STDERR.puts "Releasing Sampler: #{ptr}"
|
3468
|
-
#ref_count =
|
3399
|
+
#ref_count = MemoryPointer::new( :cl_uint )
|
3469
3400
|
#OpenCL.clGetSamplerInfo(ptr, OpenCL::Sampler::REFERENCE_COUNT, ref_count.size, ref_count, nil)
|
3470
3401
|
#STDERR.puts "reference counter: #{ref_count.read_cl_uint}"
|
3471
3402
|
error = OpenCL.clReleaseSampler(ptr)
|
@@ -3483,7 +3414,7 @@ module OpenCL
|
|
3483
3414
|
end
|
3484
3415
|
|
3485
3416
|
end
|
3486
|
-
class GLsync <
|
3417
|
+
class GLsync < ManagedStruct
|
3487
3418
|
layout :dummy, :pointer
|
3488
3419
|
#:stopdoc:
|
3489
3420
|
|
@@ -3928,13 +3859,13 @@ module OpenCL
|
|
3928
3859
|
attach_function :clCloneKernel, [Kernel,:pointer], Kernel
|
3929
3860
|
attach_function :clGetKernelSubGroupInfo, [Kernel,Device,:cl_kernel_sub_group_info,:size_t,:pointer,:size_t,:pointer,:pointer], :cl_int
|
3930
3861
|
attach_function :clEnqueueSVMMigrateMem, [CommandQueue,:cl_uint,:pointer,:pointer,:cl_mem_migration_flags,:cl_uint,:pointer,:pointer], :cl_int
|
3931
|
-
rescue
|
3862
|
+
rescue NotFoundError => e
|
3932
3863
|
warn "Warning OpenCL 2.0 loader detected!"
|
3933
3864
|
end
|
3934
|
-
rescue
|
3865
|
+
rescue NotFoundError => e
|
3935
3866
|
warn "Warning OpenCL 1.2 loader detected!"
|
3936
3867
|
end
|
3937
|
-
rescue
|
3868
|
+
rescue NotFoundError => e
|
3938
3869
|
warn "Warning OpenCL 1.1 loader detected!"
|
3939
3870
|
end
|
3940
3871
|
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
require 'ffi'
|
2
|
+
|
3
|
+
module OpenCL
|
4
|
+
include FFI
|
5
|
+
extend Library
|
6
|
+
|
7
|
+
TYPES = [
|
8
|
+
[ :int8, :cl_char ],
|
9
|
+
[ :uint8, :cl_uchar ],
|
10
|
+
[ :int16, :cl_short ],
|
11
|
+
[ :uint16, :cl_ushort ],
|
12
|
+
[ :int32, :cl_int ],
|
13
|
+
[ :uint32, :cl_uint ],
|
14
|
+
[ :int64, :cl_long ],
|
15
|
+
[ :uint64, :cl_ulong ],
|
16
|
+
[ :uint16, :cl_half ],
|
17
|
+
[ :float, :cl_float ],
|
18
|
+
[ :double, :cl_double ],
|
19
|
+
[ :uint32, :cl_GLuint ],
|
20
|
+
[ :int32, :cl_GLint ],
|
21
|
+
[ :uint32, :cl_GLenum ],
|
22
|
+
[ :cl_uint, :cl_bool ],
|
23
|
+
[ :cl_ulong, :cl_bitfield ],
|
24
|
+
[ :cl_bitfield, :cl_device_type ],
|
25
|
+
[ :cl_uint, :cl_platform_info ],
|
26
|
+
[ :cl_uint, :cl_device_info ],
|
27
|
+
[ :cl_bitfield, :cl_device_fp_config ],
|
28
|
+
[ :cl_uint, :cl_device_mem_cache_type ],
|
29
|
+
[ :cl_uint, :cl_device_local_mem_type ],
|
30
|
+
[ :cl_bitfield, :cl_device_exec_capabilities ],
|
31
|
+
[ :cl_bitfield, :cl_device_svm_capabilities ],
|
32
|
+
[ :cl_bitfield, :cl_command_queue_properties ],
|
33
|
+
[ :pointer, :cl_device_partition_property ],
|
34
|
+
[ :cl_bitfield, :cl_device_affinity_domain ],
|
35
|
+
[ :pointer, :cl_context_properties ],
|
36
|
+
[ :cl_uint, :cl_context_info ],
|
37
|
+
[ :cl_bitfield, :cl_queue_properties ],
|
38
|
+
[ :cl_uint, :cl_command_queue_info ],
|
39
|
+
[ :cl_uint, :cl_channel_order ],
|
40
|
+
[ :cl_uint, :cl_channel_type ],
|
41
|
+
[ :cl_bitfield, :cl_mem_flags ],
|
42
|
+
[ :cl_bitfield, :cl_svm_mem_flags ],
|
43
|
+
[ :cl_uint, :cl_mem_object_type ],
|
44
|
+
[ :cl_uint, :cl_mem_info ],
|
45
|
+
[ :cl_bitfield, :cl_mem_migration_flags ],
|
46
|
+
[ :cl_uint, :cl_image_info ],
|
47
|
+
[ :cl_uint, :cl_buffer_create_type ],
|
48
|
+
[ :cl_uint, :cl_addressing_mode ],
|
49
|
+
[ :cl_uint, :cl_filter_mode ],
|
50
|
+
[ :cl_uint, :cl_sampler_info ],
|
51
|
+
[ :cl_bitfield, :cl_map_flags ],
|
52
|
+
[ :pointer, :cl_pipe_properties ],
|
53
|
+
[ :cl_uint, :cl_pipe_info ],
|
54
|
+
[ :cl_uint, :cl_program_info ],
|
55
|
+
[ :cl_uint, :cl_program_build_info ],
|
56
|
+
[ :cl_uint, :cl_program_binary_type ],
|
57
|
+
[ :cl_int, :cl_build_status ],
|
58
|
+
[ :cl_uint, :cl_kernel_info ],
|
59
|
+
[ :cl_uint, :cl_kernel_arg_info ],
|
60
|
+
[ :cl_uint, :cl_kernel_arg_address_qualifier ],
|
61
|
+
[ :cl_uint, :cl_kernel_arg_access_qualifier ],
|
62
|
+
[ :cl_bitfield, :cl_kernel_arg_type_qualifier ],
|
63
|
+
[ :cl_uint, :cl_kernel_work_group_info ],
|
64
|
+
[ :cl_uint, :cl_kernel_sub_group_info ],
|
65
|
+
[ :cl_uint, :cl_event_info ],
|
66
|
+
[ :cl_uint, :cl_command_type ],
|
67
|
+
[ :cl_uint, :cl_profiling_info ],
|
68
|
+
[ :cl_bitfield, :cl_sampler_properties ],
|
69
|
+
[ :cl_uint, :cl_kernel_exec_info ],
|
70
|
+
[ :cl_uint, :cl_gl_object_type ],
|
71
|
+
[ :cl_uint, :cl_gl_texture_info ],
|
72
|
+
[ :cl_uint, :cl_gl_platform_info ],
|
73
|
+
[ :cl_uint, :cl_gl_context_info ],
|
74
|
+
[ :cl_uint, :cl_queue_priority_khr ],
|
75
|
+
[ :cl_uint, :cl_queue_throttle_khr ]
|
76
|
+
]
|
77
|
+
|
78
|
+
TYPES.each { |orig, add|
|
79
|
+
typedef orig, add
|
80
|
+
}
|
81
|
+
TYPES.push [ FFI::TypeDefs.find { |name,t| t == FFI.find_type(:size_t) }.first, :size_t]
|
82
|
+
end
|
83
|
+
|
84
|
+
if RUBY_VERSION.scan(/\d+/).collect(&:to_i).first >= 2
|
85
|
+
|
86
|
+
module OpenCLRefinements
|
87
|
+
|
88
|
+
refine FFI::Pointer do
|
89
|
+
methods_prefix = [:put, :get, :write, :read, :put_array_of, :get_array_of]
|
90
|
+
OpenCL::TYPES.each { |orig, add|
|
91
|
+
methods_prefix.each { |meth|
|
92
|
+
alias_method "#{meth}_#{add}".to_sym, "#{meth}_#{orig}".to_sym
|
93
|
+
}
|
94
|
+
}
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
using OpenCLRefinements
|
99
|
+
else
|
100
|
+
|
101
|
+
class FFI::Pointer
|
102
|
+
methods_prefix = [:put, :get, :write, :read, :put_array_of, :get_array_of]
|
103
|
+
OpenCL::TYPES.each { |orig, add|
|
104
|
+
methods_prefix.each { |meth|
|
105
|
+
alias_method "#{meth}_#{add}".to_sym, "#{meth}_#{orig}".to_sym
|
106
|
+
}
|
107
|
+
}
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
|
112
|
+
module OpenCL
|
113
|
+
remove_const(:TYPES)
|
114
|
+
end
|
data/lib/opencl_ruby_ffi.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
+
require "opencl_ruby_ffi/opencl_types.rb"
|
1
2
|
require "opencl_ruby_ffi/opencl_ruby_ffi_base_gen.rb"
|
3
|
+
require "opencl_ruby_ffi/opencl_arithmetic_gen.rb"
|
2
4
|
require "opencl_ruby_ffi/opencl_ruby_ffi_base.rb"
|
3
|
-
require "opencl_ruby_ffi/Arithmetic_gen.rb"
|
4
5
|
require "opencl_ruby_ffi/Context.rb"
|
5
6
|
require "opencl_ruby_ffi/Platform.rb"
|
6
7
|
require "opencl_ruby_ffi/Device.rb"
|
data/opencl_ruby_ffi.gemspec
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'opencl_ruby_ffi'
|
3
|
-
s.version = "1.
|
3
|
+
s.version = "1.2.0"
|
4
4
|
s.author = "Brice Videau"
|
5
5
|
s.email = "brice.videau@imag.fr"
|
6
6
|
s.homepage = "https://github.com/Nanosim-LIG/opencl-ruby"
|
7
7
|
s.summary = "Ruby OpenCL FFI bindings"
|
8
8
|
s.description = "Ruby OpenCL FFI bindings. OpenCL 2.1 ready"
|
9
|
-
s.files =
|
9
|
+
s.files = Dir[ 'opencl_ruby_ffi.gemspec', 'LICENSE', 'lib/**/*']
|
10
10
|
s.has_rdoc = true
|
11
11
|
s.license = 'BSD'
|
12
12
|
s.required_ruby_version = '>= 1.8.7'
|