BOAST 1.0.6 → 1.0.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c85b9d3cf15ddaa43c8772daa563fc77ffa0e2d8
4
- data.tar.gz: 2c3f92c1b64383ef09e28333f882bbeb2f717ee6
3
+ metadata.gz: f11eacd12c0e6cfa7268db8d77718b8ea7264077
4
+ data.tar.gz: 2edec679ab6ac265fb66a3190b7693b5cde5fce7
5
5
  SHA512:
6
- metadata.gz: c48d0c7349a97e7d2ffb7a632e21d01e7af48d69009dbf635d95ba81d22aa76b24321b2d9bf0da83da77d114ccf11dae5272084334bd3aa76a633d339b37fe60
7
- data.tar.gz: 12fa72007ca814bff99b9a0e3593113fde333f66a6194b7b853164c8e3e7fa47f9705095e75c37303ee9f60dbaf16eb74a1649be3e46c5889cc9007b5a7f8f1b
6
+ metadata.gz: 1da1fdca526a8ecc1d82164e4621b271714f82cc210718d6bcd70bb6482c74366ea8e14fdd7f44d7338a8724c68ebb7746ddd2e49d964c978ba94d911cac114c
7
+ data.tar.gz: 76d2966d546378fa0901656711d76703218649e601534f7da7acfeae2d50e89604737f27924c97888d472ae77f7646596ed474a5fb9c0e87a608237864de0760
data/BOAST.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'BOAST'
3
- s.version = "1.0.6"
3
+ s.version = "1.0.7"
4
4
  s.author = "Brice Videau"
5
5
  s.email = "brice.videau@imag.fr"
6
6
  s.homepage = "https://github.com/Nanosim-LIG/boast"
data/lib/BOAST.rb CHANGED
@@ -3,6 +3,7 @@ require 'BOAST/Language/Functors.rb'
3
3
  require 'BOAST/Language/Inspectable.rb'
4
4
  require 'BOAST/Language/Transitions.rb'
5
5
  require 'BOAST/Language/Arithmetic.rb'
6
+ require 'BOAST/Language/Intrinsics.rb'
6
7
  require 'BOAST/Language/Operators.rb'
7
8
  require 'BOAST/Language/DataTypes.rb'
8
9
  require 'BOAST/Language/Expression.rb'
@@ -6,8 +6,8 @@ module BOAST
6
6
  C = 2
7
7
  CL = 3
8
8
  CUDA = 4
9
- X86 = 1
10
- ARM = 2
9
+ #X86 = 1
10
+ #ARM = 2
11
11
  MPPA = 3
12
12
 
13
13
  module PrivateStateAccessor
@@ -95,7 +95,7 @@ module BOAST
95
95
  else
96
96
  @vector_length = 1
97
97
  end
98
- @total_size = @vector_length*@size
98
+ @total_size = @size*@vector_length
99
99
  @signed = true
100
100
  end
101
101
 
@@ -189,7 +189,7 @@ module BOAST
189
189
  else
190
190
  @vector_length = 1
191
191
  end
192
- @total_size = @vector_length*@size
192
+ @total_size = @size*@vector_length
193
193
  end
194
194
 
195
195
  def to_hash
@@ -351,9 +351,11 @@ module BOAST
351
351
  s = indent
352
352
  s += decl_c + " {"
353
353
  output.puts s
354
+ increment_indent_level
354
355
  @members_array.each { |value|
355
356
  value.decl
356
357
  }
358
+ decrement_indent_level
357
359
  s = indent
358
360
  s += "}"
359
361
  s += finalize
@@ -365,9 +367,11 @@ module BOAST
365
367
  s = indent
366
368
  s += "TYPE :: #{@name}\n"
367
369
  output.puts s
370
+ increment_indent_level
368
371
  @members_array.each { |value|
369
372
  value.decl
370
373
  }
374
+ decrement_indent_level
371
375
  s = indent
372
376
  s += "END TYPE #{@name}"
373
377
  s += finalize
@@ -49,13 +49,13 @@ module BOAST
49
49
  if op1 and op2 then
50
50
  r_t, oper = transition(op1, op2, @operator)
51
51
  res_exp = to_s_base(op1, op2, oper, r_t)
52
- return r_t.copy(res_exp, :const => nil, :constant => nil, :direction => nil, :dir => nil)
52
+ return r_t.copy(res_exp, :const => nil, :constant => nil, :direction => nil, :dir => nil, :align => nil)
53
53
  elsif op2
54
54
  res_exp = to_s_base(@operand1, op2, @operator)
55
- return op2.copy(res_exp, :const => nil, :constant => nil, :direction => nil, :dir => nil)
55
+ return op2.copy(res_exp, :const => nil, :constant => nil, :direction => nil, :dir => nil, :align => nil)
56
56
  elsif op1
57
57
  res_exp = to_s_base(op1, @operand2, @operator)
58
- return op1.copy(res_exp, :const => nil, :constant => nil, :direction => nil, :dir => nil)
58
+ return op1.copy(res_exp, :const => nil, :constant => nil, :direction => nil, :dir => nil, :align => nil)
59
59
  else
60
60
  STDERR.puts "#{@operand1} #{@operand2}"
61
61
  raise "Expression on no operand!"
@@ -28,7 +28,7 @@ module BOAST
28
28
 
29
29
  def get_c_strings
30
30
  return { :if => '"if (#{cond}) {"',
31
- :else_if => '"} else if (#{cond}) {"',
31
+ :elsif => '"} else if (#{cond}) {"',
32
32
  :else => '"} else {"',
33
33
  :end => '"}"' }
34
34
  end
@@ -3,14 +3,19 @@ module BOAST
3
3
  class Index < Expression
4
4
  attr_reader :source
5
5
  attr_reader :indexes
6
+ attr_accessor :align
6
7
 
7
8
  def initialize(source, indexes)
8
9
  @source = source
9
10
  @indexes = indexes
10
11
  end
11
12
 
13
+ def align?
14
+ return !!@align
15
+ end
16
+
12
17
  def to_var
13
- var = @source.copy("#{self}", :const => nil, :constant => nil, :dim => nil, :dimension => nil, :direction => nil, :dir => nil)
18
+ var = @source.copy("#{self}", :const => nil, :constant => nil, :dim => nil, :dimension => nil, :direction => nil, :dir => nil, :align => align)
14
19
  return var
15
20
  end
16
21
 
