【问题标题】:Calling a function in @parallel results in huge memory allocations在@parallel 中调用函数会导致巨大的内存分配
【发布时间】:2014-12-05 07:29:11
【问题描述】:

我已经为我之前的问题 (Julia allocates huge amount of memory for unknown reason) 创建了一个最小工作示例,以隔离问题。这可以直接在 REPL 中测试。考虑代码:

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

--

function test2(n)
    @parallel (+) for i = 1:10^n
        sqrt(rand()^2 + rand()^2 +rand()^2)
    end
end

--

function test3(n)
    function add(one, two, three)
        one + two + three
    end

    @parallel (+) for i = 1:10^n
        sqrt(add(rand()^2, rand()^2, rand()^2))
    end
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

【问题讨论】:

  • 这不会发生在我身上。 versioninfo() 说什么?
  • @rickhg12hs 编辑添加 Julia 版本

标签: debugging memory memory-management julia


【解决方案1】:

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

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

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

【讨论】:

  • test3 运行需要多长时间,您使用的是什么版本的 Julia?我尝试在 Linux 机器上的 3.2 版上运行它,但我仍然分配了 9600711508 字节,24.90 秒(比 test1 和 test2 长得多)
  • 在带有Julia Version 0.4.0-dev+2043addprocs(2) 的旧笔记本电脑上,我得到以下信息:(函数调用,近似时间(秒),分配的字节数)-> [(test1(8),9.8 , 72), (test2(8), 4.9, ~ 32k), (test3(8), 39, ~ 34k)]
  • @Nick 在JuliaBox 上尝试您的代码。那里也没有看到巨大的分配。它比我的笔记本电脑快得多。
  • 我在 JuliaBox 上分配了 9600003104 个字节。 9GB?仅使用一个处理器运行它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 2012-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多