Skip to content

Commit 99b6a8c

Browse files
authored
Merge pull request #19639 from pabloferz/pz/inline-broadcast
Reduce allocations in broadcast
2 parents b0a4153 + 4c964d3 commit 99b6a8c

File tree

3 files changed

+16
-10
lines changed

3 files changed

+16
-10
lines changed

base/broadcast.jl

+3-4
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ Base.@propagate_inbounds _broadcast_getindex(::Any, A, I) = A[I]
126126
# of keeps). The first two type parameters are to ensure specialization.
127127
@generated function _broadcast!{K,ID,AT,nargs}(f, B::AbstractArray, keeps::K, Idefaults::ID, As::AT, ::Type{Val{nargs}}, iter)
128128
quote
129-
$(Expr(:meta, :noinline))
129+
$(Expr(:meta, :inline))
130130
# destructure the keeps and As tuples
131131
@nexprs $nargs i->(A_i = As[i])
132132
@nexprs $nargs i->(keep_i = keeps[i])
@@ -147,7 +147,7 @@ end
147147
# and then copy in chunks into the output
148148
@generated function _broadcast!{K,ID,AT,nargs}(f, B::BitArray, keeps::K, Idefaults::ID, As::AT, ::Type{Val{nargs}}, iter)
149149
quote
150-
$(Expr(:meta, :noinline))
150+
$(Expr(:meta, :inline))
151151
# destructure the keeps and As tuples
152152
@nexprs $nargs i->(A_i = As[i])
153153
@nexprs $nargs i->(keep_i = keeps[i])
@@ -241,9 +241,8 @@ function broadcast_t(f, ::Type{Any}, shape, iter, As...)
241241
B[I] = val
242242
return _broadcast!(f, B, keeps, Idefaults, As, Val{nargs}, iter, st, 1)
243243
end
244-
@inline function broadcast_t(f, T, shape, iter, As...)
244+
@inline function broadcast_t{nargs}(f, T, shape, iter, As::Vararg{Any,nargs})
245245
B = similar(Array{T}, shape)
246-
nargs = length(As)
247246
keeps, Idefaults = map_newindexer(shape, As)
248247
_broadcast!(f, B, keeps, Idefaults, As, Val{nargs}, iter)
249248
return B

base/linalg/bidiag.jl

+11-4
Original file line numberDiff line numberDiff line change
@@ -559,23 +559,30 @@ function eigvecs{T}(M::Bidiagonal{T})
559559
n = length(M.dv)
560560
Q = Array{T}(n, n)
561561
blks = [0; find(x -> x == 0, M.ev); n]
562+
v = zeros(T, n)
562563
if M.isupper
563564
for idx_block = 1:length(blks) - 1, i = blks[idx_block] + 1:blks[idx_block + 1] #index of eigenvector
564-
v=zeros(T, n)
565+
fill!(v, zero(T))
565566
v[blks[idx_block] + 1] = one(T)
566567
for j = blks[idx_block] + 1:i - 1 #Starting from j=i, eigenvector elements will be 0
567568
v[j+1] = (M.dv[i] - M.dv[j])/M.ev[j] * v[j]
568569
end
569-
Q[:, i] = v/norm(v)
570+
c = norm(v)
571+
for j = 1:n
572+
Q[j, i] = v[j] / c
573+
end
570574
end
571575
else
572576
for idx_block = 1:length(blks) - 1, i = blks[idx_block + 1]:-1:blks[idx_block] + 1 #index of eigenvector
573-
v = zeros(T, n)
577+
fill!(v, zero(T))
574578
v[blks[idx_block+1]] = one(T)
575579
for j = (blks[idx_block+1] - 1):-1:max(1, (i - 1)) #Starting from j=i, eigenvector elements will be 0
576580
v[j] = (M.dv[i] - M.dv[j+1])/M.ev[j] * v[j+1]
577581
end
578-
Q[:,i] = v/norm(v)
582+
c = norm(v)
583+
for j = 1:n
584+
Q[j, i] = v[j] / c
585+
end
579586
end
580587
end
581588
Q #Actually Triangular

base/linalg/diagonal.jl

+2-2
Original file line numberDiff line numberDiff line change
@@ -338,9 +338,9 @@ svdvals(D::Diagonal) = [svdvals(v) for v in D.diag]
338338
function svd{T<:Number}(D::Diagonal{T})
339339
S = abs.(D.diag)
340340
piv = sortperm(S, rev = true)
341-
U = Array(Diagonal(D.diag ./ S))
341+
U = Diagonal(D.diag ./ S)
342342
Up = hcat([U[:,i] for i = 1:length(D.diag)][piv]...)
343-
V = eye(D)
343+
V = Diagonal(ones(D.diag))
344344
Vp = hcat([V[:,i] for i = 1:length(D.diag)][piv]...)
345345
return (Up, S[piv], Vp)
346346
end

0 commit comments

Comments
 (0)