opencl_ruby_ffi 1.3.7 → 1.3.12

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: fdde36869013e898818c10e84618fc8af7efbfb37f65f0dc420a5cbcfe98e724
4
+ data.tar.gz: a1934b0c7beb47644793083adaa04765dcc8eb7cddf54fc51ee1f203ebf545c7
5
5
  SHA512:
6
- metadata.gz: d144d10d5744d13cf235a2f0ff4b9fa2bb1df7d47fc4c9b4799c233d1f9e2dc71f30f66c84cdf4a55db197cb6a4175b654845ac6be97c03ed57ea4b931508a10
7
- data.tar.gz: 29561be75358ae7ae658a365f602930ff62a4bf5854ca1a0f0547ff5b7c4703ca01bd19fc036b15b3a503a0b3990eaa482d0c95c66b0be1b388316fa09e3348b
6
+ metadata.gz: f0c9376a0dc33def8c99a553526f77755223ca2592b845713fad3567bd30b8e3c4af8a1630db4f30739ada00119f53b75ab16a5a13c323205c87410565e6d568
7
+ data.tar.gz: ade66f8ccb6bdfbfdd8a3e0a88878e129507317fd710bf52ec0425c96441d5982765e7e222c6c6c154a68ee7812e6cb144fa72aefcc35ada654899c69e2c40ef
@@ -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
- 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
@@ -1072,8 +1072,7 @@ module OpenCL
1072
1072
 
1073
1073
  # Returns the Platform associated with the CommandQueue
1074
1074
  def platform
1075
- return @_platform if @_platform
1076
- @_platform = self.context.platform
1075
+ @_platform ||= self.context.platform
1077
1076
  end
1078
1077
 
1079
1078
  # Returns the Context associated to the CommandQueue
@@ -1790,10 +1789,17 @@ module OpenCL
1790
1789
 
1791
1790
  end
1792
1791
 
1792
+ module OpenCL30
1793
+ extend InnerGenerator
1794
+
1795
+ get_info_array("CommandQueue", :cl_queue_properties, "properties_array")
1796
+ end
1797
+
1793
1798
  register_extension( :v11, OpenCL11, "device.platform.version_number >= 1.1" )
1794
1799
  register_extension( :v12, OpenCL12, "device.platform.version_number >= 1.2" )
1795
1800
  register_extension( :v20, OpenCL20, "device.platform.version_number >= 2.0" )
1796
1801
  register_extension( :v21, OpenCL21, "device.platform.version_number >= 2.1" )
1802
+ register_extension( :v30, OpenCL30, "device.platform.version_number >= 3.0" )
1797
1803
 
1798
1804
  end
1799
1805
 
@@ -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
@@ -72,26 +116,25 @@ module OpenCL
72
116
 
73
117
  # Returns the number of devices associated to the Context
74
118
  def num_devices
75
- return @_num_devices if @_num_devices
76
- d_n = 0
77
- ptr = MemoryPointer::new( :size_t )
78
- error = OpenCL.clGetContextInfo(self, DEVICES, 0, nil, ptr)
79
- error_check(error)
80
- d_n = ptr.read_size_t / Platform.size
81
- @_num_devices = d_n
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
82
125
  end
83
126
 
84
127
  # Returns an Array of Device associated to the Context
85
128
  def devices
86
- return @_devices if @_devices
87
- n = self.num_devices
88
- ptr2 = MemoryPointer::new( Device, n )
89
- error = OpenCL.clGetContextInfo(self, DEVICES, Device.size*n, ptr2, nil)
90
- error_check(error)
91
- @_devices = ptr2.get_array_of_pointer(0, n).collect { |device_ptr|
92
- Device::new(device_ptr)
93
- }
94
- return @_devices
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
95
138
  end
96
139
 
97
140
  ##
@@ -125,8 +168,7 @@ module OpenCL
125
168
 
126
169
  # Returns the platform associated to the Context
127
170
  def platform
128
- return @_platform if @_platform
129
- @_platform = self.devices.first.platform
171
+ @_platform ||= self.devices.first.platform
130
172
  end
131
173
 
132
174
  # Returns an Array of ImageFormat that are supported for a given image type in the Context
@@ -459,16 +501,36 @@ module OpenCL
459
501
  return OpenCL.create_program_with_il(self, il)
460
502
  end
461
503
 
504
+ #
462
505
  def set_default_device_command_queue( device, command_queue )
463
506
  return OpenCL.set_default_device_command_queue( self, device, command_queue )
464
507
  end
465
508
 
466
509
  end
467
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
+
468
529
  register_extension( :v11, OpenCL11, "platform.version_number >= 1.1" )
469
530
  register_extension( :v12, OpenCL12, "platform.version_number >= 1.2" )