@@ -0,0 +1,241 @@
1
+ module BOAST
2
+
3
+ X86 = 1
4
+ ARM = 2
5
+
6
+ module Intrinsics
7
+ INTRINSICS = Hash::new { |h, k| h[k] = Hash::new { |h2, k2| h2[k2] = {} } }
8
+
9
+ def intrinsics
10
+ return INTRINSICS
11
+ end
12
+
13
+ module_function :intrinsics
14
+
15
+ def get_vector_name( type )
16
+ s = ""
17
+ case type
18
+ when Int
19
+ s += "u" if type.signed?
20
+ s += "int"
21
+ when Real
22
+ s += "float"
23
+ else
24
+ raise "Undefined vector type!"
25
+ end
26
+ s += "#{type.size*8}"
27
+ s += "x#{type.vector_length}"
28
+ return s.to_sym
29
+ end
30
+
31
+ module_function :get_vector_name
32
+
33
+ def vector_type_name( type, size, vector_size, sign = :signed )
34
+ s = ""
35
+ case type
36
+ when :int
37
+ case sign
38
+ when :signed
39
+ s += "int"
40
+ when :unsigned
41
+ s += "uint"
42
+ else
43
+ raise "Invalid sign!"
44
+ end
45
+ when :float
46
+ s += "float"
47
+ else
48
+ raise "Invalid type!"
49
+ end
50
+ s += "#{size}"
51
+ s += "x#{vector_size/size}"
52
+ return s.to_sym
53
+ end
54
+
55
+ module_function :vector_type_name
56
+
57
+ def type_name_ARM( type, size, sign = :signed )
58
+ s = ""
59
+ case type
60
+ when :int
61
+ case sign
62
+ when :signed
63
+ s += "s"
64
+ when :unsigned
65
+ s += "u"
66
+ else
67
+ raise "Invalid sign!"
68
+ end
69
+ when :float
70
+ s += "f"
71
+ else
72
+ raise "Invalid type!"
73
+ end
74
+ s += "#{size}"
75
+ return s
76
+ end
77
+
78
+ module_function :type_name_ARM
79
+
80
+ def type_name_X86( type, size, vector_size, sign = :signed )
81
+ s = ""
82
+ e = ( vector_size > 64 ? "e" : "" )
83
+ case type
84
+ when :int
85
+ s += "#{e}p"
86
+ case sign
87
+ when :signed
88
+ s += "i"
89
+ when :unsigned
90
+ s += "u"
91
+ else
92
+ raise "Invalid sign!"
93
+ end
94
+ s += "#{size}"
95
+ when :float
96
+ s += "p"
97
+ case size
98
+ when 32
99
+ s += "s"
100
+ when 64
101
+ s += "d"
102
+ else
103
+ raise "Invalid size!"
104
+ end
105
+ else
106
+ raise "Invalid type!"
107
+ end
108
+ return s
109
+ end
110
+
111
+ module_function :type_name_X86
112
+
113
+ [64, 128, 256].each { |vector_size|
114
+ vs = ( vector_size < 256 ? "" : "#{vector_size}" )
115
+ sizes = [8, 16, 32]
116
+ sizes.push( 64 ) if vector_size > 64
117
+ sizes.each { |size|
118
+ [:signed, :unsigned].each { |sign|
119
+ vtype = vector_type_name( :int, size, vector_size, sign )
120
+ type = type_name_X86( :int, size, vector_size )
121
+ instructions = [[:ADD, "add"], [:SUB, "sub"]]
122
+ instructions.push( [:SET, "setr"], [:SET1, "set1"] )
123
+ instructions.push( [:MUL, "mullo"] ) if vector_size > 64 and size >= 16 and size <= 32
124
+ instructions.each { |cl, ins|
125
+ INTRINSICS[X86][cl][vtype] = "_mm#{vs}_#{ins}_#{type}".to_sym
126
+ }
127
+ if size == 64 and vector_size < 512 then
128
+ INTRINSICS[X86][:SET1][vtype] = "_mm#{vs}_set1_#{type}x".to_sym
129
+ end
130
+ }
131
+ }
132
+ [8, 16, 32, 64].each { |size|
133
+ [:signed, :unsigned].each { |sign|
134
+ vtype = vector_type_name( :int, size, vector_size, sign )
135
+ [[:LOAD, "loadu"], [:LOADA, "load"],
136
+ [:STORE, "storeu"], [:STOREA, "store"]].each { |cl, ins|
137
+ INTRINSICS[X86][cl][vtype] = "_mm#{vs}_#{ins}_si#{vector_size}".to_sym
138
+ }
139
+ }
140
+ } if vector_size > 64
141
+ sizes = []
142
+ sizes.push( 32, 64 ) if vector_size > 64
143
+ sizes.each { |size|
144
+ [[:ADD, "add"], [:SUB, "sub"], [:MUL, "mul"], [:DIV, "div"],
145
+ [:FMADD, "fmadd"], [:FMSUB, "fmsub"], [:FNMADD, "fnmadd"], [:FNMSUB, "fnmsub"],
146
+ [:ADDSUB, "addsub"], [:FMADDSUB, "fmaddsub"], [:FMSUBADD, "fmsubadd"],
147
+ [:LOAD, "loadu"], [:LOADA, "load"],
148
+ [:STORE, "storeu"], [:STOREA, "store"],
149
+ [:SET, "set"], [:SET1, "set1"] ].each { |cl, ins|
150
+ vtype = vector_type_name( :float, size, vector_size)
151
+ type = type_name_X86( :float, size, vector_size )
152
+ INTRINSICS[X86][cl][vtype] = "_mm#{vs}_#{ins}_#{type}".to_sym
153
+ }
154
+ }
155
+ }
156
+ INTRINSICS[X86][:CVT] = Hash::new { |h,k| h[k] = {} }
157
+ [128, 256].each { |bvsize|
158
+ [16, 32, 64].each { |bsize|
159
+ ssize = bsize/2
160
+ while ssize >= 8
161
+ svsize = (bvsize/bsize)*ssize
162
+ [:signed, :unsigned].each { |sign|
163
+ stype = type_name_X86( :int, ssize, 128, sign )
164
+ btype = type_name_X86( :int, bsize, bvsize, :signed )
165
+ svtype = vector_type_name( :int, ssize, svsize, sign )
166
+ bvtype = vector_type_name( :int, bsize, bvsize, :signed )
167
+ vs = ( bvsize < 256 ? "" : "#{bvsize}" )
168
+ INTRINSICS[X86][:CVT][bvtype][svtype] = "_mm#{vs}_cvt#{stype}_#{btype}".to_sym
169
+ }
170
+ ssize /= 2
171
+ end
172
+ }
173
+ }
174
+
175
+
176
+ [64, 128].each { |vector_size|
177
+ q = (vector_size == 128 ? "q" : "")
178
+ [8, 16, 32, 64].each { |size|
179
+ [:signed, :unsigned].each { |sign|
180
+ vtype = vector_type_name( :int, size, vector_size, sign )
181
+ type = type_name_ARM( :int, size, sign )
182
+ instructions = [[:ADD, "add"], [:SUB, "sub"]]
183
+ instructions.push( [:MUL, "mul"], [:FMADD, "mla"], [:FNMSUB, "mls"] ) if size < 64
184
+ instructions.push( [:LOAD, "ldl"], [:LOADA, "ldl"] )
185
+ instructions.push( [:STORE, "stl"], [:STOREA, "stl"] )
186
+ instructions.each { |cl, ins|
187
+ INTRINSICS[ARM][cl][vtype] = "v#{ins}#{q}_#{type}".to_sym
188
+ }
189
+ [[:SET1, "dup"]].each { |cl, ins|
190
+ INTRINSICS[ARM][cl][vtype] = "v#{ins}#{q}_n_#{type}".to_sym
191
+ }
192
+ [[:SET_LANE, "set"]].each { |cl, ins|
193
+ INTRINSICS[ARM][cl][vtype] = "v#{ins}#{q}_lane_#{type}".to_sym
194
+ }
195
+ }
196
+ }
197
+ [32].each { |size|
198
+ vtype = vector_type_name( :float, size, vector_size )
199
+ type = type_name_ARM( :float, size )
200
+ [[:ADD, "add"], [:SUB, "sub"], [:MUL, "mul"],
201
+ [:FMADD, "mla"], [:FNMSUB, "mls"],
202
+ [:LOAD, "ldl"], [:LOADA, "ldl"],
203
+ [:STORE, "stl"], [:STOREA, "stl"]].each { |cl, ins|
204
+ INTRINSICS[ARM][cl][vtype] = "v#{ins}#{q}_#{type}".to_sym
205
+ }
206
+ [[:SET1, "dup"]].each { |cl, ins|
207
+ INTRINSICS[ARM][cl][vtype] = "v#{ins}#{q}_n_#{type}".to_sym
208
+ }
209
+ }
210
+ }
211
+ INTRINSICS[ARM][:CVT] = Hash::new { |h,k| h[k] = {} }
212
+ [64, 128].each { |vector_size|
213
+ int_size = 32
214
+ float_size = 32
215
+ q = (vector_size == 128 ? "q" : "")
216
+ [:signed, :unsigned].each { |sign|
217
+ fvtype = vector_type_name( :float, float_size, vector_size )
218
+ ivtype = vector_type_name( :int, int_size, vector_size, sign )
219
+ ftype = type_name_ARM( :float, float_size )
220
+ itype = type_name_ARM( :int, int_size, sign )
221
+ INTRINSICS[ARM][:CVT][fvtype][ivtype] = "vcvt#{q}_#{itype}_#{ftype}".to_sym
222
+ INTRINSICS[ARM][:CVT][ivtype][fvtype] = "vcvt#{q}_#{ftype}_#{itype}".to_sym
223
+ }
224
+ }
225
+ svsize = 64
226
+ bvsize = 128
227
+ [16, 32, 64].each { |bsize|
228
+ ssize = bsize/2
229
+ [:signed, :unsigned].each { |sign|
230
+ stype = type_name_ARM( :int, ssize, sign )
231
+ btype = type_name_ARM( :int, bsize, sign )
232
+ svtype = vector_type_name( :int, ssize, svsize, sign )
233
+ bvtype = vector_type_name( :int, bsize, bvsize, sign )
234
+ INTRINSICS[ARM][:CVT][svtype][bvtype] = "vmovl_#{stype}".to_sym
235
+ INTRINSICS[ARM][:CVT][bvtype][svtype] = "vmovn_#{btype}".to_sym
236
+ }
237
+ }
238
+
239
+ end
240
+
241
+ end
@@ -2,113 +2,18 @@ module BOAST
2
2
 
