2016-12-07 2 views
0

Я новичок в Джулии и изучаю недавно параллельные вычисления Julia. Я до сих пор не совсем понял, насколько точно механизм параллелизма Юлии включает макросы \@sync и \@async после того, как я прочитал соответствующие документы.Согласование параллельных вычислений Julia

Ниже приводится pmap функции от Julia v0.5 documentation:

function pmap(f, lst) 
    np = nprocs() # determine the number of processes available 
    n = length(lst) 
    results = Vector{Any}(n) 
    i = 1 
    # function to produce the next work item from the queue. 
    # in this case it's just an index. 
    nextidx() = (idx=i; i+=1; idx) 
    @sync begin 
     for p=1:np 
      if p != myid() || np == 1 
       @async begin 
        while true 
         idx = nextidx() 
         if idx > n 
          break 
         end 
         results[idx] = remotecall_fetch(f, p, lst[idx]) 
        end 
       end 
      end 
     end 
    end 
    results 
end 

Возможно ли разные два процессора/рабочие называют nextidx() в то же время получать те же idx = j? Если да, то я чувствую, что results[j] будет вычислен дважды и result[j+1] не будет вычислен.

Большое спасибо.

Более выводы:

function f1() 
    i=1 
    nextidx()=(idx=i;sleep(1);i+=1;idx) 
    for p=1:2 
    @async begin 
     idx=nextidx() 
     println(idx) 
     end 
    end 
end 
f1() 

В результате 1 1. С помощью этого я нахожу периоды времени, в течение которых две задачи, вызывающие функцию nextidx(), могут перекрываться. Поэтому я чувствую, что в первом коде , если np = 3 (т. Е. Два работника), а длина n из lst очень велика, скажем, 10^8, , возможно, чтобы задачи получили тот же самый индекс. Это может произойти только из-за совпадения во времени, то есть две задачи принимают выражение idx = i почти в тот же момент времени, поэтому код нестабилен. Я прав?

+0

Рассмотрите вопрос об ответе _excellent_ на [this] (http://stackoverflow.com/questions/37287020/how-and-when-to-use-async-and-sync-in-julia) Вопрос о '\ @ sync' и '\ @ async'. в примере «pmap», который вы цитируете, каждый процесс получает 'idx' из' nextidx() 'отдельно от других процессов. –

+0

Я прочитал ответ и теперь знаю основные функции \ @sync и \ @async. Тем не менее, я по-прежнему отношусь к разным задачам, может получить один и тот же индекс idx. Смотрите мои дальнейшие выводы выше. Большое спасибо. – user7261265

ответ

0

Нет, если вы правильно планируете работу. pmapdocumentation указывает, что мастер-процесс рассылает задания последовательно; только параллельное выполнение является асинхронным. pmap для кодирования не требует блокировки потоков, чтобы обеспечить правильное планирование работы. Добавление sleep в nextidx преднамеренно нарушает эту функцию и представляет состояние гонки, которое вы наблюдаете. Предполагая, что все процессы разделяют состояние, которое является целью функции nextidx, тогда мастер-процесс не будет планировать одно и то же задание дважды.

+0

Я до сих пор не знаю, почему мое беспокойство не нужно. Может быть, это потому, что мне не хватает базового нижнего механизма Julia и компьютеров, в том числе, как приведенный выше код делает планирование и какой поток ... В любом случае, большое вам спасибо за ваш ответ. – user7261265

+0

нет, ваше беспокойство оправданно. как вы продемонстрировали, нетрудно ввести условия гонки в параллельный код. но «pmap» Джулии закодирован, чтобы избежать их. см. обновленный ответ. –

+0

также, если вы найдете этот ответ удовлетворительным, тогда, пожалуйста, подумайте о его принятии. –

Смежные вопросы