opencl_ruby_ffi 1.3.7 → 1.3.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: abb565a3d9a1e180eebf1e28ab06d330a4ae2477522ba2b22c0211bf7c720bc4
4
- data.tar.gz: 2e47f057d7cf5a79a3972f8a3ab1ac7291827020c607c465d357b58824683ec5
3
+ metadata.gz: 409ed20eac2dc9aa0d410563053699e18528cd62471903fd862ee2f31bb60a81
4
+ data.tar.gz: 670b281a4ab283be7a8c429474008e9e280987e8d81bc5222a853c32a10a569b
5
5
  SHA512:
6
- metadata.gz: d144d10d5744d13cf235a2f0ff4b9fa2bb1df7d47fc4c9b4799c233d1f9e2dc71f30f66c84cdf4a55db197cb6a4175b654845ac6be97c03ed57ea4b931508a10
7
- data.tar.gz: 29561be75358ae7ae658a365f602930ff62a4bf5854ca1a0f0547ff5b7c4703ca01bd19fc036b15b3a503a0b3990eaa482d0c95c66b0be1b388316fa09e3348b
6
+ metadata.gz: 9301ea0a86feed2d72684a63366ad1b6862cd8238497854b768044814940c3f7ec39a7badfa11d56cead96d0c01fddb64092b56d1399d5a8395ce6d9305754f9
7
+ data.tar.gz: 8fa725c1e61931b3d9cdff0cf5d557055398ecf058d56289a72bca1ee3d2e54f80d279266e2185177ac59f9386f32422054e6437e19f23f452a65c060c45fe0c
@@ -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
- buff = clCreateBuffer(context, flags, size, host_ptr, error)
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 { |o, i|
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 { |o, i|
603
+ [mem_objects].flatten.each_with_index { |e, i|
604
604
  objs[i].write_pointer(e)
605
605
  }
606
606
  end
@@ -1790,10 +1790,17 @@ module OpenCL
1790
1790
 
1791
1791
  end
1792
1792
 
1793
+ module OpenCL30
1794
+ extend InnerGenerator
1795
+
1796
+ get_info_array("CommandQueue", :cl_queue_properties, "properties_array")
1797
+ end
1798
+
1793
1799
  register_extension( :v11, OpenCL11, "device.platform.version_number >= 1.1" )
1794
1800
  register_extension( :v12, OpenCL12, "device.platform.version_number >= 1.2" )
1795
1801
  register_extension( :v20, OpenCL20, "device.platform.version_number >= 2.0" )
1796
1802
  register_extension( :v21, OpenCL21, "device.platform.version_number >= 2.1" )
1803
+ register_extension( :v30, OpenCL30, "device.platform.version_number >= 3.0" )
1797
1804
 
1798
1805
  end
1799
1806
 
@@ -25,7 +25,16 @@ module OpenCL
25
25
  error = MemoryPointer::new( :cl_int )
26
26
  ptr = clCreateContext(properties, devs.size, pointer, block, user_data, error)
27
27
  error_check(error.read_cl_int)
28
- return Context::new(ptr, false)
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
29
38
  end
30
39
 
31
40
  # Creates an Context using devices of the selected type
@@ -49,7 +58,16 @@ module OpenCL
49
58
  error = MemoryPointer::new( :cl_int )
50
59
  ptr = clCreateContextFromType(properties, type, block, user_data, error)
51
60
  error_check(error.read_cl_int)
52
- return Context::new(ptr, false)
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
53
71
  end
54
72
 
55
73
  def self.set_default_device_command_queue( context, device, command_queue )
@@ -59,6 +77,32 @@ module OpenCL
59
77
  return context
60
78
  end
61
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
+
62
106
  #Maps the cl_context object of OpenCL
63
107
  class Context
64
108
  include InnerInterface
@@ -459,16 +503,36 @@ module OpenCL
459
503
  return OpenCL.create_program_with_il(self, il)
460
504
  end
461
505
 
506
+ #
462
507
  def set_default_device_command_queue( device, command_queue )
463
508
  return OpenCL.set_default_device_command_queue( self, device, command_queue )
464
509
  end
465
510
 
466
511
  end
467
512
 
513
+ module OpenCL30
514
+
515
+ # Attaches a callback to context that will be called on context destruction
516
+ #
517
+ # ==== Attributes
518
+ #
519
+ # * +options+ - a hash containing named options
520
+ # * +block+ - if provided, a callback invoked when program is released. Signature of the callback is { |Pointer to the context, Pointer to user_data| ... }
521
+ #
522
+ # ==== Options
523
+ #
524
+ # * +:user_data+ - a Pointer (or convertible to Pointer using to_ptr) to the memory area to pass to the callback
525
+ def set_destructor_callback( options = {}, &block )
526
+ OpenCL.set_context_destructor_callback( self, option, &block )
527
+ return self
528
+ end
529
+ end
530
+
468
531
  register_extension( :v11, OpenCL11, "platform.version_number >= 1.1" )
469
532
  register_extension( :v12, OpenCL12, "platform.version_number >= 1.2" )
470
533
  register_extension( :v20, OpenCL20, "platform.version_number >= 2.0" )
471
534
  register_extension( :v21, OpenCL21, "platform.version_number >= 2.1" )
535
+ register_extension( :v30, OpenCL30, "platform.version_number >= 3.0" )
472
536
 
473
537
  end
474
538
 
@@ -366,10 +366,90 @@ module OpenCL
366
366
 
367
367
  end
368
368
 
369
- register_extension( :v11, OpenCL11, "platform.version_number >= 1.1" )
370
- register_extension( :v12, OpenCL12, "platform.version_number >= 1.2" )
371
- register_extension( :v20, OpenCL20, "platform.version_number >= 2.0" )
372
- register_extension( :v21, OpenCL21, "platform.version_number >= 2.1" )
369
+ module OpenCL30
370
+ extend InnerGenerator
371
+ get_info("Device", :cl_device_atomic_capabilities, "atomic_memory_capabilities")
372
+ get_info("Device", :cl_device_atomic_capabilities, "atomic_fence_capabilities")
373
+ get_info("Device", :cl_bool, "non_uniform_work_group_support")
374
+ get_info("Device", :size_t, "preferred_work_group_size_multiple")
375
+ get_info("Device", :cl_bool, "work_group_collective_functions_support")
376
+ get_info("Device", :cl_bool, "generic_address_space_support")
377
+ get_info("Device", :cl_bool, "device_enqueue_support")
378
+ get_info("Device", :cl_bool, "pipe_support")
379
+
380
+ def numeric_version
381
+ ptr = MemoryPointer::new( :cl_version )
382
+ error = OpenCL.clGetDeviceInfo( self, NUMERIC_VERSION, 4, ptr, nil)
383
+ error_check(error)
384
+ return Version::from_int(ptr.read_cl_version)
385
+ end
386
+
387
+ def extensions_with_version
388
+ sz = MemoryPointer::new( :size_t )
389
+ error = OpenCL.clGetDeviceInfo( self, EXTENSIONS_WITH_VERSION, 0, nil, sz)
390
+ error_check(error)
391
+ sz = sz.read_size_t
392
+ ptr = MemoryPointer::new( sz )
393
+ error = OpenCL.clGetDeviceInfo( self, EXTENSIONS_WITH_VERSION, sz, ptr, nil)
394
+ error_check(error)
395
+ nvsz = NameVersion.size
396
+ return (sz/nvsz).times.collect { |i| NameVersion::new(ptr + i*nvsz) }
397
+ end
398
+
399
+ def ils_with_version
400
+ sz = MemoryPointer::new( :size_t )
401
+ error = OpenCL.clGetDeviceInfo( self, ILS_WITH_VERSION, 0, nil, sz)
402
+ error_check(error)
403
+ sz = sz.read_size_t
404
+ ptr = MemoryPointer::new( sz )
405
+ error = OpenCL.clGetDeviceInfo( self, ILS_WITH_VERSION, sz, ptr, nil)
406
+ error_check(error)
407
+ nvsz = NameVersion.size
408
+ return (sz/nvsz).times.collect { |i| NameVersion::new(ptr + i*nvsz) }
409
+ end
410
+
411
+ def built_in_kernels_with_version
412
+ sz = MemoryPointer::new( :size_t )
413
+ error = OpenCL.clGetDeviceInfo( self, BUILT_IN_KERNELS_WITH_VERSION, 0, nil, sz)
414
+ error_check(error)
415
+ sz = sz.read_size_t
416
+ ptr = MemoryPointer::new( sz )
417
+ error = OpenCL.clGetDeviceInfo( self, BUILT_IN_KERNELS_WITH_VERSION, sz, ptr, nil)
418
+ error_check(error)
419
+ nvsz = NameVersion.size
420
+ return (sz/nvsz).times.collect { |i| NameVersion::new(ptr + i*nvsz) }
421
+ end
422
+
423
+ def opencl_c_all_versions
424
+ sz = MemoryPointer::new( :size_t )
425
+ error = OpenCL.clGetDeviceInfo( self, OPENCL_C_ALL_VERSIONS, 0, nil, sz)
426
+ error_check(error)
427
+ sz = sz.read_size_t
428
+ ptr = MemoryPointer::new( sz )
429
+ error = OpenCL.clGetDeviceInfo( self, OPENCL_C_ALL_VERSIONS, sz, ptr, nil)
430
+ error_check(error)
431
+ nvsz = NameVersion.size
432
+ return (sz/nvsz).times.collect { |i| NameVersion::new(ptr + i*nvsz) }
433
+ end
434
+
435
+ def opencl_c_features
436
+ sz = MemoryPointer::new( :size_t )
437
+ error = OpenCL.clGetDeviceInfo( self, OPENCL_C_FEATURES, 0, nil, sz)
438
+ error_check(error)
439
+ sz = sz.read_size_t
440
+ ptr = MemoryPointer::new( sz )
441
+ error = OpenCL.clGetDeviceInfo( self, OPENCL_C_FEATURES, sz, ptr, nil)
442
+ error_check(error)
443
+ nvsz = NameVersion.size
444
+ return (sz/nvsz).times.collect { |i| NameVersion::new(ptr + i*nvsz) }
445
+ end
446
+ end
447
+
448
+ register_extension( :v11, OpenCL11, "platform.version_number >= 1.1" )
449
+ register_extension( :v12, OpenCL12, "platform.version_number >= 1.2" )
450
+ register_extension( :v20, OpenCL20, "platform.version_number >= 2.0" )
451
+ register_extension( :v21, OpenCL21, "platform.version_number >= 2.1" )
452
+ register_extension( :v30, OpenCL30, "platform.version_number >= 3.0" )
373
453
 
374
454
  end
375
455
 
@@ -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 Image
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_image( context, format, desc, options = {} )
17
18
  flags = get_flags( options )
18
19
  host_ptr = options[:host_ptr]
19
20
  error = MemoryPointer::new( :cl_int )
20
- img_ptr = clCreateImage( context, flags, format, desc, host_ptr, error )
21
+ if context.platform.version_number < 3.0 then
22
+ img_ptr = clCreateImage( context, flags, format, desc, host_ptr, error )
23
+ else
24
+ properties = get_mem_properties( options )
25
+ img_ptr = clCreateImageWithProperties( context, properties, flags, format, desc, host_ptr, error )
26
+ end
21
27
  error_check(error.read_cl_int)
22
28
  return Image::new(img_ptr, false)
23
29
  end
@@ -130,11 +130,17 @@ module OpenCL
130
130
  extend InnerGenerator
131
131
 
132
132
  get_info("Mem", :cl_bool, "uses_svm_pointer", true)
133
+ end
134
+
135
+ module OpenCL30
136
+ extend InnerGenerator
133
137
 
138
+ get_info_array("Mem", :cl_mem_properties, "properties")
134
139
  end
135
140
 
136
141
  register_extension( :v11, OpenCL11, "platform.version_number >= 1.1" )
137
142
  register_extension( :v20, OpenCL20, "platform.version_number >= 2.0" )
143
+ register_extension( :v30, OpenCL30, "platform.version_number >= 3.0" )
138
144
 
139
145
  end
140
146
 
@@ -34,6 +34,14 @@ module OpenCL
34
34
  get_info("Pipe", :cl_uint, "packet_size")
35
35
  get_info("Pipe", :cl_uint, "max_packets")
36
36
 
37
+ module OpenCL30
38
+ extend InnerGenerator
39
+
40
+ get_info_array("Pipe", :cl_pipe_properties, "properties")
41
+ end
42
+
43
+ register_extension( :v30, Pipe::OpenCL30, "platform.version_number >= 3.0" )
44
+
37
45
  end
38
46
 
39
47
  end
@@ -181,8 +181,33 @@ module OpenCL
181
181
 
182
182
  end
183
183
 
184
+ module OpenCL30
185
+ extend InnerGenerator
186
+
187
+ def numeric_version
188
+ ptr = MemoryPointer::new( :cl_version )
189
+ error = OpenCL.clGetPlatformInfo( self, NUMERIC_VERSION, 4, ptr, nil)
190
+ error_check(error)
191
+ return Version::from_int(ptr.read_cl_version)
192
+ end
193
+
194
+ def extensions_with_version
195
+ sz = MemoryPointer::new( :size_t )
196
+ error = OpenCL.clGetPlatformInfo( self, EXTENSIONS_WITH_VERSION, 0, nil, sz)
197
+ error_check(error)
198
+ sz = sz.read_size_t
199
+ ptr = MemoryPointer::new( sz )
200
+ error = OpenCL.clGetPlatformInfo( self, EXTENSIONS_WITH_VERSION, sz, ptr, nil)
201
+ error_check(error)
202
+ nvsz = NameVersion.size
203
+ return (sz/nvsz).times.collect { |i| NameVersion::new(ptr + i*nvsz) }
204
+ end
205
+
206
+ end
207
+
184
208
  register_extension( :v12, OpenCL12, "version_number >= 1.2" )
185
209
  register_extension( :v21, OpenCL21, "version_number >= 2.1" )
210
+ register_extension( :v30, OpenCL30, "version_number >= 3.0" )
186
211
 
187
212
  end
188
213
 
@@ -9,3 +9,4 @@ require "opencl_ruby_ffi/ext/device_fission.rb"
9
9
  require "opencl_ruby_ffi/khr/sub_groups.rb"
10
10
  require "opencl_ruby_ffi/khr/priority_hints.rb"
11
11
  require "opencl_ruby_ffi/khr/throttle_hints.rb"
12
+ require "opencl_ruby_ffi/khr/device_uuid.rb"
@@ -0,0 +1,119 @@
1
+ using OpenCLRefinements if RUBY_VERSION.scan(/\d+/).collect(&:to_i).first >= 2
2
+
3
+ module OpenCL
4
+
5
+ UUID_SIZE_KHR = 16
6
+ LUID_SIZE_KHR = 8
7
+
8
+ DEVICE_UUID_KHR = 0x106A
9
+ DRIVER_UUID_KHR = 0x106B
10
+ DEVICE_LUID_VALID_KHR = 0x106C
11
+ DEVICE_LUID_KHR = 0x106D
12
+ DEVICE_NODE_MASK_KHR = 0x106E
13
+
14
+ class UUID < Struct
15
+ layout :id, [ OpenCL.find_type(:cl_uchar), UUID_SIZE_KHR ]
16
+ def to_s
17
+ a = self[:id].to_a
18
+ s = ""
19
+ s << "%02x" % a[15]
20
+ s << "%02x" % a[14]
21
+ s << "%02x" % a[13]
22
+ s << "%02x" % a[12]
23
+ s << "-"
24
+ s << "%02x" % a[11]
25
+ s << "%02x" % a[10]
26
+ s << "-"
27
+ s << "%02x" % a[9]
28
+ s << "%02x" % a[8]
29
+ s << "-"
30
+ s << "%02x" % a[7]
31
+ s << "%02x" % a[6]
32
+ s << "-"
33
+ s << "%02x" % a[5]
34
+ s << "%02x" % a[4]
35
+ s << "%02x" % a[3]
36
+ s << "%02x" % a[2]
37
+ s << "%02x" % a[1]
38
+ s << "%02x" % a[0]
39
+ end
40
+
41
+ def self.from_string(uuid)
42
+ new.from_string(uuid)
43
+ end
44
+
45
+ def from_string(uuid)
46
+ m = uuid.match(/(\h\h)(\h\h)(\h\h)(\h\h)-(\h\h)(\h\h)-(\h\h)(\h\h)-(\h\h)(\h\h)-(\h\h)(\h\h)(\h\h)(\h\h)(\h\h)(\h\h)/)
47
+ raise "invalid format" unless m
48
+ UUID_SIZE_KHR.times { |i|
49
+ self[:id][UUID_SIZE_KHR-1-i] = m[i+1].to_i(16)
50
+ }
51
+ self
52
+ end
53
+ end
54
+
55
+ class LUID < Struct
56
+ layout :id, [ OpenCL.find_type(:cl_uchar), LUID_SIZE_KHR ]
57
+ def to_s
58
+ a = self[:id].to_a
59
+ s = ""
60
+ s << "%02x" % a[7]
61
+ s << "%02x" % a[6]
62
+ s << "%02x" % a[5]
63
+ s << "%02x" % a[4]
64
+ s << "%02x" % a[3]
65
+ s << "%02x" % a[2]
66
+ s << "%02x" % a[1]
67
+ s << "%02x" % a[0]
68
+ end
69
+
70
+ def self.from_string(uuid)
71
+ new.from_string(uuid)
72
+ end
73
+
74
+ def from_string(uuid)
75
+ m = uuid.match(/(\h\h)(\h\h)(\h\h)(\h\h)(\h\h)(\h\h)(\h\h)(\h\h)/)
76
+ raise "invalid format" unless m
77
+ LUID_SIZE_KHR.times { |i|
78
+ self[:id][LUID_SIZE_KHR-1-i] = m[i+1].to_i(16)
79
+ }
80
+ self
81
+ end
82
+ end
83
+
84
+ class Device
85
+ UUID_KHR = 0x106A
86
+ LUID_VALID_KHR = 0x106C
87
+ LUID_KHR = 0x106D
88
+ NODE_MASK_KHR = 0x106E
89
+
90
+ module KHRDeviceUUID
91
+ extend InnerGenerator
92
+ get_info("Device", :cl_bool, "luid_valid_khr")
93
+ get_info("Device", :cl_uint, "node_mask_khr")
94
+
95
+ def uuid_khr
96
+ id = UUID.new
97
+ error = OpenCL.clGetDeviceInfo( self, UUID_KHR, UUID_SIZE_KHR, id, nil)
98
+ error_check(error)
99
+ return id
100
+ end
101
+
102
+ def driver_uuid_khr
103
+ id = UUID.new
104
+ error = OpenCL.clGetDeviceInfo( self, DRIVER_UUID_KHR, UUID_SIZE_KHR, id, nil)
105
+ error_check(error)
106
+ return id
107
+ end
108
+
109
+ def luid_khr
110
+ id = LUID.new
111
+ error = OpenCL.clGetDeviceInfo( self, LUID_KHR, LUID_SIZE_KHR, id, nil)
112
+ error_check(error)
113
+ return id
114
+ end
115
+ end
116
+ register_extension( :cl_khr_device_uuid, KHRDeviceUUID, "extensions.include?(\"cl_khr_device_uuid\")" )
117
+ end
118
+
119
+ end
@@ -126,6 +126,76 @@ module OpenCL
126
126
  end
127
127
  end
128
128
 
129
+ class Version
130
+ include Comparable
131
+ MAJOR_BITS = 10
132
+ MINOR_BITS = 10
133
+ PATCH_BITS = 12
134
+ MAJOR_MASK = (1 << MAJOR_BITS) - 1
135
+ MINOR_MASK = (1 << MINOR_BITS) - 1
136
+ PATCH_MASK = (1 << PATCH_BITS) - 1
137
+
138
+ attr_reader :major, :minor, :patch
139
+ def initialize(major, minor = 0, patch = 0)
140
+ @major = major
141
+ @minor = minor
142
+ @patch = patch
143
+ end
144
+
145
+ def to_int
146
+ Version.make(@major, @minor, @patch)
147
+ end
148
+ alias to_i to_int
149
+
150
+ def <=>(other)
151
+ res = (@major <=> other.major)
152
+ res = (@minor <=> other.minor) if res == 0
153
+ res = (@patch <=> other.patch) if res == 0
154
+ res
155
+ end
156
+
157
+ def to_s
158
+ "#{@major}.#{@minor}.#{@patch}"
159
+ end
160
+
161
+ def self.major(v)
162
+ v >> (MINOR_BITS + PATCH_BITS)
163
+ end
164
+
165
+ def self.minor(v)
166
+ (v >> (PATCH_BITS)) & MINOR_MASK
167
+ end
168
+
169
+ def self.patch(v)
170
+ v & PATCH_MASK
171
+ end
172
+
173
+ def self.make(major, minor = 0, patch = 0)
174
+ ((major & MAJOR_MASK) << (MINOR_BITS + PATCH_BITS)) +
175
+ ((minor & MINOR_MASK) << PATCH_BITS) +
176
+ (patch & PATCH_MASK)
177
+ end
178
+
179
+ def self.from_int(v)
180
+ self.new(major(v), minor(v), patch(v))
181
+ end
182
+ end
183
+
184
+ # Maps the :cl_name_version type of OpenCL
185
+ class NameVersion < Struct
186
+ MAX_NAME_SIZE = 64
187
+ layout :version, :cl_version,
188
+ :name, [:char, MAX_NAME_SIZE]
189
+
190
+ def version
191
+ Version.from_int(self[:version])
192
+ end
193
+
194
+ def name
195
+ self[:name].to_s
196
+ end
197
+ end
198
+
129
199
  module InnerInterface
130
200
 
131
201
  private
@@ -169,7 +239,7 @@ module OpenCL
169
239
  end
170
240
  return properties
171
241
  end
172
-
242
+
173
243
  # 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
174
244
  def get_origin_region( image, options, origin_symbol, region_symbol )
175
245
  origin = MemoryPointer::new( :size_t, 3 )
@@ -214,6 +284,19 @@ module OpenCL
214
284
  return properties
215
285
  end
216
286
 
287
+ # EXtracts the :properties named option (for a Mem) from the hash given and returns the properties values
288
+ def get_mem_properties( options )
289
+ properties = nil
290
+ if options[:properties] then
291
+ properties = MemoryPointer::new( :cl_mem_properties, options[:properties].length + 1 )
292
+ options[:properties].each_with_index { |e,i|
293
+ properties[i].write_cl_mem_properties(e.respond_to?(:to_ptr) ? e : e.to_i)
294
+ }
295
+ properties[options[:properties].length].write_cl_mem_properties(0)
296
+ end
297
+ return properties
298
+ end
299
+
217
300
  # Extracts the :device_list named option from the hash given and returns [ number of devices, an Pointer to the list of Device or nil ]
218
301
  def get_device_list( options )
219
302
  devices = options[:device_list]
@@ -248,6 +331,7 @@ module OpenCL
248
331
  :cl_command_queue_properties => CommandQueue::Properties,
249
332
  :cl_device_affinity_domain => Device::AffinityDomain,
250
333
  :cl_device_svm_capabilities => Device::SVMCapabilities,
334
+ :cl_device_atomic_capabilities => Device::AtomicCapabilities,
251
335
  :cl_channel_order => ChannelOrder,
252
336
  :cl_channel_type => ChannelType,
253
337
  :cl_mem_flags => Mem::Flags,
@@ -287,11 +371,8 @@ module OpenCL
287
371
  module ExtensionInnerGenerator
288
372
 
289
373
  private
290
- # Generates a new method for klass that use the given clGetKlassInfo extension of the object's platform, to read an info of the given type. The info queried is specified by name.
291
- # @param [String] klass the property is to be found
292
- # @param [Symbol] type of the property
293
- # @param [String] name of the property
294
- # @!macro [attach] get_info
374
+
375
+ # @!macro [attach] get_info_ext
295
376
  # @!method $3
296
377
  # Returns the OpenCL::$1::$3 info
297
378
  # @return $2
@@ -347,11 +428,7 @@ EOF
347
428
  module_eval s
348
429
  end
349
430
 
350
- # Generates a new method for klass that use the given clGetKlassInfo extension of the object's platform, to read an Array of element of the given type. The info queried is specified by name.
351
- # @param [String] klass the property is to be found
352
- # @param [Symbol] type of the property
353
- # @param [String] name of the property
354
- # @!macro [attach] get_info_array
431
+ # @!macro [attach] get_info_array_ext
355
432
  # @!method $3
356
433
  # Returns the OpenCL::$1::$3 info
357
434
  # @return an Array of $2
@@ -409,10 +486,6 @@ EOF
409
486
 
410
487
  private
411
488
 
412
- # Generates a new method for klass that use the apropriate clGetKlassInfo, to read an info of the given type. The info queried is specified by name.
413
- # @param [String] klass the property is to be found
414
- # @param [Symbol] type of the property
415
- # @param [String] name of the property
416
489
  # @!macro [attach] get_info
417
490
  # @!method $3
418
491
  # Returns the OpenCL::$1::$3 info
@@ -465,11 +538,6 @@ EOF
465
538
  module_eval s
466
539
  end
467
540
 
468
- # Generates a new method for klass that use the apropriate clGetKlassInfo, to read an Array of element of the given type. The info queried is specified by name.
469
- # @param [String] klass the property is to be found
470
- # @param [Symbol] type of the property
471
- # @param [String] name of the property
472
- # @param [Bool]
473
541
  # @!macro [attach] get_info_array
474
542
  # @!method $3
475
543
  # Returns the OpenCL::$1::$3 info
@@ -102,6 +102,8 @@ module OpenCL
102
102
  PLATFORM_VENDOR = 0x0903
103
103
  PLATFORM_EXTENSIONS = 0x0904
104
104
  PLATFORM_HOST_TIMER_RESOLUTION = 0x0905
105
+ PLATFORM_NUMERIC_VERSION = 0x0906
106
+ PLATFORM_EXTENSIONS_WITH_VERSION = 0x0907
105
107
  DEVICE_TYPE_DEFAULT = (1 << 0)
106
108
  DEVICE_TYPE_CPU = (1 << 1)
107
109
  DEVICE_TYPE_GPU = (1 << 2)
@@ -201,6 +203,20 @@ module OpenCL
201
203
  DEVICE_IL_VERSION = 0x105B
202
204
  DEVICE_MAX_NUM_SUB_GROUPS = 0x105C
203
205
  DEVICE_SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS = 0x105D
206
+ DEVICE_NUMERIC_VERSION = 0x105E
207
+ DEVICE_EXTENSIONS_WITH_VERSION = 0x1060
208
+ DEVICE_ILS_WITH_VERSION = 0x1061
209
+ DEVICE_BUILT_IN_KERNELS_WITH_VERSION = 0x1062
210
+ DEVICE_ATOMIC_MEMORY_CAPABILITIES = 0x1063
211
+ DEVICE_ATOMIC_FENCE_CAPABILITIES = 0x1064
212
+ DEVICE_NON_UNIFORM_WORK_GROUP_SUPPORT = 0x1065
213
+ DEVICE_OPENCL_C_ALL_VERSIONS = 0x1066
214
+ DEVICE_PREFERRED_WORK_GROUP_SIZE_MULTIPLE = 0x1067
215
+ DEVICE_WORK_GROUP_COLLECTIVE_FUNCTIONS_SUPPORT = 0x1068
216
+ DEVICE_GENERIC_ADDRESS_SPACE_SUPPORT = 0x1069
217
+ DEVICE_OPENCL_C_FEATURES = 0x106F
218
+ DEVICE_DEVICE_ENQUEUE_SUPPORT = 0x1070
219
+ DEVICE_PIPE_SUPPORT = 0x1071
204
220
  FP_DENORM = (1 << 0)
205
221
  FP_INF_NAN = (1 << 1)
206
222
  FP_ROUND_TO_NEAREST = (1 << 2)
@@ -240,12 +256,20 @@ module OpenCL
240
256
  DEVICE_SVM_FINE_GRAIN_BUFFER = (1 << 1)
241
257
  DEVICE_SVM_FINE_GRAIN_SYSTEM = (1 << 2)
242
258
  DEVICE_SVM_ATOMICS = (1 << 3)
259
+ DEVICE_ATOMIC_ORDER_RELAXED = (1 << 0)
260
+ DEVICE_ATOMIC_ORDER_ACQ_REL = (1 << 1)
261
+ DEVICE_ATOMIC_ORDER_SEQ_CST = (1 << 2)
262
+ DEVICE_ATOMIC_SCOPE_WORK_ITEM = (1 << 3)
263
+ DEVICE_ATOMIC_SCOPE_WORK_GROUP = (1 << 4)
264
+ DEVICE_ATOMIC_SCOPE_DEVICE = (1 << 5)
265
+ DEVICE_ATOMIC_SCOPE_ALL_DEVICES = (1 << 6)
243
266
  QUEUE_CONTEXT = 0x1090
244
267
  QUEUE_DEVICE = 0x1091
245
268
  QUEUE_REFERENCE_COUNT = 0x1092
246
269
  QUEUE_PROPERTIES = 0x1093
247
270
  QUEUE_SIZE = 0x1094
248
271
  QUEUE_DEVICE_DEFAULT = 0x1095
272
+ QUEUE_PROPERTIES_ARRAY = 0x1098
249
273
  MEM_READ_WRITE = (1 << 0)
250
274
  MEM_WRITE_ONLY = (1 << 1)
251
275
  MEM_READ_ONLY = (1 << 2)
@@ -323,6 +347,7 @@ module OpenCL
323
347
  MEM_ASSOCIATED_MEMOBJECT = 0x1107
324
348
  MEM_OFFSET = 0x1108
325
349
  MEM_USES_SVM_POINTER = 0x1109
350
+ MEM_PROPERTIES = 0x110A
326
351
  IMAGE_FORMAT = 0x1110
327
352
  IMAGE_ELEMENT_SIZE = 0x1111
328
353
  IMAGE_ROW_PITCH = 0x1112
@@ -336,6 +361,7 @@ module OpenCL
336
361
  IMAGE_NUM_SAMPLES = 0x111A
337
362
  PIPE_PACKET_SIZE = 0x1120
338
363
  PIPE_MAX_PACKETS = 0x1121
364
+ PIPE_PROPERTIES = 0x1122
339
365
  ADDRESS_NONE = 0x1130
340
366
  ADDRESS_CLAMP_TO_EDGE = 0x1131
341
367
  ADDRESS_CLAMP = 0x1132
@@ -451,6 +477,7 @@ module OpenCL
451
477
  COMMAND_SVM_MEMFILL = 0x120B
452
478
  COMMAND_SVM_MAP = 0x120C
453
479
  COMMAND_SVM_UNMAP = 0x120D
480
+ COMMAND_SVM_MIGRATE_MEM = 0x120E
454
481
  COMPLETE = 0x0
455
482
  RUNNING = 0x1
456
483
  SUBMITTED = 0x2
@@ -482,6 +509,13 @@ module OpenCL
482
509
  MEM_HOST_WRITETHROUGH_QCOM = 0x40A6
483
510
  MEM_HOST_WRITE_COMBINING_QCOM = 0x40A7
484
511
  MEM_ION_HOST_PTR_QCOM = 0x40A8
512
+ NAME_VERSION_MAX_NAME_SIZE = 64
513
+ VERSION_MAJOR_BITS = 10
514
+ VERSION_MINOR_BITS = 10
515
+ VERSION_PATCH_BITS = 12
516
+ VERSION_MAJOR_MASK = (1 << VERSION_MAJOR_BITS) - 1
517
+ VERSION_MINOR_MASK = (1 << VERSION_MINOR_BITS) - 1
518
+ VERSION_PATCH_MASK = (1 << VERSION_PATCH_BITS) - 1
485
519
  # Parent class to map OpenCL errors, and is used to raise unknown errors
486
520
  class Error < StandardError
487
521
  attr_reader :code
@@ -695,8 +729,7 @@ EOF
695
729
 
696
730
  # Returns true if flag is bitwise included in the Bitfield
697
731
  def include?(flag)
698
- return true if ( @val & flag ) == flag
699
- return false
732
+ return ( @val & flag ) == flag
700
733
  end
701
734
 
702
735
  # Returns a String corresponding to the Bitfield description
@@ -744,7 +777,7 @@ EOF
744
777
  return @val
745
778
  end
746
779
 
747
- # Setss the internal representation of the Bitfield to val
780
+ # Sets the internal representation of the Bitfield to val
748
781
  def flags=(val)
749
782
  @val = val
750
783
  end
@@ -799,6 +832,8 @@ EOF
799
832
  VENDOR = 0x0903
800
833
  EXTENSIONS = 0x0904
801
834
  HOST_TIMER_RESOLUTION = 0x0905
835
+ NUMERIC_VERSION = 0x0906
836
+ EXTENSIONS_WITH_VERSION = 0x0907
802
837
 
803
838
  # Creates a new Platform and retains it if specified and aplicable
804
839
  def initialize(ptr, retain = true)
@@ -914,6 +949,20 @@ EOF
914
949
  IL_VERSION = 0x105B
915
950
  MAX_NUM_SUB_GROUPS = 0x105C
916
951
  SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS = 0x105D
952
+ NUMERIC_VERSION = 0x105E
953
+ EXTENSIONS_WITH_VERSION = 0x1060
954
+ ILS_WITH_VERSION = 0x1061
955
+ BUILT_IN_KERNELS_WITH_VERSION = 0x1062
956
+ ATOMIC_MEMORY_CAPABILITIES = 0x1063
957
+ ATOMIC_FENCE_CAPABILITIES = 0x1064
958
+ NON_UNIFORM_WORK_GROUP_SUPPORT = 0x1065
959
+ OPENCL_C_ALL_VERSIONS = 0x1066
960
+ PREFERRED_WORK_GROUP_SIZE_MULTIPLE = 0x1067
961
+ WORK_GROUP_COLLECTIVE_FUNCTIONS_SUPPORT = 0x1068
962
+ GENERIC_ADDRESS_SPACE_SUPPORT = 0x1069
963
+ OPENCL_C_FEATURES = 0x106F
964
+ DEVICE_ENQUEUE_SUPPORT = 0x1070
965
+ PIPE_SUPPORT = 0x1071
917
966
  PARTITION_EQUALLY = 0x1086
918
967
  PARTITION_BY_COUNTS = 0x1087
919
968
  PARTITION_BY_COUNTS_LIST_END = 0x0
@@ -929,6 +978,13 @@ EOF
929
978
  SVM_FINE_GRAIN_SYSTEM = (1 << 2)
930
979
  SVM_ATOMICS = (1 << 3)
931
980
  PAGE_SIZE_QCOM = 0x40A1
981
+ ATOMIC_ORDER_RELAXED = (1 << 0)
982
+ ATOMIC_ORDER_ACQ_REL = (1 << 1)
983
+ ATOMIC_ORDER_SEQ_CST = (1 << 2)
984
+ ATOMIC_SCOPE_WORK_ITEM = (1 << 3)
985
+ ATOMIC_SCOPE_WORK_GROUP = (1 << 4)
986
+ ATOMIC_SCOPE_DEVICE = (1 << 5)
987
+ ATOMIC_SCOPE_ALL_DEVICES = (1 << 6)
932
988
 
933
989
  #DEFINED in ext/device_fission.rb
934
990
  # # Creates a new Device and retains it if specified and aplicable
@@ -1079,6 +1135,25 @@ EOF
1079
1135
  end
1080
1136
  end
1081
1137
 
1138
+ # Bitfield that maps the :cl_device_atomic_capabilities
1139
+ class AtomicCapabilities < Bitfield
1140
+ ORDER_RELAXED = (1 << 0)
1141
+ ORDER_ACQ_REL = (1 << 1)
1142
+ ORDER_SEQ_CST = (1 << 2)
1143
+ SCOPE_WORK_ITEM = (1 << 3)
1144
+ SCOPE_WORK_GROUP = (1 << 4)
1145
+ SCOPE_DEVICE = (1 << 5)
1146
+ SCOPE_ALL_DEVICES = (1 << 6)
1147
+ # Returns an Array of String representing the different flags set
1148
+ def names
1149
+ fs = []
1150
+ %w( ORDER_RELAXED ORDER_ACQ_REL ORDER_SEQ_CST SCOPE_WORK_ITEM SCOPE_WORK_GROUP SCOPE_DEVICE SCOPE_ALL_DEVICES ).each { |f|
1151
+ fs.push(f) if self.include?( self.class.const_get(f) )
1152
+ }
1153
+ return fs
1154
+ end
1155
+ end
1156
+
1082
1157
  end
1083
1158
  class Context < ExtendedStruct
1084
1159
  layout :dummy, :pointer
@@ -1132,6 +1207,7 @@ EOF
1132
1207
  PROPERTIES = 0x1093
1133
1208
  SIZE = 0x1094
1134
1209
  DEVICE_DEFAULT = 0x1095
1210
+ PROPERTIES_ARRAY = 0x1098
1135
1211
  # Creates a new CommandQueue and retains it if specified and aplicable
1136
1212
  def initialize(ptr, retain = true)
1137
1213
  super(ptr)
@@ -1202,6 +1278,7 @@ EOF
1202
1278
  ASSOCIATED_MEMOBJECT = 0x1107
1203
1279
  OFFSET = 0x1108
1204
1280
  USES_SVM_POINTER = 0x1109
1281
+ PROPERTIES = 0x110A
1205
1282
  HOST_UNCACHED_QCOM = 0x40A4
1206
1283
  HOST_WRITEBACK_QCOM = 0x40A5
1207
1284
  HOST_WRITETHROUGH_QCOM = 0x40A6
@@ -1737,6 +1814,7 @@ EOF
1737
1814
  SVM_MEMFILL = 0x120B
1738
1815
  SVM_MAP = 0x120C
1739
1816
  SVM_UNMAP = 0x120D
1817
+ SVM_MIGRATE_MEM = 0x120E
1740
1818
  @codes = {}
1741
1819
  @codes[0x11F0] = 'NDRANGE_KERNEL'
1742
1820
  @codes[0x11F1] = 'TASK'
@@ -1768,6 +1846,7 @@ EOF
1768
1846
  @codes[0x120B] = 'SVM_MEMFILL'
1769
1847
  @codes[0x120C] = 'SVM_MAP'
1770
1848
  @codes[0x120D] = 'SVM_UNMAP'
1849
+ @codes[0x120E] = 'SVM_MIGRATE_MEM'
1771
1850
  end
1772
1851
 
1773
1852
  # Enum that maps the :cl_gl_object_type type
@@ -1839,6 +1918,7 @@ EOF
1839
1918
  layout :dummy, :pointer
1840
1919
  PACKET_SIZE = 0x1120
1841
1920
  MAX_PACKETS = 0x1121
1921
+ PROPERTIES = 0x1122
1842
1922
  end
1843
1923
  attach_function :clGetPlatformIDs, [:cl_uint,:pointer,:pointer], :cl_int
1844
1924
  attach_function :clGetPlatformInfo, [Platform,:cl_platform_info,:size_t,:pointer,:pointer], :cl_int
@@ -1974,6 +2054,14 @@ EOF
1974
2054
  callback :clSetProgramReleaseCallback_notify, [Program.by_ref,:pointer], :void
1975
2055
  attach_function :clSetProgramReleaseCallback, [Program,:clSetProgramReleaseCallback_notify,:pointer], :cl_int
1976
2056
  attach_function :clSetProgramSpecializationConstant, [Program,:cl_uint,:size_t,:pointer], :cl_int
2057
+ begin # OpenCL 3.0
2058
+ attach_function :clCreateBufferWithProperties, [Context,:pointer,:cl_mem_flags,:size_t,:pointer,:pointer], Mem
2059
+ attach_function :clCreateImageWithProperties, [Context,:pointer,:cl_mem_flags,:pointer,:pointer,:pointer,:pointer], Mem
2060
+ callback :clSetContextDestructorCallback_notify, [Context.by_ref,:pointer], :void
2061
+ attach_function :clSetContextDestructorCallback, [Context,:clSetContextDestructorCallback_notify,:pointer], :cl_int
2062
+ rescue NotFoundError => e
2063
+ warn "Warning OpenCL 2.2 loader detected!"
2064
+ end
1977
2065
  rescue NotFoundError => e
1978
2066
  warn "Warning OpenCL 2.1 loader detected!"
1979
2067
  end
@@ -67,6 +67,10 @@ module OpenCL
67
67
  [ :cl_uint, :cl_profiling_info ],
68
68
  [ :cl_bitfield, :cl_sampler_properties ],
69
69
  [ :cl_uint, :cl_kernel_exec_info ],
70
+ [ :cl_bitfield, :cl_device_atomic_capabilities ],
71
+ [ :cl_uint, :cl_khronos_vendor_id ],
72
+ [ :cl_bitfield, :cl_mem_properties ],
73
+ [ :cl_uint, :cl_version ],
70
74
  [ :cl_uint, :cl_gl_object_type ],
71
75
  [ :cl_uint, :cl_gl_texture_info ],
72
76
  [ :cl_uint, :cl_gl_platform_info ],
@@ -1,11 +1,11 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'opencl_ruby_ffi'
3
- s.version = "1.3.7"
3
+ s.version = "1.3.8"
4
4
  s.author = "Brice Videau"
5
5
  s.email = "bvideau@anl.gov"
6
6
  s.homepage = "https://github.com/Nanosim-LIG/opencl-ruby"
7
7
  s.summary = "Ruby OpenCL FFI bindings"
8
- s.description = "Ruby OpenCL FFI bindings. OpenCL 2.2 ready"
8
+ s.description = "Ruby OpenCL FFI bindings. OpenCL 3.0 ready"
9
9
  s.files = Dir[ 'opencl_ruby_ffi.gemspec', 'LICENSE', 'lib/**/**/*.rb', '.yardopts', 'templates_custom/default/module/setup.rb' ]
10
10
  s.license = 'BSD-2-Clause'
11
11
  s.required_ruby_version = '>= 1.8.7'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opencl_ruby_ffi
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.7
4
+ version: 1.3.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brice Videau
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-01 00:00:00.000000000 Z
11
+ date: 2021-03-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: narray
@@ -70,7 +70,7 @@ dependencies:
70
70
  - - ">="
71
71
  - !ruby/object:Gem::Version
72
72
  version: 1.0.0
73
- description: Ruby OpenCL FFI bindings. OpenCL 2.2 ready
73
+ description: Ruby OpenCL FFI bindings. OpenCL 3.0 ready
74
74
  email: bvideau@anl.gov
75
75
  executables: []
76
76
  extensions: []
@@ -106,6 +106,7 @@ files:
106
106
  - lib/opencl_ruby_ffi/intel/unofficial.rb
107
107
  - lib/opencl_ruby_ffi/khr/d3d10_sharing.rb
108
108
  - lib/opencl_ruby_ffi/khr/d3d11_sharing.rb
109
+ - lib/opencl_ruby_ffi/khr/device_uuid.rb
109
110
  - lib/opencl_ruby_ffi/khr/dx9_media_sharing.rb
110
111
  - lib/opencl_ruby_ffi/khr/egl_event.rb
111
112
  - lib/opencl_ruby_ffi/khr/egl_image.rb