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
@@ -11,29 +11,176 @@ module OpenCL
|
|
11
11
|
# ==== Options
|
12
12
|
#
|
13
13
|
# * +:device_list+ - an Array of Device to build the program for
|
14
|
-
# * +:user_data+ - a Pointer (or convertible to Pointer using to_ptr) to the memory area to pass to the callback
|
15
14
|
# * +:options+ - a String containing the options to use for the build
|
15
|
+
# * +:user_data+ - a Pointer (or convertible to Pointer using to_ptr) to the memory area to pass to the callback
|
16
16
|
def self.build_program(program, options = {}, &block)
|
17
17
|
@@callbacks.push( block ) if block
|
18
|
+
devices = options[:device_list]
|
19
|
+
devices = [devices].flatten if devices
|
20
|
+
devices_p = nil
|
21
|
+
num_devices = 0
|
22
|
+
if devices and devices.size > 0 then
|
23
|
+
num_devices = devices.size
|
24
|
+
devices_p = FFI::MemoryPointer::new( Device, num_devices)
|
25
|
+
num_devices.times { |indx|
|
26
|
+
devices_p[indx].write_pointer(devices[indx])
|
27
|
+
}
|
28
|
+
end
|
29
|
+
opt = ""
|
30
|
+
opt = options[:options] if options[:options]
|
31
|
+
options_p = FFI::MemoryPointer.from_string(opt)
|
32
|
+
error = OpenCL.clBuildProgram(program, num_devices, devices_p, options_p, block, options[:user_data] )
|
33
|
+
OpenCL.error_check(error)
|
34
|
+
return program
|
35
|
+
end
|
36
|
+
|
37
|
+
# Links a set of compiled programs for all device in a Context, or a subset of devices
|
38
|
+
#
|
39
|
+
# ==== Attributes
|
40
|
+
#
|
41
|
+
# * +context+ - Context the created Program will be associated with
|
42
|
+
# * +input_programs+ - a single or an Array of Program
|
43
|
+
# * +options+ - a Hash containing named options
|
44
|
+
# * +block+ - if provided, a callback invoked when the Program is built. Signature of the callback is { |Program, FFI::Pointer to user_data| ... }
|
45
|
+
#
|
46
|
+
# ==== Options
|
47
|
+
#
|
48
|
+
# * +:device_list+ - an Array of Device to build the program for
|
49
|
+
# * +:options+ - a String containing the options to use for the build
|
50
|
+
# * +:user_data+ - a Pointer (or convertible to Pointer using to_ptr) to the memory area to pass to the callback
|
51
|
+
def self.link_program(context, input_programs, options = {}, &block)
|
52
|
+
@@callbacks.push( block ) if block
|
53
|
+
devices = options[:device_list]
|
54
|
+
devices = [devices].flatten if devices
|
55
|
+
devices_p = nil
|
56
|
+
num_devices = 0
|
57
|
+
if devices and devices.size > 0 then
|
58
|
+
num_devices = devices.size
|
59
|
+
devices_p = FFI::MemoryPointer::new( Device, num_devices)
|
60
|
+
num_devices.times { |indx|
|
61
|
+
devices_p[indx].write_pointer(devices[indx])
|
62
|
+
}
|
63
|
+
end
|
18
64
|
opt = ""
|
19
65
|
opt = options[:options] if options[:options]
|
20
66
|
options_p = FFI::MemoryPointer.from_string(opt)
|
67
|
+
programs = [input_programs].flatten
|
68
|
+
num_programs = programs.length
|
69
|
+
programs_p = FFI::MemoryPointer::new( Program, num_programs )
|
70
|
+
programs.each_with_index { |e, i|
|
71
|
+
programs_p[i].write_pointer(e)
|
72
|
+
}
|
73
|
+
error = FFI::MemoryPointer::new( :cl_int )
|
74
|
+
prog = OpenCL.clLinkProgram( context, num_devices, devices_p, options_p, num_programs, programs_p, block, options[:user_data], error)
|
75
|
+
OpenCL.error_check(error.read_cl_int)
|
76
|
+
return OpenCL::Program::new( prog, false )
|
77
|
+
end
|
78
|
+
|
79
|
+
# Compiles a Program created from sources
|
80
|
+
#
|
81
|
+
# ==== Attributes
|
82
|
+
#
|
83
|
+
# * +program+ - the program to build
|
84
|
+
# * +options+ - a Hash containing named options
|
85
|
+
# * +block+ - if provided, a callback invoked when the Program is compiled. Signature of the callback is { |Program, FFI::Pointer to user_data| ... }
|
86
|
+
#
|
87
|
+
# ==== Options
|
88
|
+
#
|
89
|
+
# * +:device_list+ - an Array of Device to build the program for
|
90
|
+
# * +:user_data+ - a Pointer (or convertible to Pointer using to_ptr) to the memory area to pass to the callback
|
91
|
+
# * +:options+ - a String containing the options to use for the compilation
|
92
|
+
# * +:input_headers+ - a Hash containing pairs of : String: header_include_name => Program: header
|
93
|
+
def self.compile_program(program, options = {}, &block)
|
94
|
+
@@callback.push( block ) if block
|
21
95
|
devices = options[:device_list]
|
22
96
|
devices = [devices].flatten if devices
|
23
97
|
devices_p = nil
|
24
98
|
num_devices = 0
|
25
99
|
if devices and devices.size > 0 then
|
26
100
|
num_devices = devices.size
|
27
|
-
devices_p = FFI::MemoryPointer
|
101
|
+
devices_p = FFI::MemoryPointer::new( Device, num_devices)
|
28
102
|
num_devices.times { |indx|
|
29
|
-
devices_p.
|
103
|
+
devices_p[indx].write_pointer(devices[indx])
|
104
|
+
}
|
105
|
+
end
|
106
|
+
opt = ""
|
107
|
+
opt = options[:options] if options[:options]
|
108
|
+
options_p = FFI::MemoryPointer.from_string(opt)
|
109
|
+
headers = options[:input_headers]
|
110
|
+
headers_p = nil
|
111
|
+
header_include_names = nil
|
112
|
+
num_headers = 0
|
113
|
+
num_headers = headers.length if headers
|
114
|
+
if num_headers then
|
115
|
+
headers_p = FFI::MemoryPointer::new( Program, num_headers )
|
116
|
+
header_include_names = FFI::MemoryPointer::new( :pointer, num_headers )
|
117
|
+
indx = 0
|
118
|
+
headers.each { |key, value|
|
119
|
+
headers_p[indx].write_pointer(value)
|
120
|
+
header_include_names[indx] = FFI::MemoryPointer.from_string(key)
|
121
|
+
indx = indx + 1
|
30
122
|
}
|
31
123
|
end
|
32
|
-
|
33
|
-
OpenCL.error_check(
|
124
|
+
error = OpenCL.clCompileProgram(program, num_devices, devices_p, options_p, num_headers, headers_p, header_include_names, block, options[:user_data] )
|
125
|
+
OpenCL.error_check(error)
|
34
126
|
return program
|
35
127
|
end
|
36
128
|
|
129
|
+
# Creates a Program from a list of built in kernel names
|
130
|
+
#
|
131
|
+
# ==== Attributes
|
132
|
+
#
|
133
|
+
# * +context+ - Context the created Program will be associated to
|
134
|
+
# * +device_list+ - an Array of Device to create the program for
|
135
|
+
# * +kernel_names+ - a single or an Array of String representing the kernel names
|
136
|
+
def self.create_program_with_built_in_kernels(context, device_list, kernel_names)
|
137
|
+
devices = [device_list].flatten
|
138
|
+
num_devices = devices.length
|
139
|
+
devices_p = FFI::MemoryPointer::new( Device, num_devices )
|
140
|
+
num_devices.times { |indx|
|
141
|
+
devices_p[indx].write_pointer(devices[indx])
|
142
|
+
}
|
143
|
+
names = [kernel_names].flatten.join(",")
|
144
|
+
names_p = FFI::MemoryPointer.from_string(names)
|
145
|
+
error = FFI::MemoryPointer::new( :cl_int )
|
146
|
+
prog = OpenCL.clCreateProgramWithBuiltInKernels( context, num_devices, devices_p, names_p, error )
|
147
|
+
OpenCL.error_check(error.read_cl_int)
|
148
|
+
return OpenCL::Program::new(prog, false)
|
149
|
+
end
|
150
|
+
|
151
|
+
# Creates a Program from binary
|
152
|
+
#
|
153
|
+
# ==== Attributes
|
154
|
+
#
|
155
|
+
# * +context+ - Context the created Program will be associated to
|
156
|
+
# * +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.
|
157
|
+
# * +binaries+ - Array of binaries
|
158
|
+
def self.create_program_with_binary(context, device_list, binaries)
|
159
|
+
bins = [binaries].flatten
|
160
|
+
num_devices = bins.length
|
161
|
+
devices = [device_list].flatten
|
162
|
+
OpenCL.error_check(OpenCL::INVALID_VALUE) if devices.length != bins.length
|
163
|
+
devices_p = FFI::MemoryPointer::new( Device, num_devices )
|
164
|
+
lengths = FFI::MemoryPointer::new( :size_t, num_devices )
|
165
|
+
binaries_p = FFI::MemoryPointer::new( :pointer, num_devices )
|
166
|
+
num_devices.times { |indx|
|
167
|
+
devices_p[indx].write_pointer(devices[indx])
|
168
|
+
lengths[indx].write_size_t(binaries[indx].size)
|
169
|
+
p = FFI::MemoryPointer::new(binaries[indx].size)
|
170
|
+
p.write_bytes(binaries[indx])
|
171
|
+
binaries_p[indx].write_pointer(p)
|
172
|
+
}
|
173
|
+
binary_status = FFI::MemoryPointer::new( :cl_int, num_devices )
|
174
|
+
error = FFI::MemoryPointer::new( :cl_int )
|
175
|
+
prog = OpenCL.clCreateProgramWithBinary(context, num_devices, devices_p, lengths, binaries_p, binary_status, error)
|
176
|
+
OpenCL.error_check(error.read_cl_int)
|
177
|
+
d_s = []
|
178
|
+
num_devices.times { |indx|
|
179
|
+
d_s.push [ devices[indx], binary_status[indx].read_cl_int ]
|
180
|
+
}
|
181
|
+
return [ OpenCL::Program::new(prog, false), d_s ]
|
182
|
+
end
|
183
|
+
|
37
184
|
# Creates a Program from sources
|
38
185
|
#
|
39
186
|
# ==== Attributes
|
@@ -48,8 +195,8 @@ module OpenCL
|
|
48
195
|
strs = [strings].flatten
|
49
196
|
end
|
50
197
|
n_strs = strs.size
|
51
|
-
strs_lengths = FFI::MemoryPointer
|
52
|
-
c_strs = FFI::MemoryPointer
|
198
|
+
strs_lengths = FFI::MemoryPointer::new( :size_t, n_strs )
|
199
|
+
c_strs = FFI::MemoryPointer::new( :pointer, n_strs )
|
53
200
|
|
54
201
|
c_strs_p = []
|
55
202
|
strs.each { |str|
|
@@ -59,13 +206,13 @@ module OpenCL
|
|
59
206
|
}
|
60
207
|
raise OpenCL::Error::new(OpenCL::Error.getErrorString(OpenCL::Error::INVALID_VALUE)) if c_strs_p.size == 0
|
61
208
|
|
62
|
-
c_strs = FFI::MemoryPointer
|
63
|
-
c_strs_length = FFI::MemoryPointer
|
209
|
+
c_strs = FFI::MemoryPointer::new( :pointer, c_strs_p.size )
|
210
|
+
c_strs_length = FFI::MemoryPointer::new( :size_t, c_strs_p.size )
|
64
211
|
c_strs_p.each_with_index { |p, i|
|
65
212
|
c_strs[i].write_pointer(p)
|
66
213
|
c_strs_length[i].write_size_t(p.size)
|
67
214
|
}
|
68
|
-
pointer_err = FFI::MemoryPointer
|
215
|
+
pointer_err = FFI::MemoryPointer::new( :cl_int )
|
69
216
|
program_ptr = OpenCL.clCreateProgramWithSource(context, c_strs_p.size, c_strs, c_strs_length, pointer_err)
|
70
217
|
OpenCL.error_check(pointer_err.read_cl_int)
|
71
218
|
return OpenCL::Program::new( program_ptr, false )
|
@@ -88,9 +235,10 @@ module OpenCL
|
|
88
235
|
if k then
|
89
236
|
k.enqueue_with_args(*a, &b)
|
90
237
|
else
|
91
|
-
orig_method_missing(m, *
|
238
|
+
orig_method_missing(m, *a, &b)
|
92
239
|
end
|
93
240
|
end
|
241
|
+
|
94
242
|
# Returns an Array containing the sizes of the binary inside the Program for each device
|
95
243
|
eval OpenCL.get_info_array("Program", :size_t, "BINARY_SIZES")
|
96
244
|
|
@@ -99,10 +247,10 @@ module OpenCL
|
|
99
247
|
|
100
248
|
# Returns an Array of String representing the Kernel names inside the Program
|
101
249
|
def kernel_names
|
102
|
-
kernel_names_size = FFI::MemoryPointer
|
250
|
+
kernel_names_size = FFI::MemoryPointer::new( :size_t )
|
103
251
|
error = OpenCL.clGetProgramInfo( self, OpenCL::Program::KERNEL_NAMES, 0, nil, kernel_names_size)
|
104
252
|
OpenCL.error_check(error)
|
105
|
-
k_names = FFI::MemoryPointer
|
253
|
+
k_names = FFI::MemoryPointer::new( kernel_names_size.read_size_t )
|
106
254
|
error = OpenCL.clGetProgramInfo( self, OpenCL::Program::KERNEL_NAMES, kernel_names_size.read_size_t, k_names, nil)
|
107
255
|
OpenCL.error_check(error)
|
108
256
|
k_names_string = k_names.read_string
|
@@ -112,11 +260,11 @@ module OpenCL
|
|
112
260
|
# Returns the concatenated Program sources
|
113
261
|
eval OpenCL.get_info("Program", :string, "SOURCE")
|
114
262
|
|
115
|
-
# Returns the BuildStatus of the
|
263
|
+
# Returns the BuildStatus of the Program for each device associated to the Program or the Device(s) specified. Returns an Array of tuple [ Device, BuildStatus ]
|
116
264
|
def build_status(devs = nil)
|
117
265
|
devs = self.devices if not devs
|
118
266
|
devs = [devs].flatten
|
119
|
-
ptr = FFI::MemoryPointer
|
267
|
+
ptr = FFI::MemoryPointer::new( :cl_build_status )
|
120
268
|
return devs.collect { |dev|
|
121
269
|
error = OpenCL.clGetProgramBuildInfo(self, dev, OpenCL::Program::BUILD_STATUS, ptr.size, ptr, nil)
|
122
270
|
OpenCL.error_check(error)
|
@@ -124,11 +272,11 @@ module OpenCL
|
|
124
272
|
}
|
125
273
|
end
|
126
274
|
|
127
|
-
# Returns the BinaryType for each Device associated to the Program or the Device specified
|
275
|
+
# Returns the BinaryType for each Device associated to the Program or the Device(s) specified. Returns an Array of tuple [ Device, BinaryType ]
|
128
276
|
def binary_type(devs = nil)
|
129
277
|
devs = self.devices if not devs
|
130
278
|
devs = [devs].flatten
|
131
|
-
ptr = FFI::MemoryPointer
|
279
|
+
ptr = FFI::MemoryPointer::new( :cl_program_binary_type )
|
132
280
|
return devs.collect { |dev|
|
133
281
|
error = OpenCL.clGetProgramBuildInfo(self, dev, OpenCL::Program::BINARY_TYPE, ptr.size, ptr, nil)
|
134
282
|
OpenCL.error_check(error)
|
@@ -136,45 +284,45 @@ module OpenCL
|
|
136
284
|
}
|
137
285
|
end
|
138
286
|
|
139
|
-
# Returns the build options for each Device associated to the Program or the Device specified
|
287
|
+
# Returns the build options for each Device associated to the Program or the Device(s) specified. Returns an Array of tuple [ Device, String ]
|
140
288
|
def build_options(devs = nil)
|
141
289
|
devs = self.devices if not devs
|
142
290
|
devs = [devs].flatten
|
143
291
|
return devs.collect { |dev|
|
144
|
-
ptr1 = FFI::MemoryPointer
|
292
|
+
ptr1 = FFI::MemoryPointer::new( :size_t, 1)
|
145
293
|
error = OpenCL.clGetProgramBuildInfo(self, dev, OpenCL::Program::BUILD_OPTIONS, 0, nil, ptr1)
|
146
294
|
OpenCL.error_check(error)
|
147
|
-
ptr2 = FFI::MemoryPointer
|
295
|
+
ptr2 = FFI::MemoryPointer::new( ptr1.read_size_t )
|
148
296
|
error = OpenCL.clGetProgramBuildInfo(self, dev, OpenCL::Program::BUILD_OPTIONS, ptr1.read_size_t, ptr2, nil)
|
149
297
|
OpenCL.error_check(error)
|
150
298
|
[dev, ptr2.read_string]
|
151
299
|
}
|
152
300
|
end
|
153
301
|
|
154
|
-
# Returns the build log for each Device associated to the Program or the Device specified
|
302
|
+
# Returns the build log for each Device associated to the Program or the Device(s) specified. Returns an Array of tuple [ Device, String ]
|
155
303
|
def build_log(devs = nil)
|
156
304
|
devs = self.devices if not devs
|
157
305
|
devs = [devs].flatten
|
158
306
|
return devs.collect { |dev|
|
159
|
-
ptr1 = FFI::MemoryPointer
|
307
|
+
ptr1 = FFI::MemoryPointer::new( :size_t, 1)
|
160
308
|
error = OpenCL.clGetProgramBuildInfo(self, dev, OpenCL::Program::BUILD_LOG, 0, nil, ptr1)
|
161
309
|
OpenCL.error_check(error)
|
162
|
-
ptr2 = FFI::MemoryPointer
|
310
|
+
ptr2 = FFI::MemoryPointer::new( ptr1.read_size_t )
|
163
311
|
error = OpenCL.clGetProgramBuildInfo(self, dev, OpenCL::Program::BUILD_LOG, ptr1.read_size_t, ptr2, nil)
|
164
312
|
OpenCL.error_check(error)
|
165
313
|
[dev, ptr2.read_string]
|
166
314
|
}
|
167
315
|
end
|
168
316
|
|
169
|
-
# Returns the binaries associated to the Program for each Device
|
317
|
+
# Returns the binaries associated to the Program for each Device. Returns an Array of tuple [ Device, String ]
|
170
318
|
def binaries
|
171
319
|
sizes = self.binary_sizes
|
172
|
-
bin_array = FFI::MemoryPointer
|
320
|
+
bin_array = FFI::MemoryPointer::new( :pointer, sizes.length )
|
173
321
|
sizes.length
|
174
322
|
total_size = 0
|
175
323
|
sizes.each_with_index { |s, i|
|
176
324
|
total_size += s
|
177
|
-
bin_array[i].write_pointer(FFI::MemoryPointer
|
325
|
+
bin_array[i].write_pointer(FFI::MemoryPointer::new(s))
|
178
326
|
}
|
179
327
|
error = OpenCL.clGetProgramInfo(self, Program::BINARIES, total_size, bin_array, nil)
|
180
328
|
OpenCL.error_check(error)
|
@@ -191,7 +339,7 @@ module OpenCL
|
|
191
339
|
# ==== Attributes
|
192
340
|
#
|
193
341
|
# * +options+ - a hash containing named options
|
194
|
-
# * +block+ - if provided, a callback invoked when
|
342
|
+
# * +block+ - if provided, a callback invoked when the Program is built. Signature of the callback is { |Program, FFI::Pointer to user_data| ... }
|
195
343
|
#
|
196
344
|
# ==== Options
|
197
345
|
# * +:device_list+ - an Array of Device to build the program for
|
@@ -201,9 +349,26 @@ module OpenCL
|
|
201
349
|
OpenCL.build_program(self, options, &block)
|
202
350
|
end
|
203
351
|
|
352
|
+
# Compiles the Program' sources
|
353
|
+
#
|
354
|
+
# ==== Attributes
|
355
|
+
#
|
356
|
+
# * +options+ - a Hash containing named options
|
357
|
+
# * +block+ - if provided, a callback invoked when the Program is compiled. Signature of the callback is { |Program, FFI::Pointer to user_data| ... }
|
358
|
+
#
|
359
|
+
# ==== Options
|
360
|
+
#
|
361
|
+
# * +:device_list+ - an Array of Device to build the program for
|
362
|
+
# * +:user_data+ - a Pointer (or convertible to Pointer using to_ptr) to the memory area to pass to the callback
|
363
|
+
# * +:options+ - a String containing the options to use for the compilation
|
364
|
+
# * +:input_headers+ - a Hash containing pairs of : String: header_include_name => Program: header
|
365
|
+
def compile(options = {}, &block)
|
366
|
+
return OpenCL.compile_program(self, options, &block)
|
367
|
+
end
|
368
|
+
|
204
369
|
# Returns the Context the Program is associated to
|
205
370
|
def context
|
206
|
-
ptr = FFI::MemoryPointer
|
371
|
+
ptr = FFI::MemoryPointer::new( Context )
|
207
372
|
error = OpenCL.clGetProgramInfo(self, Program::CONTEXT, Context.size, ptr, nil)
|
208
373
|
OpenCL.error_check(error)
|
209
374
|
return OpenCL::Context::new( ptr.read_pointer )
|
@@ -223,11 +388,11 @@ module OpenCL
|
|
223
388
|
# Returns the Array of Device the Program is associated with
|
224
389
|
def devices
|
225
390
|
n = self.num_devices
|
226
|
-
ptr2 = FFI::MemoryPointer
|
391
|
+
ptr2 = FFI::MemoryPointer::new( Device, n )
|
227
392
|
error = OpenCL.clGetProgramInfo(self, Program::DEVICES, Device.size*n, ptr2, nil)
|
228
393
|
OpenCL.error_check(error)
|
229
394
|
return ptr2.get_array_of_pointer(0, n).collect { |device_ptr|
|
230
|
-
OpenCL::Device
|
395
|
+
OpenCL::Device::new(device_ptr)
|
231
396
|
}
|
232
397
|
end
|
233
398
|
|
@@ -20,7 +20,7 @@ module OpenCL
|
|
20
20
|
|
21
21
|
# Returns the context associated with the Sampler
|
22
22
|
def context
|
23
|
-
ptr = FFI::MemoryPointer
|
23
|
+
ptr = FFI::MemoryPointer::new( Context )
|
24
24
|
error = OpenCL.clGetSamplerInfo(self, Sampler::CONTEXT, Context.size, ptr, nil)
|
25
25
|
OpenCL.error_check(error)
|
26
26
|
return OpenCL::Context::new( ptr.read_pointer )
|
@@ -184,7 +184,7 @@ module OpenCL
|
|
184
184
|
if options[:event_wait_list] then
|
185
185
|
num_events = options[:event_wait_list].length
|
186
186
|
if num_events > 0 then
|
187
|
-
events = FFI::MemoryPointer
|
187
|
+
events = FFI::MemoryPointer::new( Event, num_events )
|
188
188
|
options[:event_wait_list].each_with_index { |e, i|
|
189
189
|
events[i].write_pointer(e)
|
190
190
|
}
|
@@ -208,14 +208,14 @@ module OpenCL
|
|
208
208
|
|
209
209
|
# 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
|
210
210
|
def self.get_origin_region( image, options, origin_symbol, region_symbol )
|
211
|
-
origin = FFI::MemoryPointer
|
211
|
+
origin = FFI::MemoryPointer::new( :size_t, 3 )
|
212
212
|
(0..2).each { |i| origin[i].write_size_t(0) }
|
213
213
|
if options[origin_symbol] then
|
214
214
|
options[origin_symbol].each_with_index { |e, i|
|
215
215
|
origin[i].write_size_t(e)
|
216
216
|
}
|
217
217
|
end
|
218
|
-
region = FFI::MemoryPointer
|
218
|
+
region = FFI::MemoryPointer::new( :size_t, 3 )
|
219
219
|
(0..2).each { |i| region[i].write_size_t(1) }
|
220
220
|
if options[region_symbol] then
|
221
221
|
options[region_symbol].each_with_index { |e, i|
|
@@ -241,7 +241,7 @@ module OpenCL
|
|
241
241
|
def self.get_context_properties( options )
|
242
242
|
properties = nil
|
243
243
|
if options[:properties] then
|
244
|
-
properties = FFI::MemoryPointer
|
244
|
+
properties = FFI::MemoryPointer::new( :cl_context_properties, options[:properties].length + 1 )
|
245
245
|
options[:properties].each_with_index { |e,i|
|
246
246
|
properties[i].write_cl_context_properties(e)
|
247
247
|
}
|
@@ -261,7 +261,7 @@ module OpenCL
|
|
261
261
|
klass_name = "MemObject" if klass == "Mem"
|
262
262
|
s = <<EOF
|
263
263
|
def #{name.downcase}
|
264
|
-
ptr1 = FFI::MemoryPointer
|
264
|
+
ptr1 = FFI::MemoryPointer::new( :size_t, 1)
|
265
265
|
error = OpenCL.clGet#{klass_name}Info(self, #{klass}::#{name}, 0, nil, ptr1)
|
266
266
|
OpenCL.error_check(error)
|
267
267
|
EOF
|
@@ -271,7 +271,7 @@ EOF
|
|
271
271
|
EOF
|
272
272
|
end
|
273
273
|
s += <<EOF
|
274
|
-
ptr2 = FFI::MemoryPointer
|
274
|
+
ptr2 = FFI::MemoryPointer::new( ptr1.read_size_t )
|
275
275
|
error = OpenCL.clGet#{klass_name}Info(self, #{klass}::#{name}, ptr1.read_size_t, ptr2, nil)
|
276
276
|
OpenCL.error_check(error)
|
277
277
|
arr = ptr2.get_array_of_#{type}(0, ptr1.read_size_t/ FFI.find_type(:#{type}).size)
|
@@ -296,10 +296,10 @@ EOF
|
|
296
296
|
klass_name = "MemObject" if klass == "Mem"
|
297
297
|
s = <<EOF
|
298
298
|
def #{name.downcase}
|
299
|
-
ptr1 = FFI::MemoryPointer
|
299
|
+
ptr1 = FFI::MemoryPointer::new( :size_t, 1)
|
300
300
|
error = OpenCL.clGet#{klass_name}Info(self, #{klass}::#{name}, 0, nil, ptr1)
|
301
301
|
OpenCL.error_check(error)
|
302
|
-
ptr2 = FFI::MemoryPointer
|
302
|
+
ptr2 = FFI::MemoryPointer::new( ptr1.read_size_t )
|
303
303
|
error = OpenCL.clGet#{klass_name}Info(self, #{klass}::#{name}, ptr1.read_size_t, ptr2, nil)
|
304
304
|
OpenCL.error_check(error)
|
305
305
|
EOF
|
@@ -724,6 +724,14 @@ module OpenCL
|
|
724
724
|
#STDERR.puts "Allocating Platform: #{ptr}"
|
725
725
|
end
|
726
726
|
|
727
|
+
def to_s
|
728
|
+
if self.respond_to?(:name) then
|
729
|
+
return self.name
|
730
|
+
else
|
731
|
+
return super
|
732
|
+
end
|
733
|
+
end
|
734
|
+
|
727
735
|
# method called at Platform deletion, releases the object if aplicable
|
728
736
|
def self.release(ptr)
|
729
737
|
end
|
@@ -853,11 +861,33 @@ module OpenCL
|
|
853
861
|
# Creates a new Device and retains it if specified and aplicable
|
854
862
|
def initialize(ptr, retain = true)
|
855
863
|
super(ptr)
|
864
|
+
platform = FFI::MemoryPointer::new( Platform )
|
865
|
+
OpenCL.clGetDeviceInfo( ptr, OpenCL::Device::PLATFORM, platform.size, platform, nil)
|
866
|
+
p = OpenCL::Platform::new(platform.read_pointer)
|
867
|
+
if p.version_number >= 1.2 and retain then
|
868
|
+
error = OpenCL.clRetainDevice(ptr)
|
869
|
+
OpenCL.error_check( error )
|
870
|
+
end
|
856
871
|
#STDERR.puts "Allocating Device: #{ptr}"
|
857
872
|
end
|
858
873
|
|
874
|
+
def to_s
|
875
|
+
if self.respond_to?(:name) then
|
876
|
+
return self.name
|
877
|
+
else
|
878
|
+
return super
|
879
|
+
end
|
880
|
+
end
|
881
|
+
|
859
882
|
# method called at Device deletion, releases the object if aplicable
|
860
883
|
def self.release(ptr)
|
884
|
+
platform = FFI::MemoryPointer::new( Platform )
|
885
|
+
OpenCL.clGetDeviceInfo( ptr, OpenCL::Device::PLATFORM, platform.size, platform, nil)
|
886
|
+
p = OpenCL::Platform::new(platform.read_pointer)
|
887
|
+
if p.version_number >= 1.2 then
|
888
|
+
error = OpenCL.clReleaseDevice(ptr)
|
889
|
+
OpenCL.error_check( error )
|
890
|
+
end
|
861
891
|
end
|
862
892
|
end
|
863
893
|
|
@@ -994,10 +1024,18 @@ module OpenCL
|
|
994
1024
|
#STDERR.puts "Allocating Context: #{ptr}"
|
995
1025
|
end
|
996
1026
|
|
1027
|
+
def to_s
|
1028
|
+
if self.respond_to?(:name) then
|
1029
|
+
return self.name
|
1030
|
+
else
|
1031
|
+
return super
|
1032
|
+
end
|
1033
|
+
end
|
1034
|
+
|
997
1035
|
# method called at Context deletion, releases the object if aplicable
|
998
1036
|
def self.release(ptr)
|
999
1037
|
#STDERR.puts "Releasing Context: #{ptr}"
|
1000
|
-
#ref_count = FFI::MemoryPointer
|
1038
|
+
#ref_count = FFI::MemoryPointer::new( :cl_uint )
|
1001
1039
|
#OpenCL.clGetContextInfo(ptr, OpenCL::Context::REFERENCE_COUNT, ref_count.size, ref_count, nil)
|
1002
1040
|
#STDERR.puts "reference counter: #{ref_count.read_cl_uint}"
|
1003
1041
|
error = OpenCL.clReleaseContext(ptr)
|
@@ -1024,10 +1062,18 @@ module OpenCL
|
|
1024
1062
|
#STDERR.puts "Allocating CommandQueue: #{ptr}"
|
1025
1063
|
end
|
1026
1064
|
|
1065
|
+
def to_s
|
1066
|
+
if self.respond_to?(:name) then
|
1067
|
+
return self.name
|
1068
|
+
else
|
1069
|
+
return super
|
1070
|
+
end
|
1071
|
+
end
|
1072
|
+
|
1027
1073
|
# method called at CommandQueue deletion, releases the object if aplicable
|
1028
1074
|
def self.release(ptr)
|
1029
1075
|
#STDERR.puts "Releasing CommandQueue: #{ptr}"
|
1030
|
-
#ref_count = FFI::MemoryPointer
|
1076
|
+
#ref_count = FFI::MemoryPointer::new( :cl_uint )
|
1031
1077
|
#OpenCL.clGetCommandQueueInfo(ptr, OpenCL::CommandQueue::REFERENCE_COUNT, ref_count.size, ref_count, nil)
|
1032
1078
|
#STDERR.puts "reference counter: #{ref_count.read_cl_uint}"
|
1033
1079
|
error = OpenCL.clReleaseCommandQueue(ptr)
|
@@ -1097,10 +1143,18 @@ module OpenCL
|
|
1097
1143
|
#STDERR.puts "Allocating Mem: #{ptr}"
|
1098
1144
|
end
|
1099
1145
|
|
1146
|
+
def to_s
|
1147
|
+
if self.respond_to?(:name) then
|
1148
|
+
return self.name
|
1149
|
+
else
|
1150
|
+
return super
|
1151
|
+
end
|
1152
|
+
end
|
1153
|
+
|
1100
1154
|
# method called at Mem deletion, releases the object if aplicable
|
1101
1155
|
def self.release(ptr)
|
1102
1156
|
#STDERR.puts "Releasing Mem: #{ptr}"
|
1103
|
-
#ref_count = FFI::MemoryPointer
|
1157
|
+
#ref_count = FFI::MemoryPointer::new( :cl_uint )
|
1104
1158
|
#OpenCL.clGetMemObjectInfo(ptr, OpenCL::Mem::REFERENCE_COUNT, ref_count.size, ref_count, nil)
|
1105
1159
|
#STDERR.puts "reference counter: #{ref_count.read_cl_uint}"
|
1106
1160
|
error = OpenCL.clReleaseMemObject(ptr)
|
@@ -1204,10 +1258,18 @@ module OpenCL
|
|
1204
1258
|
#STDERR.puts "Allocating Program: #{ptr}"
|
1205
1259
|
end
|
1206
1260
|
|
1261
|
+
def to_s
|
1262
|
+
if self.respond_to?(:name) then
|
1263
|
+
return self.name
|
1264
|
+
else
|
1265
|
+
return super
|
1266
|
+
end
|
1267
|
+
end
|
1268
|
+
|
1207
1269
|
# method called at Program deletion, releases the object if aplicable
|
1208
1270
|
def self.release(ptr)
|
1209
1271
|
#STDERR.puts "Releasing Program: #{ptr}"
|
1210
|
-
#ref_count = FFI::MemoryPointer
|
1272
|
+
#ref_count = FFI::MemoryPointer::new( :cl_uint )
|
1211
1273
|
#OpenCL.clGetProgramInfo(ptr, OpenCL::Program::REFERENCE_COUNT, ref_count.size, ref_count, nil)
|
1212
1274
|
#STDERR.puts "reference counter: #{ref_count.read_cl_uint}"
|
1213
1275
|
error = OpenCL.clReleaseProgram(ptr)
|
@@ -1278,10 +1340,18 @@ module OpenCL
|
|
1278
1340
|
#STDERR.puts "Allocating Kernel: #{ptr}"
|
1279
1341
|
end
|
1280
1342
|
|
1343
|
+
def to_s
|
1344
|
+
if self.respond_to?(:name) then
|
1345
|
+
return self.name
|
1346
|
+
else
|
1347
|
+
return super
|
1348
|
+
end
|
1349
|
+
end
|
1350
|
+
|
1281
1351
|
# method called at Kernel deletion, releases the object if aplicable
|
1282
1352
|
def self.release(ptr)
|
1283
1353
|
#STDERR.puts "Releasing Kernel: #{ptr}"
|
1284
|
-
#ref_count = FFI::MemoryPointer
|
1354
|
+
#ref_count = FFI::MemoryPointer::new( :cl_uint )
|
1285
1355
|
#OpenCL.clGetKernelInfo(ptr, OpenCL::Kernel::REFERENCE_COUNT, ref_count.size, ref_count, nil)
|
1286
1356
|
#STDERR.puts "reference counter: #{ref_count.read_cl_uint}"
|
1287
1357
|
error = OpenCL.clReleaseKernel(ptr)
|
@@ -1390,10 +1460,18 @@ module OpenCL
|
|
1390
1460
|
#STDERR.puts "Allocating Event: #{ptr}"
|
1391
1461
|
end
|
1392
1462
|
|
1463
|
+
def to_s
|
1464
|
+
if self.respond_to?(:name) then
|
1465
|
+
return self.name
|
1466
|
+
else
|
1467
|
+
return super
|
1468
|
+
end
|
1469
|
+
end
|
1470
|
+
|
1393
1471
|
# method called at Event deletion, releases the object if aplicable
|
1394
1472
|
def self.release(ptr)
|
1395
1473
|
#STDERR.puts "Releasing Event: #{ptr}"
|
1396
|
-
#ref_count = FFI::MemoryPointer
|
1474
|
+
#ref_count = FFI::MemoryPointer::new( :cl_uint )
|
1397
1475
|
#OpenCL.clGetEventInfo(ptr, OpenCL::Event::REFERENCE_COUNT, ref_count.size, ref_count, nil)
|
1398
1476
|
#STDERR.puts "reference counter: #{ref_count.read_cl_uint}"
|
1399
1477
|
error = OpenCL.clReleaseEvent(ptr)
|
@@ -1419,10 +1497,18 @@ module OpenCL
|
|
1419
1497
|
#STDERR.puts "Allocating Sampler: #{ptr}"
|
1420
1498
|
end
|
1421
1499
|
|
1500
|
+
def to_s
|
1501
|
+
if self.respond_to?(:name) then
|
1502
|
+
return self.name
|
1503
|
+
else
|
1504
|
+
return super
|
1505
|
+
end
|
1506
|
+
end
|
1507
|
+
|
1422
1508
|
# method called at Sampler deletion, releases the object if aplicable
|
1423
1509
|
def self.release(ptr)
|
1424
1510
|
#STDERR.puts "Releasing Sampler: #{ptr}"
|
1425
|
-
#ref_count = FFI::MemoryPointer
|
1511
|
+
#ref_count = FFI::MemoryPointer::new( :cl_uint )
|
1426
1512
|
#OpenCL.clGetSamplerInfo(ptr, OpenCL::Sampler::REFERENCE_COUNT, ref_count.size, ref_count, nil)
|
1427
1513
|
#STDERR.puts "reference counter: #{ref_count.read_cl_uint}"
|
1428
1514
|
error = OpenCL.clReleaseSampler(ptr)
|
@@ -1443,6 +1529,14 @@ module OpenCL
|
|
1443
1529
|
#STDERR.puts "Allocating GLsync: #{ptr}"
|
1444
1530
|
end
|
1445
1531
|
|
1532
|
+
def to_s
|
1533
|
+
if self.respond_to?(:name) then
|
1534
|
+
return self.name
|
1535
|
+
else
|
1536
|
+
return super
|
1537
|
+
end
|
1538
|
+
end
|
1539
|
+
|
1446
1540
|
# method called at GLsync deletion, releases the object if aplicable
|
1447
1541
|
def self.release(ptr)
|
1448
1542
|
end
|
data/opencl_ruby_ffi.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opencl_ruby_ffi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.4'
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-03-
|
12
|
+
date: 2014-03-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: narray
|