BOAST 0.9995 → 0.9996

Sign up to get free protection for your applications and to get access to all the features.
data/BOAST.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'BOAST'
3
- s.version = "0.9995"
3
+ s.version = "0.9996"
4
4
  s.author = "Brice Videau"
5
5
  s.email = "brice.videau@imag.fr"
6
6
  s.homepage = "https://forge.imag.fr/projects/boast/"
@@ -30,6 +30,8 @@ Gem::Specification.new do |s|
30
30
  lib/BOAST/Inspectable.rb
31
31
  lib/BOAST/Functors.rb
32
32
  lib/BOAST/ControlStructure.rb
33
+ lib/BOAST/Print.rb
34
+ lib/BOAST/State.rb
33
35
  )
34
36
  s.has_rdoc = true
35
37
  s.license = 'BSD'
@@ -9,20 +9,67 @@ module BOAST
9
9
  X86 = 1
10
10
  ARM = 2
11
11
 
12
- def self.get_default_lang
13
- lang = BOAST::const_get(ENV["BOAST_LANG"]) if ENV["BOAST_LANG"]
12
+ module PrivateStateAccessor
13
+
14
+ private_state_accessor :output, :lang, :architecture
15
+ private_state_accessor :default_int_size, :default_real_size
16
+ private_state_accessor :array_start
17
+ private_state_accessor :indent_level, :indent_increment
18
+
19
+ private_boolean_state_accessor :replace_constants
20
+ private_boolean_state_accessor :default_int_signed
21
+ private_boolean_state_accessor :chain_code
22
+ private_boolean_state_accessor :debug
23
+
24
+ private
25
+ def push_env(*args)
26
+ BOAST::push_env(*args)
27
+ end
28
+
29
+ def pop_env(*args)
30
+ BOAST::pop_env(*args)
31
+ end
32
+
33
+ def increment_indent_level(*args)
34
+ BOAST::increment_indent_level(*args)
35
+ end
36
+
37
+ def decrement_indent_level(*args)
38
+ BOAST::decrement_indent_level(*args)
39
+ end
40
+
41
+ def indent
42
+ BOAST::indent
43
+ end
44
+
45
+ end
46
+
47
+ state_accessor :output, :lang, :architecture
48
+ state_accessor :default_int_size, :default_real_size
49
+ state_accessor :array_start
50
+ state_accessor :indent_level, :indent_increment
51
+
52
+ boolean_state_accessor :replace_constants
53
+ boolean_state_accessor :default_int_signed
54
+ boolean_state_accessor :chain_code
55
+ boolean_state_accessor :debug
56
+
57
+ module_function
58
+
59
+ def get_default_lang
60
+ lang = const_get(ENV["BOAST_LANG"]) if ENV["BOAST_LANG"]
14
61
  return lang if lang
15
- return BOAST::FORTRAN
62
+ return FORTRAN
16
63
  end
17
64
 
18
- def self.get_default_debug
65
+ def get_default_debug
19
66
  debug = false
20
67
  debug = ENV["DEBUG"] if ENV["DEBUG"]
21
68
  return debug
22
69
  end
23
70
 
24
71
  @@output = STDOUT
25
- @@lang = BOAST::get_default_lang
72
+ @@lang = get_default_lang
26
73
  @@replace_constants = true
27
74
  @@default_int_size = 4
28
75
  @@default_int_signed = true
@@ -32,224 +79,70 @@ module BOAST
32
79
  @@array_start = 1
33
80
  @@chain_code = false
34
81
  @@architecture = X86
35
- @@debug = BOAST::get_default_debug
82
+ @@debug = get_default_debug
36
83
 
37
84
  @@env = Hash::new{|h, k| h[k] = []}
38
85
 
39
- def self.push_env(vars = {})
86
+ def push_env(vars = {})
40
87
  vars.each { |key,value|
41
88
  var = nil
42
89
  begin
43
- var = BOAST::class_variable_get("@@"+key.to_s)
90
+ var = class_variable_get("@@"+key.to_s)
44
91
  rescue
45
92
  raise "Unknown module variable #{key}!"
46
93
  end
47
94
  @@env[key].push(var)
48
- BOAST::class_variable_set("@@"+key.to_s, value)
95
+ class_variable_set("@@"+key.to_s, value)
49
96
  }
