https://github.com/JuliaLang/julia/pull/15080

--Tim

On Friday, May 27, 2016 9:12:26 
PM CDT Yichao Yu wrote:
> On Fri, May 27, 2016 at 9:06 PM,  
<[email protected]> wrote:
> > Regarding Julia 0.4.5, I've 
discovered that arrays with many 
subscripts
> > (apparently 8 is enough to 
cause trouble) unexpectedly cause 
heap
> > allocation.  See the code and 
timings below.  This is in regard to 
a
> > finite
> > element code in which many-
way arrays are used to represent 
multi-index
> > tensors.  Can anyone explain 
this?
> 
> I believe they are called high-
dimensional arrays.
> 
> This is probably caused by the 
splatting penalty, which appears 
with
> you are calling a vararg function 
(getindex in this case) with too
> many arguments and the 
compiler decided to not inline it. 
There 
is on
> going effort to improve this and 
there might already be some
> improvement on 0.5.
> 
> > Thanks,
> > Steve Vavasis
> > 
> > 
> > julia> @time 
test_manyway.test2way(100000)
> > 
> >   0.001836 seconds (6 
allocations: 272 bytes)
> > 
> > 49837.4971725032
> > 
> > julia> @time 
test_manyway.test4way(100000)
> > 
> >   0.008931 seconds (7 
allocations: 432 bytes)
> > 
> > 50050.05619989492
> > 
> > 
> > julia> @time 
test_manyway.test8way(100000)
> > 
> >  49.707042 seconds (385.40 M 
allocations: 11.103 GB, 4.16% gc 
time)
> > 
> > 50062.84252292006
> > 
> > 
> > 
> > module test_manyway
> > 
> > function test2way(n)
> > 
> >     a2 = zeros(2,2)
> >     x = 0.0
> >     for tr = 1 : n
> >     
> >         for j1 = 1 : 2
> >         
> >             for j2 = 1 : 2
> >             
> >                 a2[j1,j2] = rand()
> >             
> >             end
> >         
> >         end
> >         x += a2[1,1]
> >     
> >     end
> >     x
> > 
> > end
> > 
> > function test4way(n)
> > 
> >     a4 = zeros(2,2,2,2)
> >     x = 0.0
> >     for tr = 1 : n
> >     
> >         for j1 = 1 : 2
> >         
> >             for j2 = 1 : 2
> >             
> >                 for j3 = 1 : 2
> >                 
> >                     for j4 = 1 : 2
> >                     
> >                         a4[j1,j2,j3,j4] = 
rand()
> >                     
> >                     end
> >                 
> >                 end
> >             
> >             end
> >         
> >         end
> >         x += a4[1,1,1,1]
> >     
> >     end
> >     x
> > 
> > end
> > 
> > function test8way(n)
> > 
> >     a8 = zeros(2,2,2,2,2,2,2,2)
> >     x = 0.0
> >     for tr = 1 : n
> >     
> >         for j1 = 1 : 2
> >         
> >             for j2 = 1 : 2
> >             
> >                 for j3 = 1 : 2
> >                 
> >                     for j4 = 1 : 2
> >                     
> >                         for j5 = 1 : 2
> >                         
> >                             for j6 = 1 : 2
> >                             
> >                                 for j7 = 1 : 2
> >                                 
> >                                     for j8 = 1 : 2
> >                                     
> >                                         
a8[j1,j2,j3,j4,j5,j6,j7,j8] =
> >                                         rand()
> >                                     
> >                                     end
> >                                 
> >                                 end
> >                             
> >                             end
> >                         
> >                         end
> >                     
> >                     end
> >                 
> >                 end
> >             
> >             end
> >         
> >         end
> >         x += a8[1,1,1,1,1,1,1,1]
> >     
> >     end
> >     x
> > 
> > end
> > 
> > end


Reply via email to