BOAST 2.0.2 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -38,7 +38,7 @@ module BOAST
|
|
38
38
|
class BasicBinaryOperator < Operator
|
39
39
|
|
40
40
|
def BasicBinaryOperator.string(arg1, arg2, return_type)
|
41
|
-
if lang == C and (arg1.
|
41
|
+
if lang == C and (arg1.instance_of? Variable and arg2.instance_of? Variable) and (arg1.type.vector_length > 1 or arg2.type.vector_length > 1) then
|
42
42
|
instruction = intrinsics(intr_symbol, return_type.type)
|
43
43
|
a1 = convert(arg1, return_type.type)
|
44
44
|
a2 = convert(arg2, return_type.type)
|
@@ -357,7 +357,7 @@ module BOAST
|
|
357
357
|
elsif values.kind_of?(Array) then
|
358
358
|
raise OperatorError, "Wrong number of mask values (#{values.length} for #{length})!" if length and values.length != length
|
359
359
|
s = "0x"
|
360
|
-
s
|
360
|
+
s << values.collect { |v| v != 0 ? 1 : 0 }.reverse.join
|
361
361
|
@value = Int( s, :signed => false, :size => values.length / 8 + ( values.length % 8 > 0 ? 1 : 0 ), :constant => s )
|
362
362
|
@length = values.length
|
363
363
|
@pos_values = values.reject { |e| e == 0 }.length
|
@@ -434,7 +434,7 @@ module BOAST
|
|
434
434
|
if lang == CL then
|
435
435
|
return @return_type.copy("(#{@return_type.type.decl})( #{eff_src} )", DISCARD_OPTIONS) if lang == CL
|
436
436
|
end
|
437
|
-
if (@source.is_a?(Numeric) and @source == 0) or (@source.
|
437
|
+
if (@source.is_a?(Numeric) and @source == 0) or (@source.instance_of? Variable and @source.constant == 0) then
|
438
438
|
begin
|
439
439
|
instruction = intrinsics(:SETZERO, @return_type.type)
|
440
440
|
return @return_type.copy("#{instruction}( )", DISCARD_OPTIONS) if instruction
|
@@ -464,9 +464,9 @@ module BOAST
|
|
464
464
|
|
465
465
|
def pr
|
466
466
|
s=""
|
467
|
-
s
|
468
|
-
s
|
469
|
-
s
|
467
|
+
s << indent
|
468
|
+
s << to_s
|
469
|
+
s << ";" if [C, CL, CUDA].include?( lang )
|
470
470
|
output.puts s
|
471
471
|
return self
|
472
472
|
end
|
@@ -500,9 +500,9 @@ module BOAST
|
|
500
500
|
tar = @target.to_var if @target.respond_to?(:to_var)
|
501
501
|
src = @source
|
502
502
|
src = @source.to_var if @source.respond_to?(:to_var)
|
503
|
-
if tar.
|
503
|
+
if tar.instance_of? Variable and tar.type.vector_length > 1 then
|
504
504
|
return @target.copy("#{@target} = #{Load(@source, @target, @options)}", DISCARD_OPTIONS)
|
505
|
-
elsif src.
|
505
|
+
elsif src.instance_of? Variable and src.type.vector_length > 1 then
|
506
506
|
r_t, _ = transition(tar, src, Affectation)
|
507
507
|
opts = @options.clone
|
508
508
|
opts[:store_type] = r_t
|
@@ -517,9 +517,9 @@ module BOAST
|
|
517
517
|
|
518
518
|
def pr
|
519
519
|
s=""
|
520
|
-
s
|
521
|
-
s
|
522
|
-
s
|
520
|
+
s << indent
|
521
|
+
s << to_s
|
522
|
+
s << ";" if [C, CL, CUDA].include?( lang )
|
523
523
|
output.puts s
|
524
524
|
return self
|
525
525
|
end
|
@@ -555,7 +555,7 @@ module BOAST
|
|
555
555
|
if lang == C or lang == CL then
|
556
556
|
if @source.kind_of?(Array) then
|
557
557
|
return Set(@source, @return_type).to_var
|
558
|
-
elsif @source.
|
558
|
+
elsif @source.instance_of? Variable or @source.respond_to?(:to_var) then
|
559
559
|
src_var = source.to_var
|
560
560
|
if src_var.type == @return_type.type then
|
561
561
|
return src_var
|
@@ -574,14 +574,14 @@ module BOAST
|
|
574
574
|
if mask and not mask.full? then
|
575
575
|
return Set(0, @return_type) if @zero and mask.empty?
|
576
576
|
return @return_type if mask.empty?
|
577
|
-
sym
|
578
|
-
sym
|
579
|
-
sym
|
577
|
+
sym << "MASK"
|
578
|
+
sym << "Z" if @zero
|
579
|
+
sym << "_"
|
580
580
|
end
|
581
581
|
if src_var.alignment and @return_type.type.total_size and ( src_var.alignment % @return_type.type.total_size ) == 0 then
|
582
|
-
sym
|
582
|
+
sym << "LOADA"
|
583
583
|
else
|
584
|
-
sym
|
584
|
+
sym << "LOAD"
|
585
585
|
end
|
586
586
|
instruction = intrinsics( sym.to_sym, @return_type.type)
|
587
587
|
if mask and not mask.full? then
|
@@ -596,7 +596,7 @@ module BOAST
|
|
596
596
|
elsif lang == FORTRAN then
|
597
597
|
if @source.kind_of?(Array) then
|
598
598
|
return Set(@source, @return_type).to_var
|
599
|
-
elsif @source.
|
599
|
+
elsif @source.instance_of? Variable or @source.respond_to?(:to_var) then
|
600
600
|
if @source.to_var.type == @return_type.type then
|
601
601
|
return @source.to_var
|
602
602
|
elsif @source.kind_of?(Index) and @return_type.type.vector_length > 1 then
|
@@ -613,9 +613,9 @@ module BOAST
|
|
613
613
|
|
614
614
|
def pr
|
615
615
|
s=""
|
616
|
-
s
|
617
|
-
s
|
618
|
-
s
|
616
|
+
s << indent
|
617
|
+
s << to_s
|
618
|
+
s << ";" if [C, CL, CUDA].include?( lang )
|
619
619
|
output.puts s
|
620
620
|
return self
|
621
621
|
end
|
@@ -667,7 +667,7 @@ module BOAST
|
|
667
667
|
src = src[1..-1]
|
668
668
|
end
|
669
669
|
p_type = type.copy(:vector_length => 1)
|
670
|
-
s
|
670
|
+
s << "#{instruction}( (#{p_type.decl} * ) #{src}, #{get_mask} )"
|
671
671
|
return @return_type.copy( s, DISCARD_OPTIONS)
|
672
672
|
end
|
673
673
|
|
@@ -677,9 +677,9 @@ module BOAST
|
|
677
677
|
|
678
678
|
def pr
|
679
679
|
s=""
|
680
|
-
s
|
681
|
-
s
|
682
|
-
s
|
680
|
+
s << indent
|
681
|
+
s << to_s
|
682
|
+
s << ";" if [C, CL, CUDA].include?( lang )
|
683
683
|
output.puts s
|
684
684
|
return self
|
685
685
|
end
|
@@ -725,11 +725,11 @@ module BOAST
|
|
725
725
|
mask = nil
|
726
726
|
mask = Mask(@mask, :length => @store_type.type.vector_length) if @mask
|
727
727
|
return "" if mask and mask.empty?
|
728
|
-
sym
|
728
|
+
sym << "MASK_" if mask and not mask.full?
|
729
729
|
if @dest.alignment and type.total_size and ( @dest.alignment % type.total_size ) == 0 then
|
730
|
-
sym
|
730
|
+
sym << "STOREA"
|
731
731
|
else
|
732
|
-
sym
|
732
|
+
sym << "STORE"
|
733
733
|
end
|
734
734
|
instruction = intrinsics(sym.to_sym, type)
|
735
735
|
p_type = type.copy(:vector_length => 1)
|
@@ -746,9 +746,9 @@ module BOAST
|
|
746
746
|
|
747
747
|
def pr
|
748
748
|
s=""
|
749
|
-
s
|
750
|
-
s
|
751
|
-
s
|
749
|
+
s << indent
|
750
|
+
s << to_s
|
751
|
+
s << ";" if [C, CL, CUDA].include?( lang )
|
752
752
|
output.puts s
|
753
753
|
return self
|
754
754
|
end
|
@@ -799,16 +799,16 @@ module BOAST
|
|
799
799
|
dst = dst[1..-1]
|
800
800
|
end
|
801
801
|
p_type = type.copy(:vector_length => 1)
|
802
|
-
return s
|
802
|
+
return s << "#{instruction}( (#{p_type.decl} * ) #{dst}, #{get_mask}, #{Operator.convert(@source, type)} )"
|
803
803
|
end
|
804
804
|
|
805
805
|
def pr
|
806
806
|
ss = to_s
|
807
807
|
if ss then
|
808
808
|
s=""
|
809
|
-
s
|
810
|
-
s
|
811
|
-
s
|
809
|
+
s << indent
|
810
|
+
s << ss
|
811
|
+
s << ";" if [C, CL, CUDA].include?( lang )
|
812
812
|
output.puts s
|
813
813
|
end
|
814
814
|
return self
|
@@ -877,9 +877,9 @@ module BOAST
|
|
877
877
|
|
878
878
|
def pr
|
879
879
|
s=""
|
880
|
-
s
|
881
|
-
s
|
882
|
-
s
|
880
|
+
s << indent
|
881
|
+
s << to_s
|
882
|
+
s << ";" if [C, CL, CUDA].include?( lang )
|
883
883
|
output.puts s
|
884
884
|
return self
|
885
885
|
end
|
@@ -948,9 +948,9 @@ module BOAST
|
|
948
948
|
|
949
949
|
def pr
|
950
950
|
s=""
|
951
|
-
s
|
952
|
-
s
|
953
|
-
s
|
951
|
+
s << indent
|
952
|
+
s << to_s
|
953
|
+
s << ";" if [C, CL, CUDA].include?( lang )
|
954
954
|
output.puts s
|
955
955
|
return self
|
956
956
|
end
|
@@ -982,9 +982,9 @@ module BOAST
|
|
982
982
|
|
983
983
|
def pr
|
984
984
|
s=""
|
985
|
-
s
|
986
|
-
s
|
987
|
-
s
|
985
|
+
s << indent
|
986
|
+
s << to_s
|
987
|
+
s << ";" if [C, CL, CUDA].include?( lang )
|
988
988
|
output.puts s
|
989
989
|
return self
|
990
990
|
end
|
@@ -1002,7 +1002,7 @@ module BOAST
|
|
1002
1002
|
def to_s_fortran
|
1003
1003
|
op1, op2 = op_to_var
|
1004
1004
|
if @return_type and @return_type.type.kind_of?(Real) and ( not op1.type.kind_of?(Real) or not op2.type.kind_of?(Real) ) then
|
1005
|
-
return "modulo(real(#{op1}, #{@return_type.type.size}), #{op2})"
|
1005
|
+
return "modulo(real(#{op1}, #{@return_type.type.size}), #{op2})" unless op1.type.kind_of?(Real)
|
1006
1006
|
return "modulo(#{op1}, real(#{op2}, #{@return_type.type.size}))"
|
1007
1007
|
else
|
1008
1008
|
return "modulo(#{op1}, #{op2})"
|
@@ -1013,12 +1013,24 @@ module BOAST
|
|
1013
1013
|
op1, op2 = op_to_var
|
1014
1014
|
if @return_type and @return_type.type.kind_of?(Real) then
|
1015
1015
|
if @return_type.type.size <= 4 then
|
1016
|
-
return "((#{op1} < 0) ^ (#{op2} < 0) ? fmodf(#{op1}, #{op2}) + #{op2} : fmodf(#{op1}, #{op2}))
|
1016
|
+
return "((#{op1} < 0) ^ (#{op2} < 0) ? fmodf(#{op1}, #{op2}) + #{op2} : fmodf(#{op1}, #{op2}))"
|
1017
1017
|
else
|
1018
1018
|
return "((#{op1} < 0) ^ (#{op2} < 0) ? fmod(#{op1}, #{op2}) + #{op2} : fmod(#{op1}, #{op2}))"
|
1019
1019
|
end
|
1020
1020
|
else
|
1021
|
-
|
1021
|
+
test_op1 = true
|
1022
|
+
test_op1 = false if op1.respond_to?(:type) and op1.type.respond_to?(:signed?) and not op1.type.signed?
|
1023
|
+
test_op2 = true
|
1024
|
+
test_op2 = false if op2.respond_to?(:type) and op2.type.respond_to?(:signed?) and not op2.type.signed?
|
1025
|
+
if test_op1 and test_op2 then
|
1026
|
+
return "((#{op1} < 0) ^ (#{op2} < 0) ? (#{op1} % #{op2}) + #{op2} : #{op1} % #{op2})"
|
1027
|
+
elsif test_op1 then
|
1028
|
+
return "( (#{op1} < 0) ? (#{op1} % #{op2.cast(op1)}) + #{op2} : #{op1} % #{op2})"
|
1029
|
+
elsif test_op2 then
|
1030
|
+
return "( (#{op2} < 0) ? (#{op1.cast(op2)} % #{op2}) + #{op2} : #{op1} % #{op2})"
|
1031
|
+
else
|
1032
|
+
return "(#{op1} % #{op2})"
|
1033
|
+
end
|
1022
1034
|
end
|
1023
1035
|
end
|
1024
1036
|
|
@@ -1056,9 +1068,9 @@ module BOAST
|
|
1056
1068
|
|
1057
1069
|
def pr
|
1058
1070
|
s=""
|
1059
|
-
s
|
1060
|
-
s
|
1061
|
-
s
|
1071
|
+
s << indent
|
1072
|
+
s << to_s
|
1073
|
+
s << ";" if [C, CL, CUDA].include?( lang )
|
1062
1074
|
output.puts s
|
1063
1075
|
return self
|
1064
1076
|
end
|
@@ -17,19 +17,19 @@ module BOAST
|
|
17
17
|
def to_s
|
18
18
|
s = ""
|
19
19
|
if lang == FORTRAN then
|
20
|
-
s
|
20
|
+
s << "!#{@name}$"
|
21
21
|
else
|
22
|
-
s
|
22
|
+
s << "#pragma #{name}"
|
23
23
|
end
|
24
24
|
@options.each{ |opt|
|
25
|
-
s
|
25
|
+
s << " #{opt}"
|
26
26
|
}
|
27
27
|
return s
|
28
28
|
end
|
29
29
|
|
30
30
|
def pr
|
31
31
|
s=""
|
32
|
-
s
|
32
|
+
s << to_s
|
33
33
|
output.puts s
|
34
34
|
return self
|
35
35
|
end
|
@@ -39,14 +39,14 @@ module BOAST
|
|
39
39
|
# @private
|
40
40
|
def boast_header(lang=C)
|
41
41
|
s = boast_header_s(lang)
|
42
|
-
s
|
42
|
+
s << ";\n"
|
43
43
|
output.print s
|
44
44
|
return self
|
45
45
|
end
|
46
46
|
|
47
47
|
def call(*parameters)
|
48
48
|
prefix = ""
|
49
|
-
prefix
|
49
|
+
prefix << "call " if lang==FORTRAN and @properties[:return].nil?
|
50
50
|
f = FuncCall::new(@name, *parameters, :return => @properties[:return] )
|
51
51
|
f.prefix = prefix
|
52
52
|
return f
|
@@ -114,50 +114,50 @@ module BOAST
|
|
114
114
|
s = ""
|
115
115
|
if lang == CL then
|
116
116
|
if @properties[:local] then
|
117
|
-
s
|
118
|
-
s
|
119
|
-
s
|
117
|
+
s << "#if __OPENCL_C_VERSION__ && __OPENCL_C_VERSION__ >= 120\n"
|
118
|
+
s << "static\n"
|
119
|
+
s << "#endif\n"
|
120
120
|
else
|
121
|
-
s
|
121
|
+
s << "__kernel "
|
122
122
|
wgs = @properties[:reqd_work_group_size]
|
123
123
|
if wgs then
|
124
|
-
s
|
124
|
+
s << "__attribute__((reqd_work_group_size(#{wgs[0]},#{wgs[1]},#{wgs[2]}))) "
|
125
125
|
end
|
126
126
|
end
|
127
127
|
elsif lang == CUDA then
|
128
128
|
if @properties[:local] then
|
129
|
-
s
|
129
|
+
s << "static __device__ "
|
130
130
|
else
|
131
|
-
s
|
131
|
+
s << "__global__ "
|
132
132
|
wgs = @properties[:reqd_work_group_size]
|
133
133
|
if wgs then
|
134
|
-
s
|
134
|
+
s << "__launch_bounds__(#{wgs[0]}*#{wgs[1]}*#{wgs[2]}) "
|
135
135
|
end
|
136
136
|
end
|
137
137
|
elsif lang == C then
|
138
138
|
if @properties[:local] then
|
139
|
-
s
|
139
|
+
s << "static "
|
140
140
|
end
|
141
141
|
if @properties[:inline] then
|
142
|
-
s
|
142
|
+
s << "inline "
|
143
143
|
end
|
144
144
|
end
|
145
145
|
if @properties[:qualifiers] then
|
146
|
-
s
|
146
|
+
s << "#{@properties[:qualifiers]} "
|
147
147
|
end
|
148
148
|
if @properties[:return] then
|
149
|
-
s
|
149
|
+
s << "#{@properties[:return].type.decl} "
|
150
150
|
else
|
151
|
-
s
|
151
|
+
s << "void "
|
152
152
|
end
|
153
|
-
s
|
153
|
+
s << "#{@name}("
|
154
154
|
if @parameters.first then
|
155
|
-
s
|
155
|
+
s << @parameters.first.send(:decl_c_s, @properties[:local])
|
156
156
|
@parameters[1..-1].each { |p|
|
157
|
-
s
|
157
|
+
s << ", "+p.send(:decl_c_s, @properties[:local])
|
158
158
|
}
|
159
159
|
end
|
160
|
-
s
|
160
|
+
s << ")"
|
161
161
|
return s
|
162
162
|
end
|
163
163
|
|
@@ -170,13 +170,13 @@ module BOAST
|
|
170
170
|
def to_s_fortran
|
171
171
|
s = ""
|
172
172
|
if @properties[:return] then
|
173
|
-
s
|
173
|
+
s << "#{@properties[:return].type.decl} FUNCTION "
|
174
174
|
else
|
175
|
-
s
|
175
|
+
s << "SUBROUTINE "
|
176
176
|
end
|
177
|
-
s
|
178
|
-
s
|
179
|
-
s
|
177
|
+
s << "#{@name}("
|
178
|
+
s << @parameters.collect(&:name).join(", ")
|
179
|
+
s << ")"
|
180
180
|
end
|
181
181
|
|
182
182
|
def open_c
|
@@ -205,7 +205,7 @@ module BOAST
|
|
205
205
|
|
206
206
|
def open_fortran
|
207
207
|
s = indent + to_s_fortran
|
208
|
-
s
|
208
|
+
s << "\n"
|
209
209
|
increment_indent_level
|
210
210
|
tmp_buff = StringIO::new
|
211
211
|
push_env( :output => tmp_buff ) {
|
@@ -214,8 +214,8 @@ module BOAST
|
|
214
214
|
}
|
215
215
|
}
|
216
216
|
tmp_buff.rewind
|
217
|
-
s
|
218
|
-
s
|
217
|
+
s << tmp_buff.read
|
218
|
+
s << indent + "integer, parameter :: wp=kind(1.0d0)"
|
219
219
|
output.puts s
|
220
220
|
@constants.each { |c|
|
221
221
|
BOAST::decl c
|
@@ -247,9 +247,9 @@ module BOAST
|
|
247
247
|
|
248
248
|
def close_c
|
249
249
|
s = ""
|
250
|
-
s
|
250
|
+
s << indent + "return #{@properties[:return]};\n" if @properties[:return]
|
251
251
|
decrement_indent_level
|
252
|
-
s
|
252
|
+
s << indent + "}"
|
253
253
|
output.puts s
|
254
254
|
return self
|
255
255
|
end
|
@@ -257,12 +257,12 @@ module BOAST
|
|
257
257
|
def close_fortran
|
258
258
|
s = ""
|
259
259
|
if @properties[:return] then
|
260
|
-
s
|
260
|
+
s << indent + "#{@name} = #{@properties[:return]}\n"
|
261
261
|
decrement_indent_level
|
262
|
-
s
|
262
|
+
s << indent + "END FUNCTION #{@name}"
|
263
263
|
else
|
264
264
|
decrement_indent_level
|
265
|
-
s
|
265
|
+
s << indent + "END SUBROUTINE #{@name}"
|
266
266
|
end
|
267
267
|
output.puts s
|
268
268
|
return self
|
@@ -271,38 +271,38 @@ module BOAST
|
|
271
271
|
def boast_header_s( lang=C )
|
272
272
|
s = ""
|
273
273
|
headers.each { |h|
|
274
|
-
s
|
274
|
+
s << "#include <#{h}>\n"
|
275
275
|
}
|
276
276
|
if lang == CL then
|
277
|
-
s
|
277
|
+
s << "__kernel "
|
278
278
|
wgs = @properties[:reqd_work_group_size]
|
279
279
|
if wgs then
|
280
|
-
s
|
280
|
+
s << "__attribute__((reqd_work_group_size(#{wgs[0]},#{wgs[1]},#{wgs[2]}))) "
|
281
281
|
end
|
282
282
|
end
|
283
283
|
trailer = ""
|
284
|
-
trailer
|
285
|
-
trailer
|
284
|
+
trailer << "_" if lang == FORTRAN
|
285
|
+
trailer << "_wrapper" if lang == CUDA
|
286
286
|
if @properties[:return] then
|
287
|
-
s
|
287
|
+
s << "#{@properties[:return].type.decl} "
|
288
288
|
elsif lang == CUDA
|
289
|
-
s
|
289
|
+
s << "unsigned long long int "
|
290
290
|
else
|
291
|
-
s
|
291
|
+
s << "void "
|
292
292
|
end
|
293
|
-
s
|
293
|
+
s << "#{@name}#{trailer}("
|
294
294
|
if @parameters.first then
|
295
|
-
s
|
295
|
+
s << @parameters.first.boast_header(lang)
|
296
296
|
@parameters[1..-1].each { |p|
|
297
|
-
s
|
298
|
-
s
|
297
|
+
s << ", "
|
298
|
+
s << p.boast_header(lang)
|
299
299
|
}
|
300
300
|
end
|
301
301
|
if lang == CUDA then
|
302
|
-
s
|
303
|
-
s
|
302
|
+
s << ", " if parameters.first
|
303
|
+
s << "size_t *_boast_block_number, size_t *_boast_block_size, int _boast_repeat"
|
304
304
|
end
|
305
|
-
s
|
305
|
+
s << ")"
|
306
306
|
return s
|
307
307
|
end
|
308
308
|
|