BOAST 0.9995 → 0.9996
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.
- data/BOAST.gemspec +3 -1
- data/lib/BOAST/Algorithm.rb +82 -189
- data/lib/BOAST/Arithmetic.rb +16 -16
- data/lib/BOAST/BOAST_OpenCL.rb +44 -41
- data/lib/BOAST/CKernel.rb +471 -344
- data/lib/BOAST/Case.rb +21 -23
- data/lib/BOAST/ControlStructure.rb +9 -1
- data/lib/BOAST/DataTypes.rb +70 -51
- data/lib/BOAST/Expression.rb +22 -17
- data/lib/BOAST/For.rb +37 -23
- data/lib/BOAST/FuncCall.rb +11 -10
- data/lib/BOAST/Functors.rb +29 -4
- data/lib/BOAST/If.rb +21 -23
- data/lib/BOAST/Index.rb +14 -13
- data/lib/BOAST/Inspectable.rb +6 -13
- data/lib/BOAST/Operators.rb +82 -61
- data/lib/BOAST/Parens.rb +4 -25
- data/lib/BOAST/Pragma.rb +7 -6
- data/lib/BOAST/Print.rb +7 -0
- data/lib/BOAST/Procedure.rb +46 -34
- data/lib/BOAST/State.rb +79 -0
- data/lib/BOAST/Transitions.rb +13 -5
- data/lib/BOAST/Variable.rb +104 -68
- data/lib/BOAST/While.rb +15 -17
- data/lib/BOAST.rb +2 -0
- metadata +4 -2
data/BOAST.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'BOAST'
|
3
|
-
s.version = "0.
|
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'
|
data/lib/BOAST/Algorithm.rb
CHANGED
@@ -9,20 +9,67 @@ module BOAST
|
|
9
9
|
X86 = 1
|
10
10
|
ARM = 2
|
11
11
|
|
12
|
-
|
13
|
-
|
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
|
62
|
+
return FORTRAN
|
16
63
|
end
|
17
64
|
|
18
|
-
def
|
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 =
|
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 =
|
82
|
+
@@debug = get_default_debug
|
36
83
|
|
37
84
|
@@env = Hash::new{|h, k| h[k] = []}
|
38
85
|
|
39
|
-
def
|
86
|
+
def push_env(vars = {})
|
40
87
|
vars.each { |key,value|
|
41
88
|
var = nil
|
42
89
|
begin
|
43
|
-
var =
|
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
|
-
|
95
|
+
class_variable_set("@@"+key.to_s, value)
|
49
96
|
}
|
50
97
|
end
|
51
98
|
|
52
|
-
def
|
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
|
-
|
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
|
72
|
-
|
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
|
132
|
-
|
112
|
+
def decrement_indent_level(increment = get_indent_increment)
|
113
|
+
set_indent_level( get_indent_level - increment )
|
133
114
|
end
|
134
115
|
|
135
|
-
def
|
136
|
-
return " "*
|
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
|
208
|
-
|
120
|
+
def pr(a)
|
121
|
+
a.pr
|
209
122
|
end
|
210
123
|
|
211
|
-
def
|
212
|
-
|
213
|
-
|
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
|
240
|
-
|
130
|
+
def close(a)
|
131
|
+
a.close
|
241
132
|
end
|
242
133
|
|
243
|
-
def
|
244
|
-
|
134
|
+
def open(a)
|
135
|
+
a.open
|
245
136
|
end
|
246
137
|
|
247
|
-
|
248
|
-
|
249
|
-
|
138
|
+
alias :Var :Variable
|
139
|
+
alias :Dim :Dimension
|
140
|
+
alias :Call :FuncCall
|
250
141
|
|
251
|
-
|
252
|
-
|
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
|
data/lib/BOAST/Arithmetic.rb
CHANGED
@@ -2,64 +2,64 @@ module BOAST
|
|
2
2
|
module Arithmetic
|
3
3
|
|
4
4
|
def ===(x)
|
5
|
-
return
|
5
|
+
return Expression::new(Affectation,self,x)
|
6
6
|
end
|
7
7
|
|
8
8
|
def !
|
9
|
-
return
|
9
|
+
return Expression::new(Not,nil,self)
|
10
10
|
end
|
11
11
|
|
12
12
|
def ==(x)
|
13
|
-
return
|
13
|
+
return Expression::new("==",self,x)
|
14
14
|
end
|
15
15
|
|
16
16
|
def !=(x)
|
17
|
-
return
|
17
|
+
return Expression::new(Different,self,x)
|
18
18
|
end
|
19
19
|
|
20
20
|
def >(x)
|
21
|
-
return
|
21
|
+
return Expression::new(">",self,x)
|
22
22
|
end
|
23
23
|
|
24
24
|
def <(x)
|
25
|
-
return
|
25
|
+
return Expression::new("<",self,x)
|
26
26
|
end
|
27
27
|
|
28
28
|
def >=(x)
|
29
|
-
return
|
29
|
+
return Expression::new(">=",self,x)
|
30
30
|
end
|
31
31
|
|
32
32
|
def <=(x)
|
33
|
-
return
|
33
|
+
return Expression::new("<=",self,x)
|
34
34
|
end
|
35
35
|
|
36
36
|
def +(x)
|
37
|
-
return
|
37
|
+
return Expression::new(Addition,self,x)
|
38
38
|
end
|
39
39
|
|
40
40
|
def -(x)
|
41
|
-
return
|
41
|
+
return Expression::new(Substraction,self,x)
|
42
42
|
end
|
43
43
|
|
44
44
|
def *(x)
|
45
|
-
return
|
45
|
+
return Expression::new(Multiplication,self,x)
|
46
46
|
end
|
47
47
|
|
48
48
|
def /(x)
|
49
|
-
return
|
49
|
+
return Expression::new(Division,self,x)
|
50
50
|
end
|
51
51
|
|
52
52
|
def -@
|
53
|
-
return
|
53
|
+
return Expression::new(Minus,nil,self)
|
54
54
|
end
|
55
55
|
|
56
56
|
def address
|
57
|
-
return
|
57
|
+
return Expression::new("&",nil,self)
|
58
58
|
end
|
59
59
|
|
60
60
|
def dereference
|
61
|
-
return
|
61
|
+
return Expression::new("*",nil,self)
|
62
62
|
end
|
63
|
-
|
63
|
+
|
64
64
|
end
|
65
65
|
end
|
data/lib/BOAST/BOAST_OpenCL.rb
CHANGED
@@ -1,13 +1,16 @@
|
|
1
1
|
module BOAST
|
2
|
-
@@ocl_cuda_dim_assoc = { 0 => "x", 1 => "y", 2 => "z" }
|
3
2
|
|
4
|
-
|
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
|
-
|
10
|
-
|
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
|
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
|
30
|
-
if
|
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
|
38
|
-
if
|
40
|
+
def get_global_size(dim)
|
41
|
+
if lang == CL then
|
39
42
|
return FuncCall::new("get_global_size", dim, :returns => Sizet)
|
40
|
-
elsif
|
41
|
-
d =
|
43
|
+
elsif lang == CUDA then
|
44
|
+
d = OCL_CUDA_DIM_ASSOC[dim]
|
42
45
|
raise "Unsupported dimension!" if not d
|
43
|
-
return eval "
|
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
|
50
|
-
if
|
52
|
+
def get_global_id(dim)
|
53
|
+
if lang == CL then
|
51
54
|
return FuncCall::new("get_global_id",dim, :returns => Sizet)
|
52
|
-
elsif
|
53
|
-
d =
|
55
|
+
elsif lang == CUDA then
|
56
|
+
d = OCL_CUDA_DIM_ASSOC[dim]
|
54
57
|
raise "Unsupported dimension!" if not d
|
55
|
-
return eval "
|
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
|
62
|
-
if
|
64
|
+
def get_local_size(dim)
|
65
|
+
if lang == CL then
|
63
66
|
return FuncCall::new("get_local_size",dim, :returns => Sizet)
|
64
|
-
elsif
|
65
|
-
d =
|
67
|
+
elsif lang == CUDA then
|
68
|
+
d = OCL_CUDA_DIM_ASSOC[dim]
|
66
69
|
raise "Unsupported dimension!" if not d
|
67
|
-
return eval "
|
70
|
+
return eval "CUDA_BLOCKDIM.#{d}"
|
68
71
|
else
|
69
72
|
raise "Unsupported language!"
|
70
73
|
end
|
71
74
|
end
|
72
75
|
|
73
|
-
def
|
74
|
-
if
|
76
|
+
def get_local_id(dim)
|
77
|
+
if lang == CL then
|
75
78
|
return FuncCall::new("get_local_id",dim, :returns => Sizet)
|
76
|
-
elsif
|
77
|
-
d =
|
79
|
+
elsif lang == CUDA then
|
80
|
+
d = OCL_CUDA_DIM_ASSOC[dim]
|
78
81
|
raise "Unsupported dimension!" if not d
|
79
|
-
return eval "
|
82
|
+
return eval "CUDA_THREADIDX.#{d}"
|
80
83
|
else
|
81
84
|
raise "Unsupported language!"
|
82
85
|
end
|
83
86
|
end
|
84
87
|
|
85
|
-
def
|
86
|
-
if
|
88
|
+
def get_num_groups(dim)
|
89
|
+
if lang == CL then
|
87
90
|
return FuncCall::new("get_num_groups",dim, :returns => Sizet)
|
88
|
-
elsif
|
89
|
-
d =
|
91
|
+
elsif lang == CUDA then
|
92
|
+
d = OCL_CUDA_DIM_ASSOC[dim]
|
90
93
|
raise "Unsupported dimension!" if not d
|
91
|
-
return eval "
|
94
|
+
return eval "CUDA_GRIDDIM.#{d}"
|
92
95
|
else
|
93
96
|
raise "Unsupported language!"
|
94
97
|
end
|
95
98
|
end
|
96
99
|
|
97
|
-
def
|
98
|
-
if
|
100
|
+
def get_group_id(dim)
|
101
|
+
if lang == CL then
|
99
102
|
return FuncCall::new("get_group_id",dim, :returns => Sizet)
|
100
|
-
elsif
|
101
|
-
d =
|
103
|
+
elsif lang == CUDA then
|
104
|
+
d = OCL_CUDA_DIM_ASSOC[dim]
|
102
105
|
raise "Unsupported dimension!" if not d
|
103
|
-
return eval "
|
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
|