3
3
  class Operator
4
4
  extend PrivateStateAccessor
5
+ extend Intrinsics
5
6
 
6
7
  def Operator.inspect
7
8
  return "#{name}"
8
9
  end
9
10
 
10
- def Operator.get_vector_name(type)
11
- case get_architecture
12
- when X86
13
- case type
14
- when Int
15
- size = "#{type.size*8}"
16
- name = ""
17
- if type.total_size*8 > 64
18
- name += "e"
19
- end
20
- if type.vector_length > 1 then
21
- name += "p"
22
- else
23
- name = "s"
24
- end
25
- if type.signed then
26
- name += "i"
27
- else
28
- name += "u"
29
- end
30
- return name += size
31
- when Real
32
- case type.size
33
- when 4
34
- return "ps" if type.vector_length > 1
35
- return "ss"
36
- when 8
37
- return "pd" if type.vector_length > 1
38
- return "sd"
39
- end
40
- else
41
- raise "Undefined vector type!"
42
- end
43
- when ARM
44
- case type
45
- when Int
46
- name = "#{ type.signed ? "s" : "u" }"
47
- name += "#{ type.size * 8}"
48
- return name
49
- when Real
50
- return "f#{type.size*8}"
51
- else
52
- raise "Undefined vector type!"
53
- end
54
- else
55
- raise "Unsupported architecture!"
56
- end
57
- end
58
-
59
11
  def Operator.convert(arg, type)
60
- case get_architecture
61
- when X86
62
- s1 = arg.type.total_size*8
63
- s2 = type.total_size*8
64
- n1 = get_vector_name(arg.type)
65
- n2 = get_vector_name(type)
66
- if s1 <= 128 and s2 <= 128 then
67
- return "_mm_cvt#{n1}_#{n2}( #{arg} )"
68
- elsif [s1, s2].max <= 256 then
69
- return "_mm256_cvt#{n1}_#{n2}( #{arg} )"
70
- elsif [s1, s2].max <= 512 then
71
- return "_mm512_cvt#{n1}_#{n2}( #{arg} )"
72
- end
73
- when ARM
74
- if type.class != arg.type.class then
75
- if type.size == arg.type.size then
76
- s = type.total_size*8
77
- n1 = get_vector_name(arg.type)
78
- n2 = get_vector_name(type)
79
- return "vcvt#{ s == 128 ? "q" : "" }_#{n2}_#{n1}( #{arg} )"
80
- elsif type.class == Real then
81
- intr = convert(arg, arg.type.copy(:size=>type.size))
82
- return convert(arg.copy(intr, :size => type.size ), type)
83
- else
84
- n1 = get_vector_name(arg.type)
85
- s = type.total_size*8
86
- t2 = type.copy(:size => arg.type.size)
87
- n2 = get_vector_name( t2 )
88
- intr = "vcvt#{ s == 128 ? "q" : "" }_#{n2}_#{n1}( #{arg} )"
89
- return convert(Variable::from_type(intr, t2), type)
90
- end
91
- elsif type.class != Real then
92
- n = get_vector_name(arg.type)
93
- if type.size == arg.type.size then
94
- if type.signed == arg.type.signed then
95
- return "#{arg}"
96
- else
97
- n2 = get_vector_name(type)
98
- return "vreinterpret_#{n2}_#{n}( #{arg} )"
99
- end
100
- elsif type.size < arg.type.size then
101
- intr = "vmovn_#{n}( #{arg} )"
102
- s = arg.type.size/2
103
- else
104
- intr = "vmovl_#{n}( #{arg} )"
105
- s = arg.type.size*2
106
- end
107
- return convert(arg.copy(intr, :size => s), type)
108
- end
109
- else
110
- raise "Unsupported architecture!"
111
- end
12
+ return "convert_#{type.decl}( #{arg} )" if lang == CL
13
+
14
+ instruction = intrinsics[get_architecture][:CVT][get_vector_name(type)][get_vector_name(arg.type)]
15
+ raise "Unavailable conversion from #{get_vector_name(arg.type)} to #{get_vector_name(type)}!" if not instruction
16
+ return "#{instruction}( #{arg} )"
112
17
  end
