exponenta event banner

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

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

Растущее число функций MATLAB обеспечивает автоматическую параллельную поддержку, включая поддержку нескольких gpu, без необходимости дополнительного кодирования. Дополнительные сведения см. в разделе Выполнение функций MATLAB с автоматической параллельной поддержкой. Например, trainNetwork функция предлагает поддержку нескольких gpu для обучения нейронных сетей и вывода. Дополнительные сведения см. в разделе Масштабирование глубокого обучения параллельно и в облаке (инструментарий глубокого обучения).

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

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

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

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

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

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 назначает каждому работнику отдельный графический процессор для достижения оптимальной производительности. Дополнительные сведения о выборе графических процессоров в параллельном пуле см. в разделе Использование нескольких графических процессоров в параллельном пуле.

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, вычисления автоматически выполняются на GPU работника.

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 для отправки данных от работников во время вычислений. Пример см. в разделе Печать при протягивании параметров с образцом.

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

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

См. также

| | | | | |

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

Подробнее

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