opencl_ruby_ffi 1.3.6 → 1.3.11
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.rb +1 -0
- data/lib/opencl_ruby_ffi/Buffer.rb +7 -1
- data/lib/opencl_ruby_ffi/CommandQueue.rb +24 -11
- data/lib/opencl_ruby_ffi/Context.rb +88 -18
- data/lib/opencl_ruby_ffi/Device.rb +99 -18
- data/lib/opencl_ruby_ffi/Event.rb +22 -13
- data/lib/opencl_ruby_ffi/Image.rb +7 -1
- data/lib/opencl_ruby_ffi/Kernel.rb +79 -50
- data/lib/opencl_ruby_ffi/Mem.rb +28 -12
- data/lib/opencl_ruby_ffi/Pipe.rb +8 -0
- data/lib/opencl_ruby_ffi/Platform.rb +41 -14
- data/lib/opencl_ruby_ffi/Program.rb +71 -26
- data/lib/opencl_ruby_ffi/SVM.rb +24 -12
- data/lib/opencl_ruby_ffi/Sampler.rb +7 -5
- data/lib/opencl_ruby_ffi/ext.rb +1 -0
- data/lib/opencl_ruby_ffi/intel/kernel_profiling.rb +38 -0
- data/lib/opencl_ruby_ffi/intel/unified_shared_memory_preview.rb +613 -0
- data/lib/opencl_ruby_ffi/intel/unofficial.rb +95 -0
- data/lib/opencl_ruby_ffi/khr/device_uuid.rb +119 -0
- data/lib/opencl_ruby_ffi/opencl_ruby_ffi_base.rb +222 -61
- data/lib/opencl_ruby_ffi/opencl_ruby_ffi_base_gen.rb +83 -173
- data/lib/opencl_ruby_ffi/opencl_ruby_ffi_library.rb +181 -0
- data/lib/opencl_ruby_ffi/opencl_types.rb +4 -0
- data/opencl_ruby_ffi.gemspec +2 -3
- metadata +9 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 065ec7c422916ba7d169142533db9bd995454f4ba4f1c15140a9520678a2bfd6
|
4
|
+
data.tar.gz: bbc4f7adf1314fc7d52ac0d17f055395f49f0b36cee51a93ccd13ad7463ad99a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cf5f687a27e5366205e978a0040da1f973e543953f286221c8bf0af9a0b2089d42f826039965cdf59bd9c1c7f64dca51b2bc50663818093fe667a5435dc429bf
|
7
|
+
data.tar.gz: 249cdaa1aba3ede6812b759c41fe21e468b40c15621f04e759829507dea1597d9fc2e31b85d8c0ef54cc65c0828da683ff0d6ad88414b14b22b87085c477b0f2
|
data/lib/opencl_ruby_ffi.rb
CHANGED
@@ -2,6 +2,7 @@ require "opencl_ruby_ffi/opencl_types.rb"
|
|
2
2
|
require "opencl_ruby_ffi/opencl_ruby_ffi_base_gen.rb"
|
3
3
|
require "opencl_ruby_ffi/opencl_arithmetic_gen.rb"
|
4
4
|
require "opencl_ruby_ffi/opencl_ruby_ffi_base.rb"
|
5
|
+
require "opencl_ruby_ffi/opencl_ruby_ffi_library.rb"
|
5
6
|
require "opencl_ruby_ffi/Context.rb"
|
6
7
|
require "opencl_ruby_ffi/Platform.rb"
|
7
8
|
require "opencl_ruby_ffi/Device.rb"
|
@@ -13,11 +13,17 @@ module OpenCL
|
|
13
13
|
#
|
14
14
|
# * +:flags+ - a single or an Array of :cl_mem_flags specifying the flags to be used when creating the Buffer
|
15
15
|
# * +:host_ptr+ - if provided, the Pointer (or convertible to Pointer using to_ptr) to the memory area to use
|
16
|
+
# * +:properties+ - if provided, an array of :cl_mem_properties (OpenCL 3.0)
|
16
17
|
def self.create_buffer( context, size, options = {} )
|
17
18
|
flags = get_flags( options )
|
18
19
|
host_ptr = options[:host_ptr]
|
19
20
|
error = MemoryPointer::new( :cl_int )
|
20
|
-
|
21
|
+
if context.platform.version_number < 3.0 then
|
22
|
+
buff = clCreateBuffer(context, flags, size, host_ptr, error)
|
23
|
+
else
|
24
|
+
properties = get_mem_properties( options )
|
25
|
+
buff = clCreateBufferWithProperties(context, properties, flags, size, host_ptr, error)
|
26
|
+
end
|
21
27
|
error_check(error.read_cl_int)
|
22
28
|
return Buffer::new( buff, false )
|
23
29
|
end
|
@@ -566,7 +566,7 @@ module OpenCL
|
|
566
566
|
objs = nil
|
567
567
|
if num_objs > 0 then
|
568
568
|
objs = MemoryPointer::new( Mem, num_objs )
|
569
|
-
[mem_objects].flatten.each_with_index { |
|
569
|
+
[mem_objects].flatten.each_with_index { |e, i|
|
570
570
|
objs[i].write_pointer(e)
|
571
571
|
}
|
572
572
|
end
|
@@ -600,7 +600,7 @@ module OpenCL
|
|
600
600
|
objs = nil
|
601
601
|
if num_objs > 0 then
|
602
602
|
objs = MemoryPointer::new( Mem, num_objs )
|
603
|
-
[mem_objects].flatten.each_with_index { |
|
603
|
+
[mem_objects].flatten.each_with_index { |e, i|
|
604
604
|
objs[i].write_pointer(e)
|
605
605
|
}
|
606
606
|
end
|
@@ -1070,6 +1070,11 @@ module OpenCL
|
|
1070
1070
|
return "#<#{self.class.name}: -> #{device.inspect}#{ 0 != p.to_i ? " (#{p})" : ""}>"
|
1071
1071
|
end
|
1072
1072
|
|
1073
|
+
# Returns the Platform associated with the CommandQueue
|
1074
|
+
def platform
|
1075
|
+
@_platform ||= self.context.platform
|
1076
|
+
end
|
1077
|
+
|
1073
1078
|
# Returns the Context associated to the CommandQueue
|
1074
1079
|
def context
|
1075
1080
|
ptr = MemoryPointer::new( Context )
|
@@ -1654,11 +1659,11 @@ module OpenCL
|
|
1654
1659
|
#
|
1655
1660
|
# * +dst_ptr+ - the Pointer (or convertible to Pointer using to_ptr) or SVMPointer to be written to
|
1656
1661
|
# * +src_ptr+ - the Pointer (or convertible to Pointer using to_ptr) or SVMPointer to be read from
|
1657
|
-
# * +size+ - the size of data to copy
|
1658
1662
|
# * +options+ - a hash containing named options
|
1659
1663
|
#
|
1660
1664
|
# ==== Options
|
1661
1665
|
#
|
1666
|
+
# * +:size+ - the size of data to copy
|
1662
1667
|
# * +:event_wait_list+ - if provided, a list of Event to wait upon before executing the command
|
1663
1668
|
# * +:blocking_copy+ - if provided indicates if the command blocks until the copy finishes
|
1664
1669
|
# * +:blocking+ - if provided indicates if the command blocks until the copy finishes
|
@@ -1666,8 +1671,8 @@ module OpenCL
|
|
1666
1671
|
# ==== Returns
|
1667
1672
|
#
|
1668
1673
|
# the Event associated with the command
|
1669
|
-
def enqueue_svm_memcpy( dst_ptr, src_ptr,
|
1670
|
-
return OpenCL.enqueue_svm_memcpy(self, dst_ptr, src_ptr,
|
1674
|
+
def enqueue_svm_memcpy( dst_ptr, src_ptr, options = {})
|
1675
|
+
return OpenCL.enqueue_svm_memcpy(self, dst_ptr, src_ptr, options)
|
1671
1676
|
end
|
1672
1677
|
|
1673
1678
|
# Enqueues a command that frees SVMPointers (or Pointers using a callback) using the CommandQueue
|
@@ -1696,31 +1701,32 @@ module OpenCL
|
|
1696
1701
|
#
|
1697
1702
|
# * +svm_ptr+ - the SVMPointer to the area to fill
|
1698
1703
|
# * +pattern+ - the Pointer (or convertible to Pointer using to_ptr) to the memory area where the pattern is stored
|
1699
|
-
# * +size+ - the size of the area to fill
|
1700
1704
|
#
|
1701
1705
|
# ==== Options
|
1702
1706
|
#
|
1707
|
+
# * +:size+ - the size of the area to fill
|
1703
1708
|
# * +:event_wait_list+ - if provided, a list of Event to wait upon before executing the command
|
1704
1709
|
# * +:pattern_size+ - if provided indicates the size of the pattern, else the maximum pattern data is used
|
1705
1710
|
#
|
1706
1711
|
# ==== Returns
|
1707
1712
|
#
|
1708
1713
|
# the Event associated with the command
|
1709
|
-
def enqueue_svm_memfill( svm_ptr, pattern,
|
1710
|
-
return OpenCL.enqueue_svm_memfill(self, svm_ptr, pattern,
|
1714
|
+
def enqueue_svm_memfill( svm_ptr, pattern, options = {})
|
1715
|
+
return OpenCL.enqueue_svm_memfill(self, svm_ptr, pattern, options)
|
1711
1716
|
end
|
1717
|
+
alias enqueue_svm_mem_fill enqueue_svm_memfill
|
1712
1718
|
|
1713
1719
|
# Enqueues a command to map an Image into host memory using the CommandQueue
|
1714
1720
|
#
|
1715
1721
|
# ==== Attributes
|
1716
1722
|
#
|
1717
1723
|
# * +svm_ptr+ - the SVMPointer to the area to map
|
1718
|
-
# * +size+ - the size of the region to map
|
1719
1724
|
# * +map_flags+ - a single or an Array of :cl_map_flags flags
|
1720
1725
|
# * +options+ - a hash containing named options
|
1721
1726
|
#
|
1722
1727
|
# ==== Options
|
1723
1728
|
#
|
1729
|
+
# * +:size+ - the size of the region to map
|
1724
1730
|
# * +:event_wait_list+ - if provided, a list of Event to wait upon before executing the command
|
1725
1731
|
# * +:blocking_map+ - if provided indicates if the command blocks until the region is mapped
|
1726
1732
|
# * +:blocking+ - if provided indicates if the command blocks until the region is mapped
|
@@ -1728,8 +1734,8 @@ module OpenCL
|
|
1728
1734
|
# ==== Returns
|
1729
1735
|
#
|
1730
1736
|
# the Event associated with the command
|
1731
|
-
def enqueue_svm_map( svm_ptr,
|
1732
|
-
return OpenCL.enqueue_svm_map( self, svm_ptr,
|
1737
|
+
def enqueue_svm_map( svm_ptr, map_flags, options = {} )
|
1738
|
+
return OpenCL.enqueue_svm_map( self, svm_ptr, map_flags, options )
|
1733
1739
|
end
|
1734
1740
|
|
1735
1741
|
# Enqueues a command to unmap a previously mapped SVM memory area using the CommandQueue
|
@@ -1783,10 +1789,17 @@ module OpenCL
|
|
1783
1789
|
|
1784
1790
|
end
|
1785
1791
|
|
1792
|
+
module OpenCL30
|
1793
|
+
extend InnerGenerator
|
1794
|
+
|
1795
|
+
get_info_array("CommandQueue", :cl_queue_properties, "properties_array")
|
1796
|
+
end
|
1797
|
+
|
1786
1798
|
register_extension( :v11, OpenCL11, "device.platform.version_number >= 1.1" )
|
1787
1799
|
register_extension( :v12, OpenCL12, "device.platform.version_number >= 1.2" )
|
1788
1800
|
register_extension( :v20, OpenCL20, "device.platform.version_number >= 2.0" )
|
1789
1801
|
register_extension( :v21, OpenCL21, "device.platform.version_number >= 2.1" )
|
1802
|
+
register_extension( :v30, OpenCL30, "device.platform.version_number >= 3.0" )
|
1790
1803
|
|
1791
1804
|
end
|
1792
1805
|
|
@@ -14,7 +14,9 @@ module OpenCL
|
|
14
14
|
# * +:properties+ - a list of :cl_context_properties
|
15
15
|
# * +:user_data+ - an Pointer or an object that can be converted into one using to_ptr. The pointer is passed to the callback.
|
16
16
|
def self.create_context(devices, options = {}, &block)
|
17
|
-
|
17
|
+
if block
|
18
|
+
@@callbacks[block] = options[:user_data]
|
19
|
+
end
|
18
20
|
devs = [devices].flatten
|
19
21
|
pointer = MemoryPointer::new( Device, devs.size)
|
20
22
|
pointer.write_array_of_pointer(devs)
|
@@ -23,7 +25,16 @@ module OpenCL
|
|
23
25
|
error = MemoryPointer::new( :cl_int )
|
24
26
|
ptr = clCreateContext(properties, devs.size, pointer, block, user_data, error)
|
25
27
|
error_check(error.read_cl_int)
|
26
|
-
|
28
|
+
context = Context::new(ptr, false)
|
29
|
+
if block && context.platform.version_number >= 3.0
|
30
|
+
callback_destructor_callback = lambda { |c, u|
|
31
|
+
@@callbacks.delete(block)
|
32
|
+
@@callbacks.delete(callback_destructor_callback)
|
33
|
+
}
|
34
|
+
@@callbacks[callback_destructor_callback] = nil
|
35
|
+
context.set_destructor_callback(&callback_destructor_callback)
|
36
|
+
end
|
37
|
+
return context
|
27
38
|
end
|
28
39
|
|
29
40
|
# Creates an Context using devices of the selected type
|
@@ -39,13 +50,24 @@ module OpenCL
|
|
39
50
|
# * +:properties+ - a list of :cl_context_properties
|
40
51
|
# * +:user_data+ - an Pointer or an object that can be converted into one using to_ptr. The pointer is passed to the callback.
|
41
52
|
def self.create_context_from_type(type, options = {}, &block)
|
42
|
-
|
53
|
+
if block
|
54
|
+
@@callbacks[block] = options[:user_data]
|
55
|
+
end
|
43
56
|
properties = get_context_properties( options )
|
44
57
|
user_data = options[:user_data]
|
45
58
|
error = MemoryPointer::new( :cl_int )
|
46
59
|
ptr = clCreateContextFromType(properties, type, block, user_data, error)
|
47
60
|
error_check(error.read_cl_int)
|
48
|
-
|
61
|
+
context = Context::new(ptr, false)
|
62
|
+
if block && context.platform.version_number >= 3.0
|
63
|
+
callback_destructor_callback = lambda { |c, u|
|
64
|
+
@@callbacks.delete(block)
|
65
|
+
@@callbacks.delete(callback_destructor_callback)
|
66
|
+
}
|
67
|
+
@@callbacks[callback_destructor_callback] = nil
|
68
|
+
context.set_destructor_callback(&callback_destructor_callback)
|
69
|
+
end
|
70
|
+
return context
|
49
71
|
end
|
50
72
|
|
51
73
|
def self.set_default_device_command_queue( context, device, command_queue )
|
@@ -55,6 +77,32 @@ module OpenCL
|
|
55
77
|
return context
|
56
78
|
end
|
57
79
|
|
80
|
+
# Attaches a callback to context that will be called on context destruction
|
81
|
+
#
|
82
|
+
# ==== Attributes
|
83
|
+
#
|
84
|
+
# * +context+ - the Program to attach the callback to
|
85
|
+
# * +options+ - a hash containing named options
|
86
|
+
# * +block+ - if provided, a callback invoked when program is released. Signature of the callback is { |Pointer to the context, Pointer to user_data| ... }
|
87
|
+
#
|
88
|
+
# ==== Options
|
89
|
+
#
|
90
|
+
# * +:user_data+ - a Pointer (or convertible to Pointer using to_ptr) to the memory area to pass to the callback
|
91
|
+
def self.set_context_destructor_callback( context, options = {}, &block )
|
92
|
+
if block
|
93
|
+
wrapper_block = lambda { |p, u|
|
94
|
+
block.call(p, u)
|
95
|
+
@@callbacks.delete(wrapper_block)
|
96
|
+
}
|
97
|
+
@@callbacks[wrapper_block] = options[:user_data]
|
98
|
+
else
|
99
|
+
wrapper_block = nil
|
100
|
+
end
|
101
|
+
error = clSetContextDestructorCallback( context, wrapper_block, options[:user_data] )
|
102
|
+
error_check(error)
|
103
|
+
return context
|
104
|
+
end
|
105
|
+
|
58
106
|
#Maps the cl_context object of OpenCL
|
59
107
|
class Context
|
60
108
|
include InnerInterface
|
@@ -68,23 +116,25 @@ module OpenCL
|
|
68
116
|
|
69
117
|
# Returns the number of devices associated to the Context
|
70
118
|
def num_devices
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
119
|
+
@_num_devices ||= begin
|
120
|
+
ptr = MemoryPointer::new( :size_t )
|
121
|
+
error = OpenCL.clGetContextInfo(self, DEVICES, 0, nil, ptr)
|
122
|
+
error_check(error)
|
123
|
+
ptr.read_size_t / Platform.size
|
124
|
+
end
|
77
125
|
end
|
78
126
|
|
79
127
|
# Returns an Array of Device associated to the Context
|
80
128
|
def devices
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
129
|
+
@_devices ||= begin
|
130
|
+
n = self.num_devices
|
131
|
+
ptr2 = MemoryPointer::new( Device, n )
|
132
|
+
error = OpenCL.clGetContextInfo(self, DEVICES, Device.size*n, ptr2, nil)
|
133
|
+
error_check(error)
|
134
|
+
ptr2.get_array_of_pointer(0, n).collect { |device_ptr|
|
135
|
+
Device::new(device_ptr)
|
136
|
+
}
|
137
|
+
end
|
88
138
|
end
|
89
139
|
|
90
140
|
##
|
@@ -118,7 +168,7 @@ module OpenCL
|
|
118
168
|
|
119
169
|
# Returns the platform associated to the Context
|
120
170
|
def platform
|
121
|
-
self.devices.first.platform
|
171
|
+
@_platform ||= self.devices.first.platform
|
122
172
|
end
|
123
173
|
|
124
174
|
# Returns an Array of ImageFormat that are supported for a given image type in the Context
|
@@ -451,16 +501,36 @@ module OpenCL
|
|
451
501
|
return OpenCL.create_program_with_il(self, il)
|
452
502
|
end
|
453
503
|
|
504
|
+
#
|
454
505
|
def set_default_device_command_queue( device, command_queue )
|
455
506
|
return OpenCL.set_default_device_command_queue( self, device, command_queue )
|
456
507
|
end
|
457
508
|
|
458
509
|
end
|
459
510
|
|
511
|
+
module OpenCL30
|
512
|
+
|
513
|
+
# Attaches a callback to context that will be called on context destruction
|
514
|
+
#
|
515
|
+
# ==== Attributes
|
516
|
+
#
|
517
|
+
# * +options+ - a hash containing named options
|
518
|
+
# * +block+ - if provided, a callback invoked when program is released. Signature of the callback is { |Pointer to the context, Pointer to user_data| ... }
|
519
|
+
#
|
520
|
+
# ==== Options
|
521
|
+
#
|
522
|
+
# * +:user_data+ - a Pointer (or convertible to Pointer using to_ptr) to the memory area to pass to the callback
|
523
|
+
def set_destructor_callback( options = {}, &block )
|
524
|
+
OpenCL.set_context_destructor_callback( self, option, &block )
|
525
|
+
return self
|
526
|
+
end
|
527
|
+
end
|
528
|
+
|
460
529
|
register_extension( :v11, OpenCL11, "platform.version_number >= 1.1" )
|
461
530
|
register_extension( :v12, OpenCL12, "platform.version_number >= 1.2" )
|
462
531
|
register_extension( :v20, OpenCL20, "platform.version_number >= 2.0" )
|
463
532
|
register_extension( :v21, OpenCL21, "platform.version_number >= 2.1" )
|
533
|
+
register_extension( :v30, OpenCL30, "platform.version_number >= 3.0" )
|
464
534
|
|
465
535
|
end
|
466
536
|
|
@@ -14,7 +14,7 @@ module OpenCL
|
|
14
14
|
def self.create_sub_devices( in_device, properties )
|
15
15
|
error_check(INVALID_OPERATION) if in_device.platform.version_number < 1.2
|
16
16
|
props = MemoryPointer::new( :cl_device_partition_property, properties.length + 1 )
|
17
|
-
properties.each_with_index { |e,i|
|
17
|
+
properties.each_with_index { |e, i|
|
18
18
|
props[i].write_cl_device_partition_property(e)
|
19
19
|
}
|
20
20
|
props[properties.length].write_cl_device_partition_property(0)
|
@@ -56,7 +56,7 @@ module OpenCL
|
|
56
56
|
return "#<#{self.class.name}: #{name} (#{pointer.to_i})>"
|
57
57
|
end
|
58
58
|
|
59
|
-
get_info("Device", :cl_uint, "address_bits")
|
59
|
+
get_info("Device", :cl_uint, "address_bits", true)
|
60
60
|
get_info("Device", :cl_bool, "available")
|
61
61
|
get_info("Device", :cl_bool, "compiler_available")
|
62
62
|
get_info("Device", :cl_bool, "endian_little")
|
@@ -101,16 +101,18 @@ module OpenCL
|
|
101
101
|
get_info("Device", :cl_uint, "max_write_image_args")
|
102
102
|
get_info("Device", :cl_uint, "mem_base_addr_align")
|
103
103
|
get_info("Device", :cl_uint, "min_data_type_align_size")
|
104
|
-
get_info("Device", :string, "name")
|
104
|
+
get_info("Device", :string, "name", true)
|
105
105
|
|
106
106
|
alias to_s name
|
107
107
|
|
108
108
|
# Returns the Platform the Device belongs to
|
109
109
|
def platform
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
110
|
+
@_platform ||= begin
|
111
|
+
ptr = MemoryPointer::new( OpenCL::Platform )
|
112
|
+
error = OpenCL.clGetDeviceInfo(self, PLATFORM, OpenCL::Platform.size, ptr, nil)
|
113
|
+
error_check(error)
|
114
|
+
OpenCL::Platform::new(ptr.read_pointer)
|
115
|
+
end
|
114
116
|
end
|
115
117
|
|
116
118
|
get_info("Device", :cl_uint, "preferred_vector_width_char")
|
@@ -119,14 +121,14 @@ module OpenCL
|
|
119
121
|
get_info("Device", :cl_uint, "preferred_vector_width_long")
|
120
122
|
get_info("Device", :cl_uint, "preferred_vector_width_float")
|
121
123
|
get_info("Device", :cl_uint, "preferred_vector_width_double")
|
122
|
-
get_info("Device", :string, "profile")
|
124
|
+
get_info("Device", :string, "profile", true)
|
123
125
|
get_info("Device", :size_t, "profiling_timer_resolution")
|
124
126
|
get_info("Device", :cl_command_queue_properties, "queue_properties")
|
125
127
|
get_info("Device", :cl_device_fp_config, "single_fp_config")
|
126
|
-
get_info("Device", :cl_device_type, "type")
|
127
|
-
get_info("Device", :string, "vendor")
|
128
|
-
get_info("Device", :cl_uint, "vendor_id")
|
129
|
-
get_info("Device", :string, "version")
|
128
|
+
get_info("Device", :cl_device_type, "type", true)
|
129
|
+
get_info("Device", :string, "vendor", true)
|
130
|
+
get_info("Device", :cl_uint, "vendor_id", true)
|
131
|
+
get_info("Device", :string, "version", true)
|
130
132
|
|
131
133
|
# returs a floating point number corresponding to the OpenCL version of the Device
|
132
134
|
def version_number
|
@@ -140,6 +142,7 @@ module OpenCL
|
|
140
142
|
module OpenCL11
|
141
143
|
extend InnerGenerator
|
142
144
|
|
145
|
+
get_info("Device", :cl_uint, "preferred_vector_width_half")
|
143
146
|
get_info("Device", :cl_bool, "host_unified_memory")
|
144
147
|
get_info("Device", :cl_uint, "native_vector_width_char")
|
145
148
|
get_info("Device", :cl_uint, "native_vector_width_short")
|
@@ -156,8 +159,6 @@ module OpenCL
|
|
156
159
|
n = ver.scan(/OpenCL C (\d+\.\d+)/)
|
157
160
|
return n.first.first.to_f
|
158
161
|
end
|
159
|
-
|
160
|
-
get_info("Device", :cl_uint, "preferred_vector_width_half")
|
161
162
|
|
162
163
|
end
|
163
164
|
|
@@ -364,10 +365,90 @@ module OpenCL
|
|
364
365
|
|
365
366
|
end
|
366
367
|
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
368
|
+
module OpenCL30
|
369
|
+
extend InnerGenerator
|
370
|
+
get_info("Device", :cl_device_atomic_capabilities, "atomic_memory_capabilities")
|
371
|
+
get_info("Device", :cl_device_atomic_capabilities, "atomic_fence_capabilities")
|
372
|
+
get_info("Device", :cl_bool, "non_uniform_work_group_support")
|
373
|
+
get_info("Device", :size_t, "preferred_work_group_size_multiple")
|
374
|
+
get_info("Device", :cl_bool, "work_group_collective_functions_support")
|
375
|
+
get_info("Device", :cl_bool, "generic_address_space_support")
|
376
|
+
get_info("Device", :cl_bool, "device_enqueue_support")
|
377
|
+
get_info("Device", :cl_bool, "pipe_support")
|
378
|
+
|
379
|
+
def numeric_version
|
380
|
+
ptr = MemoryPointer::new( :cl_version )
|
381
|
+
error = OpenCL.clGetDeviceInfo( self, NUMERIC_VERSION, 4, ptr, nil)
|
382
|
+
error_check(error)
|
383
|
+
return Version::from_int(ptr.read_cl_version)
|
384
|
+
end
|
385
|
+
|
386
|
+
def extensions_with_version
|
387
|
+
sz = MemoryPointer::new( :size_t )
|
388
|
+
error = OpenCL.clGetDeviceInfo( self, EXTENSIONS_WITH_VERSION, 0, nil, sz)
|
389
|
+
error_check(error)
|
390
|
+
sz = sz.read_size_t
|
391
|
+
ptr = MemoryPointer::new( sz )
|
392
|
+
error = OpenCL.clGetDeviceInfo( self, EXTENSIONS_WITH_VERSION, sz, ptr, nil)
|
393
|
+
error_check(error)
|
394
|
+
nvsz = NameVersion.size
|
395
|
+
return (sz/nvsz).times.collect { |i| NameVersion::new(ptr + i*nvsz) }
|
396
|
+
end
|
397
|
+
|
398
|
+
def ils_with_version
|
399
|
+
sz = MemoryPointer::new( :size_t )
|
400
|
+
error = OpenCL.clGetDeviceInfo( self, ILS_WITH_VERSION, 0, nil, sz)
|
401
|
+
error_check(error)
|
402
|
+
sz = sz.read_size_t
|
403
|
+
ptr = MemoryPointer::new( sz )
|
404
|
+
error = OpenCL.clGetDeviceInfo( self, ILS_WITH_VERSION, sz, ptr, nil)
|
405
|
+
error_check(error)
|
406
|
+
nvsz = NameVersion.size
|
407
|
+
return (sz/nvsz).times.collect { |i| NameVersion::new(ptr + i*nvsz) }
|
408
|
+
end
|
409
|
+
|
410
|
+
def built_in_kernels_with_version
|
411
|
+
sz = MemoryPointer::new( :size_t )
|
412
|
+
error = OpenCL.clGetDeviceInfo( self, BUILT_IN_KERNELS_WITH_VERSION, 0, nil, sz)
|
413
|
+
error_check(error)
|
414
|
+
sz = sz.read_size_t
|
415
|
+
ptr = MemoryPointer::new( sz )
|
416
|
+
error = OpenCL.clGetDeviceInfo( self, BUILT_IN_KERNELS_WITH_VERSION, sz, ptr, nil)
|
417
|
+
error_check(error)
|
418
|
+
nvsz = NameVersion.size
|
419
|
+
return (sz/nvsz).times.collect { |i| NameVersion::new(ptr + i*nvsz) }
|
420
|
+
end
|
421
|
+
|
422
|
+
def opencl_c_all_versions
|
423
|
+
sz = MemoryPointer::new( :size_t )
|
424
|
+
error = OpenCL.clGetDeviceInfo( self, OPENCL_C_ALL_VERSIONS, 0, nil, sz)
|
425
|
+
error_check(error)
|
426
|
+
sz = sz.read_size_t
|
427
|
+
ptr = MemoryPointer::new( sz )
|
428
|
+
error = OpenCL.clGetDeviceInfo( self, OPENCL_C_ALL_VERSIONS, sz, ptr, nil)
|
429
|
+
error_check(error)
|
430
|
+
nvsz = NameVersion.size
|
431
|
+
return (sz/nvsz).times.collect { |i| NameVersion::new(ptr + i*nvsz) }
|
432
|
+
end
|
433
|
+
|
434
|
+
def opencl_c_features
|
435
|
+
sz = MemoryPointer::new( :size_t )
|
436
|
+
error = OpenCL.clGetDeviceInfo( self, OPENCL_C_FEATURES, 0, nil, sz)
|
437
|
+
error_check(error)
|
438
|
+
sz = sz.read_size_t
|
439
|
+
ptr = MemoryPointer::new( sz )
|
440
|
+
error = OpenCL.clGetDeviceInfo( self, OPENCL_C_FEATURES, sz, ptr, nil)
|
441
|
+
error_check(error)
|
442
|
+
nvsz = NameVersion.size
|
443
|
+
return (sz/nvsz).times.collect { |i| NameVersion::new(ptr + i*nvsz) }
|
444
|
+
end
|
445
|
+
end
|
446
|
+
|
447
|
+
register_extension( :v11, OpenCL11, "platform.version_number >= 1.1" )
|
448
|
+
register_extension( :v12, OpenCL12, "platform.version_number >= 1.2" )
|
449
|
+
register_extension( :v20, OpenCL20, "platform.version_number >= 2.0" )
|
450
|
+
register_extension( :v21, OpenCL21, "platform.version_number >= 2.1" )
|
451
|
+
register_extension( :v30, OpenCL30, "platform.version_number >= 3.0" )
|
371
452
|
|
372
453
|
end
|
373
454
|
|