113
18
 
114
19
  end
@@ -120,44 +25,11 @@ module BOAST
120
25
  if lang == C and (arg1.class == Variable and arg2.class == Variable) and (arg1.type.vector_length > 1 or arg2.type.vector_length > 1) then
121
26
  raise "Vectors have different length: #{arg1} #{arg1.type.vector_length}, #{arg2} #{arg2.type.vector_length}" if arg1.type.vector_length != arg2.type.vector_length
122
27
  #puts "#{arg1.type.signed} #{arg2.type.signed} #{return_type.type.signed}"
123
- return_name = get_vector_name(return_type.type)
124
- size = return_type.type.total_size * 8
125
- case get_architecture
126
- when X86
127
- if arg1.type != return_type.type
128
- a1 = convert(arg1, return_type.type)
129
- else
130
- a1 = "#{arg1}"
131
- end
132
- if arg2.type != return_type.type
133
- a2 = convert(arg2, return_type.type)
134
- else
135
- a2 = "#{arg2}"
136
- end
137
- intr_name = "_mm"
138
- if size > 128 then
139
- intr_name += "#{size}"
140
- end
141
- intr_name += "_#{intr_name_X86}_#{return_name}"
142
- return "#{intr_name}( #{a1}, #{a2} )"
143
- when ARM
144
- if arg1.type.class != return_type.type.class then
145
- a1 = convert(arg1, return_type.type)
146
- else
147
- a1 = "#{arg1}"
148
- end
149
- if arg2.type.class != return_type.type.class then
150
- a2 = convert(arg2, return_type.type)
151
- else
152
- a2 = "#{arg2}"
153
- end
154
- intr_name = "#{intr_name_ARM}"
155
- intr_name += "q" if size == 128
156
- intr_name += "_" + return_name + "( #{a1}, #{a2} )"
157
- return intr_name
158
- else
159
- raise "Unsupported architecture!"
160
- end
28
+ instruction = intrinsics[get_architecture][intr_symbol][get_vector_name(return_type.type)]
29
+ raise "Unavailable operator #{symbol} for #{get_vector_name(return_type.type)}!" unless instruction
30
+ a1 = ( arg1.type != return_type.type ? convert(arg1, return_type.type) : "#{arg1}" )
31
+ a2 = ( arg2.type != return_type.type ? convert(arg2, return_type.type) : "#{arg2}" )
32
+ return "#{instruction}( #{a1}, #{a2} )"
161
33
  else
162
34
  return basic_usage( arg1, arg2 )
163
35
  end
@@ -168,31 +40,34 @@ module BOAST
168
40
  class Set < Operator
169
41
 
170
42
  def Set.to_s(arg1, arg2, return_type)
171
- if lang == C then
43
+ if lang == C or lang == CL then
172
44
  if arg1.class == Variable and arg1.type.vector_length > 1 then
173
- if arg1.type == arg2.type then
174
- return basic_usage(arg1, arg2)
175
- elsif arg1.type.vector_length == arg2.type.vector_length then
176
- return "(#{arg1} = #{convert(arg2, arg1.type)})"
177
- elsif arg2.type.vector_length == 1 then
178
- size = arg1.type.total_size*8
179
- case get_architecture
180
- when ARM
181
- intr_name = "vmov"
182
- intr_name += "q" if size == 128
183
- intr_name += "_n_#{get_vector_name(arg1.type)}"
184
- when X86
185
- return "(#{arg1} = _m_from_int64( #{a2} ))" if arg1.type.class == Int and arg1.type.size == 8 and size == 64
186
- intr_name = "_mm"
187
- if size > 128 then
188
- intr_name += "#{size}"
189
- end
190
- intr_name += "_set1_#{get_vector_name(arg1.type).gsub("u","")}"
191
- intr_name += "x" if arg1.type.class == Int and arg1.type.size == 8
45
+ if arg2.kind_of?( Array ) then
46
+ raise "Invalid array length!" unless arg2.length == arg1.type.vector_length
47
+ return "#{arg1} = (#{arg1.type.decl})( #{arg2.join(", ")} )" if lang == CL
48
+
49
+ instruction = intrinsics[get_architecture][:SET][get_vector_name(arg1.type)]
50
+ if not instruction then
51
+ instruction = intrinsics[get_architecture][:SET_LANE][get_vector_name(arg1.type)]
52
+ raise "Unavailable operator set for #{get_vector_name(arg1.type)}!" unless instruction
53
+ s = "#{arg1}"
54
+ arg2.each_with_index { |v,i|
55
+ s = "#{instruction}(#{v}, #{s}, #{i})"
56
+ }
57
+ return "#{arg1} = #{s}"
192
58
  else
193
- raise "Unsupported architecture!"
59
+ return "#{arg1} = #{instruction}( #{arg2.join(", ")} )"
194
60
  end
195
- return "(#{arg1} = #{intr_name}( #{arg2} ))"
61
+ elsif arg2.class != Variable or arg2.type.vector_length == 1 then
62
+ return "#{arg1} = (#{arg1.type.decl})( #{arg2} )" if lang == CL
63
+
64
+ instruction = intrinsics[get_architecture][:SET1][get_vector_name(arg1.type)]
65
+ raise "Unavailable operator set1 for #{get_vector_name(arg1.type)}!" unless instruction
66
+ return "#{arg1} = #{instruction}( #{arg2} )"
67
+ elsif arg1.type == arg2.type then
68
+ return basic_usage(arg1, arg2)
69
+ elsif arg1.type.vector_length == arg2.type.vector_length then
70
+ return "#{arg1} = #{convert(arg2, arg1.type)}"
196
71
  else
197
72
  raise "Unknown convertion between vector of different length!"
198
73
  end
@@ -223,111 +98,92 @@ module BOAST
223
98
 
