BOAST 1.2.2 → 1.3.0

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.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/BOAST.gemspec +2 -2
  3. data/lib/BOAST.rb +1 -0
  4. data/lib/BOAST/Language/Algorithm.rb +68 -30
  5. data/lib/BOAST/Language/Annotation.rb +1 -0
  6. data/lib/BOAST/Language/Architectures.rb +1 -0
  7. data/lib/BOAST/Language/Arithmetic.rb +15 -9
  8. data/lib/BOAST/Language/BOAST_OpenCL.rb +94 -87
  9. data/lib/BOAST/Language/CPUID_by_name.rb +1 -0
  10. data/lib/BOAST/Language/Case.rb +6 -0
  11. data/lib/BOAST/Language/CodeBlock.rb +1 -0
  12. data/lib/BOAST/Language/Comment.rb +14 -11
  13. data/lib/BOAST/Language/Config.rb +23 -15
  14. data/lib/BOAST/Language/ControlStructure.rb +10 -2
  15. data/lib/BOAST/Language/DataTypes.rb +23 -15
  16. data/lib/BOAST/Language/Expression.rb +3 -0
  17. data/lib/BOAST/Language/For.rb +31 -26
  18. data/lib/BOAST/Language/FuncCall.rb +7 -0
  19. data/lib/BOAST/Language/Functors.rb +56 -19
  20. data/lib/BOAST/Language/If.rb +3 -0
  21. data/lib/BOAST/Language/Index.rb +11 -9
  22. data/lib/BOAST/Language/Intrinsics.rb +2 -0
  23. data/lib/BOAST/Language/OpenMP.rb +57 -40
  24. data/lib/BOAST/Language/Operators.rb +27 -19
  25. data/lib/BOAST/Language/Pragma.rb +1 -0
  26. data/lib/BOAST/Language/Print.rb +3 -0
  27. data/lib/BOAST/Language/Procedure.rb +81 -76
  28. data/lib/BOAST/Language/Slice.rb +16 -14
  29. data/lib/BOAST/Language/State.rb +126 -55
  30. data/lib/BOAST/Language/Transitions.rb +26 -26
  31. data/lib/BOAST/Language/Variable.rb +89 -58
  32. data/lib/BOAST/Language/While.rb +3 -0
  33. data/lib/BOAST/Runtime/AffinityProbe.rb +65 -0
  34. data/lib/BOAST/Runtime/CKernel.rb +44 -1
  35. data/lib/BOAST/Runtime/CRuntime.rb +3 -0
  36. data/lib/BOAST/Runtime/CUDARuntime.rb +3 -0
  37. data/lib/BOAST/Runtime/CompiledRuntime.rb +4 -0
  38. data/lib/BOAST/Runtime/Compilers.rb +6 -5
  39. data/lib/BOAST/Runtime/Config.rb +1 -1
  40. data/lib/BOAST/Runtime/FFIRuntime.rb +3 -0
  41. data/lib/BOAST/Runtime/FORTRANRuntime.rb +3 -0
  42. data/lib/BOAST/Runtime/MPPARuntime.rb +2 -0
  43. data/lib/BOAST/Runtime/NonRegression.rb +5 -3
  44. data/lib/BOAST/Runtime/OpenCLRuntime.rb +7 -10
  45. data/lib/BOAST/Runtime/Probe.rb +2 -0
  46. metadata +7 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5fab0f4b52a0cd282c1abfc5778a690c5c90baae
4
- data.tar.gz: 7e8adb0b43d8913a825a2349a8806af4097dd494
3
+ metadata.gz: ca2740cb851da646fa30581de14043280bd95ffe
4
+ data.tar.gz: edafed822810e02453fc6418cea1da470ad47c8c
5
5
  SHA512:
