Напишите сумму независимых значений параллельно - PullRequest
2 голосов
/ 04 ноября 2019

У меня есть функция, скажем, foo(), которая возвращает значение int, и я должен перейти к другим значениям этой функции, чтобы получить два разных значения, которые необходимо суммировать, например.

result = foo(2) + foo(37)

и я бы хотел, чтобы эти foo(2) и foo(37) были рассчитаны параллельно (одновременно). Это может помочь иметь две версии foo, одна из которых использует цикл for, а другая - рекурсивную. Я совершенно новичок в Юлии и параллельном программировании, но хотел бы решить эту проблему, чтобы я мог продолжать ее до тех пор, пока не смогу построить ее как веб-приложение с Genie.jl. Кроме того, любые ресурсы, чтобы узнать о параллельном программировании с Юлией, кроме его документации, будут высоко оценены!

1 Ответ

1 голос
/ 04 ноября 2019

Если вы хотите использовать процессы для распараллеливания, вы можете использовать цикл «распределенный для»:

8.2.3. Агрегированные результаты

Вторая ситуация - когда вы хотите выполнить небольшую операцию с каждым из элементов, но вы также хотите выполнить «функцию агрегирования» в конце, чтобы получить скалярное значение (или массив, есливход представляет собой матрицу). В этих случаях вы можете использовать @distributed (aggregationFunction) для конструкции.

Например, вы выполняете параллельно деление на 2, а затем используете сумму в качестве функции агрегирования. (предположим, что доступны три рабочих процесса):

function f(n)
  s = 0.0
  for i = 1:n
    s += i/2
  end
  return s
end

function pf(n)
  s = @distributed (+) for i = 1:n # aggregate using sum on variable s
    i/2
    # last element of for cycle is used by the aggregator
  end
  return s
end

@benchmark f(10000000) # median time:    11.478 ms
@benchmark pf(10000000) # median time:    4.458 ms

(из Справочник по синтаксису Julia )

В качестве альтернативы вы можете использовать потоки. У Julia уже есть многопоточность, но в Julia 1.3 (которая должна появиться через несколько дней / недель, в rc4 на момент написания) будет введен всеобъемлющий API потоков.

...