Как реализовать многопроцессорность в одном модуле в Julia? - PullRequest
0 голосов
/ 25 мая 2020

Я пытаюсь запустить функцию testcase () внутри функции wrapper () при использовании многопроцессорной обработки для вызова функции testcase () несколько раз. Я хочу сохранить результат вызова функции в testcase () и добавить его в массив для будущего использования, но получаю следующую ошибку:

julia> tester.wrapper()
ERROR: UndefVarError: testcase not defined
Stacktrace:
 [1] wrapper() at playground.jl:21
 [2] top-level scope at none:0

Согласно this post, я попытался добавить в модуль макрос @everywhere и заключил функцию testcase () в @everywhere. Кроме того, я заключил функцию testcase () в начальный блок с @everywhere. Я также пытался обернуть функцию wrapper () с помощью @everywhere, но это привело к wrapper not defined.

Это упрощенная версия кода, который я использую:

# Ran addprocs(2) from REPL

@everywhere module tester
using Distributed

# Some function that returns a value
@everywhere begin
    function testcase(num)
        return sqrt(num)
    end # function
end # begin

# Another function that uses multiprocessing
function wrapper()
    # Store all results of testcase() in the results array
    results = []

    for i in range(1, 100; step=3)
        # Utilize 3 processes
        for j = 1:3
            push!(results, remotecall_fetch(testcase, j, i+(j-1)))
        end # for
    end # for

    return results
end # function
end # module

1 Ответ

0 голосов
/ 25 мая 2020

Вам не нужно оборачивать функцию testcase в @everywhere, поскольку модуль уже @everywhere:

   @everywhere module tester
   using Distributed

   function testcase(num)
           return sqrt(num)
   end # function

   function wrapper()
       results = []

       for i in range(1, 100; step=3)
           # Utilize 3 processes
           for j = 1:3
               push!(results, remotecall_fetch(testcase, j, i+(j-1)))
           end # for
       end # for

       return results
   end # function
   end

tester.wrapper() возвращает ожидаемый результат:

102-element Array{Any,1}:
  1.0
  1.4142135623730951
  1.7320508075688772
  2.0
  2.23606797749979
  [...]

Но ваш код по-прежнему не выполняется параллельно, потому что вы вызываете testcase и ждете результата, прежде чем продолжить. Функция pmap (или @distributed for с SharedArray) может быть здесь лучшим вариантом:

   @everywhere module tester
   using Distributed

   # Some function that returns a value
   function testcase(num)
           return sqrt(num)
   end # function

   # Another function that uses multiprocessing
   wrapper() = pmap(tester.testcase,1:102)
   end

Вы получите тот же ответ, что и раньше, поскольку код выполняется параллельно.

Обратите внимание, что потоки в Julia также возможны, если вы работаете с одним компьютером (но с несколькими ядрами).

...