Запустите функции 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 в параллельном пуле смотрите Использование Несколько графических процессоров в параллельном Пуле.

numGPUs = gpuDeviceCount("available");
parpool(numGPUs);
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,'.');

Если вам нужно большее управление вашими вычислениями, можно использовать более усовершенствованную параллельную функциональность. Например, можно использовать parallel.pool.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 или fetchNext на будущих объектах. Кроме того, можно использовать afterEach или afterAll вызвать функции на результаты автоматически, когда они готовы. Например, чтобы построить результат каждой симуляции сразу после того, как это завершится, используйте afterEach на будущих объектах. Каждый цвет представляет различную симуляцию.

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

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

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

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

| | | | | |

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

Больше о

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