From 09e8dc5903d8cf30098d4b68be76156e41416950 Mon Sep 17 00:00:00 2001 From: Tim Besard Date: Fri, 31 Aug 2018 09:11:00 +0200 Subject: [PATCH 1/2] Broadcast views to avoid allocations. --- src/apiutils.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apiutils.jl b/src/apiutils.jl index 44b931df..dc9f7a6c 100644 --- a/src/apiutils.jl +++ b/src/apiutils.jl @@ -59,7 +59,7 @@ end function seed!(duals::AbstractArray{Dual{T,V,N}}, x, seeds::NTuple{N,Partials{N,V}}) where {T,V,N} - duals[1:N] .= Dual{T,V,N}.(x[1:N], seeds[1:N]) + duals[1:N] .= Dual{T,V,N}.(view(x, 1:N), seeds[1:N]) return duals end @@ -67,7 +67,7 @@ function seed!(duals::AbstractArray{Dual{T,V,N}}, x, index, seed::Partials{N,V} = zero(Partials{N,V})) where {T,V,N} offset = index - 1 chunk = (1:N) .+ offset - duals[chunk] .= Dual{T,V,N}.(x[chunk], Base.RefValue(seed)) + duals[chunk] .= Dual{T,V,N}.(view(x, chunk), Base.RefValue(seed)) return duals end @@ -75,6 +75,6 @@ function seed!(duals::AbstractArray{Dual{T,V,N}}, x, index, seeds::NTuple{N,Partials{N,V}}, chunksize = N) where {T,V,N} offset = index - 1 chunk = (1:chunksize) .+ offset - duals[chunk] .= Dual{T,V,N}.(x[chunk], seeds[1:chunksize]) + duals[chunk] .= Dual{T,V,N}.(view(x, chunk), seeds[1:chunksize]) return duals end From 88c28617082bdbe794cc476a5d17f6e89732259b Mon Sep 17 00:00:00 2001 From: Tim Besard Date: Mon, 10 Sep 2018 16:53:08 +0200 Subject: [PATCH 2/2] Avoid slicing (and hence copying) typically large tuples. --- src/apiutils.jl | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/apiutils.jl b/src/apiutils.jl index dc9f7a6c..5b9f8cfa 100644 --- a/src/apiutils.jl +++ b/src/apiutils.jl @@ -53,13 +53,13 @@ end function seed!(duals::AbstractArray{Dual{T,V,N}}, x, seed::Partials{N,V} = zero(Partials{N,V})) where {T,V,N} - duals .= Dual{T,V,N}.(x, Base.RefValue(seed)) + duals .= Dual{T,V,N}.(x, Ref(seed)) return duals end function seed!(duals::AbstractArray{Dual{T,V,N}}, x, seeds::NTuple{N,Partials{N,V}}) where {T,V,N} - duals[1:N] .= Dual{T,V,N}.(view(x, 1:N), seeds[1:N]) + duals[1:N] .= Dual{T,V,N}.(view(x, 1:N), seeds) return duals end @@ -67,7 +67,7 @@ function seed!(duals::AbstractArray{Dual{T,V,N}}, x, index, seed::Partials{N,V} = zero(Partials{N,V})) where {T,V,N} offset = index - 1 chunk = (1:N) .+ offset - duals[chunk] .= Dual{T,V,N}.(view(x, chunk), Base.RefValue(seed)) + duals[chunk] .= Dual{T,V,N}.(view(x, chunk), Ref(seed)) return duals end @@ -75,6 +75,10 @@ function seed!(duals::AbstractArray{Dual{T,V,N}}, x, index, seeds::NTuple{N,Partials{N,V}}, chunksize = N) where {T,V,N} offset = index - 1 chunk = (1:chunksize) .+ offset - duals[chunk] .= Dual{T,V,N}.(view(x, chunk), seeds[1:chunksize]) + if chunksize == N + duals[chunk] .= Dual{T,V,N}.(view(x, chunk), seeds) + else + duals[chunk] .= Dual{T,V,N}.(view(x, chunk), getindex.(Ref(seeds), 1:chunksize)) + end return duals end