parfor

Выполните for - итерации цикла параллельно на рабочих

Синтаксис

parfor loopVar = initVal:endVal; statements; end
parfor (loopVar = initVal:endVal,M); statements; end
parfor (loopVar = initVal:endVal,opts); statements; end
parfor (loopVar = initVal:endVal,cluster); statements; end

Описание

пример

parfor loopVar = initVal:endVal; statements; end выполняет for - итерации цикла параллельно на рабочих в параллельном пуле.

MATLAB® выполняет команды тела цикла в statements для значений loopVar между initVal и endVal. loopVar задает вектор целочисленных значений, увеличивающихся на 1. Если у вас есть Parallel Computing Toolbox™, итерации statements могут выполниться на параллельном пуле рабочих на вашем многоядерном компьютере или кластере. Как с for - цикл, можно включать одну строку или несколько строк в statements.

Чтобы узнать, как parfor может помочь увеличить вашу пропускную способность, смотрите, Решают, Когда Использовать parfor.

parfor отличается от традиционного for - цикл следующими способами:

  • Итерации цикла выполняются параллельно в недетерминированном порядке. Это означает, что вы можете должны быть изменить свой код, чтобы использовать parfor. Для большего количества справки смотрите, Преобразовывают циклы for В циклы parfor.

  • Итерации цикла должны быть последовательными, увеличив целочисленные значения.

  • Тело parfor - цикл должно быть независимым. Одна итерация цикла не может зависеть от предыдущей итерации, потому что итерации выполняются в недетерминированном порядке. Для большего количества справки смотрите, Гарантируют, Что Итерации цикла parfor Независимы.

  • Вы не можете использовать parfor - цикл в другом parfor - цикл. Для большего количества справки смотрите Вложенный parfor и циклы for и Другие parfor Требования.

пример

parfor (loopVar = initVal:endVal,M); statements; end использование M, чтобы задать максимальное количество рабочих от параллельного пула, чтобы использовать в оценке statements в теле цикла. M должен быть неотрицательным целым числом.

По умолчанию MATLAB использует доступных рабочих в вашем параллельном пуле. Можно изменить количество рабочих на вкладке Home в разделе Environment путем выбора Parallel> Parallel Preferences. Можно заменить количество по умолчанию рабочих в параллельном пуле при помощи parpool. Когда никакие рабочие не доступны в пуле, или M является нулем, MATLAB все еще выполняет тело цикла в недетерминированном порядке, но не параллельно. Используйте этот синтаксис, чтобы переключиться между параллельным и последовательным выполнением при тестировании кода.

С этим синтаксисом, чтобы выполнить итерации параллельно, у вас должен быть параллельный пул рабочих. По умолчанию, если вы выполняете parfor, вы автоматически создаете параллельный пул рабочих на кластере, заданном вашим кластерным профилем по умолчанию. Кластером по умолчанию является local. Можно изменить кластер в Parallel Preferences. Для получения дополнительной информации смотрите, Задают Ваши Параллельные Настройки.

parfor (loopVar = initVal:endVal,opts); statements; end использование opts, чтобы задать ресурсы, чтобы использовать в оценке statements в теле цикла. Создайте набор опций parfor с помощью функции parforOptions. С этим подходом можно запустить parfor на кластере без первого создания параллельного пула и управлять, как parfor делит итерации в подобласти значений для рабочих.

пример

parfor (loopVar = initVal:endVal,cluster); statements; end выполняет statements на рабочих в cluster, не создавая параллельный пул. Это эквивалентно выполнению parfor (loopVar = initVal:endVal,parforOptions(cluster)); statements; end.

Примеры

свернуть все

Создайте parfor - цикл для в вычислительном отношении интенсивной задачи и измерьте получившееся ускорение.

В редакторе MATLAB введите следующий for - цикл. Измерять время протекло, добавьте tic и toc.

tic
n = 200;
A = 500;
a = zeros(1,n);
for i = 1:n
    a(i) = max(abs(eig(rand(A))));
end
toc

Запустите скрипт и отметьте прошедшее время.

Elapsed time is 31.935373 seconds.

В скрипте замените for - цикл с parfor - цикл.

tic
n = 200;
A = 500;
a = zeros(1,n);
parfor i = 1:n
    a(i) = max(abs(eig(rand(A))));
