exponenta event banner

parfor

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

Описание

пример

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

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

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

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

пример

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

По умолчанию MATLAB использует доступных работников в параллельном пуле. Можно изменить число работников на вкладке Главная (Home) в разделе Среда (Environment), выбрав Параллельный (Parallel) > Параллельные настройки (Parallel Preferences). Можно переопределить количество работников по умолчанию в параллельном пуле с помощью parpool. Если в пуле нет работников или M равно нулю, MATLAB по-прежнему выполняет тело цикла в недетерминированном порядке, но не параллельно. Этот синтаксис используется для переключения между параллельным и последовательным выполнением при тестировании кода.

С помощью этого синтаксиса для параллельного выполнения итераций необходимо иметь параллельный пул работников. По умолчанию при выполнении parforавтоматически создается параллельный пул работников в кластере, определенном профилем кластера по умолчанию. Кластер по умолчанию - локальный. Можно изменить кластер в окне «Настройки параллельной работы». Дополнительные сведения см. в разделе Определение параметров параллели.

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 и Масштабирование циклов Up в кластер и облако.

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

Создание объекта кластера с помощью parcluster и создать набор parfor варианты с ним. По умолчанию parcluster использует профиль кластера по умолчанию. Проверьте профиль по умолчанию на вкладке Главная страница MATLAB (Parallel > Select a 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Переменные -loop являются последовательными увеличивающимися целыми числами. Дополнительные сведения см. в разделе Устранение неполадок переменных в контурах parfor.

Диапазон parforпеременная -loop не должна превышать поддерживаемый диапазон. Дополнительные сведения см. в разделе Предотвращение переполнений в пакетных контурах.

Типы данных: 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- петли, см. Вложенные части для и для - Петли и другие части для требований.

Максимальное число параллельно работающих работников, указанное как неотрицательное целое число. При указании верхнего предела 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- петля, когда итерация в цикле зависит от результатов других итераций.

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

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

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

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

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

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

  • Вы можете запускать модели Simulink ® параллельно с parsim вместо использования команды parfor-контуры. Дополнительные сведения и примеры параллельного использования Simulink см. в разделе Запуск нескольких моделирований (Simulink).

Представлен в R2008a