6
- metadata.gz: 4fc23c211872b5bd42ae68cd18be4dacdcdc8a235c14bd5c40e80359bbff25a8c0433bdc52cf9d4b5a605ad0342f025384cf2c32cb94d3ed9241d4b058932d70
7
- data.tar.gz: 29db1a68750851b3ce5a1f4e1b8e8495a8f553d0b979628ab132cf7cc3c4e96bc8672ffed74b7a938bead7e0e6a5c212b89041f73be8b7647d68c188a603452c
6
+ metadata.gz: 8ae1bcaf2964999e45ba8ca1aab3642425f8c24dba9aff508106cf65d5b4baadd0709b3ef12349388dc6e8ea89ca6281de32df3a15bb29ebc87a1780291114da
7
+ data.tar.gz: b0b4d95e68c5395a9d9740f7f59c900babfa419b261cd000add8d5238899c3178d2953ea073d4721ba397e6cb6678e17e040e1e8e90c82bef02fb7716c941ab9
data/BOAST.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'BOAST'
3
- s.version = "1.2.2"
3
+ s.version = "1.3.0"
4
4
  s.author = "Brice Videau"
5
5
  s.email = "brice.videau@imag.fr"
6
6
  s.homepage = "https://github.com/Nanosim-LIG/boast"
@@ -12,7 +12,7 @@ Gem::Specification.new do |s|
12
12
  s.required_ruby_version = '>= 1.9.3'
13
13
  s.add_dependency 'narray', '~> 0.6.0', '>=0.6.0.8'
14
14
  s.add_dependency 'narray_ffi', '~> 1.2', '>=1.2.0'
15
- s.add_dependency 'opencl_ruby_ffi', '~> 1.2', '>=1.2.1'
15
+ s.add_dependency 'opencl_ruby_ffi', '~> 1.3', '>=1.3.2'
16
16
  s.add_dependency 'systemu', '~> 2', '>=2.2.0'
17
17
  s.add_dependency 'os', '~> 0.9', '>=0.9.6'
18
18
  s.add_dependency 'PAPI', '~> 0', '>=0.101'
data/lib/BOAST.rb CHANGED
@@ -29,6 +29,7 @@ require 'BOAST/Language/While.rb'
29
29
  require 'BOAST/Language/Pragma.rb'
30
30
  require 'BOAST/Runtime/Config.rb'
31
31
  require 'BOAST/Runtime/Probe.rb'
32
+ require 'BOAST/Runtime/AffinityProbe.rb'
32
33
  require 'BOAST/Runtime/Compilers.rb'
33
34
  require 'BOAST/Runtime/OpenCLRuntime.rb'
34
35
  require 'BOAST/Runtime/CompiledRuntime.rb'
@@ -1,46 +1,57 @@
1
1
  module BOAST
2
2
 
3
3
  extend TypeTransition
4
+
5
+ EXTENDED.push TypeTransition
4
6
 
5
7
  module PrivateStateAccessor
6
8
 
7
9
  private
8
- def push_env(*args)
9
- BOAST::push_env(*args)
10
+ # (see BOAST#push_env)
11
+ def push_env(vars, &block)
12
+ BOAST::push_env(vars, &block)
10
13
  end
11
14
 
12
- def pop_env(*args)
13
- BOAST::pop_env(*args)
15
+ # (see BOAST#pop_env)
16
+ def pop_env(*vars)
17
+ BOAST::pop_env(*vars)
14
18
  end
15
19
 
16
- def increment_indent_level(*args)
17
- BOAST::increment_indent_level(*args)
20
+ # (see BOAST#increment_indent_level)
21
+ def increment_indent_level(increment = get_indent_increment)
22
+ BOAST::increment_indent_level(increment)
18
23
  end
19
24
 
20
- def decrement_indent_level(*args)
21
- BOAST::decrement_indent_level(*args)
25
+ # (see BOAST#decrement_indent_level)
26
+ def decrement_indent_level(increment = get_indent_increment)
27
+ BOAST::decrement_indent_level(increment)
22
28
  end
23
29
 
30
+ # (see BOAST#indent)
24
31
  def indent
25
32
  BOAST::indent
26
33
  end
27
34
 
35
+ # (see BOAST#get_architecture_name)
28
36
  def get_architecture_name
29
37
  BOAST::get_architecture_name
30
38
  end
31
39
 
40
+ # (see BOAST#get_lang_name)
32
41
  def get_lang_name
33
42
  BOAST::get_lang_name
34
43
  end
35
44
 
36
- def annotate_number(*args)
37
- BOAST::annotate_number(*args)
45
+ # (see BOAST#annotate_number)
46
+ def annotate_number(name)
47
+ BOAST::annotate_number(name)
38
48
  end
39
49
 
40
50
  end
41
51
 
42
52
  module_function
43
53
 