end
toc

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

По умолчанию MATLAB автоматически открывает параллельный пул рабочих на вашей локальной машине.

Elapsed time is 10.760068 seconds. 

Заметьте, что вы ускоряете свое вычисление путем преобразования for - цикла в parfor - цикл на четырех рабочих. Вы можете уменьшать прошедшее время далее путем увеличения числа рабочих в параллельном пуле. Для получения дополнительной информации смотрите, Преобразовывают циклы for В циклы parfor и Увеличивают циклы parfor, чтобы Кластеризироваться и Объединиться в облако.

Можно задать максимальное количество рабочих M для parfor - цикл. Установите M = 0 запускать тело цикла в настольном MATLAB, не используя рабочих, даже если пул открыт. Когда M = 0, MATLAB все еще выполняет тело цикла в недетерминированном порядке, но не параллельно, так, чтобы можно было проверять, независимы ли parfor - циклы и подходят, чтобы работать на рабочих. Это - самый простой способ позволить вам отлаживать содержимое parfor - цикл. Вы не можете установить точки останова непосредственно в теле parfor - цикл, но можно установить точки останова в функциях, вызванных от тела parfor - цикл.

Задайте M = 0, чтобы запустить тело parfor - цикл в настольном MATLAB, даже если пул открыт.

 M = 0;                     % M specifies maximum number of workers
 y = ones(1,100);
 parfor (i = 1:100,M)
      y(i) = i;
 end

Чтобы управлять количеством рабочих в вашем параллельном пуле, смотрите, Задают Ваши Параллельные Настройки и parpool.

Чтобы измериться, сколько данных передается и от рабочих в вашем текущем параллельном пуле, добавьте ticBytes(gcp) и tocBytes(gcp) до и после parfor - цикл. Используйте gcp в качестве аргумента, чтобы получить текущий параллельный пул.

Удалите свой текущий параллельный пул, если у вас все еще есть тот.

delete(gcp('nocreate'))
tic
ticBytes(gcp);
n = 200;
A = 500;
a = zeros(1,n);
parfor i = 1:n
    a(i) = max(abs(eig(rand(A))));
end
tocBytes(gcp)
toc

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

По умолчанию MATLAB автоматически открывает параллельный пул рабочих на вашей локальной машине.

Starting parallel pool (parpool) using the 'local' profile ... connected to 4 workers.
...
             BytesSentToWorkers    BytesReceivedFromWorkers
             __________________    ________________________

    1        15340                  7024                   
    2        13328                  5712                   
    3        13328                  5704                   
    4        13328                  5728                   
    Total    55324                 24168                   

Можно использовать ticBytes и результаты tocBytes исследовать объем данных, переданный и от рабочих в параллельном пуле. В этом примере передача данных является маленькой. Для получения дополнительной информации о parfor - циклы, смотрите, Решают, Когда Использовать parfor и Преобразовать циклы for В циклы parfor.

Создайте кластерный объект с помощью функции parcluster и создайте набор опций parfor с нею. По умолчанию parcluster использует ваш кластерный профиль по умолчанию. Проверяйте, что ваш профиль по умолчанию на вкладке MATLAB Home, параллельно> Выбирают Default Cluster.

cluster = parcluster;

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

Когда вы используете этот подход, parfor может использовать всех доступных рабочих в кластере, и рабочие становятся доступными, как только цикл завершается. Этот подход также полезен, если ваш кластер не поддерживает параллельные пулы. Если вы хотите управлять другими опциями, включая разделение итераций, используйте parforOptions.

values = [3 3 3 7 3 3 3];
parfor (i=1:numel(values),cluster)
    out(i) = norm(pinv(rand(values(i)*1e3)));
end

Используйте этот синтаксис, чтобы запустить parfor на большом кластере, не используя рабочих для дольше, чем необходимый.

Входные параметры

свернуть все

Индексная переменная цикла с начальным значением initVal и окончательное значение endVal. Переменная может быть любым числовым типом, и значение должно быть целым числом.

Убедитесь, что ваш parfor - переменные цикла являются последовательными увеличивающимися целыми числами. Для большего количества справки смотрите Переменные Поиска и устранения неисправностей в циклах parfor.

