как мы знаем, Джулия поддерживает параллелизм, и это что-то укоренившееся в языке, который очень хорош.
Я недавно видел, что Джулия поддерживает потоки, но мне кажется, что это экспериментально.Я заметил, что в случае использования макроса Threads.@Threads
в Shared Arrays нет необходимости, что, возможно, является вычислительным преимуществом, поскольку не выполняется копирование объектов.Я также увидел, что есть преимущество не объявлять все функции с @everywhere
.
Может кто-нибудь сказать мне преимущество использования макроса @parallel
вместо макроса @threads
?
Ниже приведены два простых примера использования несинхронизированных макросов для параллелизма.
Использование макроса @threads
addprocs(Sys.CPU_CORES)
function f1(b)
b+1
end
function f2(c)
f1(c)
end
result = Vector(10)
@time Threads.@threads for i = 1:10
result[i] = f2(i)
end
0,015273 секунды (6,42 тыс. Распределений: 340,874 КиБ)
Использование макроса @parallel
addprocs(Sys.CPU_CORES)
@everywhere function f1(b)
b+1
end
@everywhere function f2(c)
f1(c)
end
result = SharedArray{Float64}(10)
@time @parallel for i = 1:10
result[i] = f2(i)
end
0,060588 секунд (распределение 68,66 К: 3,625 МиБ)
Мне кажется, что для симуляций Монте-Карло, где циклы математически независимы и требуется большая вычислительная производительность, использование макроса @threads
более удобно.Как вы думаете, преимущества и недостатки использования каждого из макросов?
С уважением.