我已經創建了我的上一個問題(Julia allocates huge amount of memory for unknown reason)的最低工作示例,將問題隔離開來。這可以直接在REPL中進行測試。考慮代碼:在@parallel中調用函數會導致巨大的內存分配
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 2014-12-06 04:45:01
@ rickhg12hs編輯添加Julia版本 – Nick 2014-12-06 07:53:37