opencl_ruby_ffi 1.3.3 → 1.3.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,586 @@
1
+ module OpenCL
2
+ DEVICE_HOST_MEM_CAPABILITIES_INTEL = 0x4190
3
+ DEVICE_DEVICE_MEM_CAPABILITIES_INTEL = 0x4191
4
+ DEVICE_SINGLE_DEVICE_SHARED_MEM_CAPABILITIES_INTEL = 0x4192
5
+ DEVICE_CROSS_DEVICE_SHARED_MEM_CAPABILITIES_INTEL = 0x4193
6
+ DEVICE_SHARED_SYSTEM_MEM_CAPABILITIES_INTEL = 0x4194
7
+
8
+ UNIFIED_SHARED_MEMORY_ACCESS_INTEL = (1 << 0)
9
+ UNIFIED_SHARED_MEMORY_ATOMIC_ACCESS_INTEL = (1 << 1)
10
+ UNIFIED_SHARED_MEMORY_CONCURRENT_ACCESS_INTEL = (1 << 2)
11
+ UNIFIED_SHARED_MEMORY_CONCURRENT_ATOMIC_ACCESS_INTEL = (1 << 3)
12
+
13
+ MEM_ALLOC_FLAGS_INTEL = 0x4195
14
+
15
+ MEM_ALLOC_WRITE_COMBINED_INTEL = (1 << 0)
16
+
17
+ MEM_TYPE_UNKNOWN_INTEL = 0x4196
18
+ MEM_TYPE_HOST_INTEL = 0x4197
19
+ MEM_TYPE_DEVICE_INTEL = 0x4198
20
+ MEM_TYPE_SHARED_INTEL = 0x4199
21
+
22
+ MEM_ALLOC_TYPE_INTEL = 0x419A
23
+ MEM_ALLOC_BASE_PTR_INTEL = 0x419B
24
+ MEM_ALLOC_SIZE_INTEL = 0x419C
25
+ MEM_ALLOC_DEVICE_INTEL = 0x419D
26
+ MEM_ALLOC_INFO_TBD1_INTEL = 0x419E
27
+ MEM_ALLOC_INFO_TBD2_INTEL = 0x419F
28
+
29
+ KERNEL_EXEC_INFO_INDIRECT_HOST_ACCESS_INTEL = 0x4200
30
+ KERNEL_EXEC_INFO_INDIRECT_DEVICE_ACCESS_INTEL = 0x4201
31
+ KERNEL_EXEC_INFO_INDIRECT_SHARED_ACCESS_INTEL = 0x4202
32
+ KERNEL_EXEC_INFO_USM_PTRS_INTEL = 0x4203
33
+
34
+ MIGRATE_MEM_OBJECT_HOST_INTEL = (1 << 0)
35
+ MIGRATE_MEM_OBJECT_CONTENT_UNDEFINED_INTEL = (1 << 1)
36
+
37
+ COMMAND_MEMFILL_INTEL = 0x4204
38
+ COMMAND_MEMCPY_INTEL = 0x4205
39
+ COMMAND_MIGRATEMEM_INTEL = 0x4206
40
+ COMMAND_MEMADVISE_INTEL = 0x4207
41
+
42
+ class CommandType
43
+ MEMFILL_INTEL = 0x4204
44
+ MEMCPY_INTEL = 0x4205
45
+ MIGRATEMEM_INTEL = 0x4206
46
+ MEMADVISE_INTEL = 0x4207
47
+
48
+ @codes[0x4204] = 'MEMFILL_INTEL'
49
+ @codes[0x4205] = 'MEMCPY_INTEL'
50
+ @codes[0x4206] = 'MIGRATEMEM_INTEL'
51
+ @codes[0x4207] = 'MEMADVISE_INTEL'
52
+ end
53
+
54
+ MEM_ADVICE_TBD0_INTEL = 0x4208
55
+ MEM_ADVICE_TBD1_INTEL = 0x4209
56
+ MEM_ADVICE_TBD2_INTEL = 0x420A
57
+ MEM_ADVICE_TBD3_INTEL = 0x420B
58
+ MEM_ADVICE_TBD4_INTEL = 0x420C
59
+ MEM_ADVICE_TBD5_INTEL = 0x420D
60
+ MEM_ADVICE_TBD6_INTEL = 0x420E
61
+ MEM_ADVICE_TBD7_INTEL = 0x420F
62
+
63
+ [[:cl_bitfield, :cl_mem_properties_intel],
64
+ [:cl_bitfield, :cl_mem_migration_flags_intel],
65
+ [:cl_bitfield, :cl_mem_alloc_flags_intel],
66
+ [:cl_uint, :cl_mem_info_intel],
67
+ [:cl_uint, :cl_mem_advice_intel],
68
+ [:cl_bitfield, :cl_unified_shared_memory_capabilities_intel],
69
+ [:cl_uint, :cl_unified_shared_memory_type_intel]
70
+ ].each { |o_t, t|
71
+ typedef o_t, t
72
+ }
73
+ end
74
+
75
+ if RUBY_VERSION.scan(/\d+/).collect(&:to_i).first >= 2
76
+ module OpenCLRefinements
77
+ refine FFI::Pointer do
78
+ methods_prefix = [:put, :get, :write, :read, :put_array_of, :get_array_of]
79
+ [[:cl_bitfield, :cl_mem_properties_intel],
80
+ [:cl_bitfield, :cl_mem_migration_flags_intel],
81
+ [:cl_bitfield, :cl_mem_alloc_flags_intel],
82
+ [:cl_uint, :cl_mem_info_intel],
83
+ [:cl_uint, :cl_mem_advice_intel],
84
+ [:cl_bitfield, :cl_unified_shared_memory_capabilities_intel],
85
+ [:cl_uint, :cl_unified_shared_memory_type_intel]
86
+ ].each { |orig, add|
87
+ methods_prefix.each { |meth|
88
+ alias_method "#{meth}_#{add}".to_sym, "#{meth}_#{orig}".to_sym
89
+ }
90
+ }
91
+ end
92
+ end
93
+ using OpenCLRefinements
94
+ else
95
+ class FFI::Pointer
96
+ methods_prefix = [:put, :get, :write, :read, :put_array_of, :get_array_of]
97
+ [[:cl_bitfield, :cl_mem_properties_intel],
98
+ [:cl_bitfield, :cl_mem_migration_flags_intel],
99
+ [:cl_bitfield, :cl_mem_alloc_flags_intel],
100
+ [:cl_uint, :cl_mem_info_intel],
101
+ [:cl_uint, :cl_mem_advice_intel],
102
+ [:cl_bitfield, :cl_unified_shared_memory_capabilities_intel],
103
+ [:cl_uint, :cl_unified_shared_memory_type_intel]
104
+ ].each { |orig, add|
105
+ methods_prefix.each { |meth|
106
+ alias_method "#{meth}_#{add}".to_sym, "#{meth}_#{orig}".to_sym
107
+ }
108
+ }
109
+ end
110
+ end
111
+
112
+ module OpenCL
113
+
114
+ class UnifiedSharedMemoryCapabilitiesINTEL < Bitfield
115
+ UNIFIED_SHARED_MEMORY_ACCESS_INTEL = (1 << 0)
116
+ UNIFIED_SHARED_MEMORY_ATOMIC_ACCESS_INTEL = (1 << 1)
117
+ UNIFIED_SHARED_MEMORY_CONCURRENT_ACCESS_INTEL = (1 << 2)
118
+ UNIFIED_SHARED_MEMORY_CONCURRENT_ATOMIC_ACCESS_INTEL = (1 << 3)
119
+
120
+ def names
121
+ fs = []
122
+ %w( UNIFIED_SHARED_MEMORY_ACCESS_INTEL UNIFIED_SHARED_MEMORY_ATOMIC_ACCESS_INTEL UNIFIED_SHARED_MEMORY_CONCURRENT_ACCESS_INTEL UNIFIED_SHARED_MEMORY_CONCURRENT_ATOMIC_ACCESS_INTEL )..each { |f|
123
+ fs.push(f) if self.include?( self.class.const_get(f) )
124
+ }
125
+ return fs
126
+ end
127
+ end
128
+
129
+ module InnerInterface
130
+ TYPE_CONVERTER[:cl_unified_shared_memory_capabilities_intel] = UnifiedSharedMemoryCapabilitiesINTEL
131
+ end
132
+
133
+ class Mem
134
+ ALLOC_FLAGS_INTEL = 0x4195
135
+
136
+ TYPE_UNKNOWN_INTEL = 0x4196
137
+ TYPE_HOST_INTEL = 0x4197
138
+ TYPE_DEVICE_INTEL = 0x4198
139
+ TYPE_SHARED_INTEL = 0x4199
140
+
141
+ ALLOC_WRITE_COMBINED_INTEL = (1 << 0)
142
+
143
+ ALLOC_TYPE_INTEL = 0x419A
144
+ ALLOC_BASE_PTR_INTEL = 0x419B
145
+ ALLOC_SIZE_INTEL = 0x419C
146
+ ALLOC_DEVICE_INTEL = 0x419D
147
+ ALLOC_INFO_TBD1_INTEL = 0x419E
148
+ ALLOC_INFO_TBD2_INTEL = 0x419F
149
+
150
+ class UnifiedSharedMemoryTypeINTEL < EnumInt
151
+ UNKNOWN_INTEL = 0x4196
152
+ HOST_INTEL = 0x4197
153
+ DEVICE_INTEL = 0x4198
154
+ SHARED_INTEL = 0x4199
155
+ @codes = {}
156
+ @codes[0x4196] = 'UNKNOWN_INTEL'
157
+ @codes[0x4197] = 'HOST_INTEL'
158
+ @codes[0x4198] = 'DEVICE_INTEL'
159
+ @codes[0x4199] = 'SHARED_INTEL'
160
+ end
161
+
162
+ class AllocFlagsINTEL < Bitfield
163
+ DEFAULT_INTEL = 0
164
+ WRITE_COMBINED_INTEL = (1 << 0)
165
+ def names
166
+ fs = []
167
+ %w( WRITE_COMBINED_INTEL ).each { |f|
168
+ fs.push(f) if self.include?( self.class.const_get(f) )
169
+ }
170
+ return fs
171
+ end
172
+ end
173
+
174
+ class AdviceINTEL < EnumInt
175
+ TBD0_INTEL = 0x4208
176
+ TBD1_INTEL = 0x4209
177
+ TBD2_INTEL = 0x420A
178
+ TBD3_INTEL = 0x420B
179
+ TBD4_INTEL = 0x420C
180
+ TBD5_INTEL = 0x420D
181
+ TBD6_INTEL = 0x420E
182
+ TBD7_INTEL = 0x420F
183
+ @codes = {}
184
+ @codes[0x4208] = 'TBD0_INTEL'
185
+ @codes[0x4209] = 'TBD1_INTEL'
186
+ @codes[0x420A] = 'TBD2_INTEL'
187
+ @codes[0x420B] = 'TBD3_INTEL'
188
+ @codes[0x420C] = 'TBD4_INTEL'
189
+ @codes[0x420D] = 'TBD5_INTEL'
190
+ @codes[0x420E] = 'TBD6_INTEL'
191
+ @codes[0x420F] = 'TBD7_INTEL'
192
+ end
193
+
194
+ class MigrationFlagsINTEL < Bitfield
195
+ HOST_INTEL = (1 << 0)
196
+ CONTENT_UNDEFINED_INTEL = (1 << 1)
197
+ # Returns an Array of String representing the different flags set
198
+ def names
199
+ fs = []
200
+ %w( HOST CONTENT_UNDEFINED ).each { |f|
201
+ fs.push(f) if self.include?( self.class.const_get(f) )
202
+ }
203
+ return fs
204
+ end
205
+ end
206
+
207
+ end
208
+
209
+ module InnerInterface
210
+ TYPE_CONVERTER[:cl_unified_shared_memory_type_intel] = Mem::UnifiedSharedMemoryTypeINTEL
211
+ TYPE_CONVERTER[:cl_mem_alloc_flags_intel] = Mem::AllocFlagsINTEL
212
+ TYPE_CONVERTER[:cl_mem_advice_intel] = Mem::AdviceINTEL
213
+ TYPE_CONVERTER[:cl_mem_migration_flags_intel] = Mem::MigrationFlagsINTEL
214
+ end
215
+
216
+ class Device
217
+ HOST_MEM_CAPABILITIES_INTEL = 0x4190
218
+ DEVICE_MEM_CAPABILITIES_INTEL = 0x4191
219
+ SINGLE_DEVICE_SHARED_MEM_CAPABILITIES_INTEL = 0x4192
220
+ CROSS_DEVICE_SHARED_MEM_CAPABILITIES_INTEL = 0x4193
221
+ SHARED_SYSTEM_MEM_CAPABILITIES_INTEL = 0x4194
222
+
223
+ module UnifiedSharedMemoryPreviewINTEL
224
+ extend InnerGenerator
225
+
226
+ get_info("Device", :cl_unified_shared_memory_capabilities_intel, "host_mem_capabilities_intel")
227
+ get_info("Device", :cl_unified_shared_memory_capabilities_intel, "device_mem_capabilities_intel")
228
+ get_info("Device", :cl_unified_shared_memory_capabilities_intel, "device_shared_mem_capabilities_intel")
229
+ get_info("Device", :cl_unified_shared_memory_capabilities_intel, "cross_device_mem_capabilities_intel")
230
+ get_info("Device", :cl_unified_shared_memory_capabilities_intel, "shared_system_mem_capabilities_intel")
231
+ end
232
+ register_extension( :cl_intel_unified_shared_memory_preview, UnifiedSharedMemoryPreviewINTEL, "extensions.include?(\"cl_intel_unified_shared_memory_preview\")" )
233
+ end
234
+
235
+ class USMPointer < Pointer
236
+
237
+ def initialize(address, context)
238
+ super(address)
239
+ @context = context
240
+ end
241
+
242
+ def inspect
243
+ return "#<#{self.class.name}: 0x#{address.to_s(16)} (#{size})>"
244
+ end
245
+
246
+ def slice(offset, size)
247
+ res = super(offset, size)
248
+ self.class.new(res, context)
249
+ end
250
+
251
+ def +( offset )
252
+ self.slice(offset, self.size - offset)
253
+ end
254
+
255
+ def free
256
+ @context.mem_free_intel(alloc_base_ptr_intel)
257
+ end
258
+
259
+ def alloc_type_intel
260
+ @context.mem_alloc_type_intel(self)
261
+ end
262
+
263
+ def alloc_flags_intel
264
+ @context.mem_alloc_flags_intel(self)
265
+ end
266
+
267
+ def alloc_base_ptr_intel
268
+ @context.mem_alloc_base_ptr_intel(self)
269
+ end
270
+
271
+ def alloc_size_intel
272
+ @context.mem_alloc_size_intel(self)
273
+ end
274
+
275
+ def alloc_device_intel
276
+ context.mem_alloc_device_intel(self)
277
+ end
278
+ end
279
+
280
+ class Context
281
+ module UnifiedSharedMemoryPreviewINTEL
282
+ extend InnerGenerator
283
+
284
+ def clGetMemAllocInfoINTEL
285
+ return @_clGetMemAllocInfoINTEL if @_clGetMemAllocInfoINTEL
286
+ @_clGetMemAllocInfoINTEL = platform.get_extension_function("clGetMemAllocInfoINTEL", :cl_int, [Context, :pointer, :cl_mem_info_intel, :size_t, :pointer, :pointer])
287
+ error_check(OpenCL::INVALID_OPERATION) unless @_clGetMemAllocInfoINTEL
288
+ return @_clGetMemAllocInfoINTEL
289
+ end
290
+
291
+ def clHostMemAllocINTEL
292
+ return @_clHostMemAllocINTEL if @_clHostMemAllocINTEL
293
+ @_clHostMemAllocINTEL = platform.get_extension_function("clHostMemAllocINTEL", :pointer, [Context, :pointer, :size_t, :cl_uint, :pointer])
294
+ error_check(OpenCL::INVALID_OPERATION) unless @_clHostMemAllocINTEL
295
+ return @_clHostMemAllocINTEL
296
+ end
297
+
298
+ def clDeviceMemAllocINTEL
299
+ return @_clDeviceMemAllocINTEL if @_clDeviceMemAllocINTEL
300
+ @_clDeviceMemAllocINTEL = platform.get_extension_function("clDeviceMemAllocINTEL", :pointer, [Context, Device, :pointer, :size_t, :cl_uint, :pointer])
301
+ error_check(OpenCL::INVALID_OPERATION) unless @_clDeviceMemAllocINTEL
302
+ return @_clDeviceMemAllocINTEL
303
+ end
304
+
305
+ def clSharedMemAllocINTEL
306
+ return @_clSharedMemAllocINTEL if @_clSharedMemAllocINTEL
307
+ @_clSharedMemAllocINTEL = platform.get_extension_function("clSharedMemAllocINTEL", :pointer, [Context, Device, :pointer, :size_t, :cl_uint, :pointer])
308
+ error_check(OpenCL::INVALID_OPERATION) unless @_clSharedMemAllocINTEL
309
+ return @_clSharedMemAllocINTEL
310
+ end
311
+
312
+ def clMemFreeINTEL
313
+ return @_clMemFreeINTEL if @_clMemFreeINTEL
314
+ @_clMemFreeINTEL = platform.get_extension_function("clMemFreeINTEL", :cl_int, [Context, :pointer])
315
+ error_check(OpenCL::INVALID_OPERATION) unless @_clMemFreeINTEL
316
+ return @_clMemFreeINTEL
317
+ end
318
+
319
+ def get_mem_properties_intel(properties)
320
+ return nil unless properties
321
+ properties = [properties].flatten
322
+ props = MemoryPointer::new(:cl_mem_properties_intel, properties.length + 1)
323
+ properties.each_with_index { |e, i|
324
+ props[i].write_cl_mem_properties_intel(e)
325
+ }
326
+ props[properties.length].write_cl_mem_properties_intel(0)
327
+ return props
328
+ end
329
+
330
+ private :get_mem_properties_intel
331
+
332
+ def host_mem_alloc_intel(size, options = {})
333
+ properties = get_mem_properties_intel(options[:properties])
334
+ alignment = 0
335
+ alignment = options[:alignment] if options[:alignment]
336
+ error = MemoryPointer::new( :cl_int )
337
+ ptr = clHostMemAllocINTEL.call(self, properties, size, alignment, error)
338
+ error_check(error.read_cl_int)
339
+ return USMPointer::new(ptr.slice(0, size), self)
340
+ end
341
+
342
+ def device_mem_alloc_intel(device, size, options = {})
343
+ properties = get_mem_properties_intel(options[:properties])
344
+ alignment = 0
345
+ alignment = options[:alignment] if options[:alignment]
346
+ error = MemoryPointer::new( :cl_int )
347
+ ptr = clDeviceMemAllocINTEL.call(self, device, properties, size, alignment, error)
348
+ error_check(error.read_cl_int)
349
+ return USMPointer::new(ptr.slice(0, size), self)
350
+ end
351
+
352
+ def shared_mem_alloc_intel(device, size, options = {})
353
+ properties = get_mem_properties_intel(options[:properties])
354
+ alignment = 0
355
+ alignment = options[:alignment] if options[:alignment]
356
+ error = MemoryPointer::new( :cl_int )
357
+ ptr = clSharedMemAllocINTEL.call(self, device, properties, size, alignment, error)
358
+ error_check(error.read_cl_int)
359
+ return USMPointer::new(ptr.slice(0, size), self)
360
+ end
361
+
362
+ def mem_free_intel(ptr)
363
+ error = clMemFreeINTEL.call(self, ptr)
364
+ error_check(error)
365
+ return self
366
+ end
367
+
368
+ def mem_alloc_type_intel(ptr)
369
+ ptr_res = MemoryPointer::new(:cl_unified_shared_memory_type_intel)
370
+ error = clGetMemAllocInfoINTEL.call(self, ptr, OpenCL::Mem::ALLOC_TYPE_INTEL, ptr_res.size, ptr_res, nil)
371
+ error_check(error)
372
+ return OpenCL::Mem::UnifiedSharedMemoryTypeINTEL::new(ptr_res.read_cl_unified_shared_memory_type_intel)
373
+ end
374
+
375
+ def mem_alloc_flags_intel(ptr)
376
+ ptr_res = MemoryPointer::new(:cl_mem_alloc_flags_intel)
377
+ error = clGetMemAllocInfoINTEL.call(self, ptr, OpenCL::Mem::ALLOC_FLAGS_INTEL, ptr_res.size, ptr_res, nil)
378
+ error_check(error)
379
+ return OpenCL::Mem::AllocFlagsINTEL::new(ptr_res.read_cl_mem_alloc_flags_intel)
380
+ end
381
+
382
+ def mem_alloc_base_ptr_intel(ptr)
383
+ ptr_res = MemoryPointer::new(:pointer)
384
+ error = clGetMemAllocInfoINTEL.call(self, ptr, OpenCL::Mem::ALLOC_BASE_PTR_INTEL, ptr_res.size, ptr_res, nil)
385
+ error_check(error)
386
+ return ptr_res.read_pointer
387
+ end
388
+
389
+ def mem_alloc_size_intel(ptr)
390
+ ptr_res = MemoryPointer::new(:size_t)
391
+ error = clGetMemAllocInfoINTEL.call(self, ptr, OpenCL::Mem::ALLOC_SIZE_INTEL, ptr_res.size, ptr_res, nil)
392
+ error_check(error)
393
+ return ptr_res.read_size_t
394
+ end
395
+
396
+ def mem_alloc_device_intel(ptr)
397
+ ptr_res = MemoryPointer::new( Device )
398
+ error = OpenCL.clGetMemAllocInfoINTEL.call(self, ptr, OpenCL::Mem::ALLOC_DEVICE_INTEL, Device.size, ptr_res, nil)
399
+ error_check(error)
400
+ return Device::new(ptr_res.read_pointer)
401
+ end
402
+
403
+ end
404
+ register_extension( :cl_intel_unified_shared_memory_preview, UnifiedSharedMemoryPreviewINTEL, "platform.extensions.include?(\"cl_intel_unified_shared_memory_preview\")" )
405
+ end
406
+
407
+ class Kernel
408
+ EXEC_INFO_INDIRECT_HOST_ACCESS_INTEL = 0x4200
409
+ EXEC_INFO_INDIRECT_DEVICE_ACCESS_INTEL = 0x4201
410
+ EXEC_INFO_INDIRECT_SHARED_ACCESS_INTEL = 0x4202
411
+ EXEC_INFO_USM_PTRS_INTEL = 0x4203
412
+
413
+ module UnifiedSharedMemoryPreviewINTEL
414
+ extend InnerGenerator
415
+
416
+ def clSetKernelArgMemPointerINTEL
417
+ return @_clSetKernelArgMemPointerINTEL if @_clSetKernelArgMemPointerINTEL
418
+ @_clSetKernelArgMemPointerINTEL = context.platform.get_extension_function("clSetKernelArgMemPointerINTEL", :cl_int, Kernel, :cl_uint, :pointer)
419
+ error_check(OpenCL::INVALID_OPERATION) unless @_clSetKernelArgMemPointerINTEL
420
+ return @_clSetKernelArgMemPointerINTEL
421
+ end
422
+
423
+ def set_arg_mem_pointer_intel(index, usm_pointer)
424
+ error = clSetKernelArgMemPointerINTEL.call(self, index, usm_pointer)
425
+ error_check(error)
426
+ return self
427
+ end
428
+
429
+ def set_usm_ptrs_intel( ptrs )
430
+ pointers = [ptrs].flatten
431
+ pt = MemoryPointer::new( :pointer, pointers.length )
432
+ pointers.each_with_index { |p, i|
433
+ pt[i].write_pointer(p)
434
+ }
435
+ error = OpenCL.clSetKernelExecInfo( self, EXEC_INFO_USM_PTRS_INTEL, pt.size, pt)
436
+ error_check(error)
437
+ self
438
+ end
439
+
440
+ def set_indirect_host_access_intel( flag )
441
+ pt = MemoryPointer::new( :cl_bool )
442
+ pt.write_cl_bool( flag )
443
+ error = OpenCL.clSetKernelExecInfo( self, EXEC_INFO_INDIRECT_HOST_ACCESS_INTEL, pt.size, pt)
444
+ error_check(error)
445
+ self
446
+ end
447
+
448
+ def set_indirect_device_access_intel( flag )
449
+ pt = MemoryPointer::new( :cl_bool )
450
+ pt.write_cl_bool( flag )
451
+ error = OpenCL.clSetKernelExecInfo( self, EXEC_INFO_INDIRECT_DEVICE_ACCESS_INTEL, pt.size, pt)
452
+ error_check(error)
453
+ self
454
+ end
455
+
456
+ def set_shared_device_access_intel( flag )
457
+ pt = MemoryPointer::new( :cl_bool )
458
+ pt.write_cl_bool( flag )
459
+ error = OpenCL.clSetKernelExecInfo( self, EXEC_INFO_SHARED_DEVICE_ACCESS_INTEL, pt.size, pt)
460
+ error_check(error)
461
+ self
462
+ end
463
+
464
+ def enqueue_with_args(command_queue, global_work_size, *args)
465
+ n = self.num_args
466
+ error_check(INVALID_KERNEL_ARGS) if args.length < n
467
+ error_check(INVALID_KERNEL_ARGS) if args.length > n + 1
468
+ if args.length == n + 1
469
+ options = args.last
470
+ else
471
+ options = {}
472
+ end
473
+ n.times { |i|
474
+ if args[i].class == SVMPointer and self.context.platform.version_number >= 2.0 then
475
+ self.set_arg_svm_pointer(i, args[i])
476
+ elsif args[i].class == USMPointer then
477
+ self.set_arg_mem_pointer_intel(i, args[i])
478
+ else
479
+ self.set_arg(i, args[i])
480
+ end
481
+ }
482
+ command_queue.enqueue_ndrange_kernel(self, global_work_size, options)
483
+ end
484
+
485
+ end
486
+ register_extension( :cl_intel_unified_shared_memory_preview, UnifiedSharedMemoryPreviewINTEL, "platform.extensions.include?(\"cl_intel_unified_shared_memory_preview\")" )
487
+ end
488
+
489
+ class Kernel
490
+ class Arg
491
+ module UnifiedSharedMemoryPreviewINTEL
492
+ def set(value, size = nil)
493
+ if value.class == SVMPointer and @kernel.context.platform.version_number >= 2.0 then
494
+ OpenCL.set_kernel_arg_svm_pointer(@kernel, @index, value)
495
+ elsif args[i].class == USMPointer then
496
+ @kernel.set_arg_mem_pointer_intel(@index, value)
497
+ else
498
+ OpenCL.set_kernel_arg(@kernel, @index, value, size)
499
+ end
500
+ end
501
+ end
502
+ register_extension( :cl_intel_unified_shared_memory_preview, UnifiedSharedMemoryPreviewINTEL, "platform.extensions.include?(\"cl_intel_unified_shared_memory_preview\")" )
503
+ end
504
+ end
505
+
506
+ class CommandQueue
507
+ module UnifiedSharedMemoryPreviewINTEL
508
+ extend InnerGenerator
509
+
510
+ def clEnqueueMemFillINTEL
511
+ return @_clEnqueueMemFillINTEL if @_clEnqueueMemFillINTEL
512
+ @_clEnqueueMemFillINTEL = platform.get_extension_function("clEnqueueMemFillINTEL", :cl_int, [CommandQueue, :pointer, :pointer, :size_t, :size_t, :cl_uint, :pointer, :pointer])
513
+ error_check(OpenCL::INVALID_OPERATION) unless @_clEnqueueMemFillINTEL
514
+ return @_clEnqueueMemFillINTEL
515
+ end
516
+
517
+ def clEnqueueMemcpyINTEL
518
+ return @_clEnqueueMemcpyINTEL if @_clEnqueueMemcpyINTEL
519
+ @_clEnqueueMemcpyINTEL = platform.get_extension_function("clEnqueueMemcpyINTEL", :cl_int, [CommandQueue, :cl_bool, :pointer, :pointer, :size_t, :cl_uint, :pointer, :pointer])
520
+ error_check(OpenCL::INVALID_OPERATION) unless @_clEnqueueMemcpyINTEL
521
+ return @_clEnqueueMemcpyINTEL
522
+ end
523
+
524
+ def clEnqueueMigrateMemINTEL
525
+ return @_clEnqueueMigrateMemINTEL if @_clEnqueueMigrateMemINTEL
526
+ @_clEnqueueMigrateMemINTEL = platform.get_extension_function("clEnqueueMigrateMemINTEL", :cl_int, [CommandQueue, :pointer, :size_t, :cl_mem_migration_flags_intel, :cl_uint, :pointer, :pointer])
527
+ error_check(OpenCL::INVALID_OPERATION) unless @_clEnqueueMemcpyINTEL
528
+ return @_clEnqueueMemcpyINTEL
529
+ end
530
+
531
+ def clEnqueueMemAdviseINTEL
532
+ return @_clEnqueueMemAdviseINTEL if @_clEnqueueMemAdviseINTEL
533
+ @_clEnqueueMemAdviseINTEL = platform.get_extension_function("clEnqueueMemAdviseINTEL", :cl_int, [CommandQueue, :pointer, :size_t, :cl_mem_advice_intel, :cl_uint, :pointer, :pointer])
534
+ error_check(OpenCL::INVALID_OPERATION) unless @_clEnqueueMemAdviseINTEL
535
+ return @_clEnqueueMemAdviseINTEL
536
+ end
537
+
538
+ def enqueue_mem_fill_intel(usm_ptr, pattern, options = {})
539
+ num_events, events = get_event_wait_list( options )
540
+ pattern_size = pattern.size
541
+ pattern_size = options[:pattern_size] if options[:pattern_size]
542
+ size = usm_ptr.size
543
+ size = options[:size] if options[:size]
544
+ event = MemoryPointer::new( Event )
545
+ error = clEnqueueMemFillINTEL.call(self, usm_ptr, pattern, pattern_size, size, num_events, events, event)
546
+ error_check(error)
547
+ return Event::new(event.read_pointer, false)
548
+ end
549
+
550
+ def enqueue_memcpy_intel(dst_ptr, src_ptr, options = {})
551
+ num_events, events = get_event_wait_list( options )
552
+ blocking = FALSE
553
+ blocking = TRUE if options[:blocking] or options[:blocking_copy]
554
+ size = [dst_ptr.size, src_ptr.size].min
555
+ size = options[:size] if options[:size]
556
+ event = MemoryPointer::new( Event )
557
+ error = clEnqueueMemcpyINTEL.call(self, blocking, dst_ptr, src_ptr, size, num_events, events, event)
558
+ error_check(error)
559
+ return Event::new(event.read_pointer, false)
560
+ end
561
+
562
+ def enqueue_migrate_mem_intel(usm_ptr, options = {})
563
+ num_events, events = get_event_wait_list( options )
564
+ flags = get_flags( options )
565
+ size = usm_ptr.size
566
+ size = options[:size] if options[:size]
567
+ event = MemoryPointer::new( Event )
568
+ error = clEnqueueMigrateMemINTEL.call(self, usm_ptr, size, flags, num_events, events, event)
569
+ error_check(error)
570
+ return Event::new(event.read_pointer, false)
571
+ end
572
+
573
+ def enqueue_mem_advise_intel(usm_ptr, advice, options = {})
574
+ num_events, events = get_event_wait_list( options )
575
+ size = usm_ptr.size
576
+ size = options[:size] if options[:size]
577
+ event = MemoryPointer::new( Event )
578
+ error = clEnqueueMemAdviseINTEL(self, usm_ptr, size, advice, num_events, events, event)
579
+ error_check(error)
580
+ return Event::new(event.read_pointer, false)
581
+ end
582
+
583
+ end
584
+ register_extension( :cl_intel_unified_shared_memory_preview, UnifiedSharedMemoryPreviewINTEL, "device.extensions.include?(\"cl_intel_unified_shared_memory_preview\")" )
585
+ end
586
+ end