470
531
  register_extension( :v20, OpenCL20, "platform.version_number >= 2.0" )
471
532
  register_extension( :v21, OpenCL21, "platform.version_number >= 2.1" )
533
+ register_extension( :v30, OpenCL30, "platform.version_number >= 3.0" )
472
534
 
473
535
  end
474
536
 
@@ -107,11 +107,12 @@ module OpenCL
107
107
 
108
108
  # Returns the Platform the Device belongs to
109
109
  def platform
110
- return @_platform if @_platform
111
- ptr = MemoryPointer::new( OpenCL::Platform )
112
- error = OpenCL.clGetDeviceInfo(self, PLATFORM, OpenCL::Platform.size, ptr, nil)
113
- error_check(error)
114
- @_platform = OpenCL::Platform::new(ptr.read_pointer)
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
115
116
  end
116
117
 
117
118
  get_info("Device", :cl_uint, "preferred_vector_width_char")
@@ -158,8 +159,6 @@ module OpenCL
158
159
  n = ver.scan(/OpenCL C (\d+\.\d+)/)
159
160
  return n.first.first.to_f
160
161
  end
161
-
162
- get_info("Device", :cl_uint, "preferred_vector_width_half")
163
162
 
164
163
  end
165
164
 
@@ -366,10 +365,90 @@ module OpenCL
366
365
 
367
366
  end
368
367
 
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" )
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" )
373
452
 
374
453
  end
375
454
 
@@ -77,17 +77,17 @@ module OpenCL
77
77
 
78
78
  # Returns the CommandQueue associated with the Event, if it exists
79
79
  def command_queue
80
- return @_command_queue if @_command_queue
81
- ptr = MemoryPointer::new( CommandQueue )
82
- error = OpenCL.clGetEventInfo(self, COMMAND_QUEUE, CommandQueue.size, ptr, nil)
83
- error_check(error)
84
- pt = ptr.read_pointer
85
- if pt.null? then
86
- @_command_queue = nil
87
- else
88
- @_command_queue = CommandQueue::new( pt )
80
+ @_command_queue ||= begin
81
+ ptr = MemoryPointer::new( CommandQueue )
82
+ error = OpenCL.clGetEventInfo(self, COMMAND_QUEUE, CommandQueue.size, ptr, nil)
83
+ error_check(error)
84
+ pt = ptr.read_pointer
85
+ if pt.null? then
86
+ nil
87
+ else
88
+ CommandQueue::new( pt )
89
+ end
89
90
  end
90
- @_command_queue
91
91
  end
92
92
 
93
93
  get_info("Event", :cl_command_type, "command_type", true)
@@ -98,8 +98,7 @@ module OpenCL
98
98
 
99
99
  # Returns the Platform associated with the Event
100
100
  def platform
101
- return @_platform if @_platform
102
- @_platform = self.context.platform
101
+ @_platform ||= self.context.platform
103
102
  end
104
103
 
105
104
  # Returns a CommandExecutionStatus corresponding to the status of the command associtated with the Event
@@ -148,11 +147,12 @@ module OpenCL
148
147
 
149
148
  # Returns the Context associated with the Event
150
149
  def context
151
- return @_context if @_context
152
- ptr = MemoryPointer::new( Context )
153
- error = OpenCL.clGetEventInfo(self, CONTEXT, Context.size, ptr, nil)
154
- error_check(error)
155
- @_context = Context::new( ptr.read_pointer )
150
+ @_context ||= begin
151
+ ptr = MemoryPointer::new( Context )
152
+ error = OpenCL.clGetEventInfo(self, CONTEXT, Context.size, ptr, nil)
153
+ error_check(error)
154
+ Context::new( ptr.read_pointer )
155
+ end
156
156
  end
157
157
 
158
158
  # Sets the satus of Event (a user event) to the given execution status
@@ -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
@@ -29,9 +29,12 @@ module OpenCL
29
29
  sz = size
30
30
  sz = value.class.size if sz == nil
31
31
  val = value
32
- if value.kind_of?(Mem) then
32
+ if value.kind_of?(Mem)
33
33
  val = MemoryPointer::new( Mem )
34
34
  val.write_pointer(value.to_ptr)
35
+ elsif value.kind_of?(Sampler)
36
+ val = MemoryPointer::new( Sampler )
37
+ val.write_pointer(value.to_ptr)
35
38
  end
36
39
  error = clSetKernelArg( kernel, index, sz, val )
37
40
  error_check(error)
@@ -113,58 +116,63 @@ module OpenCL
113
116
 
114
117
  # Returns an AddressQualifier corresponding to the Arg
115
118
  def address_qualifier
