opencl_ruby_ffi 0.994 → 0.995
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/CommandQueue.rb +14 -9
- data/lib/opencl_ruby_ffi/Context.rb +17 -12
- data/lib/opencl_ruby_ffi/Device.rb +29 -24
- data/lib/opencl_ruby_ffi/Event.rb +25 -20
- data/lib/opencl_ruby_ffi/Image.rb +10 -11
- data/lib/opencl_ruby_ffi/Kernel.rb +36 -26
- data/lib/opencl_ruby_ffi/Mem.rb +27 -22
- data/lib/opencl_ruby_ffi/Pipe.rb +6 -1
- data/lib/opencl_ruby_ffi/Platform.rb +14 -9
- data/lib/opencl_ruby_ffi/Program.rb +31 -58
- data/lib/opencl_ruby_ffi/Sampler.rb +11 -6
- data/lib/opencl_ruby_ffi/opencl_ruby_ffi_base.rb +186 -154
- data/lib/opencl_ruby_ffi/opencl_ruby_ffi_base_gen.rb +110 -96
- data/opencl_ruby_ffi.gemspec +1 -1
- metadata +2 -2
@@ -1040,37 +1040,42 @@ module OpenCL
|
|
1040
1040
|
|
1041
1041
|
# Maps the cl_command_queue object of OpenCL
|
1042
1042
|
class CommandQueue
|
1043
|
+
include InnerInterface
|
1044
|
+
|
1045
|
+
class << self
|
1046
|
+
include InnerGenerator
|
1047
|
+
end
|
1043
1048
|
|
1044
1049
|
# Returns the Context associated to the CommandQueue
|
1045
1050
|
def context
|
1046
|
-
ptr = FFI::MemoryPointer::new(
|
1051
|
+
ptr = FFI::MemoryPointer::new( Context )
|
1047
1052
|
error = OpenCL.clGetCommandQueueInfo(self, CONTEXT, Context.size, ptr, nil)
|
1048
|
-
|
1049
|
-
return
|
1053
|
+
error_check(error)
|
1054
|
+
return Context::new( ptr.read_pointer )
|
1050
1055
|
end
|
1051
1056
|
|
1052
1057
|
# Returns the Device associated to the CommandQueue
|
1053
1058
|
def device
|
1054
|
-
ptr = FFI::MemoryPointer::new(
|
1059
|
+
ptr = FFI::MemoryPointer::new( Device )
|
1055
1060
|
error = OpenCL.clGetCommandQueueInfo(self, DEVICE, Device.size, ptr, nil)
|
1056
|
-
|
1057
|
-
return
|
1061
|
+
error_check(error)
|
1062
|
+
return Device::new( ptr.read_pointer )
|
1058
1063
|
end
|
1059
1064
|
|
1060
1065
|
##
|
1061
1066
|
# :method: reference_count
|
1062
1067
|
# Returns the reference count of the CommandQueue
|
1063
|
-
eval
|
1068
|
+
eval get_info("CommandQueue", :cl_uint, "REFERENCE_COUNT")
|
1064
1069
|
|
1065
1070
|
##
|
1066
1071
|
# :method: size
|
1067
1072
|
# Returns the currently specified size for the command queue (2.0 and for device queue only)
|
1068
|
-
eval
|
1073
|
+
eval get_info("CommandQueue", :cl_uint, "SIZE")
|
1069
1074
|
|
1070
1075
|
##
|
1071
1076
|
# :method: properties
|
1072
1077
|
# Returns the :cl_command_queue_properties used to create the CommandQueue
|
1073
|
-
eval
|
1078
|
+
eval get_info("CommandQueue", :cl_command_queue_properties, "PROPERTIES")
|
1074
1079
|
|
1075
1080
|
# Enqueues a native kernel using the CommandQueue
|
1076
1081
|
# not yet fully implemented
|
@@ -49,18 +49,23 @@ module OpenCL
|
|
49
49
|
|
50
50
|
#Maps the cl_context object of OpenCL
|
51
51
|
class Context
|
52
|
+
include InnerInterface
|
53
|
+
|
54
|
+
class << self
|
55
|
+
include InnerGenerator
|
56
|
+
end
|
52
57
|
|
53
58
|
##
|
54
59
|
# :method: reference_count
|
55
60
|
# Returns the reference count of the Context
|
56
61
|
%w( REFERENCE_COUNT ).each { |prop|
|
57
|
-
eval
|
62
|
+
eval get_info("Context", :cl_uint, prop)
|
58
63
|
}
|
59
64
|
|
60
65
|
##
|
61
66
|
# :method: properties
|
62
67
|
# the Array of :cl_context_properties used to create the Context
|
63
|
-
eval
|
68
|
+
eval get_info_array("Context", :cl_context_properties, "PROPERTIES")
|
64
69
|
|
65
70
|
# Returns the platform associated to the Context
|
66
71
|
def platform
|
@@ -71,8 +76,8 @@ module OpenCL
|
|
71
76
|
def num_devices
|
72
77
|
d_n = 0
|
73
78
|
ptr = FFI::MemoryPointer::new( :size_t )
|
74
|
-
error = OpenCL.clGetContextInfo(self,
|
75
|
-
|
79
|
+
error = OpenCL.clGetContextInfo(self, DEVICES, 0, nil, ptr)
|
80
|
+
error_check(error)
|
76
81
|
d_n = ptr.read_size_t / Platform.size
|
77
82
|
# else
|
78
83
|
# ptr = FFI::MemoryPointer::new( :cl_uint )
|
@@ -87,10 +92,10 @@ module OpenCL
|
|
87
92
|
def devices
|
88
93
|
n = self.num_devices
|
89
94
|
ptr2 = FFI::MemoryPointer::new( Device, n )
|
90
|
-
error = OpenCL.clGetContextInfo(self,
|
91
|
-
|
95
|
+
error = OpenCL.clGetContextInfo(self, DEVICES, Device.size*n, ptr2, nil)
|
96
|
+
error_check(error)
|
92
97
|
return ptr2.get_array_of_pointer(0, n).collect { |device_ptr|
|
93
|
-
|
98
|
+
Device::new(device_ptr)
|
94
99
|
}
|
95
100
|
end
|
96
101
|
|
@@ -104,16 +109,16 @@ module OpenCL
|
|
104
109
|
#
|
105
110
|
# * +:flags+ - a single or an Array of :cl_mem_flags specifying the flags to be used when creating the Buffer
|
106
111
|
def supported_image_formats( image_type, options = {} )
|
107
|
-
flags =
|
112
|
+
flags = get_flags( options )
|
108
113
|
num_image_formats = FFI::MemoryPointer::new( :cl_uint )
|
109
114
|
error = OpenCL.clGetSupportedImageFormats( self, flags, image_type, 0, nil, num_image_formats )
|
110
|
-
|
115
|
+
error_check(error)
|
111
116
|
num_entries = num_image_formats.read_cl_uint
|
112
117
|
image_formats = FFI::MemoryPointer::new( ImageFormat, num_entries )
|
113
118
|
error = OpenCL.clGetSupportedImageFormats( self, flags, image_type, num_entries, image_formats, nil )
|
114
|
-
|
119
|
+
error_check(error)
|
115
120
|
return num_entries.times.collect { |i|
|
116
|
-
|
121
|
+
ImageFormat::from_pointer( image_formats + i * ImageFormat.size )
|
117
122
|
}
|
118
123
|
end
|
119
124
|
|
@@ -334,7 +339,7 @@ module OpenCL
|
|
334
339
|
#
|
335
340
|
# * +device_list+ - an Array of Device to create the program for
|
336
341
|
# * +kernel_names+ - a single or an Array of String representing the kernel names
|
337
|
-
def
|
342
|
+
def create_program_with_built_in_kernels( device_list, kernel_names )
|
338
343
|
return OpenCL.create_program_with_built_in_kernels(self, device_list, kernel_names )
|
339
344
|
end
|
340
345
|
|
@@ -31,6 +31,11 @@ module OpenCL
|
|
31
31
|
|
32
32
|
# Maps the cl_device_id object of OpenCL
|
33
33
|
class Device
|
34
|
+
include InnerInterface
|
35
|
+
|
36
|
+
class << self
|
37
|
+
include InnerGenerator
|
38
|
+
end
|
34
39
|
|
35
40
|
# :stopdoc:
|
36
41
|
DRIVER_VERSION = 0x102D
|
@@ -40,10 +45,10 @@ module OpenCL
|
|
40
45
|
def extensions
|
41
46
|
extensions_size = FFI::MemoryPointer::new( :size_t )
|
42
47
|
error = OpenCL.clGetDeviceInfo( self, EXTENSIONS, 0, nil, extensions_size)
|
43
|
-
|
48
|
+
error_check(error)
|
44
49
|
ext = FFI::MemoryPointer::new( extensions_size.read_size_t )
|
45
50
|
error = OpenCL.clGetDeviceInfo( self, EXTENSIONS, extensions_size.read_size_t, ext, nil)
|
46
|
-
|
51
|
+
error_check(error)
|
47
52
|
ext_string = ext.read_string
|
48
53
|
return ext_string.split(" ")
|
49
54
|
end
|
@@ -52,92 +57,92 @@ module OpenCL
|
|
52
57
|
def built_in_kernels
|
53
58
|
built_in_kernels_size = FFI::MemoryPointer::new( :size_t )
|
54
59
|
error = OpenCL.clGetDeviceInfo( self, BUILT_IN_KERNELS, 0, nil, built_in_kernels_size)
|
55
|
-
|
60
|
+
error_check(error)
|
56
61
|
ker = FFI::MemoryPointer::new( built_in_kernels_size.read_size_t )
|
57
62
|
error = OpenCL.clGetDeviceInfo( self, BUILT_IN_KERNELS, built_in_kernels_size.read_size_t, ker, nil)
|
58
|
-
|
63
|
+
error_check(error)
|
59
64
|
ker_string = ext.read_string
|
60
65
|
return ker_string.split(";")
|
61
66
|
end
|
62
67
|
|
63
68
|
%w( BUILT_IN_KERNELS DRIVER_VERSION VERSION VENDOR PROFILE OPENCL_C_VERSION NAME ).each { |prop|
|
64
|
-
eval
|
69
|
+
eval get_info("Device", :string, prop)
|
65
70
|
}
|
66
71
|
|
67
72
|
%w( MAX_MEM_ALLOC_SIZE MAX_CONSTANT_BUFFER_SIZE LOCAL_MEM_SIZE GLOBAL_MEM_CACHE_SIZE GLOBAL_MEM_SIZE ).each { |prop|
|
68
|
-
eval
|
73
|
+
eval get_info("Device", :cl_ulong, prop)
|
69
74
|
}
|
70
75
|
|
71
76
|
%w( IMAGE_PITCH_ALIGNMENT IMAGE_BASE_ADDRESS_ALIGNMENT REFERENCE_COUNT PARTITION_MAX_SUB_DEVICES VENDOR_ID PREFERRED_VECTOR_WIDTH_HALF PREFERRED_VECTOR_WIDTH_CHAR PREFERRED_VECTOR_WIDTH_SHORT PREFERRED_VECTOR_WIDTH_INT PREFERRED_VECTOR_WIDTH_LONG PREFERRED_VECTOR_WIDTH_FLOAT PREFERRED_VECTOR_WIDTH_DOUBLE NATIVE_VECTOR_WIDTH_CHAR NATIVE_VECTOR_WIDTH_SHORT NATIVE_VECTOR_WIDTH_INT NATIVE_VECTOR_WIDTH_LONG NATIVE_VECTOR_WIDTH_FLOAT NATIVE_VECTOR_WIDTH_DOUBLE NATIVE_VECTOR_WIDTH_HALF MIN_DATA_TYPE_ALIGN_SIZE MEM_BASE_ADDR_ALIGN MAX_WRITE_IMAGE_ARGS MAX_READ_WRITE_IMAGE_ARGS MAX_WORK_ITEM_DIMENSIONS MAX_SAMPLERS MAX_READ_IMAGE_ARGS MAX_CONSTANT_ARGS MAX_COMPUTE_UNITS MAX_CLOCK_FREQUENCY ADDRESS_BITS GLOBAL_MEM_CACHELINE_SIZE QUEUE_ON_DEVICE_PREFERRED_SIZE QUEUE_ON_DEVICE_MAX_SIZE MAX_ON_DEVICE_QUEUES MAX_ON_DEVICE_EVENTS MAX_PIPE_ARGS PIPE_MAX_ACTIVE_RESERVATIONS PIPE_MAX_PACKET_SIZE PREFERRED_PLATFORM_ATOMIC_ALIGNMENT PREFERRED_GLOBAL_ATOMIC_ALIGNMENT PREFERRED_LOCAL_ATOMIC_ALIGNMENT).each { |prop|
|
72
|
-
eval
|
77
|
+
eval get_info("Device", :cl_uint, prop)
|
73
78
|
}
|
74
79
|
|
75
80
|
%w( PRINTF_BUFFER_SIZE IMAGE_MAX_BUFFER_SIZE IMAGE_MAX_ARRAY_SIZE PROFILING_TIMER_RESOLUTION MAX_WORK_GROUP_SIZE MAX_PARAMETER_SIZE IMAGE2D_MAX_WIDTH IMAGE2D_MAX_HEIGHT IMAGE3D_MAX_WIDTH IMAGE3D_MAX_HEIGHT IMAGE3D_MAX_DEPTH MAX_GLOBAL_VARIABLE_SIZE GLOBAL_VARIABLE_PREFERRED_TOTAL_SIZE).each { |prop|
|
76
|
-
eval
|
81
|
+
eval get_info("Device", :size_t, prop)
|
77
82
|
}
|
78
83
|
|
79
84
|
%w( PREFERRED_INTEROP_USER_SYNC LINKER_AVAILABLE IMAGE_SUPPORT HOST_UNIFIED_MEMORY COMPILER_AVAILABLE AVAILABLE ENDIAN_LITTLE ERROR_CORRECTION_SUPPORT ).each { |prop|
|
80
|
-
eval
|
85
|
+
eval get_info("Device", :cl_bool, prop)
|
81
86
|
}
|
82
87
|
|
83
88
|
%w( SINGLE_FP_CONFIG HALF_FP_CONFIG DOUBLE_FP_CONFIG ).each { |prop|
|
84
|
-
eval
|
89
|
+
eval get_info("Device", :cl_device_fp_config, prop)
|
85
90
|
}
|
86
91
|
|
87
92
|
##
|
88
93
|
# :method: execution_capabilities()
|
89
94
|
# Returns an ExecCpabilities representing the execution capabilities corresponding to the Device
|
90
|
-
eval
|
95
|
+
eval get_info("Device", :cl_device_exec_capabilities, "EXECUTION_CAPABILITIES")
|
91
96
|
|
92
97
|
##
|
93
98
|
# :method: global_mem_cache_type()
|
94
99
|
# Returns a MemCacheType representing the type of the global cache memory on the Device
|
95
|
-
eval
|
100
|
+
eval get_info("Device", :cl_device_mem_cache_type, "GLOBAL_MEM_CACHE_TYPE")
|
96
101
|
|
97
102
|
##
|
98
103
|
# :method: local_mem_type()
|
99
104
|
# Returns a LocalMemType rpresenting the type of the local memory on the Device
|
100
|
-
eval
|
105
|
+
eval get_info("Device", :cl_device_local_mem_type, "LOCAL_MEM_TYPE")
|
101
106
|
|
102
107
|
##
|
103
108
|
# :method: queue_properties()
|
104
109
|
# Returns a CommandQueue::Properties representing the properties supported by a CommandQueue targetting the Device
|
105
|
-
eval
|
110
|
+
eval get_info("Device", :cl_command_queue_properties, "QUEUE_PROPERTIES")
|
106
111
|
|
107
112
|
##
|
108
113
|
# :method: queue_on_device_properties()
|
109
114
|
# Returns a CommandQueue::Properties representing the properties supported by a CommandQueue on the Device
|
110
|
-
eval
|
115
|
+
eval get_info("Device", :cl_command_queue_properties, "QUEUE_ON_DEVICE_PROPERTIES")
|
111
116
|
|
112
117
|
##
|
113
118
|
# :method: queue_on_host_properties()
|
114
119
|
# Returns a CommandQueue::Properties representing the properties supported by a CommandQueue targetting the Device
|
115
|
-
eval
|
120
|
+
eval get_info("Device", :cl_command_queue_properties, "QUEUE_ON_HOST_PROPERTIES")
|
116
121
|
|
117
122
|
##
|
118
123
|
# :method: type()
|
119
124
|
# Returns a Device::Type representing the type of the Device
|
120
|
-
eval
|
125
|
+
eval get_info("Device", :cl_device_type, "TYPE")
|
121
126
|
|
122
127
|
##
|
123
128
|
# :method: partition_affinity_domain()
|
124
129
|
# Returns an AffinityDomain representing the list of supported affinity domains for partitioning the Device using OpenCL::Device::PARTITION_BY_AFFINITY_DOMAIN
|
125
|
-
eval
|
130
|
+
eval get_info("Device", :cl_device_affinity_domain, "PARTITION_AFFINITY_DOMAIN")
|
126
131
|
|
127
132
|
##
|
128
133
|
# :method: max_work_item_sizes()
|
129
134
|
# Maximum number of work-items that can be specified in each dimension of the work-group to clEnqueueNDRangeKernel for the Device
|
130
|
-
eval
|
135
|
+
eval get_info_array("Device", :size_t, "MAX_WORK_ITEM_SIZES")
|
131
136
|
|
132
137
|
##
|
133
138
|
# :method: partition_properties()
|
134
139
|
# Returns the list of partition types supported by the Device
|
135
|
-
eval
|
140
|
+
eval get_info_array("Device", :cl_device_partition_property, "PARTITION_PROPERTIES")
|
136
141
|
|
137
142
|
##
|
138
143
|
# :method: svm_capabilities()
|
139
144
|
# Returns an SVMCapabilities representing the the SVM capabilities corresponding to the device
|
140
|
-
eval
|
145
|
+
eval get_info_array("Device", :cl_device_svm_capabilities, "SVM_CAPABILITIES")
|
141
146
|
|
142
147
|
# Return an Array of partition properties names representing the partition type supported by the device
|
143
148
|
def partition_properties_names
|
@@ -151,13 +156,13 @@ module OpenCL
|
|
151
156
|
##
|
152
157
|
# :method: partition_type()
|
153
158
|
# Returns a list of :cl_device_partition_property used to create the Device
|
154
|
-
eval
|
159
|
+
eval get_info_array("Device", :cl_device_partition_property, "PARTITION_TYPE")
|
155
160
|
|
156
161
|
# Returns the platform the Device belongs to
|
157
162
|
def platform
|
158
163
|
ptr = FFI::MemoryPointer::new( OpenCL::Platform )
|
159
164
|
error = OpenCL.clGetDeviceInfo(self, PLATFORM, OpenCL::Platform.size, ptr, nil)
|
160
|
-
|
165
|
+
error_check(error)
|
161
166
|
return OpenCL::Platform::new(ptr.read_pointer)
|
162
167
|
end
|
163
168
|
|
@@ -165,7 +170,7 @@ module OpenCL
|
|
165
170
|
def parent_device
|
166
171
|
ptr = FFI::MemoryPointer::new( Device )
|
167
172
|
error = OpenCL.clGetDeviceInfo(self, PARENT_DEVICE, Device.size, ptr, nil)
|
168
|
-
|
173
|
+
error_check(error)
|
169
174
|
return nil if ptr.null?
|
170
175
|
return Device::new(ptr.read_pointer)
|
171
176
|
end
|
@@ -67,73 +67,78 @@ module OpenCL
|
|
67
67
|
|
68
68
|
# Maps the cl_event object
|
69
69
|
class Event
|
70
|
+
include InnerInterface
|
71
|
+
|
72
|
+
class << self
|
73
|
+
include InnerGenerator
|
74
|
+
end
|
70
75
|
|
71
76
|
# Returns the CommandQueue associated with the Event, if it exists
|
72
77
|
def command_queue
|
73
|
-
ptr = FFI::MemoryPointer::new(
|
74
|
-
error = OpenCL.clGetEventInfo(self, COMMAND_QUEUE,
|
75
|
-
|
78
|
+
ptr = FFI::MemoryPointer::new( CommandQueue )
|
79
|
+
error = OpenCL.clGetEventInfo(self, COMMAND_QUEUE, CommandQueue.size, ptr, nil)
|
80
|
+
error_check(error)
|
76
81
|
pt = ptr.read_pointer
|
77
82
|
if pt.null? then
|
78
83
|
return nil
|
79
84
|
else
|
80
|
-
return
|
85
|
+
return CommandQueue::new( pt )
|
81
86
|
end
|
82
87
|
end
|
83
88
|
|
84
89
|
# Returns the Context associated with the Event
|
85
90
|
def context
|
86
|
-
ptr = FFI::MemoryPointer::new(
|
87
|
-
error = OpenCL.clGetEventInfo(self, CONTEXT,
|
88
|
-
|
89
|
-
return
|
91
|
+
ptr = FFI::MemoryPointer::new( Context )
|
92
|
+
error = OpenCL.clGetEventInfo(self, CONTEXT, Context.size, ptr, nil)
|
93
|
+
error_check(error)
|
94
|
+
return Context::new( ptr.read_pointer )
|
90
95
|
end
|
91
96
|
|
92
97
|
# Returns a CommandType corresponding to the type of the command associated with the Event
|
93
|
-
eval
|
98
|
+
eval get_info("Event", :cl_command_type, "COMMAND_TYPE")
|
94
99
|
|
95
100
|
# Returns a CommandExecutionStatus corresponding to the status of the command associtated with the Event
|
96
101
|
def command_execution_status
|
97
102
|
ptr = FFI::MemoryPointer::new( :cl_int )
|
98
103
|
error = OpenCL.clGetEventInfo(self, COMMAND_EXECUTION_STATUS, ptr.size, ptr, nil )
|
99
|
-
|
100
|
-
return
|
104
|
+
error_check(error)
|
105
|
+
return CommandExecutionStatus::new( ptr.read_cl_int )
|
101
106
|
end
|
102
107
|
|
103
108
|
##
|
104
109
|
# :method: reference_count()
|
105
110
|
# Returns the reference counter of th Event
|
106
|
-
eval
|
111
|
+
eval get_info("Event", :cl_uint, "REFERENCE_COUNT")
|
107
112
|
|
108
113
|
# Returns the date the command corresponding to Event was queued
|
109
114
|
def profiling_command_queued
|
110
115
|
ptr = FFI::MemoryPointer::new( :cl_ulong )
|
111
|
-
error = OpenCL.clGetEventProfilingInfo(self,
|
112
|
-
|
116
|
+
error = OpenCL.clGetEventProfilingInfo(self, PROFILING_COMMAND_QUEUED, ptr.size, ptr, nil )
|
117
|
+
error_check(error)
|
113
118
|
return ptr.read_cl_ulong
|
114
119
|
end
|
115
120
|
|
116
121
|
# Returns the date the command corresponding to Event was submited
|
117
122
|
def profiling_command_submit
|
118
123
|
ptr = FFI::MemoryPointer::new( :cl_ulong )
|
119
|
-
error = OpenCL.clGetEventProfilingInfo(self,
|
120
|
-
|
124
|
+
error = OpenCL.clGetEventProfilingInfo(self, PROFILING_COMMAND_SUBMIT, ptr.size, ptr, nil )
|
125
|
+
error_check(error)
|
121
126
|
return ptr.read_cl_ulong
|
122
127
|
end
|
123
128
|
|
124
129
|
# Returns the date the command corresponding to Event started
|
125
130
|
def profiling_command_start
|
126
131
|
ptr = FFI::MemoryPointer::new( :cl_ulong )
|
127
|
-
error = OpenCL.clGetEventProfilingInfo(self,
|
128
|
-
|
132
|
+
error = OpenCL.clGetEventProfilingInfo(self, PROFILING_COMMAND_START, ptr.size, ptr, nil )
|
133
|
+
error_check(error)
|
129
134
|
return ptr.read_cl_ulong
|
130
135
|
end
|
131
136
|
|
132
137
|
# Returns the date the command corresponding to Event ended
|
133
138
|
def profiling_command_end
|
134
139
|
ptr = FFI::MemoryPointer::new( :cl_ulong )
|
135
|
-
error = OpenCL.clGetEventProfilingInfo(self,
|
136
|
-
|
140
|
+
error = OpenCL.clGetEventProfilingInfo(self, PROFILING_COMMAND_END, ptr.size, ptr, nil )
|
141
|
+
error_check(error)
|
137
142
|
return ptr.read_cl_ulong
|
138
143
|
end
|
139
144
|
|
@@ -199,7 +199,6 @@ module OpenCL
|
|
199
199
|
# Maps the cl_mem OpenCL objects of type CL_MEM_OBJECT_IMAGE*
|
200
200
|
class Image
|
201
201
|
|
202
|
-
|
203
202
|
##
|
204
203
|
# :method: element_size
|
205
204
|
# Returns the element_size of the Image
|
@@ -228,7 +227,7 @@ module OpenCL
|
|
228
227
|
# :method: array_size
|
229
228
|
# Returns the array_size of the Image
|
230
229
|
%w( ELEMENT_SIZE ROW_PITCH SLICE_PITCH WIDTH HEIGHT DEPTH ARRAY_SIZE ).each { |prop|
|
231
|
-
eval
|
230
|
+
eval get_info("Image", :size_t, prop)
|
232
231
|
}
|
233
232
|
|
234
233
|
##
|
@@ -239,29 +238,29 @@ module OpenCL
|
|
239
238
|
# :method: num_samples
|
240
239
|
# Returns the num_samples of the Image
|
241
240
|
%w( NUM_MIP_LEVELS NUM_SAMPLES ).each { |prop|
|
242
|
-
eval
|
241
|
+
eval get_info("Image", :cl_uint, prop)
|
243
242
|
}
|
244
243
|
|
245
244
|
# Returns the ImageDesc corresponding to the Image
|
246
245
|
def desc
|
247
|
-
return
|
246
|
+
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 )
|
248
247
|
end
|
249
248
|
|
250
249
|
# Returns the ImageFormat corresponding to the image
|
251
250
|
def format
|
252
|
-
image_format = FFI::MemoryPointer::new(
|
251
|
+
image_format = FFI::MemoryPointer::new( ImageFormat )
|
253
252
|
error = OpenCL.clGetImageInfo( self, FORMAT, image_format.size, image_format, nil)
|
254
|
-
|
255
|
-
return
|
253
|
+
error_check(error)
|
254
|
+
return ImageFormat::from_pointer( image_format )
|
256
255
|
end
|
257
256
|
|
258
257
|
# Returns the associated Buffer if any, nil otherwise
|
259
258
|
def buffer
|
260
|
-
ptr = FFI::MemoryPointer::new(
|
261
|
-
error = OpenCL.clGetImageInfo(self, BUFFER,
|
262
|
-
|
259
|
+
ptr = FFI::MemoryPointer::new( Buffer )
|
260
|
+
error = OpenCL.clGetImageInfo(self, BUFFER, Buffer.size, ptr, nil)
|
261
|
+
error_check(error)
|
263
262
|
return nil if ptr.null?
|
264
|
-
return
|
263
|
+
return Buffer::new(ptr.read_pointer)
|
265
264
|
end
|
266
265
|
|
267
266
|
end
|
@@ -37,9 +37,19 @@ module OpenCL
|
|
37
37
|
|
38
38
|
# Maps the cl_kernel object
|
39
39
|
class Kernel
|
40
|
+
include InnerInterface
|
41
|
+
|
42
|
+
class << self
|
43
|
+
include InnerGenerator
|
44
|
+
end
|
40
45
|
|
41
46
|
# Maps the logical cl arg object
|
42
47
|
class Arg
|
48
|
+
include InnerInterface
|
49
|
+
|
50
|
+
class << self
|
51
|
+
include InnerGenerator
|
52
|
+
end
|
43
53
|
# Returns the index of the Arg in the list
|
44
54
|
attr_reader :index
|
45
55
|
# Returns the Kernel this Arg belongs to
|
@@ -53,58 +63,58 @@ module OpenCL
|
|
53
63
|
|
54
64
|
# Returns an AddressQualifier corresponding to the Arg
|
55
65
|
def address_qualifier
|
56
|
-
|
66
|
+
error_check(INVALID_OPERATION) if @kernel.context.platform.version_number < 1.2
|
57
67
|
ptr = FFI::MemoryPointer::new( :cl_kernel_arg_address_qualifier )
|
58
68
|
error = OpenCL.clGetKernelArgInfo(@kernel, @index, ADDRESS_QUALIFIER, ptr.size, ptr, nil)
|
59
|
-
|
69
|
+
error_check(error)
|
60
70
|
return AddressQualifier::new( ptr.read_cl_kernel_arg_address_qualifier )
|
61
71
|
end
|
62
72
|
|
63
73
|
# Returns an AccessQualifier corresponding to the Arg
|
64
74
|
def access_qualifier
|
65
|
-
|
75
|
+
error_check(INVALID_OPERATION) if @kernel.context.platform.version_number < 1.2
|
66
76
|
ptr = FFI::MemoryPointer::new( :cl_kernel_arg_access_qualifier )
|
67
77
|
error = OpenCL.clGetKernelArgInfo(@kernel, @index, ACCESS_QUALIFIER, ptr.size, ptr, nil)
|
68
|
-
|
78
|
+
error_check(error)
|
69
79
|
return AccessQualifier::new( ptr.read_cl_kernel_arg_access_qualifier )
|
70
80
|
end
|
71
81
|
|
72
82
|
# Returns a TypeQualifier corresponding to the Arg
|
73
83
|
def type_qualifier
|
74
|
-
|
84
|
+
error_check(INVALID_OPERATION) if @kernel.context.platform.version_number < 1.2
|
75
85
|
ptr = FFI::MemoryPointer::new( :cl_kernel_arg_type_qualifier )
|
76
86
|
error = OpenCL.clGetKernelArgInfo(@kernel, @index, TYPE_QUALIFIER, ptr.size, ptr, nil)
|
77
|
-
|
87
|
+
error_check(error)
|
78
88
|
return TypeQualifier::new( ptr.read_cl_kernel_arg_type_qualifier )
|
79
89
|
end
|
80
90
|
|
81
91
|
# Returns a String corresponding to the Arg type name
|
82
92
|
def type_name
|
83
|
-
|
93
|
+
error_check(INVALID_OPERATION) if @kernel.context.platform.version_number < 1.2
|
84
94
|
ptr1 = FFI::MemoryPointer::new( :size_t, 1)
|
85
95
|
error = OpenCL.clGetKernelArgInfo(@kernel, @index, TYPE_NAME, 0, nil, ptr1)
|
86
|
-
|
96
|
+
error_check(error)
|
87
97
|
ptr2 = FFI::MemoryPointer::new( ptr1.read_size_t )
|
88
98
|
error = OpenCL.clGetKernelArgInfo(@kernel, @index, TYPE_NAME, ptr1.read_size_t, ptr2, nil)
|
89
|
-
|
99
|
+
error_check(error)
|
90
100
|
return ptr2.read_string
|
91
101
|
end
|
92
102
|
|
93
103
|
# Returns a String corresponding to the Arg name
|
94
104
|
def name
|
95
|
-
|
105
|
+
error_check(INVALID_OPERATION) if @kernel.context.platform.version_number < 1.2
|
96
106
|
ptr1 = FFI::MemoryPointer::new( :size_t, 1)
|
97
107
|
error = OpenCL.clGetKernelArgInfo(@kernel, @index, NAME, 0, nil, ptr1)
|
98
|
-
|
108
|
+
error_check(error)
|
99
109
|
ptr2 = FFI::MemoryPointer::new( ptr1.read_size_t )
|
100
110
|
error = OpenCL.clGetKernelArgInfo(@kernel, @index, NAME, ptr1.read_size_t, ptr2, nil)
|
101
|
-
|
111
|
+
error_check(error)
|
102
112
|
return ptr2.read_string
|
103
113
|
end
|
104
114
|
|
105
115
|
# Sets this Arg to value. The size of value can be specified.
|
106
116
|
def set(value, size = nil)
|
107
|
-
if value.class ==
|
117
|
+
if value.class == SVMPointer and @kernel.context.platform.version_number >= 2.0 then
|
108
118
|
OpenCL.set_kernel_arg_svm_pointer( @kernel, @index, value )
|
109
119
|
else
|
110
120
|
OpenCL.set_kernel_arg(@kernel, @index, value, size)
|
@@ -125,24 +135,24 @@ module OpenCL
|
|
125
135
|
|
126
136
|
# Specifies the list of SVM pointers the kernel will be using
|
127
137
|
def set_svm_ptrs( ptrs )
|
128
|
-
|
138
|
+
error_check(INVALID_OPERATION) if self.context.platform.version_number < 2.0
|
129
139
|
pointers = [ptrs].flatten
|
130
140
|
pt = FFI::MemoryPointer::new( :pointer, pointers.length )
|
131
141
|
pointers.each_with_index { |p, i|
|
132
142
|
pt[i].write_pointer(p)
|
133
143
|
}
|
134
144
|
error = OpenCL.clSetKernelExecInfo( self, EXEC_INFO_SVM_PTRS, pt.size, pt)
|
135
|
-
|
145
|
+
error_check(error)
|
136
146
|
return self
|
137
147
|
end
|
138
148
|
|
139
149
|
# Specifies the granularity of the SVM system.
|
140
150
|
def set_svm_fine_grain_system( flag )
|
141
|
-
|
151
|
+
error_check(INVALID_OPERATION) if self.context.platform.version_number < 2.0
|
142
152
|
pt = FFI::MemoryPointer::new( :cl_bool )
|
143
153
|
pt.write_cl_bool( flag )
|
144
154
|
error = OpenCL.clSetKernelExecInfo( self, EXEC_INFO_SVM_FINE_GRAIN_SYSTEL, pt.size, pt)
|
145
|
-
|
155
|
+
error_check(error)
|
146
156
|
return self
|
147
157
|
end
|
148
158
|
|
@@ -154,7 +164,7 @@ module OpenCL
|
|
154
164
|
# :method: attributes()
|
155
165
|
# returns a String containing the attributes qualifier used at kernel definition
|
156
166
|
%w( FUNCTION_NAME ATTRIBUTES ).each { |prop|
|
157
|
-
eval
|
167
|
+
eval get_info("Kernel", :string, prop)
|
158
168
|
}
|
159
169
|
|
160
170
|
alias name function_name
|
@@ -167,23 +177,23 @@ module OpenCL
|
|
167
177
|
# :method: reference_count
|
168
178
|
# Returns the reference counter for the Kernel
|
169
179
|
%w( NUM_ARGS REFERENCE_COUNT ).each { |prop|
|
170
|
-
eval
|
180
|
+
eval get_info("Kernel", :cl_uint, prop)
|
171
181
|
}
|
172
182
|
|
173
183
|
# Returns the Context the Kernel is associated with
|
174
184
|
def context
|
175
185
|
ptr = FFI::MemoryPointer::new( Context )
|
176
186
|
error = OpenCL.clGetKernelInfo(self, CONTEXT, Context.size, ptr, nil)
|
177
|
-
|
178
|
-
return
|
187
|
+
error_check(error)
|
188
|
+
return Context::new( ptr.read_pointer )
|
179
189
|
end
|
180
190
|
|
181
191
|
# Returns the Program the Kernel was created from
|
182
192
|
def program
|
183
193
|
ptr = FFI::MemoryPointer::new( Program )
|
184
194
|
error = OpenCL.clGetKernelInfo(self, PROGRAM, Program.size, ptr, nil)
|
185
|
-
|
186
|
-
return
|
195
|
+
error_check(error)
|
196
|
+
return Program::new(ptr.read_pointer)
|
187
197
|
end
|
188
198
|
|
189
199
|
# Set the index th argument of the Kernel to value. The size of value can be specified.
|
@@ -199,15 +209,15 @@ module OpenCL
|
|
199
209
|
# 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 enqueuNDrange kernel can be specified
|
200
210
|
def enqueue_with_args(command_queue, global_work_size, *args)
|
201
211
|
n = self.num_args
|
202
|
-
|
203
|
-
|
212
|
+
error_check(INVALID_KERNEL_ARGS) if args.length < n
|
213
|
+
error_check(INVALID_KERNEL_ARGS) if args.length > n + 1
|
204
214
|
if args.length == n + 1
|
205
215
|
options = args.last
|
206
216
|
else
|
207
217
|
options = {}
|
208
218
|
end
|
209
219
|
n.times { |i|
|
210
|
-
if args[i].class ==
|
220
|
+
if args[i].class == SVMPointer and self.context.platform.version_number >= 2.0 then
|
211
221
|
self.set_arg_svm_pointer(i, args[i])
|
212
222
|
else
|
213
223
|
self.set_arg(i, args[i])
|