Avik: this is actually the situation I'm in. My tight inner loops involve elementwise operations on many small arrays, so the runtime cost of using vectorized code is enormous. Using the macros provided by Devectorize.jl only somewhat alleviates this problem, so I ended up hand-writing devectorized loops to achieve zero temp allocation when writing in-place. I'm quite happy to do this -- C-like code for C-like performance, after all -- but I was curious as to where this runtime overhead was coming from, and whether it's avoidable.

On 29/04/2014 8:27 pm, Avik Sengupta wrote:
That overhead seems constant, beyond a single temporary. So I dont suppose there is that much to be worried about, unless you are using many small arrays.

julia> 800-sizeof(rand(2))
784

julia> 944-sizeof(rand(20))
784


On Tuesday, 29 April 2014 10:40:10 UTC+1, Carlos Becker wrote:

    Besides Julia internals, I suppose there is memory overhead in
    terms of the structure holding the array itself (when temporaries
    are created).
    I suppose an array isn't just the size in bytes of the data it
    holds, but also information about its size/type/etc. Though I
    doubt that would add up to 800 bytes, it could explain part of it.

    I wonder if there is a way within julia to know the 'real' size of
    a julia object.

    El martes, 29 de abril de 2014 11:32:21 UTC+2, Carlos Becker
    escribió:

        I just saw another part of your message, I am wondering also
        why memory consumption is so high.

        El martes, 29 de abril de 2014 11:31:09 UTC+2, Carlos Becker
        escribió:

            This is likely to be because Julia is creating
            temporaries. This is probably why you get increasing
            memory usage when increasing array size.

            This is a long topic, that will have to be solved
            (hopefully soon), I had a previous question related to
            something similar here:
            https://groups.google.com/d/topic/julia-users/Pbrm9Nn9fWc/discussion
            
<https://groups.google.com/d/topic/julia-users/Pbrm9Nn9fWc/discussion>


            El martes, 29 de abril de 2014 08:05:17 UTC+2, John
            Aslanides escribió:

                I'm aware that evaluating a vectorized operation (say,
                an elementwise product of two arrays) will result in
                the allocation of a temporary array. I'm surprised,
                though, at just how much memory this seems to consume
                in practice -- unless there's something I'm not
                understanding. Here is an extreme example:

                julia> a = rand(2); b = rand(2);

                julia> @time a .*= b;
                elapsed time: 0.505942281 seconds (11612212 bytes
                allocated)

                julia> @time a .*= b;
                elapsed time: 1.4177e-5 seconds (800 bytes allocated)

                julia> @time a .*= b;
                elapsed time: 2.5334e-5 seconds (800 bytes allocated)

                800 bytes seems like a lot of overhead given that a
                and b are both only 16 bytes each. Of course, this
                overhead (whatever it is) becomes comparatively less
                significant as we move to larger arrays, but it's
                still sizeable:

                julia> a = rand(20); b = rand(20);

                julia> @time a.*= b;
                elapsed time: 1.4162e-5 seconds (944 bytes allocated)

                julia> @time a.*= b;
                elapsed time: 2.3754e-5 seconds (944 bytes allocated)

                Can someone explain what's going on here?


Reply via email to