224
99
  end
225
100
 
226
- class Affectation < Operator
227
-
228
- def Affectation.to_s(arg1, arg2, return_type)
229
- if lang == C then
230
- if arg1.class == Variable and arg1.type.vector_length > 1 then
231
- #puts "#{arg1.type.vector_length} #{arg2.type.vector_length}"
232
- if arg1.type == arg2.type then
233
- return basic_usage(arg1, arg2)
234
- elsif arg1.type.vector_length == arg2.type.vector_length then
235
- return "#{arg1} = #{convert(arg2, arg1.type)}"
236
- elsif arg2.type.vector_length == 1 then
237
- size = arg1.type.total_size*8
238
- a2 = "#{arg2}"
239
- if a2[0] != "*" then
240
- a2 = "&" + a2
241
- else
242
- a2 = a2[1..-1]
243
- end
244
- case get_architecture
245
- when ARM
246
- intr_name = "vldl"
247
- intr_name += "q" if size == 128
248
- intr_name += "_#{get_vector_name(arg1.type)}"
249
- when X86
250
- if arg1.type.class == Int and size == 64 then
251
- return "#{arg1} = _m_from_int64( *((int64_t * ) #{a2} ) )"
252
- end
253
- intr_name = "_mm"
254
- if size > 128 then
255
- intr_name += "#{size}"
256
- end
257
- intr_name += "_load_"
258
- if arg1.type.class == Int then
259
- intr_name += "si#{size}"
260
- else
261
- intr_name += "#{get_vector_name(arg1.type)}"
262
- end
101
+ class Load < Operator
102
+
103
+ def Load.to_s(arg1, arg2, return_type)
104
+ if lang == C or lang == CL then
105
+ if arg1 then
106
+ if arg1.class == Variable and arg1.type.vector_length > 1 then
107
+ if arg2.kind_of?( Array ) then
108
+ return Set.to_s(arg1, arg2, return_type)
109
+ elsif arg1.type == arg2.type then
110
+ return Affectation.basic_usage(arg1, arg2)
111
+ elsif arg1.type.vector_length == arg2.type.vector_length then
112
+ return "#{arg1} = #{convert(arg2, arg1.type)}"
113
+ elsif arg2.type.vector_length == 1 then
114
+ return "#{arg1} = #{Load.to_s(nil, arg2, arg1)}"
263
115
  else
264
- raise "Unsupported architecture!"
116
+ raise "Unknown convertion between vectors of different length!"
265
117
  end
266
- return "#{arg1} = #{intr_name}( (#{arg1.type.decl} * ) #{a2} )"
267
118
  else
268
- raise "Unknown convertion between vectors of different length!"
119
+ Affectation.basic_usage(arg1, arg2)
269
120
  end
270
- elsif arg2.class == Variable and arg2.type.vector_length > 1 then
271
- size = arg2.type.total_size*8
272
- a1 = "#{arg1}"
273
- if a1[0] != "*" then
274
- a1 = "&" + a1
121
+ elsif arg2.class == Variable and arg2.type.vector_length == 1 then
122
+ a2 = "#{arg2}"
123
+ if a2[0] != "*" then
124
+ a2 = "&" + a2
275
125
  else
276
- a1 = a1[1..-1]
126
+ a2 = a2[1..-1]
277
127
  end
278
- case get_architecture
279
- when ARM
280
- intr_name = "vstl"
281
- intr_name += "q" if size == 128
282
- intr_name += "_#{get_vector_name(arg2.type)}"
283
- when X86
284
- if arg2.type.class == Int and size == 64 then
285
- return " *((int64_t * ) #{a1}) = _m_to_int64( #{arg2} )"
286
- end
287
- intr_name = "_mm"
288
- if size > 128 then
289
- intr_name += "#{size}"
290
- end
291
- intr_name += "_store_"
292
- if arg2.type.class == Int then
293
- intr_name += "si#{size}"
294
- else
295
- intr_name += "#{get_vector_name(arg2.type)}"
296
- end
128
+
129
+ return "vload#{return_type.type.vector_length}(0, #{a2})" if lang == CL
130
+ return "#{arg1} = _m_from_int64( *((int64_t * ) #{a2} ) )" if get_architecture == X86 and arg2.type.total_size*8 == 64
131
+
132
+ if arg2.align == return_type.type.total_size then
133
+ instruction = intrinsics[get_architecture][:LOADA][get_vector_name(return_type.type)]
297
134
  else
298
- raise "Unsupported architecture!"
135
+ instruction = intrinsics[get_architecture][:LOAD][get_vector_name(return_type.type)]
299
136
  end
300
- return "#{intr_name}((#{arg2.type.decl} * ) #{a1}, #{arg2} )"
137
+ raise "Unavailable operator load for #{get_vector_name(return_type.type)}!" unless instruction
138
+ return "#{instruction}( #{a2} )"
301
139
  else
302
- return basic_usage(arg1, arg2)
140
+ return "#{arg2}"
303
141
  end
304
- elsif lang == CL then
305
- if arg1.class == Variable and arg1.type.vector_length > 1 then
306
- if arg2.class == Variable and arg2.type.vector_length == arg1.type.vector_length then
307
- return "#{arg1} = convert_#{arg1.type.decl}(#{arg2})"
308
- else
309
- a2 = "#{arg2}"
310
- if a2[0] != "*" then
311
- a2 = "&" + a2
312
- else
313
- a2 = a2[1..-1]
314
- end
315
- return "#{arg1} = vload#{arg1.type.vector_length}(0, #{a2})"
316
- end
317
- elsif arg2.class == Variable and arg2.type.vector_length > 1 then
318
- a1 = "#{arg1}"
319
- if a1[0] != "*" then
320
- a1 = "&" + a1
321
- else
322
- a1 = a1[1..-1]
323
- end
324
- return "vstore#{arg2.type.vector_length}(#{arg2}, 0, #{a1})"
142
+ end
143
+ return Affectation.basic_usage(arg1, arg2) if arg1
144
+ return "#{arg2}"
145
+ end
146
+
147
+ end
148
+
149
+ class Store < Operator
150
+
151
+ def Store.to_s(arg1, arg2, return_type)
152
+ if lang == C or lang == CL then
153
+ a1 = "#{arg1}"
154
+ if a1[0] != "*" then
155
+ a1 = "&" + a1
325
156
  else
326
- return basic_usage(arg1, arg2)
157
+ a1 = a1[1..-1]
327
158
  end
