Запустите функции 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, то те функции работают на графическом процессоре кластерного рабочего. Чтобы узнать больше об идущих параллельно функциях в кластере, смотрите, Масштабируют от Рабочего стола до Кластера.

Усовершенствованная поддержка быстрого мультиузла коммуникация графического процессора

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

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

Если вы используете Linux, вычисляют кластер с быстрыми межсоединениями между машинами, такими как Infiniband, или быстро соединяет между графическими процессорами на различных машинах, таких как GPUDirect RDMA, вы можете смочь использовать в своих интересах быструю поддержку мультиузла в MATLAB. Включите эту поддержку на всех рабочих в вашем пуле путем установки переменной окружения PARALLEL_SERVER_FAST_MULTINODE_GPU_COMMUNICATION к 1. Установите эту переменную окружения в Кластерном менеджере по Профилю.

Этой функцией является часть библиотеки NVIDIA NCCL для коммуникации графического процессора. Чтобы сконфигурировать его, необходимо установить переменные новой среды задавать протокол сетевого интерфейса, особенно NCCL_SOCKET_IFNAME. Для получения дополнительной информации см. документацию NCCL и в частности раздел по Переменным окружения NCCL.

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

| | | | | |

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

Больше о

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