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-Loops в циклы parfor.

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

  • Тело parfor-цикл должен быть независимым. Одна итерация цикла не может зависеть от предыдущей итерации, потому что итерации выполняются в недетерминированном порядке. Для получения дополнительной справки см. Раздел «Убедитесь, что итерации цикл parfor являются независимыми».

  • Вы не можете использовать parfor-цикл внутри другого parfor-цикл. Для получения дополнительной справки смотрите Вложенные parfor и for-Loops и Другие требования 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-цикл с 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-Loops в циклы parfor и Шкалу циклов parfor в кластер и облако.

Можно задать максимальное количество работников M для parfor-цикл. Задайте M = 0 чтобы запустить тело цикла в рабочем столе MATLAB, без использования рабочих процессов, даже если пул открыт. Когда M = 0MATLAB все еще выполняет тело цикла в недетерминированном порядке, но не параллельно, так что можно проверить, 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

Чтобы контролировать количество работников в вашем параллельном пуле, смотрите Specify Your Parallel Preferences и 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-Loops в циклы parfor».

Создайте объект кластера с помощью parcluster и создайте набор parfor опции с ним. По умолчанию parcluster использует профиль кластера по умолчанию. Проверьте профиль по умолчанию на вкладке MATLAB Home, в Parallel > Select a Кластер.

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.

The области значений of 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-Loops в циклы parfor»

Не гнездиться parfor-циклы, см. Вложенный parfor и for-Loops и Другие требования 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-loop, когда итерация в вашем цикле зависит от результатов других итераций.

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

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

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

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

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

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

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

Введенный в R2008a