параллельные циклы в Юлии - не хочу, чтобы работа разбивалась перед началом - PullRequest
0 голосов
/ 16 мая 2018

У моей машины 4 ядра.Когда я выполняю параллельные запуски с @sync @parallel, я замечаю, что Джулия делит задания на 4 до отправки их на 4 процессора:

# start of do_something.jl
function do_something(i, parts)
    procs = zeros(Int, parts)
    procs[i] = myid()
    total = 0.0
    for j = 1:i * 100000000
        total = total + 1e-6
    end
    return procs
end
# end of do_something.jl

# synctest3a.jl
addprocs(Sys.CPU_CORES)
@everywhere include("do_something.jl")
parts = 20
procs = @sync @parallel (+) for i = 1:parts
    do_something(i, parts)
end
@printf("procs=%s\n", procs)

Результат julia synctest3a.jl, указывая, что первые 5 были отправлены процессору 2, следующие 5 были отправлены процессору 3 и т. д .:

procs=[2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5]

У меня есть приложение, в котором время выполнения do_something () может сильно различаться (в этом игрушечном примере это более или менее пропорционально i).Так что я действительно хочу, чтобы каждый процессор выполнял do_something, как только он стал бесплатным, а не каждый, выполняющий ровно 1/4 вызовов.Как мне это сделать?

1 Ответ

0 голосов
/ 16 мая 2018

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

Еще одна опция для управления поведением планирования - это определение вашей собственной функции pmap (название, разумеется, не имеет значения). Таким образом, вы можете иметь гораздо больше контроля над расписанием. Например, вы можете изменить расписание на основе результатов предыдущих вычислений. См. здесь для примера определения pmap и его определения.

...