116
- return @_address_qualifier if @_address_qualifier
117
- error_check(INVALID_OPERATION) if @kernel.context.platform.version_number < 1.2
118
- ptr = MemoryPointer::new( :cl_kernel_arg_address_qualifier )
119
- error = OpenCL.clGetKernelArgInfo(@kernel, @index, ADDRESS_QUALIFIER, ptr.size, ptr, nil)
120
- error_check(error)
121
- @_address_qualifier = AddressQualifier::new( ptr.read_cl_kernel_arg_address_qualifier )
119
+ @_address_qualifier ||= begin
120
+ error_check(INVALID_OPERATION) if @kernel.context.platform.version_number < 1.2
121
+ ptr = MemoryPointer::new( :cl_kernel_arg_address_qualifier )
122
+ error = OpenCL.clGetKernelArgInfo(@kernel, @index, ADDRESS_QUALIFIER, ptr.size, ptr, nil)
123
+ error_check(error)
124
+ AddressQualifier::new( ptr.read_cl_kernel_arg_address_qualifier )
125
+ end
122
126
  end
123
127
 
124
128
  # Returns an AccessQualifier corresponding to the Arg
125
129
  def access_qualifier
126
- return @_access_qualifier if @_access_qualifier
127
- error_check(INVALID_OPERATION) if @kernel.context.platform.version_number < 1.2
128
- ptr = MemoryPointer::new( :cl_kernel_arg_access_qualifier )
129
- error = OpenCL.clGetKernelArgInfo(@kernel, @index, ACCESS_QUALIFIER, ptr.size, ptr, nil)
130
- error_check(error)
131
- @_access_qualifier = AccessQualifier::new( ptr.read_cl_kernel_arg_access_qualifier )
130
+ @_access_qualifier ||= begin
131
+ error_check(INVALID_OPERATION) if @kernel.context.platform.version_number < 1.2
132
+ ptr = MemoryPointer::new( :cl_kernel_arg_access_qualifier )
133
+ error = OpenCL.clGetKernelArgInfo(@kernel, @index, ACCESS_QUALIFIER, ptr.size, ptr, nil)
134
+ error_check(error)
135
+ AccessQualifier::new( ptr.read_cl_kernel_arg_access_qualifier )
136
+ end
132
137
  end
133
138
 
134
139
  # Returns a String corresponding to the Arg type name
135
140
  def type_name
136
- return @_type_name if @_type_name
137
- error_check(INVALID_OPERATION) if @kernel.context.platform.version_number < 1.2
138
- ptr1 = MemoryPointer::new( :size_t, 1)
139
- error = OpenCL.clGetKernelArgInfo(@kernel, @index, TYPE_NAME, 0, nil, ptr1)
140
- error_check(error)
141
- ptr2 = MemoryPointer::new( ptr1.read_size_t )
142
- error = OpenCL.clGetKernelArgInfo(@kernel, @index, TYPE_NAME, ptr1.read_size_t, ptr2, nil)
143
- error_check(error)
144
- @_type_name = ptr2.read_string
141
+ @_type_name ||= begin
142
+ error_check(INVALID_OPERATION) if @kernel.context.platform.version_number < 1.2
143
+ ptr1 = MemoryPointer::new( :size_t, 1)
144
+ error = OpenCL.clGetKernelArgInfo(@kernel, @index, TYPE_NAME, 0, nil, ptr1)
145
+ error_check(error)
146
+ ptr2 = MemoryPointer::new( ptr1.read_size_t )
147
+ error = OpenCL.clGetKernelArgInfo(@kernel, @index, TYPE_NAME, ptr1.read_size_t, ptr2, nil)
148
+ error_check(error)
149
+ ptr2.read_string
150
+ end
145
151
  end
146
152
 
147
153
  # Returns a TypeQualifier corresponding to the Arg
148
154
  def type_qualifier
149
- return @_type_qualifier if @_type_qualifier
150
- error_check(INVALID_OPERATION) if @kernel.context.platform.version_number < 1.2
151
- ptr = MemoryPointer::new( :cl_kernel_arg_type_qualifier )
152
- error = OpenCL.clGetKernelArgInfo(@kernel, @index, TYPE_QUALIFIER, ptr.size, ptr, nil)
153
- error_check(error)
154
- @_type_qualifier = TypeQualifier::new( ptr.read_cl_kernel_arg_type_qualifier )
155
+ @_type_qualifier ||= begin
156
+ error_check(INVALID_OPERATION) if @kernel.context.platform.version_number < 1.2
157
+ ptr = MemoryPointer::new( :cl_kernel_arg_type_qualifier )
158
+ error = OpenCL.clGetKernelArgInfo(@kernel, @index, TYPE_QUALIFIER, ptr.size, ptr, nil)
159
+ error_check(error)
160
+ TypeQualifier::new( ptr.read_cl_kernel_arg_type_qualifier )
161
+ end
155
162
  end