50
97
  end
51
98
 
52
- def self.pop_env(*vars)
99
+ def pop_env(*vars)
53
100
  vars.each { |key|
54
101
  raise "Unknown module variable #{key}!" unless @@env.has_key?(key)
55
102
  ret = @@env[key].pop
56
103
  raise "No stored value for #{key}!" if ret.nil?
57
- BOAST::class_variable_set("@@"+key.to_s, ret)
58
- }
59
- end
60
-
61
- def self.print(a)
62
- a.print
63
- end
64
-
65
- def self.decl(*a)
66
- a.each { |d|
67
- d.decl
104
+ class_variable_set("@@"+key.to_s, ret)
68
105
  }
69
106
  end
70
107
 
71
- def self.close(a)
72
- a.close
73
- end
74
-
75
- def self.open(a)
76
- a.open
77
- end
78
-
79
- def self.debug=(debug)
80
- @@debug = debug
81
- end
82
-
83
- def self.debug
84
- return @@debug
85
- end
86
-
87
- def self.architecture=(arch)
88
- @@architecture = arch
89
- end
90
-
91
- def self.set_architecture(arch)
92
- @@architecture = arch
93
- end
94
-
95
- def self.architecture
96
- return @@architecture
97
- end
98
-
99
- def self.get_architecture
100
- return @@architecture
101
- end
102
-
103
- def self.indent_level=(level)
104
- @@indent_level = level
105
- end
106
-
107
- def self.set_indent_level(level)
108
- @@indent_level = level
109
- end
110
-
111
- def self.indent_level
112
- return @@indent_level
113
- end
114
-
115
- def self.get_indent_level
116
- return @@indent_level
117
- end
118
-
119
- def self.indent_increment
120
- return @@indent_increment
121
- end
122
-
123
- def self.get_indent_increment
124
- return @@indent_increment
125
- end
126
-
127
- def self.increment_indent_level(increment = @@indent_increment)
128
- @@indent_level += increment
108
+ def increment_indent_level(increment = get_indent_increment)
109
+ set_indent_level( get_indent_level + increment )
129
110
  end
130
111
 
131
- def self.decrement_indent_level(increment = @@indent_increment)
132
- @@indent_level -= increment
112
+ def decrement_indent_level(increment = get_indent_increment)
113
+ set_indent_level( get_indent_level - increment )
133
114
  end
134
115
 
135
- def self.indent
136
- return " "*BOAST::get_indent_level
137
- end
138
-
139
- def self.set_replace_constants(replace_constants)
140
- @@replace_constants = replace_constants
141
- end
142
-
143
- def self.replace_constants?
144
- return @@replace_constants
145
- end
146
-
147
- def self.get_replace_constants
148
- return @@replace_constants
149
- end
150
-
151
- def self.default_int_signed=(signed)
152
- @@default_int_signed = signed
153
- end
154
-
155
- def self.set_default_int_signed(signed)
156
- @@default_int_signed = signed
157
- end
158
-
159
- def self.default_int_signed?
160
- return @@default_int_signed
161
- end
162
-
163
- def self.get_default_int_signed
164
- return @@default_int_signed
165
- end
166
-
167
- def self.default_int_size=(size)
168
- @@default_int_size = size
169
- end
170
-
171
- def self.set_default_int_size(size)
172
- @@default_int_size = size
173
- end
174
-
175
- def self.default_int_size
176
- return @@default_int_size
177
- end
178
-
179
- def self.get_default_int_size
180
- return @@default_int_size
181
- end
182
-
183
- def self.default_real_size=(size)
184
- @@default_real_size = size
185
- end
186
-
187
- def self.set_default_real_size(size)
188
- @@default_real_size = size
189
- end
190
-
191
- def self.default_real_size
192
- return @@default_real_size
193
- end
194
-
195
- def self.get_default_real_size
196
- return @@default_real_size
197
- end
198
-
199
- def self.lang=(lang)
200
- @@lang = lang
201
- end
202
-
203
- def self.set_lang(lang)
204
- @@lang = lang
116
+ def indent
117
+ return " "*get_indent_level
205
118
  end
