Currently, the Julia compiler cannot optimize either for inline storage, and uses an array of pointers in both cases as a fallback. The reason for this is that nobody has yet written the code to teach the compiler how to do it, although much of the work is already done to make it possible.
On Thursday, July 31, 2014, Iain Dunning <[email protected]> wrote: > Also, if you haven't seen it yet, make sure to check out > http://juliadiff.org > > On Thursday, July 31, 2014 4:39:26 PM UTC-4, Iain Dunning wrote: >> >> 1. Yes, it would create an array of pointers. >> 2. Yes, it would worsen performance. >> 3. Try using a Tuple, e.g. >> >> julia> immutable Dual{T1,T2,N} >> x::T1 >> dx::NTuple{N,T2} >> end >> >> julia> Dual(1.0, (2.0, 3.0)) >> Dual{Float64,Float64,2}(1.0,(2.0,3.0)) >> >> I think this will be stored "flat" but I'm not 100% sure. >> >> On Thursday, July 31, 2014 2:45:27 AM UTC-4, Philippe Maincon wrote: >>> >>> Hi, >>> >>> Say I create a multidimensional array "a" and I have defined the type >>> >>> >>> immutable Dual{T1,T2} # immutable: fields are read only, except by >>> constructor >>> >>> x ::T1 # think of this as a Float for this discussion >>> >>> dx::T2 # Vector{Float} >>> >>> end >>> >>> >>> (yes, I am playing with automatic differentiation) Then I want to do the >>> following allocation: >>> >>> >>> b = Array(Dual{Float64, Array{Float64,ndims(a)}} ,size(a)...) >>> >>> >>> So I want an array of "structures", each having as field a Float, and an >>> Array. This would be accessed as b[i].x and b[i].dx[j] >>> >>> Now my intention is that all these dx array *have the same size*, which >>> opens for packed storage, without any use of pointers by the compiler. >>> This, I understand is what "immutable" is for, and is exploited, >>> implicitly, in Complex.jl. However, in my declaration above, I do not spec >>> the size of the dx's, and sothis will compile, I believe, into an array of >>> x's and pointer to dx's, and I expect suboptimal performance. >>> >>> >>> 1. Am I right that this would compile into an array of pointers? >>> 2. If yes, am I right that this would cause poor performance? (think of >>> Complex,jl, you really want things to go fast, there) >>> 3. If yes, is there a way to allocate b that ensures "packed storage"? >>> >>> >>> Thank you beforehand for your answer, but most of all, thank you for Julia! >>> >>> >>> Philippe >>> >>>
