#parallel-processing #julia
#параллельная обработка #джулия
Вопрос:
Я бы хотел, чтобы что-то подобное работало в Julia:
using Distributed
addprocs(4)
@everywhere arr = Array{Int}(undef, 10)
for i = 1:10
@spawn arr[i] = i
end
Как правильно это сделать?
Комментарии:
1.
SharedArrays
? Пример почти эквивалентен приведенному здесь (прокрутите немного вниз).2. Спасибо, я также обнаружил, что в моем коде, изменив @spawn на Threads.@spawn работает так же хорошо.
3. Распараллеливание с использованием потоков — это нечто совершенно иное, чем распараллеливание с использованием многопроцессорной обработки с распределением. Когда вы изменили значение на
Threads.@spawn
первое,@everywhere
оно устарело, и вам все равно нужно убедиться, что ваш@spawn
поток редактирования выполнил свою работу.
Ответ №1:
У вас есть следующие способы распараллелить процесс.
-
Потоки (требуется установка
JULIA_NUM_THREADS
системной переменной)arr = Array{Int}(undef, 10) Threads.@threads for i = 1:10 arr[i] = i end
-
SharedArrays
using Distributed, SharedArrays addprocs(4) arr = SharedVector{Int}(10) @sync @distributed for i in 1:10 arr[i] = i end
Обратите внимание, что распространенной ошибкой является то, что вы забываете поместить
@sync
перед@distributed
тем, что не имеет функции агрегатора (см. Последний пример). -
Агрегируйте результаты ваших распределенных вычислений
using Distributed addprocs(4) arr = @distributed (append!) for i in 1:10 [i] end
Комментарии:
1. В моей ситуации я не могу использовать первый, потому что моя функция не является потокобезопасной. Я также не смог реализовать свой код как второй, а третий, похоже, больше похож на синтаксический сахар и не такой мирный, как другие. Однако мой код волшебным образом работает. Скоро я открою еще один пост, чтобы спросить, все ли я делаю правильно, пожалуйста, взгляните. Большое вам спасибо!!
2. Я использую третий, потому что иногда
SharedArrays
мне кажется нестабильным. Третий имеет смысл, когда вычисление[i]
занимает значительное количество времени (например, 10 мс).