206
119
 
207
- def self.lang
208
- return @@lang
120
+ def pr(a)
121
+ a.pr
209
122
  end
210
123
 
211
- def self.get_lang
212
- return @@lang
213
- end
214
-
215
- def self.output(output)
216
- @@output = output
217
- end
218
-
219
- def self.set_output(output)
220
- @@output = output
221
- end
222
-
223
- def self.output
224
- return @@output
225
- end
226
-
227
- def self.get_output
228
- return @@output
229
- end
230
-
231
- def self.set_chain_code(chain_code)
232
- @@chain_code = chain_code
233
- end
234
-
235
- def self.get_chain_code
236
- return @@chain_code
124
+ def decl(*a)
125
+ a.each { |d|
126
+ d.decl
127
+ }
237
128
  end
238
129
 
239
- def self.array_start=(array_start)
240
- @@array_start = array_start
130
+ def close(a)
131
+ a.close
241
132
  end
242
133
 
243
- def self.set_array_start(array_start)
244
- @@array_start = array_start
134
+ def open(a)
135
+ a.open
245
136
  end
246
137
 
247
- def self.array_start
248
- return @@array_start
249
- end
138
+ alias :Var :Variable
139
+ alias :Dim :Dimension
140
+ alias :Call :FuncCall
250
141
 
251
- def self.get_array_start
252
- return @@array_start
142
+ class << self
143
+ alias :Var :Variable
144
+ alias :Dim :Dimension
145
+ alias :Call :FuncCall
253
146
  end
254
147
 
255
148
  Var = Variable
@@ -263,7 +156,7 @@ module BOAST
263
156
  set_transition(Sizet, Sizet, :default, Sizet)
264
157
  set_transition(Sizet, Int, :default, Sizet)
265
158
  set_transition(Int, Sizet, :default, Sizet)
266
-
159
+
267
160
  end
268
161
 
269
162
  ConvolutionGenerator = BOAST
@@ -2,64 +2,64 @@ module BOAST
2
2
  module Arithmetic
3
3
 
4
4
  def ===(x)
5
- return BOAST::Expression::new(BOAST::Affectation,self,x)
5
+ return Expression::new(Affectation,self,x)
6
6
  end
7
7
 
8
8
  def !
9
- return BOAST::Expression::new(BOAST::Not,nil,self)
9
+ return Expression::new(Not,nil,self)
10
10
  end
11
11
 
12
12
  def ==(x)
13
- return BOAST::Expression::new("==",self,x)
13
+ return Expression::new("==",self,x)
14
14
  end
15
15
 
16
16
  def !=(x)
17
- return BOAST::Expression::new(BOAST::Different,self,x)
17
+ return Expression::new(Different,self,x)
18
18
  end
19
19
 
20
20
  def >(x)
21
- return BOAST::Expression::new(">",self,x)
21
+ return Expression::new(">",self,x)
22
22
  end
23
23
 
24
24
  def <(x)
25
- return BOAST::Expression::new("<",self,x)
25
+ return Expression::new("<",self,x)
26
26
  end
27
27
 
28
28
  def >=(x)
29
- return BOAST::Expression::new(">=",self,x)
29
+ return Expression::new(">=",self,x)
30
30
  end
31
31
 
32
32
  def <=(x)
33
- return BOAST::Expression::new("<=",self,x)
33
+ return Expression::new("<=",self,x)
34
34
  end
35
35
 
36
36
  def +(x)
37
- return BOAST::Expression::new(BOAST::Addition,self,x)
37
+ return Expression::new(Addition,self,x)
38
38
  end
39
39
 
40
40
  def -(x)
41
- return BOAST::Expression::new(BOAST::Substraction,self,x)
41
+ return Expression::new(Substraction,self,x)
42
42
  end
