В этом примере показано, как запустить код 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.
gpuArray
| gpuDevice
| parpool
| parfor
| parfeval
| fetchOutputs
| afterEach