-
-
Notifications
You must be signed in to change notification settings - Fork 21
Open
Description
Perhaps I'm doing something wrong in how I set things up, but dualcache seems to always generate allocations when requesting the dual portion of the cache. Here's the most minimal example I could think of; I posted a slightly less minimal example here. Writing my own (simpler, less flexible) version of get_tmp eliminates the issue. The following code:
using ForwardDiff, PreallocationTools
function my_get_tmp(dc::PreallocationTools.DiffCache, u::Vector{T}) where {T <: ForwardDiff.Dual}
return reshape(reinterpret(T, dc.dual_du), size(dc.du))
end
function my_get_tmp(dc::PreallocationTools.DiffCache, u::Vector{T}) where {T <: Float64}
return dc.du
end
function test()
ChunkSize = 12
for n in (10, 20)
println("\nTesting for n=", n)
A = zeros(n);
DA = zeros(ForwardDiff.Dual{ForwardDiff.Tag{nothing, Float64}, Float64, ChunkSize}, 10);
cache = dualcache(A, ChunkSize);
print("... get_tmp on Vector{Float64}\n")
a = @allocated my_get_tmp(cache, A); println(a)
print("... get_tmp on Vector{Dual}\n")
a = @allocated get_tmp(cache, DA); println(a)
print("... my_get_tmp on Vector{Float64}\n")
a = @allocated my_get_tmp(cache, A); println(a)
print("... my_get_tmp on Vector{Dual}\n")
a = @allocated my_get_tmp(cache, DA); println(a)
end
end
test()gives:
julia> test()
Testing for n=10
... get_tmp on Vector{Float64}
0
... get_tmp on Vector{Dual}
1168
... my_get_tmp on Vector{Float64}
0
... my_get_tmp on Vector{Dual}
0
Testing for n=20
... get_tmp on Vector{Float64}
0
... get_tmp on Vector{Dual}
2240
... my_get_tmp on Vector{Float64}
0
... my_get_tmp on Vector{Dual}
0I.e. results in allocations that scale with the vector size and are slightly larger than what I would think would be needed (8*Chunksize*n=960 for n=10 and 1920 for n=20). Using Julia v1.7.3, PreallocationTools v0.4.0, on Mac OSX 12.5.
Metadata
Metadata
Assignees
Labels
No labels