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.
- checksums.yaml +4 -4
- data/BOAST.gemspec +2 -2
- data/lib/BOAST.rb +1 -0
- data/lib/BOAST/Language/Algorithm.rb +68 -30
- data/lib/BOAST/Language/Annotation.rb +1 -0
- data/lib/BOAST/Language/Architectures.rb +1 -0
- data/lib/BOAST/Language/Arithmetic.rb +15 -9
- data/lib/BOAST/Language/BOAST_OpenCL.rb +94 -87
- data/lib/BOAST/Language/CPUID_by_name.rb +1 -0
- data/lib/BOAST/Language/Case.rb +6 -0
- data/lib/BOAST/Language/CodeBlock.rb +1 -0
- data/lib/BOAST/Language/Comment.rb +14 -11
- data/lib/BOAST/Language/Config.rb +23 -15
- data/lib/BOAST/Language/ControlStructure.rb +10 -2
- data/lib/BOAST/Language/DataTypes.rb +23 -15
- data/lib/BOAST/Language/Expression.rb +3 -0
- data/lib/BOAST/Language/For.rb +31 -26
- data/lib/BOAST/Language/FuncCall.rb +7 -0
- data/lib/BOAST/Language/Functors.rb +56 -19
- data/lib/BOAST/Language/If.rb +3 -0
- data/lib/BOAST/Language/Index.rb +11 -9
- data/lib/BOAST/Language/Intrinsics.rb +2 -0
- data/lib/BOAST/Language/OpenMP.rb +57 -40
- data/lib/BOAST/Language/Operators.rb +27 -19
- data/lib/BOAST/Language/Pragma.rb +1 -0
- data/lib/BOAST/Language/Print.rb +3 -0
- data/lib/BOAST/Language/Procedure.rb +81 -76
- data/lib/BOAST/Language/Slice.rb +16 -14
- data/lib/BOAST/Language/State.rb +126 -55
- data/lib/BOAST/Language/Transitions.rb +26 -26
- data/lib/BOAST/Language/Variable.rb +89 -58
- data/lib/BOAST/Language/While.rb +3 -0
- data/lib/BOAST/Runtime/AffinityProbe.rb +65 -0
- data/lib/BOAST/Runtime/CKernel.rb +44 -1
- data/lib/BOAST/Runtime/CRuntime.rb +3 -0
- data/lib/BOAST/Runtime/CUDARuntime.rb +3 -0
- data/lib/BOAST/Runtime/CompiledRuntime.rb +4 -0
- data/lib/BOAST/Runtime/Compilers.rb +6 -5
- data/lib/BOAST/Runtime/Config.rb +1 -1
- data/lib/BOAST/Runtime/FFIRuntime.rb +3 -0
- data/lib/BOAST/Runtime/FORTRANRuntime.rb +3 -0
- data/lib/BOAST/Runtime/MPPARuntime.rb +2 -0
- data/lib/BOAST/Runtime/NonRegression.rb +5 -3
- data/lib/BOAST/Runtime/OpenCLRuntime.rb +7 -10
- data/lib/BOAST/Runtime/Probe.rb +2 -0
- metadata +7 -6
@@ -5672,4 +5672,5 @@ X86CPUID_by_name ={"_m_from_int64"=>["MMX"],
|
|
5672
5672
|
"_mm_mask_permutex2var_epi8"=>["AVX512VBMI", "AVX512VL"],
|
5673
5673
|
"_mm_mask2_permutex2var_epi8"=>["AVX512VBMI", "AVX512VL"],
|
5674
5674
|
"_mm_maskz_permutex2var_epi8"=>["AVX512VBMI", "AVX512VL"]}
|
5675
|
+
private_constant :X86CPUID_by_name
|
5675
5676
|
end
|
data/lib/BOAST/Language/Case.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
module BOAST
|
2
2
|
|
3
|
+
# @!parse module Functors; functorize CaseCondition; end
|
3
4
|
class CaseCondition < ControlStructure
|
4
5
|
attr_reader :block
|
5
6
|
attr_reader :constants
|
@@ -21,6 +22,8 @@ module BOAST
|
|
21
22
|
:break => 'nil' }
|
22
23
|
end
|
23
24
|
|
25
|
+
private :get_c_strings, :get_fortran_strings
|
26
|
+
|
24
27
|
alias get_cl_strings get_c_strings
|
25
28
|
alias get_cuda_strings get_c_strings
|
26
29
|
|
@@ -70,6 +73,7 @@ module BOAST
|
|
70
73
|
|
71
74
|
end
|
72
75
|
|
76
|
+
# @!parse module Functors; functorize Case; end
|
73
77
|
class Case < ControlStructure
|
74
78
|
|
75
79
|
attr_reader :expression
|
@@ -96,6 +100,8 @@ module BOAST
|
|
96
100
|
:end => '"end select"' }
|
97
101
|
end
|
98
102
|
|
103
|
+
private :get_c_strings, :get_fortran_strings
|
104
|
+
|
99
105
|
alias get_cl_strings get_c_strings
|
100
106
|
alias get_cuda_strings get_c_strings
|
101
107
|
|
@@ -1,5 +1,6 @@
|
|
1
1
|
module BOAST
|
2
2
|
|
3
|
+
# @!parse module Functors; functorize Comment; end
|
3
4
|
class Comment
|
4
5
|
extend Functor
|
5
6
|
include PrivateStateAccessor
|
@@ -10,6 +11,19 @@ module BOAST
|
|
10
11
|
@comment = string
|
11
12
|
end
|
12
13
|
|
14
|
+
def to_s
|
15
|
+
return to_s_fortran if get_lang == FORTRAN
|
16
|
+
return to_s_c if [C,CL,CUDA].include?(get_lang)
|
17
|
+
end
|
18
|
+
|
19
|
+
def pr
|
20
|
+
s = to_s
|
21
|
+
output.puts s
|
22
|
+
return self
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
13
27
|
def to_s_fortran
|
14
28
|
s = ""
|
15
29
|
@comment.each_line { |l| s += "! #{l}" }
|
@@ -22,17 +36,6 @@ module BOAST
|
|
22
36
|
return s
|
23
37
|
end
|
24
38
|
|
25
|
-
def to_s
|
26
|
-
return to_s_fortran if get_lang == FORTRAN
|
27
|
-
return to_s_c if [C,CL,CUDA].include?(get_lang)
|
28
|
-
end
|
29
|
-
|
30
|
-
def pr
|
31
|
-
s = to_s
|
32
|
-
output.puts s
|
33
|
-
return self
|
34
|
-
end
|
35
|
-
|
36
39
|
end
|
37
40
|
|
38
41
|
end
|
@@ -14,6 +14,8 @@ module BOAST
|
|
14
14
|
:fortran_line_length => 72
|
15
15
|
}
|
16
16
|
|
17
|
+
module_function
|
18
|
+
|
17
19
|
def assert_boast_config_dir
|
18
20
|
home_config_dir = ENV["XDG_CONFIG_HOME"]
|
19
21
|
home_config_dir = "#{Dir.home}/.config" if not home_config_dir
|
@@ -25,8 +27,6 @@ module BOAST
|
|
25
27
|
return boast_config_dir
|
26
28
|
end
|
27
29
|
|
28
|
-
module_function :assert_boast_config_dir
|
29
|
-
|
30
30
|
def read_boast_config
|
31
31
|
boast_config_dir = assert_boast_config_dir
|
32
32
|
return unless boast_config_dir
|
@@ -42,17 +42,21 @@ module BOAST
|
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
-
module_function :read_boast_config
|
46
|
-
|
47
45
|
read_boast_config
|
48
46
|
|
49
47
|
module PrivateStateAccessor
|
50
48
|
|
51
|
-
private_state_accessor :output
|
52
|
-
private_state_accessor :
|
49
|
+
private_state_accessor :output
|
50
|
+
private_state_accessor :lang
|
51
|
+
private_state_accessor :architecture
|
52
|
+
private_state_accessor :model
|
53
|
+
private_state_accessor :address_size
|
54
|
+
private_state_accessor :default_int_size
|
55
|
+
private_state_accessor :default_real_size
|
53
56
|
private_state_accessor :default_align
|
54
57
|
private_state_accessor :array_start
|
55
|
-
private_state_accessor :indent_level
|
58
|
+
private_state_accessor :indent_level
|
59
|
+
private_state_accessor :indent_increment
|
56
60
|
private_state_accessor :annotate_list
|
57
61
|
private_state_accessor :annotate_indepth_list
|
58
62
|
private_state_accessor :annotate_level
|
@@ -70,11 +74,17 @@ module BOAST
|
|
70
74
|
|
71
75
|
end
|
72
76
|
|
73
|
-
state_accessor :output
|
74
|
-
state_accessor :
|
77
|
+
state_accessor :output
|
78
|
+
state_accessor :lang
|
79
|
+
state_accessor :architecture
|
80
|
+
state_accessor :model
|
81
|
+
state_accessor :address_size
|
82
|
+
state_accessor :default_int_size
|
83
|
+
state_accessor :default_real_size
|
75
84
|
state_accessor :default_align
|
76
85
|
state_accessor :array_start
|
77
|
-
state_accessor :indent_level
|
86
|
+
state_accessor :indent_level
|
87
|
+
state_accessor :indent_increment
|
78
88
|
state_accessor :annotate_list
|
79
89
|
state_accessor :annotate_indepth_list
|
80
90
|
state_accessor :annotate_level
|
@@ -114,18 +124,18 @@ module BOAST
|
|
114
124
|
default_state_getter :disable_openmp, false
|
115
125
|
default_state_getter :boast_inspect, false, nil, :INSPECT
|
116
126
|
|
117
|
-
alias use_vla_old? use_vla?
|
118
127
|
class << self
|
119
128
|
alias use_vla_old? use_vla?
|
129
|
+
private :use_vla_old?
|
120
130
|
end
|
121
131
|
|
132
|
+
# @return the boolean evaluation of the *use_vla* state. false if lang is CL or CUDA.
|
122
133
|
def use_vla?
|
123
134
|
return false if [CL,CUDA].include?(lang)
|
124
135
|
return use_vla_old?
|
125
136
|
end
|
126
137
|
|
127
|
-
|
128
|
-
|
138
|
+
# @private
|
129
139
|
def get_default_architecture
|
130
140
|
architecture = const_get(ENV["ARCHITECTURE"]) if ENV["ARCHITECTURE"]
|
131
141
|
architecture = const_get(ENV["ARCH"]) if not architecture and ENV["ARCH"]
|
@@ -134,8 +144,6 @@ module BOAST
|
|
134
144
|
return X86
|
135
145
|
end
|
136
146
|
|
137
|
-
module_function :get_default_architecture
|
138
|
-
|
139
147
|
@@architecture = get_default_architecture
|
140
148
|
|
141
149
|
end
|
@@ -17,12 +17,20 @@ module BOAST
|
|
17
17
|
FORTRAN => get_fortran_strings }
|
18
18
|
end
|
19
19
|
|
20
|
-
|
20
|
+
private :get_strings
|
21
|
+
|
22
|
+
class << self
|
23
|
+
|
24
|
+
def token_string_generator(name, *args)
|
21
25
|
s = <<EOF
|
22
26
|
def #{name}_string(#{args.join(",")})
|
23
|
-
return eval get_strings[get_lang][:#{name}]
|
27
|
+
return eval get_strings[get_lang][:#{name}]
|
24
28
|
end
|
25
29
|
EOF
|
30
|
+
end
|
31
|
+
|
32
|
+
private :token_string_generator
|
33
|
+
|
26
34
|
end
|
27
35
|
|
28
36
|
def [](*args)
|
@@ -1,5 +1,6 @@
|
|
1
1
|
module BOAST
|
2
2
|
|
3
|
+
# Base class for BOAST data types. Inherited class will define a functor.
|
3
4
|
class DataType
|
4
5
|
include Intrinsics
|
5
6
|
include PrivateStateAccessor
|
@@ -10,6 +11,7 @@ module BOAST
|
|
10
11
|
|
11
12
|
end
|
12
13
|
|
14
|
+
# @!parse module VarFunctors; var_functorize Sizet; end
|
13
15
|
class Sizet < DataType
|
14
16
|
|
15
17
|
attr_reader :signed
|
@@ -60,6 +62,7 @@ module BOAST
|
|
60
62
|
|
61
63
|
end
|
62
64
|
|
65
|
+
# @!parse module VarFunctors; var_functorize Real; end
|
63
66
|
class Real < DataType
|
64
67
|
|
65
68
|
attr_reader :size
|
@@ -135,6 +138,7 @@ module BOAST
|
|
135
138
|
|
136
139
|
end
|
137
140
|
|
141
|
+
# @!parse module VarFunctors; var_functorize Int; end
|
138
142
|
class Int < DataType
|
139
143
|
|
140
144
|
attr_reader :size
|
@@ -246,6 +250,7 @@ module BOAST
|
|
246
250
|
|
247
251
|
end
|
248
252
|
|
253
|
+
# @!parse module VarFunctors; var_functorize CStruct; end
|
249
254
|
class CStruct < DataType
|
250
255
|
|
251
256
|
attr_reader :name, :members, :members_array
|
@@ -261,31 +266,26 @@ module BOAST
|
|
261
266
|
}
|
262
267
|
end
|
263
268
|
|
264
|
-
def decl_c
|
265
|
-
return "struct #{@name}" if [C, CL, CUDA].include?( lang )
|
266
|
-
end
|
267
|
-
|
268
|
-
def decl_fortran
|
269
|
-
return "TYPE(#{@name})" if lang == FORTRAN
|
270
|
-
end
|
271
|
-
|
272
269
|
def decl
|
273
270
|
return decl_c if [C, CL, CUDA].include?( lang )
|
274
271
|
return decl_fortran if lang == FORTRAN
|
275
272
|
end
|
276
273
|
|
277
|
-
def finalize
|
278
|
-
s = ""
|
279
|
-
s += ";" if [C, CL, CUDA].include?( lang )
|
280
|
-
s+="\n"
|
281
|
-
return s
|
282
|
-
end
|
283
|
-
|
284
274
|
def define
|
285
275
|
return define_c if [C, CL, CUDA].include?( lang )
|
286
276
|
return define_fortran if lang == FORTRAN
|
287
277
|
end
|
288
278
|
|
279
|
+
private
|
280
|
+
|
281
|
+
def decl_c
|
282
|
+
return "struct #{@name}" if [C, CL, CUDA].include?( lang )
|
283
|
+
end
|
284
|
+
|
285
|
+
def decl_fortran
|
286
|
+
return "TYPE(#{@name})" if lang == FORTRAN
|
287
|
+
end
|
288
|
+
|
289
289
|
def define_c
|
290
290
|
s = indent
|
291
291
|
s += decl_c + " {"
|
@@ -318,8 +318,16 @@ module BOAST
|
|
318
318
|
return self
|
319
319
|
end
|
320
320
|
|
321
|
+
def finalize
|
322
|
+
s = ""
|
323
|
+
s += ";" if [C, CL, CUDA].include?( lang )
|
324
|
+
s+="\n"
|
325
|
+
return s
|
326
|
+
end
|
327
|
+
|
321
328
|
end
|
322
329
|
|
330
|
+
# @!parse module VarFunctors; var_functorize CustomType; end
|
323
331
|
class CustomType < DataType
|
324
332
|
|
325
333
|
attr_reader :size, :name, :vector_length
|
@@ -2,6 +2,7 @@ module BOAST
|
|
2
2
|
|
3
3
|
module_function
|
4
4
|
|
5
|
+
# @!parse module Functors; functorize Expression; end
|
5
6
|
class Expression
|
6
7
|
include PrivateStateAccessor
|
7
8
|
include Arithmetic
|
@@ -39,6 +40,8 @@ module BOAST
|
|
39
40
|
end
|
40
41
|
return s
|
41
42
|
end
|
43
|
+
|
44
|
+
private :to_s_base
|
42
45
|
|
43
46
|
def to_var
|
44
47
|
op1 = nil
|
data/lib/BOAST/Language/For.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
module BOAST
|
2
2
|
|
3
|
+
# @!parse module Functors; functorize For; end
|
3
4
|
class For < ControlStructure
|
4
5
|
include Annotation
|
5
|
-
ANNOTATIONS = [ :iterator, :
|
6
|
+
ANNOTATIONS = [ :iterator, :first, :last, :step, :operator ]
|
6
7
|
|
7
8
|
attr_reader :iterator
|
8
|
-
attr_reader :
|
9
|
-
attr_reader :
|
9
|
+
attr_reader :first
|
10
|
+
attr_reader :last
|
10
11
|
attr_reader :step
|
11
12
|
attr_accessor :block
|
12
13
|
|
@@ -18,13 +19,13 @@ module BOAST
|
|
18
19
|
@unroll = val
|
19
20
|
end
|
20
21
|
|
21
|
-
def initialize(
|
22
|
+
def initialize(iterator, first, last, options={}, &block)
|
22
23
|
default_options = {:step => 1}
|
23
24
|
default_options.update( options )
|
24
25
|
@options = options
|
25
|
-
@iterator =
|
26
|
-
@
|
27
|
-
@
|
26
|
+
@iterator = iterator
|
27
|
+
@first = first
|
28
|
+
@last = last
|
28
29
|
@step = default_options[:step]
|
29
30
|
@operator = "<="
|
30
31
|
@block = block
|
@@ -65,6 +66,8 @@ module BOAST
|
|
65
66
|
:end => '"end do"' }
|
66
67
|
end
|
67
68
|
|
69
|
+
private :get_c_strings, :get_fortran_strings
|
70
|
+
|
68
71
|
alias get_cl_strings get_c_strings
|
69
72
|
alias get_cuda_strings get_c_strings
|
70
73
|
|
@@ -72,19 +75,14 @@ module BOAST
|
|
72
75
|
eval token_string_generator( * %w{end})
|
73
76
|
|
74
77
|
def to_s
|
75
|
-
s = for_string(@iterator, @
|
78
|
+
s = for_string(@iterator, @first, @last, @step, @operator)
|
76
79
|
return s
|
77
80
|
end
|
78
81
|
|
79
|
-
# def u(s = 2)
|
80
|
-
# return [For::new(@iterator, @begin, @end - (@step*s - 1), @options.dup.update( { :step => (@step*s) } ), &@block),
|
81
|
-
# For::new(@iterator, @begin.to_var + ((@end - @begin + 1)/(@step*s))*(@step*s), @end, @options, &@block) ]
|
82
|
-
# end
|
83
|
-
#
|
84
82
|
def unroll
|
85
83
|
opts = @options.clone
|
86
84
|
opts[:unroll] = true
|
87
|
-
return For::new(@iterator, @
|
85
|
+
return For::new(@iterator, @first, @last, opts, &block)
|
88
86
|
end
|
89
87
|
|
90
88
|
def pr_unroll(*args)
|
@@ -92,19 +90,19 @@ module BOAST
|
|
92
90
|
begin
|
93
91
|
begin
|
94
92
|
push_env( :replace_constants => true )
|
95
|
-
if @
|
96
|
-
|
97
|
-
elsif @
|
98
|
-
|
93
|
+
if @first.kind_of?(Variable) then
|
94
|
+
first = @first.constant
|
95
|
+
elsif @first.kind_of?(Expression) then
|
96
|
+
first = eval "#{@first}"
|
99
97
|
else
|
100
|
-
|
98
|
+
first = @first.to_i
|
101
99
|
end
|
102
|
-
if @
|
103
|
-
|
104
|
-
elsif @
|
105
|
-
|
100
|
+
if @last.kind_of?(Variable) then
|
101
|
+
last = @last.constant
|
102
|
+
elsif @last.kind_of?(Expression) then
|
103
|
+
last = eval "#{@last}"
|
106
104
|
else
|
107
|
-
|
105
|
+
last = @last.to_i
|
108
106
|
end
|
109
107
|
if @step.kind_of?(Variable) then
|
110
108
|
step = @step.constant
|
@@ -113,7 +111,7 @@ module BOAST
|
|
113
111
|
else
|
114
112
|
step = @step.to_i
|
115
113
|
end
|
116
|
-
raise "Invalid bounds (not constants)!" if not (
|
114
|
+
raise "Invalid bounds (not constants)!" if not ( first and last and step )
|
117
115
|
ensure
|
118
116
|
pop_env( :replace_constants )
|
119
117
|
end
|
@@ -125,7 +123,7 @@ module BOAST
|
|
125
123
|
end
|
126
124
|
return self
|
127
125
|
end
|
128
|
-
range =
|
126
|
+
range = first..last
|
129
127
|
@iterator.force_replace_constant = true
|
130
128
|
range.step(step) { |i|
|
131
129
|
@iterator.constant = i
|
@@ -135,6 +133,8 @@ module BOAST
|
|
135
133
|
@iterator.constant = nil
|
136
134
|
end
|
137
135
|
|
136
|
+
private :pr_unroll
|
137
|
+
|
138
138
|
def open
|
139
139
|
@openmp.open if @openmp
|
140
140
|
s=""
|
@@ -166,6 +166,11 @@ module BOAST
|
|
166
166
|
return self
|
167
167
|
end
|
168
168
|
|
169
|
+
# def u(s = 2)
|
170
|
+
# return [For::new(@iterator, @first, @last - (@step*s - 1), @options.dup.update( { :step => (@step*s) } ), &@block),
|
171
|
+
# For::new(@iterator, @first.to_var + ((@last - @first + 1)/(@step*s))*(@step*s), @last, @options, &@block) ]
|
172
|
+
# end
|
173
|
+
|
169
174
|
end
|
170
175
|
|
171
176
|
end
|