Я создал минимальный рабочий пример моего предыдущего вопроса (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)
? Он выделяет ОГРОМНЫЕ объемы памяти.
EDIT:
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
@ rickhg12hs Отредактировано для добавления Julia version – Nick