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