Увидев в Интернете несколько учебников по параллелизму Джулии, я решил реализовать небольшой параллельный фрагмент кода для вычисления ряда гармоник.
Серийный код:
harmonic = function (n::Int64)
x = 0
for i in n:-1:1 # summing backwards to avoid rounding errors
x +=1/i
end
x
end
И ясделал 2 параллельные версии, одну с использованием макроса @distributed
, а другую с использованием макроса @everywhere
(julia -p 2
btw):
@everywhere harmonic_ever = function (n::Int64)
x = 0
for i in n:-1:1
x +=1/i
end
x
end
harmonic_distr = function (n::Int64)
x = @distributed (+) for i in n:-1:1
x = 1/i
end
x
end
Однако, когда я запускаю приведенный выше код и @time
it, яне получайте никакого ускорения - на самом деле, версия @distributed
работает значительно медленнее!
@time harmonic(10^10)
>>> 53.960678 seconds (29.10 k allocations: 1.553 MiB) 23.60306659488827
job = @spawn harmonic_ever(10^10)
@time fetch(job)
>>> 46.729251 seconds (309.01 k allocations: 15.737 MiB) 23.60306659488827
@time harmonic_distr(10^10)
>>> 143.105701 seconds (1.25 M allocations: 63.564 MiB, 0.04% gc time) 23.603066594889185
То, что полностью и абсолютно сбивает с толку, это "0.04% gc time
".Я явно что-то упускаю, а также примеры, которые я видел, не для версии 1.0.1 (например, используется @parallel
).