328
- else
329
- return basic_usage(arg1, arg2)
159
+
160
+ return "vstore#{arg2.type.vector_length}(#{arg2}, 0, #{a1})" if lang == CL
161
+ return "*((int64_t * ) #{a1}) = _m_to_int64( #{arg2} )" if get_architecture == X86 and arg2.type.total_size*8 == 64
162
+
163
+ if arg1.align == arg2.type.total_size then
164
+ instruction = intrinsics[get_architecture][:STOREA][get_vector_name(arg2.type)]
165
+ else
166
+ instruction = intrinsics[get_architecture][:STORE][get_vector_name(arg2.type)]
167
+ end
168
+ raise "Unavailable operator store for #{get_vector_name(arg2.type)}!" unless instruction
169
+ p_type = arg2.type.copy(:vector_length => 1)
170
+ p_type = arg2.type if get_architecture == X86 and arg2.type.kind_of?(Int)
171
+ return "#{instruction}( (#{p_type.decl} * ) #{a1}, #{arg2} )"
330
172
  end
173
+ return Affectation.basic_usage(arg1, arg2)
174
+ end
175
+
176
+ end
177
+
178
+ class Affectation < Operator
179
+
180
+ def Affectation.to_s(arg1, arg2, return_type)
181
+ if arg1.class == Variable and arg1.type.vector_length > 1 then
182
+ return Load.to_s(arg1, arg2, return_type)
183
+ elsif arg2.class == Variable and arg2.type.vector_length > 1 then
184
+ return Store.to_s(arg1, arg2, return_type)
185
+ end
186
+ return basic_usage(arg1, arg2)
331
187
  end
332
188
 
333
189
  def Affectation.basic_usage(arg1, arg2)
@@ -344,12 +200,8 @@ module BOAST
344
200
  return "*"
345
201
  end
346
202
 
347
- def intr_name_X86
348
- return "mul"
349
- end
350
-
351
- def intr_name_ARM
352
- return "vmul"
203
+ def intr_symbol
204
+ return :MUL
353
205
  end
354
206
 
355
207
  def basic_usage(arg1, arg2)
@@ -368,14 +220,10 @@ module BOAST
368
220
  return "+"
369
221
  end
370
222
 
371
- def intr_name_X86
372
- return "add"
223
+ def intr_symbol
224
+ return :ADD
373
225
  end
374
226
 
375
- def intr_name_ARM
376
- return "vadd"
377
- end
378
-
379
227
  def basic_usage(arg1, arg2)
380
228
  return "#{arg1} + #{arg2}"
381
229
  end
@@ -392,14 +240,10 @@ module BOAST
392
240
  return "-"
393
241
  end
394
242
 
395
- def intr_name_X86
396
- return "sub"
243
+ def intr_symbol
244
+ return :SUB
397
245
  end
398
246
 
399
- def intr_name_ARM
400
- return "vsub"
401
- end
402
-
403
247
  def basic_usage(arg1, arg2)
404
248
  return "#{arg1} - (#{arg2})"
405
249
  end
@@ -416,14 +260,10 @@ module BOAST
416
260
  return "/"
417
261
  end
418
262
 
419
- def intr_name_X86
420
- return "div"
263
+ def intr_symbol
264
+ return :DIV
421
265
  end
422
266
 
423
- def intr_name_ARM
424
- raise "Neon doesn't support division!"
425
- end
426
-
427
267
  def basic_usage(arg1, arg2)
428
268
  return "(#{arg1}) / (#{arg2})"
429
269
  end
@@ -89,22 +89,23 @@ module BOAST
89
89
  end
90
90
 
91
91
  def close_c
92
- decrement_indent_level
93
92
  s = ""
94
- s += " return #{@properties[:return]};\n" if @properties[:return]
95
- s += "}"
93
+ s += indent + "return #{@properties[:return]};\n" if @properties[:return]
94
+ decrement_indent_level
95
+ s += indent + "}"
96
96
  output.puts s
97
97
  return self
98
98
  end
99
99
 
100
100
  def close_fortran
101
- decrement_indent_level
102
101
  s = ""
103
102
  if @properties[:return] then
104
- s += " #{@name} = #{@properties[:return]}\n"
105
- s += "END FUNCTION #{@name}"
103
+ s += indent + "#{@name} = #{@properties[:return]}\n"
104
+ decrement_indent_level
105
+ s += indent + "END FUNCTION #{@name}"
106
106
  else
107
- s += "END SUBROUTINE #{@name}"
107
+ decrement_indent_level
108
+ s += indent + "END SUBROUTINE #{@name}"
108
109
  end
109
110
  output.puts s
110
111
  return self
@@ -125,7 +126,13 @@ module BOAST
125
126
  end
126
127
 
127
128
  def decl_fortran
128
- raise "Interfaces are not implemented in FORTRAN yet!"
129
+ output.puts indent + "INTERFACE"
130
+ increment_indent_level
131
+ open_fortran
132
+ close_fortran
133
+ decrement_indent_level
134
+ output.puts indent + "END INTERFACE"
135
+ return self
129
136
  end
130
137
 
131
138
  def decl_c_s
@@ -152,6 +159,13 @@ module BOAST
152
159
  s += "__launch_bounds__(#{wgs[0]}*#{wgs[1]}*#{wgs[2]}) "
153
160
  end
154
161
  end
162
+ elsif lang == C then
163
+ if @properties[:local] then
164
+ s += "static "
165
+ end
166
+ if @properties[:inline] then
167
+ s+= "inline "
168
+ end
155
169
  end
156
170
  if @properties[:qualifiers] then
157
171
  s += "#{@properties[:qualifiers]} "
@@ -173,7 +187,7 @@ module BOAST
173
187
  end
174
188
 
175
189
  def decl_c
176
- s = decl_c_s + ";"
190
+ s = indent + decl_c_s + ";"
177
191
  output.puts s
178
192
  return self
179
193
  end
@@ -196,10 +210,13 @@ module BOAST
196
210
  s += "SUBROUTINE "
197
211
  end
198
212
  s += "#{@name}("
199
- s += parameters.join(", ")
213
+ s += parameters.collect(&:name).join(", ")
200
214
  s += ")"
201
215
  end
202
216
 
217
+ def pr_align
218
+ end
219
+
203
220
  def open_c
204
221
  s = decl_c_s + "{"
205
222
  output.puts s
@@ -209,14 +226,14 @@ module BOAST
209
226
  }
210
227
  if lang == C then
211
228
  parameters.each { |p|
212
- p.align
229
+ p.pr_align
213
230
  }
214
231
  end
215
232
  return self
216
233
  end
217
234
 
218
235
  def open_fortran
219
- s = to_s_fortran
236
+ s = indent + to_s_fortran
220
237
  s += "\n"
221
238
  increment_indent_level
222
239
  s += indent + "integer, parameter :: wp=kind(1.0d0)"
@@ -226,7 +243,7 @@ module BOAST
226
243
  }
227
244
  parameters.each { |p|
228
245
  p.decl
229
- p.align
246
+ p.pr_align
230
247
  }
