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

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

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

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

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

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

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

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

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

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

plot(r,x,'.');

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

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

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

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

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 для начальной генеральной совокупности и итерацию логистической карты на нем. Поскольку код использует операторы с поддержкой GPU на 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 для асинхронного выполнения расчетов в параллельных пулах. Если ваши расчеты используют функции с поддержкой GPU, то расчетов запуска на графическом процессоре работника. В качестве примера вы запускаете симуляции Монте-Карло на нескольких графических процессорах асинхронно.

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

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 использует функции с поддержкой GPU на gpuArray, поэтому они выполняются на графическом процессоре работника. Потому что 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, выполняйте на кластерных работниках. Если ваши расчеты используют функции с поддержкой GPU на gpuArrays, то эти функции выполняются на графическом процессоре рабочего кластера. Дополнительные сведения о запуске параллельных функций на кластере см. в разделе Шкале с рабочего стола на кластер.

См. также

| | | | | |

Похожие примеры

Подробнее о

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