43
43
 
44
44
  def *(x)
45
- return BOAST::Expression::new(BOAST::Multiplication,self,x)
45
+ return Expression::new(Multiplication,self,x)
46
46
  end
47
47
 
48
48
  def /(x)
49
- return BOAST::Expression::new(BOAST::Division,self,x)
49
+ return Expression::new(Division,self,x)
50
50
  end
51
51
 
52
52
  def -@
53
- return BOAST::Expression::new(BOAST::Minus,nil,self)
53
+ return Expression::new(Minus,nil,self)
54
54
  end
55
55
 
56
56
  def address
57
- return BOAST::Expression::new("&",nil,self)
57
+ return Expression::new("&",nil,self)
58
58
  end
59
59
 
60
60
  def dereference
61
- return BOAST::Expression::new("*",nil,self)
61
+ return Expression::new("*",nil,self)
62
62
  end
63
-
63
+
64
64
  end
65
65
  end
@@ -1,13 +1,16 @@
1
1
  module BOAST
2
- @@ocl_cuda_dim_assoc = { 0 => "x", 1 => "y", 2 => "z" }
3
2
 
4
- @@cuda_threadIdx = CStruct("threadIdx",:type_name => "cuda_trheadIdx", :members => [Int("x", :signed => false),Int("y", :signed => false),Int("z", :signed => false)])
5
- @@cuda_blockIdx = CStruct("blockIdx",:type_name => "cuda_blockIdx", :members => [Int("x", :signed => false),Int("y", :signed => false),Int("z", :signed => false)])
6
- @@cuda_blockDim = CStruct("blockDim",:type_name => "cuda_blockDim", :members => [Int("x", :signed => false),Int("y", :signed => false),Int("z", :signed => false)])
7
- @@cuda_gridDim = CStruct("gridDim",:type_name => "cuda_gridDim", :members => [Int("x", :signed => false),Int("y", :signed => false),Int("z", :signed => false)])
3
+ OCL_CUDA_DIM_ASSOC = { 0 => "x", 1 => "y", 2 => "z" }
8
4
 
9
- def self.barrier(*locality)
10
- if @@lang == CL then
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)])
9
+
10
+ module_function
11
+
12
+ def barrier(*locality)
13
+ if lang == CL then
11
14
  loc=""
12
15
  if locality.include?(:local) and locality.include?(:global) then
13
16
  return FuncCall::new("barrier","CLK_LOCAL_MEM_FENCE | CLK_GLOBAL_MEM_FENCE")
@@ -18,7 +21,7 @@ module BOAST
18
21
  else
19
22
  raise "Unsupported locality"
20
23
  end
21
- elsif @@lang == CUDA then
24
+ elsif lang == CUDA then
22
25
  return FuncCall::new("__syncthreads")
23
26
  else
24
27
  raise "Unsupported language!"
@@ -26,84 +29,84 @@ module BOAST
26
29
  end
27
30
 
28
31
 
29
- def self.get_work_dim
30
- if @@lang == CL then
32
+ def get_work_dim
33
+ if lang == CL then
31
34
  return FuncCall::new("get_work_dim", :returns => Int("wd", :signed => false))
32
35
  else
33
36
  raise "Unsupported language!"
34
37
  end
35
38
  end
36
39
 
37
- def self.get_global_size(dim)
38
- if @@lang == CL then
40
+ def get_global_size(dim)
41
+ if lang == CL then
39
42
  return FuncCall::new("get_global_size", dim, :returns => Sizet)
40
- elsif @@lang == CUDA then
41
- d = @@ocl_cuda_dim_assoc[dim]
43
+ elsif lang == CUDA then
44
+ d = OCL_CUDA_DIM_ASSOC[dim]
42
45
  raise "Unsupported dimension!" if not d
43
- return eval "@@cuda_gridDim.#{d}*@@cuda_blockDim.#{d}"
46
+ return eval "CUDA_GRIDDIM.#{d}*CUDA_BLOCKDIM.#{d}"
44
47
  else