231
248
  return self
232
249
  end
@@ -137,7 +137,9 @@ module BOAST
137
137
  attr_reader :texture
138
138
  attr_reader :sampler
139
139
  attr_reader :restrict
140
- attr_reader :align
140
+ attr_reader :deferred_shape
141
+ attr_reader :optional
142
+ attr_accessor :align
141
143
  attr_accessor :replace_constant
142
144
  attr_accessor :force_replace_constant
143
145
 
@@ -177,10 +179,18 @@ module BOAST
177
179
  !!@scalar_output
178
180
  end
179
181
 
182
+ def optional?
183
+ !!@optional
184
+ end
185
+
180
186
  def align?
181
187
  !!@align
182
188
  end
183
189
 
190
+ def deferred_shape?
191
+ !!@deferred_shape
192
+ end
193
+
184
194
  def initialize(name,type,hash={})
185
195
  @name = name.to_s
186
196
  @direction = hash[:direction] ? hash[:direction] : hash[:dir]
@@ -191,6 +201,8 @@ module BOAST
191
201
  @allocate = hash[:allocate]
192
202
  @restrict = hash[:restrict]
193
203
  @align = hash[:align]
204
+ @deferred_shape = hash[:deferred_shape]
205
+ @optional = hash[:optional]
194
206
  @force_replace_constant = false
195
207
  if not hash[:replace_constant].nil? then
196
208
  @replace_constant = hash[:replace_constant]
@@ -303,7 +315,7 @@ module BOAST
303
315
  return s
304
316
  end
305
317
 
306
- def decl_ffi(alloc = false)
318
+ def decl_ffi(alloc, lang)
307
319
  return :pointer if lang == FORTRAN and not alloc
308
320
  return :pointer if dimension?
309
321
  return :pointer if @direction == :out or @direction == :inout and not alloc
@@ -335,7 +347,7 @@ module BOAST
335
347
  }.join("][")
336
348
  s += "]"
337
349
  else
338
- if dimension? and not constant? and not allocate? and (not local? or (local? and device)) then
350
+ if dimension? and not constant? and not ( allocate? and @allocate != :heap ) and (not local? or (local? and device)) then
339
351
  s += " *"
340
352
  if restrict? and not decl_module? then
341
353
  if lang == CL
@@ -352,13 +364,13 @@ module BOAST
352
364
  if dimension? and constant? then
353
365
  s += "[]"
354
366
  end
355
- if dimension? and ((local? and not device) or (allocate? and not constant?)) then
367
+ if dimension? and ((local? and not device) or ( ( allocate? and @allocate != :heap ) and not constant?)) then
356
368
  s +="[("
357
369
  s += @dimension.collect{ |d| d.to_s }.reverse.join(")*(")
358
370
  s +=")]"
359
371
  end
360
372
  end
361
- if dimension? and (align? or default_align > 1) and (constant? or allocate?) then
373
+ if dimension? and (align? or default_align > 1) and (constant? or (allocate? and @allocate != :heap ) ) then
362
374
  a = ( align? ? align : 1 )
363
375
  a = ( a >= default_align ? a : default_align )
364
376
  s+= " __attribute((aligned(#{a})))"
@@ -399,54 +411,111 @@ module BOAST
399
411
  return self
400
412
  end
401
413
 
402
- def align_c_s(a)
414
+ def pr_align_c_s(a)
403
415
  return "__assume_aligned(#{@name}, #{a})"
404
416
  end
405
417
 
406
- def align_c(a)
418
+ def pr_align_c(a)
407
419
  s = ""
408
420
  s += indent
409
- s += align_c_s(a)
421
+ s += pr_align_c_s(a)
410
422
  s += finalize
411
423
  output.print s
412
424
  return self
413
425
  end
414
426
 
415
- def align_fortran_s(a)
427
+ def pr_align_fortran_s(a)
416
428
  return "!DIR$ ASSUME_ALIGNED #{@name}: #{a}"
417
429
  end
418
430
 
419
- def align_fortran(a)
431
+ def pr_align_fortran(a)
420
432
  s = ""
421
433
  s += indent
422
- s += align_fortran_s(a)
434
+ s += pr_align_fortran_s(a)
423
435
  s += finalize
424
436
  output.print s
425
437
  return self
426
438
  end
427
439
 
428
- def align
440
+ def pr_align
429
441
  if dimension? then
430
442
  if align? or default_align > 1 then
431
443
  a = ( align? ? align : 1 )
432
444
  a = ( a >= default_align ? a : default_align )
433
- return align_c(a) if lang == C
434
- return align_fortran(a) if lang == FORTRAN
445
+ return pr_align_c(a) if lang == C
446
+ return pr_align_fortran(a) if lang == FORTRAN
435
447
  end
436
448
  end
437
449
  end
438
450
 
451
+ def alloc_fortran( dims = nil )
452
+ s = ""
453
+ s += indent
454
+ s += "allocate( #{name}("
455
+ s += dims.collect { |d| d.to_s }.join(", ")
456
+ s += ") )"
457
+ s += finalize
458
+ output.print s
459
+ return self
460
+ end
461
+
462
+ def alloc_c( dims = nil )
463
+ s = ""
464
+ s += indent
465
+ s += "#{name} = (#{@type.decl} *)malloc( sizeof(#{@type.decl})*("
466
+ s += dims.collect { |d| d.to_s }.reverse.join(")*(")
467
+ s += ") )"
468
+ s += finalize
469
+ output.print s
470
+ return self
471
+ end
472
+
473
+ def alloc( dims = nil )
474
+ @dimension = [dims].flatten if dims
475
+ dims = @dimension
476
+ raise "Cannot allocate array with unknown dimension!" unless dims
477
+ return alloc_fortran(dims) if lang == FORTRAN
478
+ return alloc_c(dims) if lang == C
479
+ end
480
+
481
+ def dealloc_fortran
482
+ s = ""
483
+ s += indent
484
+ s += "deallocate( #{name} )"
485
+ s += finalize
486
+ output.print s
487
+ return self
488
+ end
489
+
490
+ def dealloc_c
491
+ s = ""
492
+ s += indent
493
+ s += "free( #{name} )"
494
+ s += finalize
495
+ output.print s
496
+ return self
497
+ end
498
+
499
+ def dealloc
500
+ return dealloc_fortran if lang == FORTRAN
501
+ return dealloc_c if lang == C
502
+ end
503
+
439
504
  def decl_fortran
440
505
  s = ""
441
506
  s += indent
442
507
  s += @type.decl
443
- s += ", intent(#{@direction})" if @direction
508
+ s += ", intent(#{@direction})" if @direction
509
+ s += ", optional" if optional?
510
+ s += ", allocatable" if allocate? and @allocate == :heap
444
511
  s += ", parameter" if constant?
