opencl_ruby_ffi 1.2.2 → 1.3.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/.yardopts +1 -0
- data/lib/opencl_ruby_ffi.rb +2 -0
- data/lib/opencl_ruby_ffi/Buffer.rb +18 -13
- data/lib/opencl_ruby_ffi/CommandQueue.rb +301 -302
- data/lib/opencl_ruby_ffi/Context.rb +158 -158
- data/lib/opencl_ruby_ffi/Device.rb +270 -224
- data/lib/opencl_ruby_ffi/Event.rb +40 -36
- data/lib/opencl_ruby_ffi/Image.rb +34 -57
- data/lib/opencl_ruby_ffi/Kernel.rb +251 -191
- data/lib/opencl_ruby_ffi/Mem.rb +49 -70
- data/lib/opencl_ruby_ffi/Pipe.rb +3 -14
- data/lib/opencl_ruby_ffi/Platform.rb +46 -48
- data/lib/opencl_ruby_ffi/Program.rb +131 -124
- data/lib/opencl_ruby_ffi/Sampler.rb +6 -24
- data/lib/opencl_ruby_ffi/amd/device_attribute_query.rb +100 -0
- data/lib/opencl_ruby_ffi/egl.rb +2 -0
- data/lib/opencl_ruby_ffi/ext.rb +11 -0
- data/lib/opencl_ruby_ffi/ext/device_fission.rb +264 -0
- data/lib/opencl_ruby_ffi/gl_ext.rb +2 -0
- data/lib/opencl_ruby_ffi/khr/d3d10_sharing.rb +120 -0
- data/lib/opencl_ruby_ffi/khr/d3d11_sharing.rb +120 -0
- data/lib/opencl_ruby_ffi/khr/dx9_media_sharing.rb +113 -0
- data/lib/opencl_ruby_ffi/khr/egl_event.rb +15 -0
- data/lib/opencl_ruby_ffi/khr/egl_image.rb +58 -0
- data/lib/opencl_ruby_ffi/khr/fp16.rb +23 -0
- data/lib/opencl_ruby_ffi/khr/fp64.rb +23 -0
- data/lib/opencl_ruby_ffi/khr/gl_event.rb +38 -0
- data/lib/opencl_ruby_ffi/khr/gl_sharing.rb +79 -0
- data/lib/opencl_ruby_ffi/khr/icd.rb +30 -0
- data/lib/opencl_ruby_ffi/khr/initalize_memory.rb +19 -0
- data/lib/opencl_ruby_ffi/khr/priority_hints.rb +48 -0
- data/lib/opencl_ruby_ffi/khr/spir.rb +45 -0
- data/lib/opencl_ruby_ffi/khr/sub_groups.rb +49 -0
- data/lib/opencl_ruby_ffi/khr/terminate_context.rb +46 -0
- data/lib/opencl_ruby_ffi/khr/throttle_hints.rb +47 -0
- data/lib/opencl_ruby_ffi/nv/device_attribute_query.rb +50 -0
- data/lib/opencl_ruby_ffi/opencl_ruby_ffi_base.rb +40 -13
- data/lib/opencl_ruby_ffi/opencl_ruby_ffi_base_gen.rb +214 -2114
- data/lib/opencl_ruby_ffi/opencl_types.rb +15 -3
- data/opencl_ruby_ffi.gemspec +4 -4
- data/templates_custom/default/module/setup.rb +9 -0
- metadata +29 -6
- data/lib/opencl_ruby_ffi/GLExt.rb +0 -58
- data/lib/opencl_ruby_ffi/Stream.rb +0 -127
@@ -69,10 +69,7 @@ module OpenCL
|
|
69
69
|
# Maps the cl_event object
|
70
70
|
class Event
|
71
71
|
include InnerInterface
|
72
|
-
|
73
|
-
class << self
|
74
|
-
include InnerGenerator
|
75
|
-
end
|
72
|
+
extend InnerGenerator
|
76
73
|
|
77
74
|
def inspect
|
78
75
|
return "#<#{self.class.name}: #{command_type}>"
|
@@ -91,17 +88,12 @@ module OpenCL
|
|
91
88
|
end
|
92
89
|
end
|
93
90
|
|
94
|
-
|
91
|
+
get_info("Event", :cl_command_type, "command_type")
|
92
|
+
|
95
93
|
def context
|
96
|
-
|
97
|
-
error = OpenCL.clGetEventInfo(self, CONTEXT, Context.size, ptr, nil)
|
98
|
-
error_check(error)
|
99
|
-
return Context::new( ptr.read_pointer )
|
94
|
+
return command_queue.context
|
100
95
|
end
|
101
96
|
|
102
|
-
# Returns a CommandType corresponding to the type of the command associated with the Event
|
103
|
-
eval get_info("Event", :cl_command_type, "COMMAND_TYPE")
|
104
|
-
|
105
97
|
# Returns a CommandExecutionStatus corresponding to the status of the command associtated with the Event
|
106
98
|
def command_execution_status
|
107
99
|
ptr = MemoryPointer::new( :cl_int )
|
@@ -110,10 +102,7 @@ module OpenCL
|
|
110
102
|
return CommandExecutionStatus::new( ptr.read_cl_int )
|
111
103
|
end
|
112
104
|
|
113
|
-
|
114
|
-
# :method: reference_count()
|
115
|
-
# Returns the reference counter of th Event
|
116
|
-
eval get_info("Event", :cl_uint, "REFERENCE_COUNT")
|
105
|
+
get_info("Event", :cl_uint, "reference_count")
|
117
106
|
|
118
107
|
# Returns the date the command corresponding to Event was queued
|
119
108
|
def profiling_command_queued
|
@@ -147,29 +136,44 @@ module OpenCL
|
|
147
136
|
return ptr.read_cl_ulong
|
148
137
|
end
|
149
138
|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
139
|
+
module OpenCL11
|
140
|
+
|
141
|
+
# Returns the Context associated with the Event
|
142
|
+
def context
|
143
|
+
ptr = MemoryPointer::new( Context )
|
144
|
+
error = OpenCL.clGetEventInfo(self, CONTEXT, Context.size, ptr, nil)
|
145
|
+
error_check(error)
|
146
|
+
return Context::new( ptr.read_pointer )
|
147
|
+
end
|
148
|
+
|
149
|
+
# Sets the satus of Event (a user event) to the given execution status
|
150
|
+
def set_user_event_status( execution_status )
|
151
|
+
return OpenCL.set_user_event_status( self, execution_status )
|
152
|
+
end
|
153
|
+
|
154
|
+
alias :set_status :set_user_event_status
|
155
|
+
|
156
|
+
# Attaches a callback to the Event that will be called on the given transition
|
157
|
+
#
|
158
|
+
# ==== Attributes
|
159
|
+
#
|
160
|
+
# * +command_exec_callback_type+ - a CommandExecutionStatus
|
161
|
+
# * +options+ - a hash containing named options
|
162
|
+
# * +block+ - a callback invoked when the given Event occurs. Signature of the callback is { |Event, :cl_int event_command_exec_status, Pointer to user_data| ... }
|
163
|
+
#
|
164
|
+
# ==== Options
|
165
|
+
#
|
166
|
+
# * +:user_data+ - a Pointer (or convertible to Pointer using to_ptr) to the memory area to pass to the callback
|
167
|
+
def set_event_callback( command_exec_callback_type, options={}, &proc )
|
168
|
+
return OpenCL.set_event_callback( self, command_exec_callback_type, options, &proc )
|
169
|
+
end
|
170
|
+
|
171
|
+
alias :set_callback :set_event_callback
|
154
172
|
|
155
|
-
alias :set_status :set_user_event_status
|
156
|
-
|
157
|
-
# Attaches a callback to the Event that will be called on the given transition
|
158
|
-
#
|
159
|
-
# ==== Attributes
|
160
|
-
#
|
161
|
-
# * +command_exec_callback_type+ - a CommandExecutionStatus
|
162
|
-
# * +options+ - a hash containing named options
|
163
|
-
# * +block+ - a callback invoked when the given Event occurs. Signature of the callback is { |Event, :cl_int event_command_exec_status, Pointer to user_data| ... }
|
164
|
-
#
|
165
|
-
# ==== Options
|
166
|
-
#
|
167
|
-
# * +:user_data+ - a Pointer (or convertible to Pointer using to_ptr) to the memory area to pass to the callback
|
168
|
-
def set_event_callback( command_exec_callback_type, options={}, &proc )
|
169
|
-
return OpenCL.set_event_callback( self, command_exec_callback_type, options, &proc )
|
170
173
|
end
|
171
174
|
|
172
|
-
|
175
|
+
register_extension( :v11, OpenCL11, "cond = false; if command_queue then cond = (command_queue.device.platform.version_number >= 1.1) else ptr = MemoryPointer::new( Context ); error = OpenCL.clGetEventInfo(self, CONTEXT, Context.size, ptr, nil); error_check(error); cond = (Context::new( ptr.read_pointer ).platform.version_number >= 1.1) end; cond" )
|
173
176
|
|
174
177
|
end
|
178
|
+
|
175
179
|
end
|
@@ -122,15 +122,15 @@ module OpenCL
|
|
122
122
|
# ==== Options
|
123
123
|
#
|
124
124
|
# * +:flags+ - a single or an Array of :cl_mem_flags specifying the flags to be used when creating the Image
|
125
|
-
def self.
|
125
|
+
def self.create_from_gl_renderbuffer( context, renderbuffer, options = {} )
|
126
126
|
flags = get_flags( options )
|
127
127
|
error = MemoryPointer::new( :cl_int )
|
128
|
-
img =
|
128
|
+
img = clCreateFromGLRenderbuffer( context, flags, renderbuffer, error )
|
129
129
|
error_check(error.read_cl_int)
|
130
130
|
return Image::new( img, false )
|
131
131
|
end
|
132
132
|
class << self
|
133
|
-
alias :
|
133
|
+
alias :create_from_GL_renderbuffer :create_from_gl_renderbuffer
|
134
134
|
end
|
135
135
|
|
136
136
|
# Creates an Image from an OpenGL texture
|
@@ -228,53 +228,6 @@ module OpenCL
|
|
228
228
|
return "#<#{self.class.name}: #{format.channel_order}, #{format.channel_data_type}, #{width}#{h != 0 ? "x#{h}" : ""}#{d != 0 ? "x#{d}" : ""} (#{size})#{f.to_i != 0 ? " (#{f})" : "" }>"
|
229
229
|
end
|
230
230
|
|
231
|
-
##
|
232
|
-
# :method: element_size
|
233
|
-
# Returns the element_size of the Image
|
234
|
-
|
235
|
-
##
|
236
|
-
# :method: row_pitch
|
237
|
-
# Returns the row_pitch of the Image
|
238
|
-
|
239
|
-
##
|
240
|
-
# :method: slice_pitch
|
241
|
-
# Returns the slice_pitch of the Image
|
242
|
-
|
243
|
-
##
|
244
|
-
# :method: width
|
245
|
-
# Returns the width of the Image
|
246
|
-
|
247
|
-
##
|
248
|
-
# :method: height
|
249
|
-
# Returns the height of the Image
|
250
|
-
|
251
|
-
##
|
252
|
-
# :method: depth
|
253
|
-
# Returns the depth of the Image
|
254
|
-
|
255
|
-
##
|
256
|
-
# :method: array_size
|
257
|
-
# Returns the array_size of the Image
|
258
|
-
%w( ELEMENT_SIZE ROW_PITCH SLICE_PITCH WIDTH HEIGHT DEPTH ARRAY_SIZE ).each { |prop|
|
259
|
-
eval get_info("Image", :size_t, prop)
|
260
|
-
}
|
261
|
-
|
262
|
-
##
|
263
|
-
# :method: num_mip_levels
|
264
|
-
# Returns the num_mip_levels of the Image
|
265
|
-
|
266
|
-
##
|
267
|
-
# :method: num_samples
|
268
|
-
# Returns the num_samples of the Image
|
269
|
-
%w( NUM_MIP_LEVELS NUM_SAMPLES ).each { |prop|
|
270
|
-
eval get_info("Image", :cl_uint, prop)
|
271
|
-
}
|
272
|
-
|
273
|
-
# Returns the ImageDesc corresponding to the Image
|
274
|
-
def desc
|
275
|
-
return ImageDesc::new( self.type, self.width, self.height, self.depth, self.array_size, self.row_pitch, self.slice_pitch, self.num_mip_levels, self.num_samples, self.buffer )
|
276
|
-
end
|
277
|
-
|
278
231
|
# Returns the ImageFormat corresponding to the image
|
279
232
|
def format
|
280
233
|
image_format = MemoryPointer::new( ImageFormat )
|
@@ -283,15 +236,39 @@ module OpenCL
|
|
283
236
|
return ImageFormat::new( image_format )
|
284
237
|
end
|
285
238
|
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
239
|
+
get_info("Image", :size_t, "element_size")
|
240
|
+
get_info("Image", :size_t, "row_pitch")
|
241
|
+
get_info("Image", :size_t, "slice_pitch")
|
242
|
+
get_info("Image", :size_t, "width")
|
243
|
+
get_info("Image", :size_t, "height")
|
244
|
+
get_info("Image", :size_t, "depth")
|
245
|
+
|
246
|
+
module OpenCL12
|
247
|
+
extend InnerGenerator
|
248
|
+
|
249
|
+
get_info("Image", :size_t, "array_size")
|
250
|
+
|
251
|
+
# Returns the associated Buffer if any, nil otherwise
|
252
|
+
def buffer
|
253
|
+
ptr = MemoryPointer::new( Buffer )
|
254
|
+
error = OpenCL.clGetImageInfo(self, BUFFER, Buffer.size, ptr, nil)
|
255
|
+
error_check(error)
|
256
|
+
return nil if ptr.null?
|
257
|
+
return Buffer::new(ptr.read_pointer)
|
258
|
+
end
|
259
|
+
|
260
|
+
get_info("Image", :cl_uint, "num_mip_levels")
|
261
|
+
get_info("Image", :cl_uint, "num_samples")
|
262
|
+
|
263
|
+
# Returns the ImageDesc corresponding to the Image
|
264
|
+
def desc
|
265
|
+
return ImageDesc::new( self.type, self.width, self.height, self.depth, self.array_size, self.row_pitch, self.slice_pitch, self.num_mip_levels, self.num_samples, self.buffer )
|
266
|
+
end
|
267
|
+
|
293
268
|
end
|
294
269
|
|
270
|
+
register_extension( :v12, OpenCL12, "platform.version_number >= 1.2" )
|
271
|
+
|
295
272
|
end
|
296
273
|
|
297
274
|
end
|
@@ -47,10 +47,7 @@ module OpenCL
|
|
47
47
|
# Maps the cl_kernel object
|
48
48
|
class Kernel
|
49
49
|
include InnerInterface
|
50
|
-
|
51
|
-
class << self
|
52
|
-
include InnerGenerator
|
53
|
-
end
|
50
|
+
extend InnerGenerator
|
54
51
|
|
55
52
|
def inspect
|
56
53
|
return "#<#{self.class.name}: #{name}>"
|
@@ -59,72 +56,43 @@ module OpenCL
|
|
59
56
|
# Maps the logical cl arg object
|
60
57
|
class Arg
|
61
58
|
include InnerInterface
|
62
|
-
|
63
|
-
|
64
|
-
include InnerGenerator
|
65
|
-
end
|
59
|
+
extend InnerGenerator
|
60
|
+
|
66
61
|
# Returns the index of the Arg in the list
|
67
62
|
attr_reader :index
|
68
63
|
# Returns the Kernel this Arg belongs to
|
69
64
|
attr_reader :kernel
|
70
65
|
|
71
|
-
|
72
|
-
def initialize( kernel, index )
|
73
|
-
@index = index
|
74
|
-
@kernel = kernel
|
75
|
-
end
|
66
|
+
if ExtendedStruct::const_get(:FORCE_EXTENSIONS_LOADING) then
|
76
67
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
ptr = MemoryPointer::new( :cl_kernel_arg_address_qualifier )
|
81
|
-
error = OpenCL.clGetKernelArgInfo(@kernel, @index, ADDRESS_QUALIFIER, ptr.size, ptr, nil)
|
82
|
-
error_check(error)
|
83
|
-
return AddressQualifier::new( ptr.read_cl_kernel_arg_address_qualifier )
|
84
|
-
end
|
68
|
+
def self.register_extension(name, mod, cond)
|
69
|
+
include mod
|
70
|
+
end
|
85
71
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
error_check(error)
|
92
|
-
return AccessQualifier::new( ptr.read_cl_kernel_arg_access_qualifier )
|
93
|
-
end
|
72
|
+
# Creates a new arg for a Kernel at index
|
73
|
+
def initialize( kernel, index )
|
74
|
+
@index = index
|
75
|
+
@kernel = kernel
|
76
|
+
end
|
94
77
|
|
95
|
-
|
96
|
-
def type_qualifier
|
97
|
-
error_check(INVALID_OPERATION) if @kernel.context.platform.version_number < 1.2
|
98
|
-
ptr = MemoryPointer::new( :cl_kernel_arg_type_qualifier )
|
99
|
-
error = OpenCL.clGetKernelArgInfo(@kernel, @index, TYPE_QUALIFIER, ptr.size, ptr, nil)
|
100
|
-
error_check(error)
|
101
|
-
return TypeQualifier::new( ptr.read_cl_kernel_arg_type_qualifier )
|
102
|
-
end
|
78
|
+
else
|
103
79
|
|
104
|
-
|
105
|
-
def type_name
|
106
|
-
error_check(INVALID_OPERATION) if @kernel.context.platform.version_number < 1.2
|
107
|
-
ptr1 = MemoryPointer::new( :size_t, 1)
|
108
|
-
error = OpenCL.clGetKernelArgInfo(@kernel, @index, TYPE_NAME, 0, nil, ptr1)
|
109
|
-
error_check(error)
|
110
|
-
ptr2 = MemoryPointer::new( ptr1.read_size_t )
|
111
|
-
error = OpenCL.clGetKernelArgInfo(@kernel, @index, TYPE_NAME, ptr1.read_size_t, ptr2, nil)
|
112
|
-
error_check(error)
|
113
|
-
return ptr2.read_string
|
114
|
-
end
|
80
|
+
Extensions = {}
|
115
81
|
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
ptr1 = MemoryPointer::new( :size_t, 1)
|
120
|
-
error = OpenCL.clGetKernelArgInfo(@kernel, @index, NAME, 0, nil, ptr1)
|
121
|
-
error_check(error)
|
122
|
-
ptr2 = MemoryPointer::new( ptr1.read_size_t )
|
123
|
-
error = OpenCL.clGetKernelArgInfo(@kernel, @index, NAME, ptr1.read_size_t, ptr2, nil)
|
124
|
-
error_check(error)
|
125
|
-
return ptr2.read_string
|
126
|
-
end
|
82
|
+
def self.register_extension(name, mod, cond)
|
83
|
+
Extensions[name] = [mod, cond]
|
84
|
+
end
|
127
85
|
|
86
|
+
# Creates a new arg for a Kernel at index
|
87
|
+
def initialize( kernel, index )
|
88
|
+
@index = index
|
89
|
+
@kernel = kernel
|
90
|
+
Extensions.each { |name, ext|
|
91
|
+
extend ext[0] if eval(ext[1])
|
92
|
+
}
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
128
96
|
# Sets this Arg to value. The size of value can be specified.
|
129
97
|
def set(value, size = nil)
|
130
98
|
if value.class == SVMPointer and @kernel.context.platform.version_number >= 2.0 then
|
@@ -134,6 +102,65 @@ module OpenCL
|
|
134
102
|
end
|
135
103
|
end
|
136
104
|
|
105
|
+
module OpenCL12
|
106
|
+
|
107
|
+
# Returns an AddressQualifier corresponding to the Arg
|
108
|
+
def address_qualifier
|
109
|
+
error_check(INVALID_OPERATION) if @kernel.context.platform.version_number < 1.2
|
110
|
+
ptr = MemoryPointer::new( :cl_kernel_arg_address_qualifier )
|
111
|
+
error = OpenCL.clGetKernelArgInfo(@kernel, @index, ADDRESS_QUALIFIER, ptr.size, ptr, nil)
|
112
|
+
error_check(error)
|
113
|
+
return AddressQualifier::new( ptr.read_cl_kernel_arg_address_qualifier )
|
114
|
+
end
|
115
|
+
|
116
|
+
# Returns an AccessQualifier corresponding to the Arg
|
117
|
+
def access_qualifier
|
118
|
+
error_check(INVALID_OPERATION) if @kernel.context.platform.version_number < 1.2
|
119
|
+
ptr = MemoryPointer::new( :cl_kernel_arg_access_qualifier )
|
120
|
+
error = OpenCL.clGetKernelArgInfo(@kernel, @index, ACCESS_QUALIFIER, ptr.size, ptr, nil)
|
121
|
+
error_check(error)
|
122
|
+
return AccessQualifier::new( ptr.read_cl_kernel_arg_access_qualifier )
|
123
|
+
end
|
124
|
+
|
125
|
+
# Returns a String corresponding to the Arg type name
|
126
|
+
def type_name
|
127
|
+
error_check(INVALID_OPERATION) if @kernel.context.platform.version_number < 1.2
|
128
|
+
ptr1 = MemoryPointer::new( :size_t, 1)
|
129
|
+
error = OpenCL.clGetKernelArgInfo(@kernel, @index, TYPE_NAME, 0, nil, ptr1)
|
130
|
+
error_check(error)
|
131
|
+
ptr2 = MemoryPointer::new( ptr1.read_size_t )
|
132
|
+
error = OpenCL.clGetKernelArgInfo(@kernel, @index, TYPE_NAME, ptr1.read_size_t, ptr2, nil)
|
133
|
+
error_check(error)
|
134
|
+
return ptr2.read_string
|
135
|
+
end
|
136
|
+
|
137
|
+
# Returns a TypeQualifier corresponding to the Arg
|
138
|
+
def type_qualifier
|
139
|
+
error_check(INVALID_OPERATION) if @kernel.context.platform.version_number < 1.2
|
140
|
+
ptr = MemoryPointer::new( :cl_kernel_arg_type_qualifier )
|
141
|
+
error = OpenCL.clGetKernelArgInfo(@kernel, @index, TYPE_QUALIFIER, ptr.size, ptr, nil)
|
142
|
+
error_check(error)
|
143
|
+
return TypeQualifier::new( ptr.read_cl_kernel_arg_type_qualifier )
|
144
|
+
end
|
145
|
+
|
146
|
+
# Returns a String corresponding to the Arg name
|
147
|
+
def name
|
148
|
+
error_check(INVALID_OPERATION) if @kernel.context.platform.version_number < 1.2
|
149
|
+
ptr1 = MemoryPointer::new( :size_t, 1)
|
150
|
+
error = OpenCL.clGetKernelArgInfo(@kernel, @index, NAME, 0, nil, ptr1)
|
151
|
+
error_check(error)
|
152
|
+
ptr2 = MemoryPointer::new( ptr1.read_size_t )
|
153
|
+
error = OpenCL.clGetKernelArgInfo(@kernel, @index, NAME, ptr1.read_size_t, ptr2, nil)
|
154
|
+
error_check(error)
|
155
|
+
return ptr2.read_string
|
156
|
+
end
|
157
|
+
|
158
|
+
alias to_s name
|
159
|
+
|
160
|
+
end
|
161
|
+
|
162
|
+
register_extension( :v12, OpenCL12, "kernel.context.platform.version_number >= 1.2" )
|
163
|
+
|
137
164
|
end
|
138
165
|
|
139
166
|
# Returns an Array of Arg corresponding to the arguments of the Kernel
|
@@ -146,52 +173,12 @@ module OpenCL
|
|
146
173
|
return a
|
147
174
|
end
|
148
175
|
|
149
|
-
|
150
|
-
def set_svm_ptrs( ptrs )
|
151
|
-
error_check(INVALID_OPERATION) if self.context.platform.version_number < 2.0
|
152
|
-
pointers = [ptrs].flatten
|
153
|
-
pt = MemoryPointer::new( :pointer, pointers.length )
|
154
|
-
pointers.each_with_index { |p, i|
|
155
|
-
pt[i].write_pointer(p)
|
156
|
-
}
|
157
|
-
error = OpenCL.clSetKernelExecInfo( self, EXEC_INFO_SVM_PTRS, pt.size, pt)
|
158
|
-
error_check(error)
|
159
|
-
return self
|
160
|
-
end
|
161
|
-
|
162
|
-
# Specifies the granularity of the SVM system.
|
163
|
-
def set_svm_fine_grain_system( flag )
|
164
|
-
error_check(INVALID_OPERATION) if self.context.platform.version_number < 2.0
|
165
|
-
pt = MemoryPointer::new( :cl_bool )
|
166
|
-
pt.write_cl_bool( flag )
|
167
|
-
error = OpenCL.clSetKernelExecInfo( self, EXEC_INFO_SVM_FINE_GRAIN_SYSTEM, pt.size, pt)
|
168
|
-
error_check(error)
|
169
|
-
return self
|
170
|
-
end
|
171
|
-
|
172
|
-
##
|
173
|
-
# :method: function_name()
|
174
|
-
# returns a String correspondig to the Kernel function name
|
175
|
-
|
176
|
-
##
|
177
|
-
# :method: attributes()
|
178
|
-
# returns a String containing the attributes qualifier used at kernel definition
|
179
|
-
%w( FUNCTION_NAME ATTRIBUTES ).each { |prop|
|
180
|
-
eval get_info("Kernel", :string, prop)
|
181
|
-
}
|
182
|
-
|
176
|
+
get_info("Kernel", :string, "function_name")
|
183
177
|
alias name function_name
|
178
|
+
alias to_s name
|
184
179
|
|
185
|
-
|
186
|
-
|
187
|
-
# Returns the number of arguments for the Kernel
|
188
|
-
|
189
|
-
##
|
190
|
-
# :method: reference_count
|
191
|
-
# Returns the reference counter for the Kernel
|
192
|
-
%w( NUM_ARGS REFERENCE_COUNT ).each { |prop|
|
193
|
-
eval get_info("Kernel", :cl_uint, prop)
|
194
|
-
}
|
180
|
+
get_info("Kernel", :cl_uint, "num_args")
|
181
|
+
get_info("Kernel", :cl_uint, "reference_count")
|
195
182
|
|
196
183
|
# Returns the Context the Kernel is associated with
|
197
184
|
def context
|
@@ -230,92 +217,11 @@ module OpenCL
|
|
230
217
|
return ptr.read_cl_ulong
|
231
218
|
end
|
232
219
|
|
233
|
-
def preferred_work_group_size_multiple(device = program.devices.first)
|
234
|
-
ptr = MemoryPointer::new( :size_t )
|
235
|
-
error = OpenCL.clGetKernelWorkGroupInfo(self, device, PREFERRED_WORK_GROUP_SIZE_MULTIPLE, ptr.size, ptr, nil)
|
236
|
-
error_check(error)
|
237
|
-
return ptr.read_size_t
|
238
|
-
end
|
239
|
-
|
240
|
-
def private_mem_size(device = program.devices.first)
|
241
|
-
ptr = MemoryPointer::new( :cl_ulong )
|
242
|
-
error = OpenCL.clGetKernelWorkGroupInfo(self, device, PRIVATE_MEM_SIZE, ptr.size, ptr, nil)
|
243
|
-
error_check(error)
|
244
|
-
return ptr.read_cl_ulong
|
245
|
-
end
|
246
|
-
|
247
|
-
def global_work_size(device = program.devices.first)
|
248
|
-
ptr = MemoryPointer::new( :size_t, 3 )
|
249
|
-
error = OpenCL.clGetKernelWorkGroupInfo(self, device, GLOBAL_WORK_SIZE, ptr.size, ptr, nil)
|
250
|
-
error_check(error)
|
251
|
-
return ptr.get_array_of_size_t(0,3)
|
252
|
-
end
|
253
|
-
|
254
|
-
def max_num_sub_groups(device = program.devices.first)
|
255
|
-
error_check(INVALID_OPERATION) if self.context.platform.version_number < 2.1
|
256
|
-
ptr = MemoryPointer::new( :size_t )
|
257
|
-
error = OpenCL.clGetKernelSubGroupInfo(self, device, MAX_NUM_SUB_GROUPS, 0, nil, ptr.size, ptr, nil)
|
258
|
-
error_check(error)
|
259
|
-
return ptr.read_size_t
|
260
|
-
end
|
261
|
-
|
262
|
-
def compile_num_sub_groups(device = program.devices.first)
|
263
|
-
error_check(INVALID_OPERATION) if self.context.platform.version_number < 2.1
|
264
|
-
ptr = MemoryPointer::new( :size_t )
|
265
|
-
error = OpenCL.clGetKernelSubGroupInfo(self, device, COMPILE_NUM_SUB_GROUPS, 0, nil, ptr.size, ptr, nil)
|
266
|
-
error_check(error)
|
267
|
-
return ptr.read_size_t
|
268
|
-
end
|
269
|
-
|
270
|
-
def max_sub_group_size_for_ndrange(local_work_size, device = program.devices.first)
|
271
|
-
error_check(INVALID_OPERATION) if self.context.platform.version_number < 2.1
|
272
|
-
local_work_size = [local_work_size].flatten
|
273
|
-
lws_p = MemoryPointer::new( :size_t, local_work_size.length )
|
274
|
-
local_work_size.each_with_index { |e,i|
|
275
|
-
lws_p[i].write_size_t( e )
|
276
|
-
}
|
277
|
-
ptr = MemoryPointer::new( :size_t )
|
278
|
-
error = OpenCL.clGetKernelSubGroupInfo(self, device, MAX_SUB_GROUP_SIZE_FOR_NDRANGE, lws_p.size, lws_p, ptr.size, ptr, nil)
|
279
|
-
error_check(error)
|
280
|
-
return ptr.read_size_t
|
281
|
-
end
|
282
|
-
|
283
|
-
def sub_groups_count_for_ndrange(local_work_size, device = program.devices.first)
|
284
|
-
error_check(INVALID_OPERATION) if self.context.platform.version_number < 2.1
|
285
|
-
local_work_size = [local_work_size].flatten
|
286
|
-
lws_p = MemoryPointer::new( :size_t, local_work_size.length )
|
287
|
-
local_work_size.each_with_index { |e,i|
|
288
|
-
lws_p[i].write_size_t( e )
|
289
|
-
}
|
290
|
-
ptr = MemoryPointer::new( :size_t )
|
291
|
-
error = OpenCL.clGetKernelSubGroupInfo(self, device, SUB_GROUP_COUNT_FOR_NDRANGE, lws_p.size, lws_p, ptr.size, ptr, nil)
|
292
|
-
error_check(error)
|
293
|
-
return ptr.read_size_t
|
294
|
-
end
|
295
|
-
|
296
|
-
def local_size_for_sub_group_count(sub_group_number, device = program.devices.first)
|
297
|
-
error_check(INVALID_OPERATION) if self.context.platform.version_number < 2.1
|
298
|
-
sgp_p = MemoryPointer::new( :size_t )
|
299
|
-
sgp_p.write_size_t(sub_group_number)
|
300
|
-
size_ptr = MemoryPointer::new( :size_t )
|
301
|
-
error = OpenCL.clGetKernelSubGroupInfo(self, device, LOCAL_SIZE_FOR_SUB_GROUP_COUNT, sgp_p.size, sgp_p, 0, nil, size_ptr)
|
302
|
-
error_check(error)
|
303
|
-
lws_p = MemoryPointer::new( size_ptr.read_size_t )
|
304
|
-
error = OpenCL.clGetKernelSubGroupInfo(self, device, LOCAL_SIZE_FOR_SUB_GROUP_COUNT, sgp_p.size, sgp_p, lws_p.size, lws_p, nil)
|
305
|
-
error_check(error)
|
306
|
-
return lws_p.get_array_of_size_t(0, lws_p.size/size_ptr.size)
|
307
|
-
end
|
308
|
-
|
309
220
|
# Set the index th argument of the Kernel to value. The size of value can be specified.
|
310
221
|
def set_arg(index, value, size = nil)
|
311
222
|
OpenCL.set_kernel_arg(self, index, value, size)
|
312
223
|
end
|
313
224
|
|
314
|
-
# Set the index th argument of the Kernel to an svm pointer value.
|
315
|
-
def set_arg_svm_pointer(index, svm_pointer)
|
316
|
-
OpenCL.set_kernel_arg_svm_pointer(self, index, svm_pointer)
|
317
|
-
end
|
318
|
-
|
319
225
|
# Enqueues the Kernel in the given queue, specifying the global_work_size. Arguments for the kernel are specified afterwards. Last, a hash containing options for enqueu_ndrange kernel can be specified
|
320
226
|
def enqueue_with_args(command_queue, global_work_size, *args)
|
321
227
|
n = self.num_args
|
@@ -327,19 +233,173 @@ module OpenCL
|
|
327
233
|
options = {}
|
328
234
|
end
|
329
235
|
n.times { |i|
|
330
|
-
|
331
|
-
self.set_arg_svm_pointer(i, args[i])
|
332
|
-
else
|
333
|
-
self.set_arg(i, args[i])
|
334
|
-
end
|
236
|
+
self.set_arg(i, args[i])
|
335
237
|
}
|
336
238
|
command_queue.enqueue_ndrange_kernel(self, global_work_size, options)
|
337
239
|
end
|
338
240
|
|
339
|
-
|
340
|
-
|
241
|
+
module OpenCL11
|
242
|
+
|
243
|
+
def preferred_work_group_size_multiple(device = program.devices.first)
|
244
|
+
ptr = MemoryPointer::new( :size_t )
|
245
|
+
error = OpenCL.clGetKernelWorkGroupInfo(self, device, PREFERRED_WORK_GROUP_SIZE_MULTIPLE, ptr.size, ptr, nil)
|
246
|
+
error_check(error)
|
247
|
+
return ptr.read_size_t
|
248
|
+
end
|
249
|
+
|
250
|
+
def private_mem_size(device = program.devices.first)
|
251
|
+
ptr = MemoryPointer::new( :cl_ulong )
|
252
|
+
error = OpenCL.clGetKernelWorkGroupInfo(self, device, PRIVATE_MEM_SIZE, ptr.size, ptr, nil)
|
253
|
+
error_check(error)
|
254
|
+
return ptr.read_cl_ulong
|
255
|
+
end
|
256
|
+
|
257
|
+
end
|
258
|
+
|
259
|
+
module OpenCL12
|
260
|
+
|
261
|
+
##
|
262
|
+
# returns a String containing the attributes qualifier used at kernel definition
|
263
|
+
def attributes
|
264
|
+
attributes_size = MemoryPointer::new( :size_t )
|
265
|
+
error = OpenCL.clGetKernelInfo( self, ATTRIBUTES, 0, nil, attributes_size)
|
266
|
+
error_check(error)
|
267
|
+
attr = MemoryPointer::new( attributes_size.read_size_t )
|
268
|
+
error = OpenCL.clGetKernelInfo( self, ATTRIBUTES, attributes_size.read_size_t, attr, nil)
|
269
|
+
error_check(error)
|
270
|
+
attr_string = attr.read_string
|
271
|
+
return attr_string.split(" ")
|
272
|
+
end
|
273
|
+
|
274
|
+
def global_work_size(device = program.devices.first)
|
275
|
+
ptr = MemoryPointer::new( :size_t, 3 )
|
276
|
+
error = OpenCL.clGetKernelWorkGroupInfo(self, device, GLOBAL_WORK_SIZE, ptr.size, ptr, nil)
|
277
|
+
error_check(error)
|
278
|
+
return ptr.get_array_of_size_t(0,3)
|
279
|
+
end
|
280
|
+
|
281
|
+
end
|
282
|
+
|
283
|
+
module OpenCL20
|
284
|
+
|
285
|
+
# Specifies the list of SVM pointers the kernel will be using
|
286
|
+
def set_svm_ptrs( ptrs )
|
287
|
+
error_check(INVALID_OPERATION) if self.context.platform.version_number < 2.0
|
288
|
+
pointers = [ptrs].flatten
|
289
|
+
pt = MemoryPointer::new( :pointer, pointers.length )
|
290
|
+
pointers.each_with_index { |p, i|
|
291
|
+
pt[i].write_pointer(p)
|
292
|
+
}
|
293
|
+
error = OpenCL.clSetKernelExecInfo( self, EXEC_INFO_SVM_PTRS, pt.size, pt)
|
294
|
+
error_check(error)
|
295
|
+
return self
|
296
|
+
end
|
297
|
+
|
298
|
+
# Specifies the granularity of the SVM system.
|
299
|
+
def set_svm_fine_grain_system( flag )
|
300
|
+
error_check(INVALID_OPERATION) if self.context.platform.version_number < 2.0
|
301
|
+
pt = MemoryPointer::new( :cl_bool )
|
302
|
+
pt.write_cl_bool( flag )
|
303
|
+
error = OpenCL.clSetKernelExecInfo( self, EXEC_INFO_SVM_FINE_GRAIN_SYSTEM, pt.size, pt)
|
304
|
+
error_check(error)
|
305
|
+
return self
|
306
|
+
end
|
307
|
+
|
308
|
+
# Set the index th argument of the Kernel to an svm pointer value.
|
309
|
+
def set_arg_svm_pointer(index, svm_pointer)
|
310
|
+
OpenCL.set_kernel_arg_svm_pointer(self, index, svm_pointer)
|
311
|
+
end
|
312
|
+
|
313
|
+
# Enqueues the Kernel in the given queue, specifying the global_work_size. Arguments for the kernel are specified afterwards. Last, a hash containing options for enqueu_ndrange kernel can be specified
|
314
|
+
def enqueue_with_args(command_queue, global_work_size, *args)
|
315
|
+
n = self.num_args
|
316
|
+
error_check(INVALID_KERNEL_ARGS) if args.length < n
|
317
|
+
error_check(INVALID_KERNEL_ARGS) if args.length > n + 1
|
318
|
+
if args.length == n + 1
|
319
|
+
options = args.last
|
320
|
+
else
|
321
|
+
options = {}
|
322
|
+
end
|
323
|
+
n.times { |i|
|
324
|
+
if args[i].class == SVMPointer and self.context.platform.version_number >= 2.0 then
|
325
|
+
self.set_arg_svm_pointer(i, args[i])
|
326
|
+
else
|
327
|
+
self.set_arg(i, args[i])
|
328
|
+
end
|
329
|
+
}
|
330
|
+
command_queue.enqueue_ndrange_kernel(self, global_work_size, options)
|
331
|
+
end
|
332
|
+
|
341
333
|
end
|
342
334
|
|
335
|
+
module OpenCL21
|
336
|
+
|
337
|
+
def max_num_sub_groups(device = program.devices.first)
|
338
|
+
error_check(INVALID_OPERATION) if self.context.platform.version_number < 2.1
|
339
|
+
ptr = MemoryPointer::new( :size_t )
|
340
|
+
error = OpenCL.clGetKernelSubGroupInfo(self, device, MAX_NUM_SUB_GROUPS, 0, nil, ptr.size, ptr, nil)
|
341
|
+
error_check(error)
|
342
|
+
return ptr.read_size_t
|
343
|
+
end
|
344
|
+
|
345
|
+
def compile_num_sub_groups(device = program.devices.first)
|
346
|
+
error_check(INVALID_OPERATION) if self.context.platform.version_number < 2.1
|
347
|
+
ptr = MemoryPointer::new( :size_t )
|
348
|
+
error = OpenCL.clGetKernelSubGroupInfo(self, device, COMPILE_NUM_SUB_GROUPS, 0, nil, ptr.size, ptr, nil)
|
349
|
+
error_check(error)
|
350
|
+
return ptr.read_size_t
|
351
|
+
end
|
352
|
+
|
353
|
+
def max_sub_group_size_for_ndrange(local_work_size, device = program.devices.first)
|
354
|
+
error_check(INVALID_OPERATION) if self.context.platform.version_number < 2.1
|
355
|
+
local_work_size = [local_work_size].flatten
|
356
|
+
lws_p = MemoryPointer::new( :size_t, local_work_size.length )
|
357
|
+
local_work_size.each_with_index { |e,i|
|
358
|
+
lws_p[i].write_size_t( e )
|
359
|
+
}
|
360
|
+
ptr = MemoryPointer::new( :size_t )
|
361
|
+
error = OpenCL.clGetKernelSubGroupInfo(self, device, MAX_SUB_GROUP_SIZE_FOR_NDRANGE, lws_p.size, lws_p, ptr.size, ptr, nil)
|
362
|
+
error_check(error)
|
363
|
+
return ptr.read_size_t
|
364
|
+
end
|
365
|
+
|
366
|
+
def sub_groups_count_for_ndrange(local_work_size, device = program.devices.first)
|
367
|
+
error_check(INVALID_OPERATION) if self.context.platform.version_number < 2.1
|
368
|
+
local_work_size = [local_work_size].flatten
|
369
|
+
lws_p = MemoryPointer::new( :size_t, local_work_size.length )
|
370
|
+
local_work_size.each_with_index { |e,i|
|
371
|
+
lws_p[i].write_size_t( e )
|
372
|
+
}
|
373
|
+
ptr = MemoryPointer::new( :size_t )
|
374
|
+
error = OpenCL.clGetKernelSubGroupInfo(self, device, SUB_GROUP_COUNT_FOR_NDRANGE, lws_p.size, lws_p, ptr.size, ptr, nil)
|
375
|
+
error_check(error)
|
376
|
+
return ptr.read_size_t
|
377
|
+
end
|
378
|
+
|
379
|
+
def local_size_for_sub_group_count(sub_group_number, device = program.devices.first)
|
380
|
+
error_check(INVALID_OPERATION) if self.context.platform.version_number < 2.1
|
381
|
+
sgp_p = MemoryPointer::new( :size_t )
|
382
|
+
sgp_p.write_size_t(sub_group_number)
|
383
|
+
size_ptr = MemoryPointer::new( :size_t )
|
384
|
+
error = OpenCL.clGetKernelSubGroupInfo(self, device, LOCAL_SIZE_FOR_SUB_GROUP_COUNT, sgp_p.size, sgp_p, 0, nil, size_ptr)
|
385
|
+
error_check(error)
|
386
|
+
lws_p = MemoryPointer::new( size_ptr.read_size_t )
|
387
|
+
error = OpenCL.clGetKernelSubGroupInfo(self, device, LOCAL_SIZE_FOR_SUB_GROUP_COUNT, sgp_p.size, sgp_p, lws_p.size, lws_p, nil)
|
388
|
+
error_check(error)
|
389
|
+
return lws_p.get_array_of_size_t(0, lws_p.size/size_ptr.size)
|
390
|
+
end
|
391
|
+
|
392
|
+
def clone
|
393
|
+
return OpenCL.clone_kernel( self )
|
394
|
+
end
|
395
|
+
|
396
|
+
end
|
397
|
+
|
398
|
+
register_extension( :v11, OpenCL11, "context.platform.version_number >= 1.1" )
|
399
|
+
register_extension( :v12, OpenCL12, "context.platform.version_number >= 1.2" )
|
400
|
+
register_extension( :v20, OpenCL20, "context.platform.version_number >= 2.0" )
|
401
|
+
register_extension( :v21, OpenCL21, "context.platform.version_number >= 2.1" )
|
402
|
+
|
343
403
|
end
|
344
404
|
|
345
405
|
end
|