В этом примере показано, как запустить код 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, то эти функции выполняются на графическом процессоре рабочего кластера. Дополнительные сведения о запуске параллельных функций на кластере см. в разделе Шкале с рабочего стола на кластер.
afterEach
| fetchOutputs (FevalFuture)
| gpuArray
| gpuDevice
| parfeval
| parfor
| parpool