Skip to content

Commit

Permalink
In presence of mixed inner and outer reductions, place all inner redu…
Browse files Browse the repository at this point in the history
…ctions in inner most loop.
  • Loading branch information
chriselrod committed Aug 4, 2021
1 parent d4e1873 commit ecc39aa
Showing 1 changed file with 30 additions and 1 deletion.
31 changes: 30 additions & 1 deletion src/modeling/determinestrategy.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1182,7 +1182,28 @@ struct LoopOrders
buff::Vector{Symbol}
end

function LoopOrders(ls::LoopSet)
function outer_reduct_loopordersplit(ls::LoopSet)
ops = operations(ls)
nonouterreducts = Int[]
for i eachindex(ops)
i ls.outer_reductions || push!(nonouterreducts, i)
end
reductsyms = Symbol[]
nonreductsyms = Symbol[]
for l ls.loopsymbols
isreduct = false
for opid nonouterreducts
if l reduceddependencies(ops[opid])
isreduct = true
push!(reductsyms, l)
break
end
end
isreduct || push!(nonreductsyms, l)
end
reductsyms, nonreductsyms
end
function loopordersplit(ls::LoopSet)
reductsyms = Symbol[]
nonreductsyms = Symbol[]
for l ls.loopsymbols
Expand All @@ -1196,6 +1217,14 @@ function LoopOrders(ls::LoopSet)
end
isreduct || push!(nonreductsyms, l)
end
reductsyms, nonreductsyms
end
function LoopOrders(ls::LoopSet)
if length(ls.outer_reductions) == 0
reductsyms, nonreductsyms = loopordersplit(ls)
else
reductsyms, nonreductsyms = outer_reduct_loopordersplit(ls)
end
LoopOrders(nonreductsyms, reductsyms, Vector{Symbol}(undef, length(ls.loopsymbols)))
end

Expand Down

0 comments on commit ecc39aa

Please sign in to comment.