Как одновременно записывать в несколько индексов массива в Julia?

#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:

У вас есть следующие способы распараллелить процесс.

  1. Потоки (требуется установка JULIA_NUM_THREADS системной переменной)

     arr = Array{Int}(undef, 10)
    Threads.@threads for i = 1:10
        arr[i] = i
    end
      
  2. SharedArrays

     using Distributed, SharedArrays
    addprocs(4)
    arr = SharedVector{Int}(10)
    @sync @distributed for i in 1:10
        arr[i] = i 
    end
      

    Обратите внимание, что распространенной ошибкой является то, что вы забываете поместить @sync перед @distributed тем, что не имеет функции агрегатора (см. Последний пример).

  3. Агрегируйте результаты ваших распределенных вычислений

     using Distributed
    addprocs(4)
    arr = @distributed (append!) for i in 1:10
        [i]
    end
      

Комментарии:

1. В моей ситуации я не могу использовать первый, потому что моя функция не является потокобезопасной. Я также не смог реализовать свой код как второй, а третий, похоже, больше похож на синтаксический сахар и не такой мирный, как другие. Однако мой код волшебным образом работает. Скоро я открою еще один пост, чтобы спросить, все ли я делаю правильно, пожалуйста, взгляните. Большое вам спасибо!!

2. Я использую третий, потому что иногда SharedArrays мне кажется нестабильным. Третий имеет смысл, когда вычисление [i] занимает значительное количество времени (например, 10 мс).