BOAST 2.0.2 → 2.1.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.
- checksums.yaml +4 -4
- data/BOAST.gemspec +4 -3
- data/lib/BOAST.rb +1 -0
- data/lib/BOAST/Language/Arithmetic.rb +5 -1
- data/lib/BOAST/Language/BOAST_OpenCL.rb +6 -6
- data/lib/BOAST/Language/Case.rb +11 -11
- data/lib/BOAST/Language/Comment.rb +2 -2
- data/lib/BOAST/Language/Config.rb +5 -5
- data/lib/BOAST/Language/DataTypes.rb +31 -29
- data/lib/BOAST/Language/Expression.rb +16 -16
- data/lib/BOAST/Language/For.rb +6 -6
- data/lib/BOAST/Language/FuncCall.rb +7 -7
- data/lib/BOAST/Language/HighLevelOperators.rb +6 -6
- data/lib/BOAST/Language/If.rb +7 -7
- data/lib/BOAST/Language/Index.rb +31 -31
- data/lib/BOAST/Language/Intrinsics.rb +27 -27
- data/lib/BOAST/Language/OpenMP.rb +19 -19
- data/lib/BOAST/Language/Operators.rb +62 -50
- data/lib/BOAST/Language/Pragma.rb +4 -4
- data/lib/BOAST/Language/Procedure.rb +47 -47
- data/lib/BOAST/Language/Slice.rb +14 -14
- data/lib/BOAST/Language/State.rb +1 -1
- data/lib/BOAST/Language/Transitions.rb +1 -1
- data/lib/BOAST/Language/Variable.rb +83 -90
- data/lib/BOAST/Language/While.rb +4 -4
- data/lib/BOAST/Optimization/Optimization.rb +61 -37
- data/lib/BOAST/Runtime/AffinityProbe.rb +99 -15
- data/lib/BOAST/Runtime/CRuntime.rb +18 -6
- data/lib/BOAST/Runtime/CUDARuntime.rb +11 -7
- data/lib/BOAST/Runtime/CoExecute.rb +77 -0
- data/lib/BOAST/Runtime/CompiledRuntime.rb +274 -110
- data/lib/BOAST/Runtime/Compilers.rb +15 -15
- data/lib/BOAST/Runtime/Config.rb +3 -0
- data/lib/BOAST/Runtime/EnergyProbe.rb +86 -71
- data/lib/BOAST/Runtime/FFIRuntime.rb +1 -1
- data/lib/BOAST/Runtime/FORTRANRuntime.rb +15 -5
- data/lib/BOAST/Runtime/MPPARuntime.rb +30 -19
- data/lib/BOAST/Runtime/OpenCLRuntime.rb +2 -2
- data/lib/BOAST/Runtime/Probe.rb +122 -41
- metadata +29 -8
@@ -47,23 +47,23 @@ module BOAST
|
|
47
47
|
|
48
48
|
def to_s_fortran
|
49
49
|
s = ""
|
50
|
-
s
|
51
|
-
s
|
50
|
+
s << @prefix if @prefix
|
51
|
+
s << "#{func_name}(#{@args.collect(&:to_s).join(", ")})"
|
52
52
|
end
|
53
53
|
|
54
54
|
def to_s_c
|
55
55
|
s = ""
|
56
|
-
s
|
57
|
-
s
|
56
|
+
s << @prefix if @prefix
|
57
|
+
s << "#{func_name}(#{@args.collect(&:to_s).join(", ")})"
|
58
58
|
end
|
59
59
|
|
60
60
|
private :to_s_fortran, :to_s_c
|
61
61
|
|
62
62
|
def pr
|
63
63
|
s=""
|
64
|
-
s
|
65
|
-
s
|
66
|
-
s
|
64
|
+
s << indent
|
65
|
+
s << to_s
|
66
|
+
s << ";" if [C, CL, CUDA].include?( lang )
|
67
67
|
output.puts s
|
68
68
|
return self
|
69
69
|
end
|
@@ -68,9 +68,9 @@ module BOAST
|
|
68
68
|
|
69
69
|
def pr
|
70
70
|
s=""
|
71
|
-
s
|
72
|
-
s
|
73
|
-
s
|
71
|
+
s << indent
|
72
|
+
s << to_s
|
73
|
+
s << ";" if [C, CL, CUDA].include?( lang )
|
74
74
|
output.puts s
|
75
75
|
return self
|
76
76
|
end
|
@@ -126,9 +126,9 @@ module BOAST
|
|
126
126
|
|
127
127
|
def pr
|
128
128
|
s=""
|
129
|
-
s
|
130
|
-
s
|
131
|
-
s
|
129
|
+
s << indent
|
130
|
+
s << to_s
|
131
|
+
s << ";" if [C, CL, CUDA].include?( lang )
|
132
132
|
output.puts s
|
133
133
|
return self
|
134
134
|
end
|
data/lib/BOAST/Language/If.rb
CHANGED
@@ -61,12 +61,12 @@ module BOAST
|
|
61
61
|
def to_s(condition_number = 0)
|
62
62
|
s = ""
|
63
63
|
if condition_number == 0 then
|
64
|
-
s
|
64
|
+
s << if_string(@conditions.first)
|
65
65
|
else
|
66
66
|
if @conditions[condition_number] then
|
67
|
-
s
|
67
|
+
s << elsif_string(@conditions[condition_number])
|
68
68
|
else
|
69
|
-
s
|
69
|
+
s << else_string
|
70
70
|
end
|
71
71
|
end
|
72
72
|
return s
|
@@ -78,8 +78,8 @@ module BOAST
|
|
78
78
|
def open(condition_number = 0)
|
79
79
|
decrement_indent_level if condition_number > 0
|
80
80
|
s = ""
|
81
|
-
s
|
82
|
-
s
|
81
|
+
s << indent
|
82
|
+
s << to_s(condition_number)
|
83
83
|
output.puts s
|
84
84
|
increment_indent_level
|
85
85
|
return self
|
@@ -108,8 +108,8 @@ module BOAST
|
|
108
108
|
def close
|
109
109
|
decrement_indent_level
|
110
110
|
s = ""
|
111
|
-
s
|
112
|
-
s
|
111
|
+
s << indent
|
112
|
+
s << end_string
|
113
113
|
output.puts s
|
114
114
|
return self
|
115
115
|
end
|
data/lib/BOAST/Language/Index.rb
CHANGED
@@ -8,7 +8,7 @@ module BOAST
|
|
8
8
|
|
9
9
|
def method_missing(m, *a, &b)
|
10
10
|
var = to_var
|
11
|
-
if var.type.
|
11
|
+
if var.type.kind_of?(CStruct) and var.type.members[m.to_s] then
|
12
12
|
return struct_reference(type.members[m.to_s])
|
13
13
|
elsif var.vector? and m.to_s[0] == 's' and lang != CUDA then
|
14
14
|
required_set = m.to_s[1..-1].chars.to_a
|
@@ -32,7 +32,7 @@ module BOAST
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def align?
|
35
|
-
return
|
35
|
+
return @alignment
|
36
36
|
end
|
37
37
|
|
38
38
|
def set_align(align)
|
@@ -68,7 +68,7 @@ module BOAST
|
|
68
68
|
(0...dims.length).each { |indx|
|
69
69
|
dim = dims[indx]
|
70
70
|
s = "#{indxs[indx]}"
|
71
|
-
s
|
71
|
+
s << " - (#{dim.start})" unless 0.equal?(dim.start)
|
72
72
|
ind = Empty.empty_binding.eval(s)
|
73
73
|
ind = ind.to_i
|
74
74
|
const = const[ind]
|
@@ -83,9 +83,9 @@ module BOAST
|
|
83
83
|
|
84
84
|
def pr
|
85
85
|
s=""
|
86
|
-
s
|
87
|
-
s
|
88
|
-
s
|
86
|
+
s << indent
|
87
|
+
s << to_s
|
88
|
+
s << ";" if [C, CL, CUDA].include?( lang )
|
89
89
|
output.puts s
|
90
90
|
return self
|
91
91
|
end
|
@@ -102,13 +102,13 @@ module BOAST
|
|
102
102
|
end
|
103
103
|
}
|
104
104
|
s = ""
|
105
|
-
s
|
105
|
+
s << "#{@source}(#{@source.vector? ? (@vector_index ? "#{@vector_index+1}, " : ":, ") : "" }#{indexes_dup.join(", ")})"
|
106
106
|
return s
|
107
107
|
end
|
108
108
|
|
109
109
|
def to_s_texture
|
110
|
-
raise LanguageError, "Unsupported language #{lang} for texture!"
|
111
|
-
raise "Write is unsupported for textures!"
|
110
|
+
raise LanguageError, "Unsupported language #{lang} for texture!" unless [CL, CUDA].include?( lang )
|
111
|
+
raise "Write is unsupported for textures!" unless ( @source.constant or @source.direction == :in )
|
112
112
|
dim_number = 1
|
113
113
|
if @source.dimension then
|
114
114
|
dim_number == @source.dimension.size
|
@@ -116,38 +116,38 @@ module BOAST
|
|
116
116
|
raise "Unsupported number of dimension: #{dim_number}!" if dim_number > 3
|
117
117
|
s = ""
|
118
118
|
if lang == CL then
|
119
|
-
s
|
120
|
-
s
|
119
|
+
s << "as_#{@source.type.decl}("
|
120
|
+
s << "read_imageui(#{@source}, #{@source.sampler}, "
|
121
121
|
if dim_number == 1 then
|
122
|
-
s
|
122
|
+
s << "int2(#{@indexes[0]},0)"
|
123
123
|
else
|
124
124
|
if dim_number == 2 then
|
125
|
-
s
|
125
|
+
s << "int2("
|
126
126
|
else
|
127
|
-
s
|
127
|
+
s << "int3("
|
128
128
|
end
|
129
|
-
s
|
129
|
+
s << "#{@indexes.join(", ")})"
|
130
130
|
end
|
131
|
-
s
|
131
|
+
s << ")"
|
132
132
|
if @source.type.size == 4 then
|
133
|
-
s
|
133
|
+
s << ".x"
|
134
134
|
elsif @source.type.size == 8 then
|
135
|
-
s
|
135
|
+
s << ".xy"
|
136
136
|
end
|
137
|
-
s
|
137
|
+
s << ")"
|
138
138
|
else
|
139
|
-
s
|
139
|
+
s << "tex#{dim_number}Dfetch(#{@source},"
|
140
140
|
if dim_number == 1 then
|
141
|
-
s
|
141
|
+
s << "#{@indexes[0]}"
|
142
142
|
else
|
143
143
|
if dim_number == 2 then
|
144
|
-
s
|
144
|
+
s << "int2("
|
145
145
|
else
|
146
|
-
s
|
146
|
+
s << "int3("
|
147
147
|
end
|
148
|
-
s
|
148
|
+
s << "#{@indexes.join(", ")})"
|
149
149
|
end
|
150
|
-
s
|
150
|
+
s << ")"
|
151
151
|
end
|
152
152
|
return s
|
153
153
|
end
|
@@ -158,7 +158,7 @@ module BOAST
|
|
158
158
|
t = (0...dims.length).collect { |indx|
|
159
159
|
s = "#{indxs[indx]}"
|
160
160
|
dim = dims[indx]
|
161
|
-
s
|
161
|
+
s << " - (#{dim.start})" unless 0.equal?(dim.start)
|
162
162
|
s
|
163
163
|
}
|
164
164
|
return t.join("][")
|
@@ -171,15 +171,15 @@ module BOAST
|
|
171
171
|
(0...dims.length).each { |indx|
|
172
172
|
s = ""
|
173
173
|
dim = dims[indx]
|
174
|
-
s
|
175
|
-
s
|
174
|
+
s << "#{indxs[indx]}"
|
175
|
+
s << " - (#{dim.start})" unless 0.equal?(dim.start)
|
176
176
|
if ss then
|
177
177
|
if dim.size then
|
178
|
-
s
|
178
|
+
s << " + (#{dim.size}) * "
|
179
179
|
else
|
180
180
|
raise "Unkwown dimension size!"
|
181
181
|
end
|
182
|
-
s
|
182
|
+
s << "(#{ss})"
|
183
183
|
end
|
184
184
|
ss = s
|
185
185
|
}
|
@@ -195,7 +195,7 @@ module BOAST
|
|
195
195
|
end
|
196
196
|
s = "#{@source}[" + sub + "]"
|
197
197
|
if @vector_index then
|
198
|
-
s
|
198
|
+
s << "[#{@vector_index}]"
|
199
199
|
end
|
200
200
|
return s
|
201
201
|
end
|
@@ -79,14 +79,14 @@ module BOAST
|
|
79
79
|
end
|
80
80
|
}
|
81
81
|
# supported = (INSTRUCTIONS[instruction.to_s] & MODELS[get_model.to_s]).size > 0
|
82
|
-
|
82
|
+
unless supported then
|
83
83
|
required = ""
|
84
84
|
INSTRUCTIONS[get_architecture][instruction.to_s].each { |cpuid|
|
85
|
-
required
|
85
|
+
required << " or " if required != ""
|
86
86
|
if cpuid.kind_of?( Array ) then
|
87
|
-
required
|
87
|
+
required << "( #{cpuid.join(" and ")} )"
|
88
88
|
else
|
89
|
-
required
|
89
|
+
required << "#{cpuid}"
|
90
90
|
end
|
91
91
|
}
|
92
92
|
raise IntrinsicsError, "Unsupported operation #{intr_symbol} for #{type}#{type2 ? " and #{type2}" : ""} on #{get_model}! (requires #{required})"
|
@@ -116,10 +116,10 @@ module BOAST
|
|
116
116
|
case data_type
|
117
117
|
when Int
|
118
118
|
raise IntrinsicsError, "Unsupported data size for int vector on X86: #{data_type.size*8}!" unless [1,2,4,8].include?( data_type.size )
|
119
|
-
return s
|
119
|
+
return s << "#{data_type.total_size*8>64 ? "i" : ""}"
|
120
120
|
when Real
|
121
121
|
return s if data_type.size == 4
|
122
|
-
return s
|
122
|
+
return s << "d" if data_type.size == 8
|
123
123
|
raise IntrinsicsError, "Unsupported data size for real vector on X86: #{data_type.size*8}!"
|
124
124
|
else
|
125
125
|
raise IntrinsicsError, "Unsupported data type #{data_type} for vector on X86!"
|
@@ -161,15 +161,15 @@ module BOAST
|
|
161
161
|
s = ""
|
162
162
|
case type
|
163
163
|
when Int
|
164
|
-
s
|
165
|
-
s
|
164
|
+
s << "u" unless type.signed?
|
165
|
+
s << "int"
|
166
166
|
when Real
|
167
|
-
s
|
167
|
+
s << "float"
|
168
168
|
else
|
169
169
|
raise InternalIntrinsicsError, "Undefined vector type!"
|
170
170
|
end
|
171
|
-
s
|
172
|
-
s
|
171
|
+
s << "#{type.size*8}"
|
172
|
+
s << "x#{type.vector_length}_t"
|
173
173
|
return s.to_sym
|
174
174
|
end
|
175
175
|
|
@@ -181,19 +181,19 @@ module BOAST
|
|
181
181
|
when :int
|
182
182
|
case sign
|
183
183
|
when :signed
|
184
|
-
s
|
184
|
+
s << "int"
|
185
185
|
when :unsigned
|
186
|
-
s
|
186
|
+
s << "uint"
|
187
187
|
else
|
188
188
|
raise InternalIntrinsicsError, "Invalid sign!"
|
189
189
|
end
|
190
190
|
when :float
|
191
|
-
s
|
191
|
+
s << "float"
|
192
192
|
else
|
193
193
|
raise InternalIntrinsicsError, "Invalid type!"
|
194
194
|
end
|
195
|
-
s
|
196
|
-
s
|
195
|
+
s << "#{size}"
|
196
|
+
s << "x#{vector_size/size}_t"
|
197
197
|
return s.to_sym
|
198
198
|
end
|
199
199
|
|
@@ -205,18 +205,18 @@ module BOAST
|
|
205
205
|
when :int
|
206
206
|
case sign
|
207
207
|
when :signed
|
208
|
-
s
|
208
|
+
s << "s"
|
209
209
|
when :unsigned
|
210
|
-
s
|
210
|
+
s << "u"
|
211
211
|
else
|
212
212
|
raise InternalIntrinsicsError, "Invalid sign!"
|
213
213
|
end
|
214
214
|
when :float
|
215
|
-
s
|
215
|
+
s << "f"
|
216
216
|
else
|
217
217
|
raise InternalIntrinsicsError, "Invalid type!"
|
218
218
|
end
|
219
|
-
s
|
219
|
+
s << "#{size}"
|
220
220
|
return s
|
221
221
|
end
|
222
222
|
|
@@ -227,23 +227,23 @@ module BOAST
|
|
227
227
|
case type
|
228
228
|
when :int
|
229
229
|
e = ( vector_size > 64 ? "e" : "" )
|
230
|
-
s
|
230
|
+
s << "#{e}p"
|
231
231
|
case sign
|
232
232
|
when :signed
|
233
|
-
s
|
233
|
+
s << "i"
|
234
234
|
when :unsigned
|
235
|
-
s
|
235
|
+
s << "u"
|
236
236
|
else
|
237
237
|
raise InternalIntrinsicsError, "Invalid sign!"
|
238
238
|
end
|
239
|
-
s
|
239
|
+
s << "#{size}"
|
240
240
|
when :float
|
241
|
-
s
|
241
|
+
s << "p"
|
242
242
|
case size
|
243
243
|
when 32
|
244
|
-
s
|
244
|
+
s << "s"
|
245
245
|
when 64
|
246
|
-
s
|
246
|
+
s << "d"
|
247
247
|
else
|
248
248
|
raise InternalIntrinsicsError, "Invalid size!"
|
249
249
|
end
|
@@ -7,9 +7,9 @@ module BOAST
|
|
7
7
|
def openmp_pragma_to_s
|
8
8
|
s = ""
|
9
9
|
if lang == FORTRAN then
|
10
|
-
s
|
10
|
+
s << "!$omp"
|
11
11
|
elsif lang == C then
|
12
|
-
s
|
12
|
+
s << "#pragma omp"
|
13
13
|
else
|
14
14
|
raise LanguageError, "Language does not support OpenMP!"
|
15
15
|
end
|
@@ -23,37 +23,37 @@ module BOAST
|
|
23
23
|
EOF
|
24
24
|
case arg_type
|
25
25
|
when :none
|
26
|
-
s
|
26
|
+
s << <<EOF
|
27
27
|
return " #{name}"
|
28
28
|
EOF
|
29
29
|
when :option
|
30
|
-
s
|
30
|
+
s << <<EOF
|
31
31
|
return " \#{c}"
|
32
32
|
EOF
|
33
33
|
when :option_list
|
34
|
-
s
|
34
|
+
s << <<EOF
|
35
35
|
return " (\#{[c].flatten.collect(&:to_s).join(", ")})"
|
36
36
|
EOF
|
37
37
|
when :simple
|
38
|
-
s
|
38
|
+
s << <<EOF
|
39
39
|
return " #{name}(\#{c})"
|
40
40
|
EOF
|
41
41
|
when :list
|
42
|
-
s
|
42
|
+
s << <<EOF
|
43
43
|
return " #{name}(\#{[c].flatten.collect(&:to_s).join(", ")})"
|
44
44
|
EOF
|
45
45
|
when :multilist
|
46
|
-
s
|
46
|
+
s << <<EOF
|
47
47
|
s = ""
|
48
48
|
c.each { |id, list|
|
49
|
-
s
|
49
|
+
s << " #{name}(\#{id}: \#{[list].flatten.collect(&:to_s).join(", ")})"
|
50
50
|
}
|
51
51
|
return s
|
52
52
|
EOF
|
53
53
|
else
|
54
54
|
raise "Unknown argument type!"
|
55
55
|
end
|
56
|
-
s
|
56
|
+
s << <<EOF
|
57
57
|
end
|
58
58
|
EOF
|
59
59
|
eval s
|
@@ -96,11 +96,11 @@ EOF
|
|
96
96
|
def openmp_open_clauses_to_s
|
97
97
|
s = ""
|
98
98
|
get_open_clauses.each { |c|
|
99
|
-
s
|
99
|
+
s << self.send( "openmp_clause_#{c}", @openmp_clauses[c] ) if @openmp_clauses[c]
|
100
100
|
}
|
101
101
|
if lang == C then
|
102
102
|
get_end_clauses.each { |c|
|
103
|
-
s
|
103
|
+
s << self.send( c, @openmp_clauses[c] ) if @openmp_clauses[c]
|
104
104
|
}
|
105
105
|
end
|
106
106
|
return s
|
@@ -110,7 +110,7 @@ EOF
|
|
110
110
|
s = ""
|
111
111
|
if lang == FORTRAN then
|
112
112
|
get_end_clauses.each { |c|
|
113
|
-
s
|
113
|
+
s << self.send( c, @openmp_clauses[c] ) if @openmp_clauses[c]
|
114
114
|
}
|
115
115
|
end
|
116
116
|
return s
|
@@ -206,30 +206,30 @@ EOF
|
|
206
206
|
return { :begin => '"#pragma omp #{c_name} #{ open_clauses.length + end_clauses.length > 0 ? "\#{c}" : "" }#{ options[:block] ? "\\n{" : "" }"',
|
207
207
|
EOF
|
208
208
|
if options[:c_end] then
|
209
|
-
s
|
209
|
+
s << <<EOF
|
210
210
|
:end => '"#pragma omp end #{c_name}"' }
|
211
211
|
EOF
|
212
212
|
else
|
213
|
-
s
|
213
|
+
s << <<EOF
|
214
214
|
:end => '"#{ options[:block] ? "}" : "" }"' }
|
215
215
|
EOF
|
216
216
|
end
|
217
|
-
s
|
217
|
+
s << <<EOF
|
218
218
|
end
|
219
219
|
|
220
220
|
def get_fortran_strings
|
221
221
|
return { :begin => '"!$omp #{fortran_name}#{ open_clauses.length > 0 ? " \#{c}" : "" }#{ options[:fortran_block] ? "(" : "" }"',
|
222
222
|
EOF
|
223
223
|
if options[:fortran_no_end] then
|
224
|
-
s
|
224
|
+
s << <<EOF
|
225
225
|
:end => '"#{ options[:fortran_block] ? ")" : "" }"' }
|
226
226
|
EOF
|
227
227
|
else
|
228
|
-
s
|
228
|
+
s << <<EOF
|
229
229
|
:end => '"!$omp end #{fortran_name} #{ end_clauses.length > 0 ? "\#{c}" : "" }"' }
|
230
230
|
EOF
|
231
231
|
end
|
232
|
-
s
|
232
|
+
s << <<EOF
|
233
233
|
end
|
234
234
|
|
235
235
|
def self.get_open_clauses
|