Распределенные вычисления
Engee предоставляет возможности для реализации распределенных вычислений с помощью библиотеки, называемой Distributed. Инструменты этой библиотеки помогают исследовать возможности выполнения задач в отдельных потоках, которые могут находиться на разных вычислительных ядрах.
Импорт библиотеки для распределённых вычислений:
using Distributed
С помощью функции nworkers библиотеки Distributed можно узнать сколько процессов доступно в настоящее время:
nworkers()
1
С помощью addprocs можно добавить некоторое количество рабочих процессов:
addprocs(2)
nworkers()
2
Использование pmap
Одним из примеров работы всех доступных процессов является применение функции pmap. Функция pmap преобразует коллекцию c, применяя f к каждому элементу с использованием доступных рабочих процессов и задач.
pmap(x -> x*2, [1,2,3])
3-element Vector{Int64}:
2
4
6
Любая ошибка может остановить pmap. Это может привести к тому, что указанная функция не будет применена ко всем элементам коллекции. Однако эти ошибки могут быть обработаны с помощью аргумента on_error.
pmap(x -> iseven(x) ? error("foo") : x, 1:4; on_error=identity)
4-element Vector{Any}:
1
ErrorException("foo")
3
ErrorException("foo")
Также ошибки можно обрабатывать возвращая вместо них значения:
even_or_zero = pmap(x->iseven(x) ? error("foo") : x, 1:4; on_error=ex->0)
4-element Vector{Int64}:
1
0
3
0
Использование макроса @distributed
Макрос @distributed в языке программирования Julia предоставляет возможность распараллеливания операций в цикле. Он позволяет выполнять итерации цикла на разных процессах, что может ускорить выполнение кода, особенно при работе с большими объемами данных.
Пример использования макроса @distributed:
@elapsed @sync @distributed for _ in 1:2
sleep(2)
end
2.450649919
В данном случае итерации цикла выполняются параллельно, без использования макроса время выполнения цекла заняло бы 4 секунды.
Использование макроса @everywhere
Макрос @everywhere используется для выполнения кода на всех доступных процессорах в параллельных вычислениях без необходимости явного указания каждого процесса.
Этот пример будет выполнен на каждом процессоре, доступном для параллельных вычислений, и выведет собственные значения случайной матрицы A:
@everywhere begin
using LinearAlgebra
A = rand()
println((A))
end
0.7949660890678617
From worker 2: 0.43047216493869567
From worker 3: 0.6615365425334665