445
512
  if dimension? then
446
513
  s += ", dimension("
447
514
  s += @dimension.collect { |d|
448
515
  dim = d.to_s
449
- if dim then
516
+ if deferred_shape? or ( allocate? and @allocate == :heap )
517
+ ":"
518
+ elsif dim then
450
519
  dim.to_s
451
520
  else
452
521
  "*"
@@ -461,7 +530,7 @@ module BOAST
461
530
  end
462
531
  s += finalize
463
532
  output.print s
464
- if dimension? and (align? or default_align > 1) and (constant? or allocate?) then
533
+ if dimension? and (align? or default_align > 1) and (constant? or ( allocate? and @allocate != :heap ) ) then
465
534
  a = ( align? ? align : 1 )
466
535
  a = ( a >= default_align ? a : default_align )
467
536
  s = ""
@@ -0,0 +1,6 @@
1
+ module BOAST
2
+
3
+ module Vector
4
+ end
5
+
6
+ end
@@ -6,6 +6,7 @@ require 'systemu'
6
6
  require 'yaml'
7
7
  require 'pathname'
8
8
  require 'os'
9
+ require 'narray_ffi'
9
10
 
10
11
  module BOAST
11
12
 
@@ -10,6 +10,9 @@ module BOAST
10
10
 
11
11
  def fill_library_source
12
12
  fill_library_header
13
+ @kernels.each { |k|
14
+ k.procedure.boast_header
15
+ }
13
16
  @code.rewind
14
17
  get_output.write @code.read
15
18
  end
@@ -18,6 +18,7 @@ module BOAST
18
18
  :CLDEVICE => nil,
19
19
  :CLDEVICETYPE => nil,
20
20
  :MAQAO => 'maqao',
21
+ :MAQAO_FLAGS => '',
21
22
  :openmp => false
22
23
  }
23
24
 
@@ -29,7 +29,7 @@ module BOAST
29
29
  module #{module_name}
30
30
  extend FFI::Library
31
31
  ffi_lib "#{library_path}"
32
- attach_function :#{method_name}, [ #{@procedure.parameters.collect{ |p| ":"+p.decl_ffi.to_s }.join(", ")} ], :#{@procedure.properties[:return] ? @procedure.properties[:return].type.decl_ffi : "void" }
32
+ attach_function :#{method_name}, [ #{@procedure.parameters.collect{ |p| ":"+p.decl_ffi(false,@lang).to_s }.join(", ")} ], :#{@procedure.properties[:return] ? @procedure.properties[:return].type.decl_ffi(false,@lang) : "void" }
33
33
  def run(*args)
34
34
  if args.length < @procedure.parameters.length or args.length > @procedure.parameters.length + 1 then
35
35
  raise "Wrong number of arguments for \#{@procedure.name} (\#{args.length} for \#{@procedure.parameters.length})"
@@ -47,9 +47,9 @@ module BOAST
47
47
  r_args = {}
48
48
  if @lang == FORTRAN then
49
49
  @procedure.parameters.each_with_index { |p, i|
50
- if p.decl_ffi(true) != :pointer then
51
- arg_p = FFI::MemoryPointer::new(p.decl_ffi(true))
52
- arg_p.send("write_\#{p.decl_ffi(true)}",args[i])
50
+ if p.decl_ffi(true,@lang) != :pointer then
51
+ arg_p = FFI::MemoryPointer::new(p.decl_ffi(true, @lang))
52
+ arg_p.send("write_\#{p.decl_ffi(true, @lang)}",args[i])
53
53
  t_args.push(arg_p)
54
54
  r_args[p] = arg_p if p.scalar_output?
55
55
  else
@@ -59,8 +59,8 @@ module BOAST
59
59
  else
60
60
  @procedure.parameters.each_with_index { |p, i|
61
61
  if p.scalar_output? then
62
- arg_p = FFI::MemoryPointer::new(p.decl_ffi(true))
63
- arg_p.send("write_\#{p.decl_ffi(true)}",args[i])
62
+ arg_p = FFI::MemoryPointer::new(p.decl_ffi(true, @lang))
63
+ arg_p.send("write_\#{p.decl_ffi(true,@lang)}",args[i])
64
64
  t_args.push(arg_p)
65
65
  r_args[p] = arg_p
66
66
  else
@@ -87,7 +87,7 @@ module BOAST
87
87
  if r_args.length > 0 then
88
88
  ref_return = {}
89
89
  r_args.each { |p, p_arg|
90
- ref_return[p.name.to_sym] = p_arg.send("read_\#{p.decl_ffi(true)}")
90
+ ref_return[p.name.to_sym] = p_arg.send("read_\#{p.decl_ffi(true, @lang)}")
91
91
  }
92
92
  results[:reference_return] = ref_return
93
93
  end
@@ -16,9 +16,9 @@ module BOAST
16
16
  f2.close
17
17
 
18
18
  if verbose? then
19
- puts "#{compiler_options[:MAQAO]} cqa #{f1.path} --fct=#{@procedure.name}"
19
+ puts "#{compiler_options[:MAQAO]} cqa #{f1.path} --fct=#{@procedure.name} #{compiler_options[:MAQAO_FLAGS]}"
20
20
  end
21
- result = `#{compiler_options[:MAQAO]} cqa #{f1.path} --fct=#{@procedure.name}`
21
+ result = `#{compiler_options[:MAQAO]} cqa #{f1.path} --fct=#{@procedure.name} #{compiler_options[:MAQAO_FLAGS]}`
22
22
  File::unlink(library_object)
23
23
  File::unlink(library_source)
24
24
  return result
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: BOAST
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.6
4
+ version: 1.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brice Videau
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-24 00:00:00.000000000 Z
11
+ date: 2015-10-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: narray
@@ -188,6 +188,7 @@ files:
188
188
  - lib/BOAST/Language/If.rb
189
189
  - lib/BOAST/Language/Index.rb
190
190
  - lib/BOAST/Language/Inspectable.rb
191
+ - lib/BOAST/Language/Intrinsics.rb
191
192
  - lib/BOAST/Language/OpenMP.rb
192
193
  - lib/BOAST/Language/Operators.rb
193
194
  - lib/BOAST/Language/Optimization.rb
@@ -199,6 +200,7 @@ files:
199
200
  - lib/BOAST/Language/State.rb
200
201
  - lib/BOAST/Language/Transitions.rb
201
202
  - lib/BOAST/Language/Variable.rb
203
+ - lib/BOAST/Language/Vector.rb
202
204
  - lib/BOAST/Language/While.rb
203
205
  - lib/BOAST/Runtime/CKernel.rb
204
206
  - lib/BOAST/Runtime/CRuntime.rb