156
163
 
157
164
  # Returns a String corresponding to the Arg name
158
165
  def name
159
- return @_name if @_name
160
- error_check(INVALID_OPERATION) if @kernel.context.platform.version_number < 1.2
161
- ptr1 = MemoryPointer::new( :size_t, 1)
162
- error = OpenCL.clGetKernelArgInfo(@kernel, @index, NAME, 0, nil, ptr1)
163
- error_check(error)
164
- ptr2 = MemoryPointer::new( ptr1.read_size_t )
165
- error = OpenCL.clGetKernelArgInfo(@kernel, @index, NAME, ptr1.read_size_t, ptr2, nil)
166
- error_check(error)
167
- @_name = ptr2.read_string
166
+ @_name ||= begin
167
+ error_check(INVALID_OPERATION) if @kernel.context.platform.version_number < 1.2
168
+ ptr1 = MemoryPointer::new( :size_t, 1)
169
+ error = OpenCL.clGetKernelArgInfo(@kernel, @index, NAME, 0, nil, ptr1)
170
+ error_check(error)
171
+ ptr2 = MemoryPointer::new( ptr1.read_size_t )
172
+ error = OpenCL.clGetKernelArgInfo(@kernel, @index, NAME, ptr1.read_size_t, ptr2, nil)
173
+ error_check(error)
174
+ ptr2.read_string
175
+ end
168
176
  end
169
177
 
170
178
  alias to_s name
@@ -194,26 +202,27 @@ module OpenCL
194
202
 
195
203
  # Returns the Platform associated with the Kernel
196
204
  def platform
197
- return @_platform if @_platform
198
- @_platform = self.context.platform
205
+ @_platform ||= self.context.platform
199
206
  end
200
207
 
201
208
  # Returns the Context the Kernel is associated with
202
209
  def context
203
- return @_context if @_context
204
- ptr = MemoryPointer::new( Context )
205
- error = OpenCL.clGetKernelInfo(self, CONTEXT, Context.size, ptr, nil)
206
- error_check(error)
207
- @_context = Context::new( ptr.read_pointer )
210
+ @_context ||= begin
211
+ ptr = MemoryPointer::new( Context )
212
+ error = OpenCL.clGetKernelInfo(self, CONTEXT, Context.size, ptr, nil)
213
+ error_check(error)
214
+ Context::new( ptr.read_pointer )
215
+ end
208
216
  end
209
217
 
210
218
  # Returns the Program the Kernel was created from
211
219
  def program
212
- return @_program if @_program
213
- ptr = MemoryPointer::new( Program )
214
- error = OpenCL.clGetKernelInfo(self, PROGRAM, Program.size, ptr, nil)
215
- error_check(error)
216
- @_program = Program::new(ptr.read_pointer)
220
+ @_program ||= begin
221
+ ptr = MemoryPointer::new( Program )
222
+ error = OpenCL.clGetKernelInfo(self, PROGRAM, Program.size, ptr, nil)
223
+ error_check(error)
224
+ Program::new(ptr.read_pointer)
225
+ end
217
226
  end
218
227
 
219
228
  def work_group_size(device = program.devices.first)
@@ -286,15 +295,16 @@ module OpenCL
286
295
  ##
287
296
  # returns a String containing the attributes qualifier used at kernel definition
288
297
  def attributes
289
- return @_attributes if @_attributes
290
- attributes_size = MemoryPointer::new( :size_t )
291
- error = OpenCL.clGetKernelInfo( self, ATTRIBUTES, 0, nil, attributes_size)
292
- error_check(error)
293
- attr = MemoryPointer::new( attributes_size.read_size_t )
294
- error = OpenCL.clGetKernelInfo( self, ATTRIBUTES, attributes_size.read_size_t, attr, nil)
295
- error_check(error)
296
- attr_string = attr.read_string
297
- @_attributes = attr_string.split(" ")
298
+ @_attributes ||= begin
299
+ attributes_size = MemoryPointer::new( :size_t )
300
+ error = OpenCL.clGetKernelInfo( self, ATTRIBUTES, 0, nil, attributes_size)
301
+ error_check(error)
302
+ attr = MemoryPointer::new( attributes_size.read_size_t )
303
+ error = OpenCL.clGetKernelInfo( self, ATTRIBUTES, attributes_size.read_size_t, attr, nil)
304
+ error_check(error)
305
+ attr_string = attr.read_string
306
+ attr_string.split(" ")
307
+ end
298
308
  end
299
309
 
300
310
  def global_work_size(device = program.devices.first)