parfor

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

Описание

пример

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

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

Примеры

свернуть все

Создайте a 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- цикл с a 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- цикл в a 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 блокируется и вы не можете убежать из цикла рано. Если вы хотите получить промежуточные результаты или убежать из a for- цикл рано, попробовать parfeval вместо этого.

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

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

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

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

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

Введенный в R2008a