1
1
2
- # function unitstride(op::Operation, sym::Symbol)
3
- # (first(op.symbolic_metadata) === sym) && (first(op.numerical_metadata) == 1)
4
- # end
5
-
6
- function variable_name (op:: Operation , suffix)
7
- var = op. variable
8
- suffix === nothing ? var : Symbol (var, :_ , suffix)
9
- end
10
-
2
+ variable_name (op:: Operation , :: Nothing ) = mangledvar (op)
3
+ variable_name (op:: Operation , suffix) = Symbol (mangledvar (op), suffix, :_ )
11
4
12
5
function append_inds! (ret, indices, deps)
13
6
start = (first (indices) === Symbol (" ##DISCONTIGUOUSSUBARRAY##" )) + 1 # && return append_inds!(ret, @view(indices[2:end]), deps)
86
79
# end
87
80
# end
88
81
function varassignname (var:: Symbol , u:: Int , isunrolled:: Bool )
89
- isunrolled ? Symbol (" ## " , var, :_ , u) : Symbol ( " ## " , var)
82
+ isunrolled ? Symbol (var, u) : var
90
83
end
91
84
# name_mo only gets called when vectorized
92
85
function name_mo (var:: Symbol , op:: Operation , u:: Int , W:: Symbol , vecnotunrolled:: Bool , unrolled:: Symbol )
93
86
if u < 0 # sentinel value meaning not unrolled
94
- name = Symbol ( " ## " , var)
87
+ name = var
95
88
mo = mem_offset (op)
96
89
else
97
- name = Symbol (" ## " , var,:_ , u)
90
+ name = Symbol (var, u)
98
91
mo = vecnotunrolled ? mem_offset (op, u, unrolled) : mem_offset (op, W, u, unrolled)
99
92
end
100
93
name, mo
@@ -184,18 +177,18 @@ function lower_load!(
184
177
end
185
178
function reduce_range! (q:: Expr , toreduct:: Symbol , instr:: Instruction , Uh:: Int , Uh2:: Int )
186
179
for u ∈ 0 : Uh- 1
187
- tru = Symbol (" ## " , toreduct,:_ , u)
188
- push! (q. args, Expr (:(= ), tru, Expr (instr, tru, Symbol (" ## " , toreduct,:_ , u + Uh))))
180
+ tru = Symbol (toreduct, u)
181
+ push! (q. args, Expr (:(= ), tru, Expr (instr, tru, Symbol (toreduct, u + Uh))))
189
182
end
190
183
for u ∈ 2 Uh: Uh2- 1
191
- tru = Symbol (" ## " , toreduct, :_ , u + 1 - 2 Uh)
192
- push! (q. args, Expr (:(= ), tru, Expr (instr, tru, Symbol (" ## " , toreduct,:_ , u))))
184
+ tru = Symbol (toreduct, u + 1 - 2 Uh)
185
+ push! (q. args, Expr (:(= ), tru, Expr (instr, tru, Symbol (toreduct, u))))
193
186
end
194
187
end
195
188
function reduce_range! (q:: Expr , ls:: LoopSet , Ulow:: Int , Uhigh:: Int )
196
189
for or ∈ ls. outer_reductions
197
190
op = ls. operations[or]
198
- var = op . variable
191
+ var = mangledvar (op)
199
192
temp = gensym (var)
200
193
instr = op. instruction
201
194
instr = get (REDUCTION_TRANSLATION, instr, instr)
@@ -221,10 +214,9 @@ function reduce_expr!(q::Expr, toreduct::Symbol, instr::Instruction, U::Int)
221
214
nothing
222
215
end
223
216
224
- function pvariable_name (op:: Operation , suffix)
225
- var = first (parents (op)). variable
226
- suffix === nothing ? var : Symbol (var, :_ , suffix)
227
- end
217
+ pvariable_name (op:: Operation , :: Nothing ) = mangledvar (first (parents (op)))
218
+ pvariable_name (op:: Operation , suffix) = Symbol (pvariable_name (op, nothing ), suffix, :_ )
219
+
228
220
function reduce_unroll! (q, op, U, unrolled)
229
221
loopdeps = loopdependencies (op)
230
222
isunrolled = unrolled ∈ loopdeps
@@ -332,13 +324,16 @@ function lower_compute_unrolled!(
332
324
)
333
325
lower_compute! (q, op, vectorized, W, unrolled, tiled, U, suffix, mask, true )
334
326
end
327
+ struct FalseCollection end
328
+ Base. getindex (:: FalseCollection , i... ) = false
335
329
function lower_compute! (
336
330
q:: Expr , op:: Operation , vectorized:: Symbol , W:: Symbol , unrolled:: Symbol , tiled:: Symbol , U:: Int ,
337
331
suffix:: Union{Nothing,Int} , mask:: Union{Nothing,Symbol,Unsigned} = nothing ,
338
332
opunrolled = unrolled ∈ loopdependencies (op)
339
333
)
340
334
341
335
var = op. variable
336
+ mvar = mangledvar (op)
342
337
parents_op = parents (op)
343
338
nparents = length (parents_op)
344
339
if opunrolled
@@ -355,11 +350,12 @@ function lower_compute!(
355
350
parentstiled = if suffix === nothing
356
351
optiled = false
357
352
tiledouterreduction = - 1
358
- fill ( false , nparents )
353
+ FalseCollection ( )
359
354
else
360
355
tiledouterreduction = isouterreduction (op)
356
+ suffix_ = Symbol (suffix, :_ )
361
357
if tiledouterreduction == - 1
362
- var = Symbol (var, :_ , suffix )
358
+ mvar = Symbol (mvar, suffix_ )
363
359
end
364
360
optiled = true
365
361
[tiled ∈ loopdependencies (opp) for opp ∈ parents_op]
@@ -384,25 +380,25 @@ function lower_compute!(
384
380
instrcall = Expr (instr) # Expr(:call, instr)
385
381
varsym = if tiledouterreduction > 0 # then suffix !== nothing
386
382
modsuffix = ((u + suffix* U) & 3 )
387
- Symbol (" ## " ,var, :_ , modsuffix)
383
+ Symbol (mvar , modsuffix)
388
384
elseif opunrolled
389
- Symbol (" ## " ,var, :_ , u)
385
+ Symbol (mvar, u)
390
386
else
391
- Symbol ( " ## " ,var)
387
+ mvar
392
388
end
393
389
for n ∈ 1 : nparents
394
- parent = parents_op[n]. variable
390
+ parent = mangledvar ( parents_op[n])
395
391
if n == tiledouterreduction
396
- parent = Symbol (parent,:_ , modsuffix)
392
+ parent = Symbol (parent, modsuffix)
397
393
else
398
394
if parentstiled[n]
399
- parent = Symbol (parent,:_ ,suffix )
395
+ parent = Symbol (parent, suffix_ )
400
396
end
401
397
if parentsunrolled[n]
402
- parent = Symbol (parent,:_ , u)
398
+ parent = Symbol (parent, u)
403
399
end
404
400
end
405
- push! (instrcall. args, Symbol ( " ## " , parent) )
401
+ push! (instrcall. args, parent)
406
402
end
407
403
if maskreduct && u == Uiter # only mask last
408
404
push! (q. args, Expr (:(= ), varsym, Expr (:call , lv (:vifelse ), mask, instrcall, varsym)))
@@ -429,21 +425,18 @@ function lower_constant!(
429
425
q:: Expr , op:: Operation , vectorized:: Symbol , W:: Symbol , unrolled:: Symbol , U:: Int ,
430
426
suffix:: Union{Nothing,Int} , mask:: Any = nothing
431
427
)
432
- @unpack variable, instruction = op
433
- if suffix != = nothing
434
- variable = Symbol (variable, :_ , suffix)
435
- end
436
- # store parent's reduction deps
437
- # @show op.instruction, loopdependencies(op), reduceddependencies(op), unrolled, unrolled ∈ loopdependencies(op)
428
+ instruction = op. instruction
429
+ mvar = variable_name (op, suffix)
430
+
438
431
constsym = instruction. instr
439
432
if vectorized ∈ loopdependencies (op) || vectorized ∈ reduceddependencies (op)
440
433
call = Expr (:call , lv (:vbroadcast ), W, constsym)
441
434
for u ∈ 0 : U- 1
442
- push! (q. args, Expr (:(= ), Symbol (" ## " , variable, :_ , u), call))
435
+ push! (q. args, Expr (:(= ), Symbol (mvar , u), call))
443
436
end
444
437
else
445
438
for u ∈ 0 : U- 1
446
- push! (q. args, Expr (:(= ), Symbol (" ## " , variable, :_ , u), constsym))
439
+ push! (q. args, Expr (:(= ), Symbol (mvar , u), constsym))
447
440
end
448
441
end
449
442
nothing
@@ -621,16 +614,13 @@ function initialize_outer_reductions!(
621
614
q:: Expr , op:: Operation , Umin:: Int , Umax:: Int , W:: Symbol , typeT:: Symbol , unrolled:: Symbol , suffix:: Union{Symbol,Nothing} = nothing
622
615
)
623
616
# T = op.elementbytes == 8 ? :Float64 : :Float32
624
- var = op. variable
625
617
z = Expr (:call , REDUCTION_ZERO[op. instruction], typeT)
626
618
if unrolled ∈ reduceddependencies (op)
627
619
z = Expr (:call , lv (:vbroadcast ), W, z)
628
620
end
629
- if suffix != = nothing
630
- var = Symbol (var, :_ , suffix)
631
- end
621
+ mvar = variable_name (op, suffix)
632
622
for u ∈ Umin: Umax- 1
633
- push! (q. args, Expr (:(= ), Symbol (" ## " , var, :_ , u), z))
623
+ push! (q. args, Expr (:(= ), Symbol (mvar , u), z))
634
624
end
635
625
nothing
636
626
end
@@ -658,9 +648,10 @@ function reduce_expr!(q::Expr, ls::LoopSet, U::Int)
658
648
for or ∈ ls. outer_reductions
659
649
op = ls. operations[or]
660
650
var = op. variable
651
+ mvar = mangledvar (op)
661
652
instr = op. instruction
662
- reduce_expr! (q, var , instr, U)
663
- push! (q. args, Expr (:(= ), var, Expr (:call , REDUCTION_SCALAR_COMBINE[instr], var, Symbol (" ## " , var, :_0 ))))
653
+ reduce_expr! (q, mvar , instr, U)
654
+ push! (q. args, Expr (:(= ), var, Expr (:call , REDUCTION_SCALAR_COMBINE[instr], var, Symbol (mvar, 0 ))))
664
655
end
665
656
end
666
657
function gc_preserve (ls:: LoopSet , q:: Expr )
0 commit comments