【发布时间】:2016-07-24 14:13:08
【问题描述】:
我运行 julia --track-allocation prof.jl 得到以下输出:
- using FixedSizeArrays
-
- immutable KernelVals{T}
- wavenumber::T
- vect::Vec{3,T}
- dist::T
- green::Complex{T}
- gradgreen::Vec{3,Complex{T}}
- end
-
- function kernelvals(k, x, y)
- r = x - y
0 R2 = r[1]*r[1]
0 R2 += r[2]*r[2]
0 R2 += r[3]*r[3]
0 R = sqrt(R2)
-
0 γ = im*k
0 expn = exp(-γ * R)
0 fctr = 1.0 / (4.0*pi*R)
0 green = fctr * expn
64 gradgreen = -(γ + 1/R) * green / R * r
-
0 KernelVals(k, r, R, green, gradgreen)
- end
-
- function payload()
- x = Vec{3,Float64}(0.47046262275611883,0.8745228524771103,-0.049820876498487966)
0 y = Vec{3,Float64}(-0.08977259509004082,0.543199687600189,0.8291184043296924)
0 k = 1.0
0 kv = kernelvals(k,x,y)
- return kv
- end
-
- function driver()
- println("Flush result: ", payload())
0 Profile.clear_malloc_data()
0 payload()
- end
-
- driver()
我无法摆脱以gradgreen... 开头的行上的最终内存分配。我跑了@code_warntype kernelsvals(...),没有发现类型不稳定或不确定性。
julia-0.4.6 和 julia-0.5.0-pre 上的分配模式相同。
这个函数将是我正在实现的边界元素方法的内核。它将被调用数百万次,导致总内存分配可以增长到可用物理内存的倍数 对我来说。
我使用FixedSizeArrays 的原因是为了避免与创建小的Arrays 相关的分配。
报告分配的精确位置以非常敏感的方式取决于代码。在某些时候,内存分析器将1/(4*pi*R) 归咎于触发分配的行。
非常感谢任何有关如何编写代码以产生可预测的分配模式的帮助或一般提示。
【问题讨论】:
标签: optimization profiling julia allocation