Область значений parfor - переменная цикла не должна превышать поддерживаемую область значений. Для большего количества справки смотрите, Избегают Переполнения в циклах parfor.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Цикл начального значения индексирует переменную, loopVar. Переменная может быть любым числовым типом, и значение должно быть целым числом. С endVal, задает вектор области значений parfor, который должен иметь форму M:N.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Цикл окончательного значения индексирует переменную, loopVar. Переменная может быть любым числовым типом, и значение должно быть целым числом. С initVal, задает вектор области значений parfor, который должен иметь форму M:N.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Тело цикла, заданное как текст. Серия команд MATLAB, чтобы выполниться в parfor - цикл.

Вы можете должны быть изменить свой код, чтобы использовать parfor - циклы. Для большего количества справки смотрите, Преобразовывают циклы for В циклы parfor

Не вкладывайте parfor - циклы, смотрите Вложенный parfor и циклы for и Другие parfor Требования.

Максимальное количество рабочих, запускающихся параллельно, заданный как неотрицательное целое число. Если вы задаете верхний предел, использование MATLAB не больше, чем этот номер, даже если дополнительные рабочие доступны. Если вы запрашиваете больше рабочих, чем количество доступных рабочих, то MATLAB использует максимальное количество рабочих, доступных во время вызова. Если итерации цикла - меньше, чем количество рабочих, некоторые рабочие не выполняют никакие, работают.

Если parfor не может работать на нескольких рабочих (например, если только одно ядро доступно, или M 0), MATLAB выполняет цикл последовательным способом. В этом случае MATLAB все еще выполняет тело цикла в недетерминированном порядке. Используйте этот синтаксис, чтобы переключиться между параллельным и последовательным при тестировании кода.

Опции parfor, заданные как объект ClusterOptions. Используйте функцию parforOptions, чтобы создать набор опций parfor.

Пример: opts = parforOptions(parcluster);

Кластер, заданный как объект parallel.Cluster, на котором запускается parfor. Чтобы создать кластерный объект, используйте функцию parcluster.

Пример: cluster = parcluster('local')

Типы данных: parallel.Cluster

Советы

  • Используйте parfor - цикл когда:

    • У вас есть много итераций цикла простого вычисления. parfor делит итерации цикла на группы так, чтобы каждый поток мог выполнить одну группу итераций.

    • У вас есть некоторые итерации цикла, которые занимают много времени, чтобы выполниться.

  • Не используйте parfor - цикл, когда итерация в вашем цикле будет зависеть от результатов других итераций.

    Сокращения являются одним исключением к этому правилу. Переменная reduction накапливает значение, которое зависит от всех итераций вместе, но независимо от порядка итерации. Для получения дополнительной информации смотрите Переменные Сокращения.

  • Когда вы используете parfor, необходимо ожидать цикла, чтобы завершиться, чтобы получить результаты. Ваш клиент MATLAB блокируется и вы не можете убежать из цикла рано. Если вы хотите получить промежуточные результаты или убежать из for - цикл рано, попробуйте parfeval вместо этого.

  • Если вы не задаете кластерный объект, parfor - цикл работает на существующем параллельном пуле. Если никакой пул не существует, parfor запускает новый параллельный пул, если автоматический запуск пулов не отключен в ваших параллельных настройках. Если нет никакого параллельного пула, и parfor не может запуститься один, цикл запускается последовательно на клиентском сеансе.

  • Если свойство AutoAttachFiles в кластерном профиле для параллельного пула установлено в true, MATLAB выполняет анализ parfor - цикл, чтобы определить, какие файлы кода необходимы для его выполнения, смотрите listAutoAttachedFiles. Затем MATLAB автоматически присоединяет те файлы к параллельному пулу так, чтобы код был доступен рабочим.

  • Вы не можете вызвать скрипты непосредственно в parfor - цикле. Однако можно вызвать функцию, которая вызывает скрипты.

  • Не используйте clear в цикле parfor, потому что он нарушает прозрачность рабочей области. Смотрите Гарантируют Прозрачность в циклах parfor или spmd Операторах.

  • Можно запустить модели Simulink® параллельно с командой parsim вместо того, чтобы использовать parfor - циклы. Для получения дополнительной информации и примеры использования Simulink параллельно, смотрите Выполнение Несколько Симуляций (Simulink).

Введенный в R2008a