54
+ # Returns the symbol corresponding to the active architecture
44
55
  def get_architecture_name
45
56
  case architecture
46
57
  when X86
@@ -54,6 +65,7 @@ module BOAST
54
65
  end
55
66
  end
56
67
 
68
+ # Returns the symbol corresponding to the active language
57
69
  def get_lang_name
58
70
  case lang
59
71
  when C
@@ -76,7 +88,12 @@ module BOAST
76
88
 
77
89
  @@env = Hash::new{|h, k| h[k] = []}
78
90
 
79
- def push_env(vars = {}, &block)
91
+ # Updates states and stores their value in a stack for later retrieval
92
+ # @overload push_env( vars )
93
+ # @overload push_env( vars, &block )
94
+ # @param [Hash] vars contains state symbols and values pairs
95
+ # @yield states will be popped after the given block is called
96
+ def push_env(vars, &block)
80
97
  keys = []
81
98
  vars.each { |key, value|
82
99
  var = nil
@@ -99,6 +116,8 @@ module BOAST
99
116
  end
100
117
  end
101
118
 
119
+ # Pops the specified states values
120
+ # @param vars a list of state symbols
102
121
  def pop_env(*vars)
103
122
  vars.each { |key|
104
123
  raise "Unknown module variable #{key}!" unless @@env.has_key?(key)
@@ -108,24 +127,35 @@ module BOAST
108
127
  }
109
128
  end
110
129
 
130
+ # Increments the indent level
131
+ # @param [Integer] increment number of space to add
111
132
  def increment_indent_level(increment = get_indent_increment)
112
133
  set_indent_level( get_indent_level + increment )
113
134
  end
114
-
135
+
136
+ # Decrements the indent level
137
+ # @param [Integer] increment number of space to remove
115
138
  def decrement_indent_level(increment = get_indent_increment)
116
139
  set_indent_level( get_indent_level - increment )
117
140
  end
118
141
 
142
+ # Returns a string with as many space as the indent level.
143
+ def indent
144
+ return " "*get_indent_level
145
+ end
146
+
147
+ # Returns an annotation number for the given name. The number
148
+ # is incremented for a given name is incremented each time this name is called
119
149
  def annotate_number(name)
120
150
  num = @@annotate_numbers[name]
121
151
  @@annotate_numbers[name] = num + 1
122
152
  return num
123
153
  end
124
154
 
125
- def indent
126
- return " "*get_indent_level
127
- end
128
-
155
+ # Annotates an Object by inlining a YAML structure in a comment.
156
+ # If object's class is part of the annotate list an indepth version of the annotation
157
+ # will be generated.
158
+ # @param [Object] a object to annotate
129
159
  def pr_annotate(a)
130
160
  name = a.class.name.gsub("BOAST::","")
131
161
  if annotate_list.include?(name) then
@@ -138,33 +168,38 @@ module BOAST
138
168
  end
139
169
  end
140
170
 
171
+
172
+ # One of BOAST keywords: prints BOAST objects.
173
+ # Annotates the given object.
174
+ # Calls the given object pr method with the optional arguments.
175
+ # @param a a BOAST Expression, ControlStructure or Procedure
176
+ # @param args an optional list of parameters
141
177
  def pr(a, *args)
142
178
  pr_annotate(a) if annotate?
143
179
  a.pr(*args)
144
180
  end
145
181
 
146
- def decl(*a)
147
- a.each { |d|
182
+ # One of BOAST keywords: declares BOAST Variables and Procedures.
183
+ # Calls the decl method of each given objects.
184
+ # @param list a list of parameters do declare
185
+ def decl(*list)
186
+ list.each { |d|
148
187
  d.decl
149
188
  }
150
189
  end
151
190
 
152
- def close(a)
153
- a.close
154
- end
155
-
191
+ # One of BOAST keywords: opens a BOAST ControlStructure or Procedure.
192
+ # Calls the open method of the given object.
193
+ # @param a the BOAST object to open
156
194
  def opn(a)
157
195
  a.open
158
196
  end
159
197
 
160
- alias :Var :Variable
161
- alias :Dim :Dimension
162
- alias :Call :FuncCall
163
-
164
- class << self
165
- alias :Var :Variable
166
- alias :Dim :Dimension
167
- alias :Call :FuncCall
198
+ # One of BOAST keywords: closes a BOAST ControlStructure or Procedure.
199
+ # Calls the close method of the given object.
200
+ # @param a the BOAST object to close
201
+ def close(a)
202
+ a.close
168
203
  end
169
204
 
170
205
  Var = Variable
@@ -184,6 +219,8 @@ end
184
219
  ConvolutionGenerator = BOAST
185
220
 
186
221
  class Integer
222
+ # Creates a constant BOAST Int Variable with a name corresponding to its value.
223
+ # The variable is signed only when negative.
187
224
  def to_var
188
225
  if self < 0 then
189
226
  v = BOAST::Variable::new("#{self}", BOAST::Int, :signed => true, :constant => self )
@@ -196,6 +233,7 @@ class Integer
196
233
  end
197
234
 
198
235
  class Float
236
+ # Creates a constant BOAST Real Variable with a name corresponding to its value.
199
237
  def to_var
200
238
  v = BOAST::Variable::new("#{self}", BOAST::Real, :constant => self )
201
239
  v.force_replace_constant = true
@@ -1,5 +1,6 @@
1
1
  module BOAST
2
2
 
3
+ # @private
3
4
  module Annotation
4
5
  include PrivateStateAccessor
5
6
 
@@ -234,4 +234,5 @@ X86architectures ={"pentium2"=>["MMX"],
234
234
  "SSE2",
235
235
  "SSE",
236
236
  "MMX"]}
237
+ private_constant :X86architectures
237
238
  end
@@ -1,19 +1,25 @@
1
1
  module BOAST
2
2
 
3
- module_function
3
+ module TopLevelExpressions
4
4
 
5
- def Return(value)
6
- return Expression::new("return",nil, value)
7
- end
5
+ def Return(value)
6
+ return Expression::new("return",nil, value)
7
+ end
8
8
 
9
- def And(a, b)
10
- return Expression::new(And, a, b)
11
- end
9
+ def And(a, b)
10
+ return Expression::new(And, a, b)
11
+ end
12
+
13
+ def Or(a, b)
14
+ return Expression::new(Or, a, b)
15
+ end
12
16
 
13
- def Or(a, b)
14
- return Expression::new(Or, a, b)
15
17
  end
16
18
 
19
+ extend TopLevelExpressions
20
+
21
+ EXTENDED.push TopLevelExpressions
22
+
17
23
  module Arithmetic
18
24
 
19
25
  def **(x)
@@ -1,112 +1,119 @@
1
1
  module BOAST
2
2
 
3
- OCL_CUDA_DIM_ASSOC = { 0 => "x", 1 => "y", 2 => "z" }
3
+ module OpenCLHelper
4
4
 
5
- CUDA_THREADIDX = CStruct("threadIdx",:type_name => "cuda_trheadIdx", :members => [Int("x", :signed => false),Int("y", :signed => false),Int("z", :signed => false)])
6
- CUDA_BLOCKIDX = CStruct("blockIdx",:type_name => "cuda_blockIdx", :members => [Int("x", :signed => false),Int("y", :signed => false),Int("z", :signed => false)])
7
- CUDA_BLOCKDIM = CStruct("blockDim",:type_name => "cuda_blockDim", :members => [Int("x", :signed => false),Int("y", :signed => false),Int("z", :signed => false)])
8
- CUDA_GRIDDIM = CStruct("gridDim",:type_name => "cuda_gridDim", :members => [Int("x", :signed => false),Int("y", :signed => false),Int("z", :signed => false)])
5
+ OCL_CUDA_DIM_ASSOC = { 0 => "x", 1 => "y", 2 => "z" }
9
6
 
10
- module_function
7
+ CUDA_THREADIDX = BOAST::CStruct("threadIdx",:type_name => "cuda_trheadIdx", :members => [BOAST::Int("x", :signed => false),BOAST::Int("y", :signed => false),BOAST::Int("z", :signed => false)])
8
+ CUDA_BLOCKIDX = BOAST::CStruct("blockIdx",:type_name => "cuda_blockIdx", :members => [BOAST::Int("x", :signed => false),BOAST::Int("y", :signed => false),BOAST::Int("z", :signed => false)])
9
+ CUDA_BLOCKDIM = BOAST::CStruct("blockDim",:type_name => "cuda_blockDim", :members => [BOAST::Int("x", :signed => false),BOAST::Int("y", :signed => false),BOAST::Int("z", :signed => false)])
10
+ CUDA_GRIDDIM = BOAST::CStruct("gridDim",:type_name => "cuda_gridDim", :members => [BOAST::Int("x", :signed => false),BOAST::Int("y", :signed => false),BOAST::Int("z", :signed => false)])
11
11
 
12
- def barrier(*locality)
13
- if lang == CL then
14
- loc=""
15
- if locality.include?(:local) and locality.include?(:global) then
16
- return FuncCall::new("barrier","CLK_LOCAL_MEM_FENCE | CLK_GLOBAL_MEM_FENCE")
17
- elsif locality.include?(:local) then
18
- return FuncCall::new("barrier","CLK_LOCAL_MEM_FENCE")
19
- elsif locality.include?(:global) then
20
- return FuncCall::new("barrier","CLK_GLOBAL_MEM_FENCE")
12
+ private_constant :OCL_CUDA_DIM_ASSOC, :CUDA_THREADIDX, :CUDA_BLOCKIDX, :CUDA_BLOCKDIM, :CUDA_GRIDDIM
13
+
14
+ def barrier(*locality)
15
+ if lang == CL then
16
+ loc=""
17
+ if locality.include?(:local) and locality.include?(:global) then
18
+ return FuncCall::new("barrier","CLK_LOCAL_MEM_FENCE | CLK_GLOBAL_MEM_FENCE")
19
+ elsif locality.include?(:local) then
20
+ return FuncCall::new("barrier","CLK_LOCAL_MEM_FENCE")
21
+ elsif locality.include?(:global) then
22
+ return FuncCall::new("barrier","CLK_GLOBAL_MEM_FENCE")
23
+ else
24
+ raise "Unsupported locality"
25
+ end
26
+ elsif lang == CUDA then
27
+ return FuncCall::new("__syncthreads")
21
28
  else
22
- raise "Unsupported locality"
29
+ raise "Unsupported language!"
23
30
  end
24
- elsif lang == CUDA then
25
- return FuncCall::new("__syncthreads")
26
- else
27
- raise "Unsupported language!"
28
31
  end
29
- end
30
32
 
31
-
32
- def get_work_dim
33
- if lang == CL then
34
- return FuncCall::new("get_work_dim", :returns => Int("wd", :signed => false))
35
- else
36
- raise "Unsupported language!"
33
+ def get_work_dim
34
+ if lang == CL then
35
+ return FuncCall::new("get_work_dim", :returns => Int("wd", :signed => false))
36
+ else
37
+ raise "Unsupported language!"
38
+ end
37
39
  end
38
- end
39
40
 
40
- def get_global_size(dim)
41
- if lang == CL then
42
- return FuncCall::new("get_global_size", dim, :returns => Sizet)
43
- elsif lang == CUDA then
44
- d = OCL_CUDA_DIM_ASSOC[dim]
45
- raise "Unsupported dimension!" if not d
46
- return eval "CUDA_GRIDDIM.#{d}*CUDA_BLOCKDIM.#{d}"
47
- else
48
- raise "Unsupported language!"
41
+ def get_global_size(dim)
42
+ if lang == CL then
43
+ return FuncCall::new("get_global_size", dim, :returns => Sizet)
44
+ elsif lang == CUDA then
45
+ d = OCL_CUDA_DIM_ASSOC[dim]
46
+ raise "Unsupported dimension!" if not d
47
+ return eval "CUDA_GRIDDIM.#{d}*CUDA_BLOCKDIM.#{d}"
48
+ else
49
+ raise "Unsupported language!"
50
+ end
49
51
  end
50
- end
51
52
 
52
- def get_global_id(dim)
53
- if lang == CL then
54
- return FuncCall::new("get_global_id",dim, :returns => Sizet)
55
- elsif lang == CUDA then
56
- d = OCL_CUDA_DIM_ASSOC[dim]
57
- raise "Unsupported dimension!" if not d
58
- return eval "CUDA_THREADIDX.#{d}+CUDA_BLOCKIDX.#{d}*CUDA_BLOCKDIM.#{d}"
59
- else
60
- raise "Unsupported language!"
53
+ def get_global_id(dim)
54
+ if lang == CL then
55
+ return FuncCall::new("get_global_id",dim, :returns => Sizet)
56
+ elsif lang == CUDA then
57
+ d = OCL_CUDA_DIM_ASSOC[dim]
58
+ raise "Unsupported dimension!" if not d
59
+ return eval "CUDA_THREADIDX.#{d}+CUDA_BLOCKIDX.#{d}*CUDA_BLOCKDIM.#{d}"
60
+ else
61
+ raise "Unsupported language!"
62
+ end
61
63
  end
62
- end
63
64
 
64
- def get_local_size(dim)
65
- if lang == CL then
66
- return FuncCall::new("get_local_size",dim, :returns => Sizet)
67
- elsif lang == CUDA then
68
- d = OCL_CUDA_DIM_ASSOC[dim]
69
- raise "Unsupported dimension!" if not d
70
- return eval "CUDA_BLOCKDIM.#{d}"
71
- else
72
- raise "Unsupported language!"
65
+ def get_local_size(dim)
66
+ if lang == CL then
67
+ return FuncCall::new("get_local_size",dim, :returns => Sizet)
68
+ elsif lang == CUDA then
69
+ d = OCL_CUDA_DIM_ASSOC[dim]
70
+ raise "Unsupported dimension!" if not d
71
+ return eval "CUDA_BLOCKDIM.#{d}"
72
+ else
73
+ raise "Unsupported language!"
74
+ end
73
75
  end
74
- end
75
76
 
76
- def get_local_id(dim)
77
- if lang == CL then
78
- return FuncCall::new("get_local_id",dim, :returns => Sizet)
79
- elsif lang == CUDA then
80
- d = OCL_CUDA_DIM_ASSOC[dim]
81
- raise "Unsupported dimension!" if not d
82
- return eval "CUDA_THREADIDX.#{d}"
83
- else
84
- raise "Unsupported language!"
77
+ def get_local_id(dim)
78
+ if lang == CL then
79
+ return FuncCall::new("get_local_id",dim, :returns => Sizet)
80
+ elsif lang == CUDA then
81
+ d = OCL_CUDA_DIM_ASSOC[dim]
82
+ raise "Unsupported dimension!" if not d
83
+ return eval "CUDA_THREADIDX.#{d}"
84
+ else
85
+ raise "Unsupported language!"
86
+ end
85
87
  end
86
- end
87
88
 
88
- def get_num_groups(dim)
89
- if lang == CL then
90
- return FuncCall::new("get_num_groups",dim, :returns => Sizet)
91
- elsif lang == CUDA then
92
- d = OCL_CUDA_DIM_ASSOC[dim]
93
- raise "Unsupported dimension!" if not d
94
- return eval "CUDA_GRIDDIM.#{d}"
95
- else
96
- raise "Unsupported language!"
89
+ def get_num_groups(dim)
90
+ if lang == CL then
91
+ return FuncCall::new("get_num_groups",dim, :returns => Sizet)
92
+ elsif lang == CUDA then
93
+ d = OCL_CUDA_DIM_ASSOC[dim]
94
+ raise "Unsupported dimension!" if not d
95
+ return eval "CUDA_GRIDDIM.#{d}"
96
+ else
97
+ raise "Unsupported language!"
98
+ end
97
99
  end
98
- end
99
100
 
100
- def get_group_id(dim)
101
- if lang == CL then
102
- return FuncCall::new("get_group_id",dim, :returns => Sizet)
103
- elsif lang == CUDA then
104
- d = OCL_CUDA_DIM_ASSOC[dim]
105
- raise "Unsupported dimension!" if not d
106
- return eval "CUDA_BLOCKIDX.#{d}"
107
- else
108
- raise "Unsupported language!"
101
+ def get_group_id(dim)
102
+ if lang == CL then
103
+ return FuncCall::new("get_group_id",dim, :returns => Sizet)
104
+ elsif lang == CUDA then
105
+ d = OCL_CUDA_DIM_ASSOC[dim]
106
+ raise "Unsupported dimension!" if not d
107
+ return eval "CUDA_BLOCKIDX.#{d}"
108
+ else
109
+ raise "Unsupported language!"
110
+ end
109
111
  end
112
+
110
113
  end
111
114
 
115
+ extend OpenCLHelper
116
+
117
+ EXTENDED.push OpenCLHelper
118
+
112
119
  end