Запустите функции MATLAB на нескольких графических процессорах

Этот пример показывает, как запустить код MATLAB по нескольким графическим процессорам параллельно, сначала по вашей локальной машине, затем масштабировав до кластера. Как демонстрационная проблема, пример использует логистическую карту, уравнение, которое моделирует рост генеральной совокупности.

Растущее число функций в MATLAB предлагает автоматическую параллельную поддержку, включая поддержку multi-gpu, не требуя никакого дополнительного кодирования. Для получения дополнительной информации смотрите функции MATLAB Выполнения с Автоматической Параллельной Поддержкой. Например, функция trainNetwork предлагает поддержку multi-gpu обучения нейронных сетей и вывода. Для получения дополнительной информации смотрите, Увеличивают Глубокое обучение параллельно и в Облаке (Deep Learning Toolbox).

Используйте один графический процессор

Чтобы запустить вычисления на одном графическом процессоре, используйте объекты gpuArray в качестве входных параметров к поддерживающим графический процессор функциям MATLAB. Чтобы узнать больше о поддерживающих графический процессор функциях, смотрите функции MATLAB Выполнения на графическом процессоре.

Создайте gpuArrays для темпа роста, r, и генеральной совокупности, x. Для получения дополнительной информации о создании gpuArrays, смотрите, Устанавливают Массивы на графическом процессоре.

N = 1000;
r = gpuArray.linspace(0,4,N);
x = rand(1,N,'gpuArray');

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

numIterations = 1000;
for n=1:numIterations
    x = r.*x.*(1-x);
end

Когда вычисления сделаны, строят темп роста против генеральной совокупности.

plot(r,x,'.');

Если вам нужно больше производительности, gpuArrays поддерживает несколько опций. Для списка смотрите, что gpuArray функционирует страница. Например, алгоритм в этом примере только выполняет поэлементные операции на gpuArrays, и таким образом, можно использовать функцию arrayfun, чтобы предварительно скомпилировать их для графического процессора.

Используйте несколько графических процессоров с parfor

Можно использовать циклы parfor, чтобы распределить for - итерации цикла среди параллельных рабочих. Если ваши вычисления используют поддерживающие графический процессор функции, то вычисления работают на графическом процессоре рабочего. Например, если вы используете Метод Монте-Карло, чтобы случайным образом моделировать эволюцию населения, симуляции вычисляются с несколькими графическими процессорами в параллели с помощью цикла parfor.

Создайте параллельный пул со столькими же рабочих сколько доступные графические процессоры. Чтобы определить количество доступных графических процессоров, используйте функцию gpuDeviceCount. По умолчанию MATLAB присваивает различный графический процессор каждому рабочему для лучшей производительности. Для получения дополнительной информации о выборе GPU в параллельном пуле смотрите Использование Несколько графических процессоров в Параллельном Пуле.

parpool(gpuDeviceCount);
Starting parallel pool (parpool) using the 'local' profile ...
connected to 2 workers.

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

numSimulations = 100;
X = zeros(numSimulations,N,'gpuArray');

Используйте цикл parfor, чтобы распределить симуляции рабочим в пуле. Код в цикле создает случайный gpuArray для начальной генеральной совокупности и выполняет итерации логистической карты на нем. Поскольку код использует поддерживающие графический процессор операторы на gpuArrays, вычисления автоматически работают на графическом процессоре рабочего.

parfor i = 1:numSimulations
    X(i,:) = rand(1,N,'gpuArray');
    for n=1:numIterations
        X(i,:) = r.*X(i,:).*(1-X(i,:));
    end
end

Когда вычисления сделаны, строят результаты всех симуляций. Каждый цвет представляет различную симуляцию.

figure
plot(r,X,'.');

Если вам нужно большее управление вашими вычислениями, можно использовать более усовершенствованную параллельную функциональность. Например, можно использовать DataQueue, чтобы отправить данные от рабочих во время вычислений. Для примера см. График Во время Развертки Параметра с parfor.

Если вы хотите сгенерировать восстанавливаемый набор случайных чисел, можно управлять генерацией случайных чисел на рабочем графический процессор. Для получения дополнительной информации смотрите Потоки Управления Случайных чисел на Рабочих.

Используйте несколько графических процессоров асинхронно с parfeval

Можно использовать parfeval, чтобы запустить вычисления асинхронно на параллельных рабочих пула. Если ваши вычисления используют поддерживающие графический процессор функции, то вычисления работают на графическом процессоре рабочего. Как пример, вы запускаете симуляции Монте-Карло на нескольких графических процессорах асинхронно.

Чтобы содержать результаты вычислений после, рабочие завершают их, используют будущие объекты. Предварительно выделите массив будущих объектов для результата каждой симуляции.

f(numSimulations) = parallel.FevalFuture;

Чтобы запустить вычисления с parfeval, необходимо разместить их в функции. Например, myParallelFcn содержит код одной симуляции.

type myParallelFcn
function x = myParallelFcn(r)
    N = 1000;
    x = gpuArray.rand(1,N);
    numIterations = 1000;
    for n=1:numIterations
        x = r.*x.*(1-x);
    end
end

Используйте цикл for, чтобы циклично выполниться по симуляциям и использовать parfeval, чтобы запустить их асинхронно на рабочем в параллельном пуле. myParallelFcn использует поддерживающие графический процессор функции на gpuArrays, таким образом, они работают на графическом процессоре рабочего. Поскольку parfeval выполняет вычисления асинхронно, он не делает блока MATLAB, и можно продолжить работать, в то время как вычисления происходят.

for i=1:numSimulations
    f(i) = parfeval(@myParallelFcn,1,r);
end

Чтобы собрать результаты parfeval, когда они готовы, можно использовать fetchOutputs (FevalFuture) или fetchNext на будущих объектах. Кроме того, можно использовать afterEach или afterAll, чтобы вызвать функции на результаты автоматически, когда они готовы. Например, чтобы построить результат каждой симуляции сразу после того, как это завершится, используйте afterEach на будущих объектах. Каждый цвет представляет различную симуляцию.

figure
hold on
afterEach(f,@(x) plot(r,x,'.'),0);

Используйте несколько графических процессоров в кластере

Если у вас есть доступ к кластеру с несколькими графическими процессорами, то можно увеличить вычисления. Используйте функцию parpool, чтобы запустить параллельный пул на кластере. Когда вы сделаете так, найдите что-либо подобное функциям, таким как циклы parfor или parfeval, работайте на кластерных рабочих. Если ваши вычисления используют поддерживающие графический процессор функции на gpuArrays, то те функции работают на графическом процессоре кластерного рабочего. Чтобы узнать больше об идущих параллельно функциях на кластере, смотрите, Масштабируют от Рабочего стола до Кластера.

Смотрите также

| | | | | |

Связанные примеры

Больше о

Внешние веб-сайты