45
48
  raise "Unsupported language!"
46
49
  end
47
50
  end
48
51
 
49
- def self.get_global_id(dim)
50
- if @@lang == CL then
52
+ def get_global_id(dim)
53
+ if lang == CL then
51
54
  return FuncCall::new("get_global_id",dim, :returns => Sizet)
52
- elsif @@lang == CUDA then
53
- d = @@ocl_cuda_dim_assoc[dim]
55
+ elsif lang == CUDA then
56
+ d = OCL_CUDA_DIM_ASSOC[dim]
54
57
  raise "Unsupported dimension!" if not d
55
- return eval "@@cuda_threadIdx.#{d}+@@cuda_blockIdx.#{d}*@@cuda_blockDim.#{d}"
58
+ return eval "CUDA_THREADIDX.#{d}+CUDA_BLOCKIDX.#{d}*CUDA_BLOCKDIM.#{d}"
56
59
  else
57
60
  raise "Unsupported language!"
58
61
  end
59
62
  end
60
63
 
61
- def self.get_local_size(dim)
62
- if @@lang == CL then
64
+ def get_local_size(dim)
65
+ if lang == CL then
63
66
  return FuncCall::new("get_local_size",dim, :returns => Sizet)
64
- elsif @@lang == CUDA then
65
- d = @@ocl_cuda_dim_assoc[dim]
67
+ elsif lang == CUDA then
68
+ d = OCL_CUDA_DIM_ASSOC[dim]
66
69
  raise "Unsupported dimension!" if not d
67
- return eval "@@cuda_blockDim.#{d}"
70
+ return eval "CUDA_BLOCKDIM.#{d}"
68
71
  else
69
72
  raise "Unsupported language!"
70
73
  end
71
74
  end
72
75
 
73
- def self.get_local_id(dim)
74
- if @@lang == CL then
76
+ def get_local_id(dim)
77
+ if lang == CL then
75
78
  return FuncCall::new("get_local_id",dim, :returns => Sizet)
76
- elsif @@lang == CUDA then
77
- d = @@ocl_cuda_dim_assoc[dim]
79
+ elsif lang == CUDA then
80
+ d = OCL_CUDA_DIM_ASSOC[dim]
78
81
  raise "Unsupported dimension!" if not d
79
- return eval "@@cuda_threadIdx.#{d}"
82
+ return eval "CUDA_THREADIDX.#{d}"
80
83
  else
81
84
  raise "Unsupported language!"
82
85
  end
83
86
  end
84
87
 
85
- def self.get_num_groups(dim)
86
- if @@lang == CL then
88
+ def get_num_groups(dim)
89
+ if lang == CL then
87
90
  return FuncCall::new("get_num_groups",dim, :returns => Sizet)
88
- elsif @@lang == CUDA then
89
- d = @@ocl_cuda_dim_assoc[dim]
91
+ elsif lang == CUDA then
92
+ d = OCL_CUDA_DIM_ASSOC[dim]
90
93
  raise "Unsupported dimension!" if not d
91
- return eval "@@cuda_gridDim.#{d}"
94
+ return eval "CUDA_GRIDDIM.#{d}"
92
95
  else
93
96
  raise "Unsupported language!"
94
97
  end
95
98
  end
96
99
 
97
- def self.get_group_id(dim)
98
- if @@lang == CL then
100
+ def get_group_id(dim)
101
+ if lang == CL then
99
102
  return FuncCall::new("get_group_id",dim, :returns => Sizet)
100
- elsif @@lang == CUDA then
101
- d = @@ocl_cuda_dim_assoc[dim]
103
+ elsif lang == CUDA then
104
+ d = OCL_CUDA_DIM_ASSOC[dim]
102
105
  raise "Unsupported dimension!" if not d
103
- return eval "@@cuda_blockIdx.#{d}"
106
+ return eval "CUDA_BLOCKIDX.#{d}"
104
107
  else
105
108
  raise "Unsupported language!"
106
109
  end
107
110
  end
108
-
111
+
109
112
  end