Debugging 在@parallel中调用函数会导致巨大的内存分配

Debugging 在@parallel中调用函数会导致巨大的内存分配,debugging,memory,memory-management,julia,Debugging,Memory,Memory Management,Julia,我已经为我的上一个问题()创建了一个最低限度的工作示例,隔离了这个问题。这可以在REPL中直接测试。考虑代码: function test1(n) s = zero(Float64) for i = 1:10^n s += sqrt(rand()^2 + rand()^2 + rand()^2) end return s end @time test1(8); @time test1(8); @time test2(8); @time test

我已经为我的上一个问题()创建了一个最低限度的工作示例,隔离了这个问题。这可以在REPL中直接测试。考虑代码:

function test1(n)
    s = zero(Float64)
    for i = 1:10^n
        s += sqrt(rand()^2 + rand()^2 + rand()^2)
    end
    return s
end
@time test1(8);
@time test1(8);

@time test2(8);
@time test2(8);

@time test3(8);
@time test3(8);
--

--

然后,我测试代码:

function test1(n)
    s = zero(Float64)
    for i = 1:10^n
        s += sqrt(rand()^2 + rand()^2 + rand()^2)
    end
    return s
end
@time test1(8);
@time test1(8);

@time test2(8);
@time test2(8);

@time test3(8);
@time test3(8);
以下是输出:

elapsed time: 1.017241708 seconds (183868 bytes allocated)
elapsed time: 1.033503964 seconds (96 bytes allocated)

elapsed time: 1.214897591 seconds (3682220 bytes allocated)
elapsed time: 1.020521156 seconds (2104 bytes allocated)

elapsed time: 15.23876415 seconds (9600679268 bytes allocated, 26.69% gc time)
elapsed time: 15.418865707 seconds (9600002736 bytes allocated, 26.19% gc time)
谁能解释一下:

  • 为什么每个函数的第一次运行分配了这么多内存
  • 为什么
    test2(8)
    中分配的内存高于
    test1(8)
    ?他们做同样的事情
  • 最重要的是,
    test3(8)
    到底是怎么回事?它正在分配大量内存
编辑:

Julia Version 0.3.1
Commit c03f413* (2014-09-21 21:30 UTC)
Platform Info:
  System: Darwin (x86_64-apple-darwin13.3.0)
  CPU: Intel(R) Core(TM) i7-3615QM CPU @ 2.30GHz
  WORD_SIZE: 64
  BLAS: libopenblas (USE64BITINT DYNAMIC_ARCH NO_AFFINITY Sandybridge)
  LAPACK: libopenblas
  LIBM: libopenlibm
  LLVM: libLLVM-3.3

在每个函数的第一次运行中,分配都是由编译引起的:请记住,julia的JIT编译器大部分都是用julia编写的,因此在编译过程中消耗的任何内存(主要是类型分析)都会被包括在内。一旦编译了函数,此分配就会消失

对我来说,test2和test3在第二次运行时都分配了大约50K字节(使用
julia-p2


最后,并行版本分配一些额外内存的原因与
@parallel
的工作方式有关。它基本上必须从函数中创建一个“thunk”,并将其传递给其他进程。这个thunk不是预编译的,因为它可能依赖于作为参数传入的变量。

我不会这样做。
versioninfo()
说了些什么?@rickhg12hs编辑后添加了Julia版本test3需要多长时间才能运行,您使用的Julia版本是什么?我试着在Linux机器上运行3.2版,但我仍然得到9600711508字节的分配,24.90秒(比test1和test2长得多),在我的老式笔记本电脑上,Julia version 0.4.0-dev+2043和addprocs(2),我得到以下结果:(函数调用,大约时间(秒),分配的字节)->[(
test1(8)
,9.8,72),(
test2(8)
,4.9,~32k),(
test3(8)
,39,~34k)]@尼克试试你的代码。那里也没有看到巨大的分配。它比我的笔记本电脑快得多。我在JuliaBox上分配了9600003104字节。9GB?只使用一个处理器运行它。