Юлия: Макро нити и параллель - PullRequest
0 голосов
/ 11 июня 2018

как мы знаем, Джулия поддерживает параллелизм, и это что-то укоренившееся в языке, который очень хорош.

Я недавно видел, что Джулия поддерживает потоки, но мне кажется, что это экспериментально.Я заметил, что в случае использования макроса 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 более удобно.Как вы думаете, преимущества и недостатки использования каждого из макросов?

С уважением.

1 Ответ

0 голосов
/ 11 июня 2018

Вот мой опыт:

Темы

Плюсы:

  • общая память
  • низкая стоимость нереста Джулии со многими потоками

Минусы:

  • ограничено одной машиной
  • количество потоков должно быть указано при запуске Julia
  • возможные проблемы с ложным разделением (https://en.wikipedia.org/wiki/False_sharing)
  • часто для правильной работы программы необходимо использовать блокирующие или атомарные операции, в частности, многие функции в Julia не являются поточно-ориентированными, поэтому их следует соблюдать осторожно
  • не гарантируетсячтобы остаться в текущей форме после Джулии 1.0

Процессов

Плюсов:

  • лучшего масштабирования (их можно создавать, например, на кластере из нескольких машин)
  • вы можете добавлять процессы во время работы Julia

Минусы:

  • низкая эффективность, когда вам приходится передавать много данных между процессами
  • медленнее, чтобы начать
  • вы должны явно поделиться кодомданные для / между работниками

Резюме

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

...