Документация Engee

Распределенные вычисления

Engee предоставляет возможности для реализации распределенных вычислений с помощью библиотеки, называемой Distributed. Инструменты этой библиотеки помогают исследовать возможности выполнения задач в отдельных потоках, которые могут находиться на разных вычислительных ядрах.

parallel_computing1.png

Импорт библиотеки для распределённых вычислений:

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

Выводы

В данном примере было продемонстрировано использование библиотеки Distributed для реализации распределенных вычислений. Были приведены примеры использования функции pmap и макросов @distributed и @everywhere для параллельного выполнения задач и операций в цикле.