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
