Выберите Between Thread-Based и Process-Based Environments

С Parallel Computing Toolbox™ можно запустить параллельный код в различных параллельных средах, таких как основанные на потоке или основанные на процессе среды. Эти среды предлагают различные преимущества.

Обратите внимание на то, что основанные на потоке среды поддерживают только подмножество функций MATLAB®, доступных рабочим процесса. Если вы интересуетесь функцией, которая не поддерживается, сообщите команде MathWorks Technical Support. Для получения дополнительной информации о поддержке смотрите Поддержку Проверки Основанной на потоке Среды.

Выберите Parallel Environment

В зависимости от типа параллельной среды вы выбираете, функции, на которых работают или рабочие процесса, или распараллеливаете рабочих. Чтобы решить, какая среда является правильной для вас, консультируйтесь со следующей схемой и таблицей.

  • Чтобы использовать параллель объединяют функции, такие как parfor или parfeval, создайте параллельный пул в выбранной среде при помощи parpool функция.

    СредаРекомендацияПример
    Основанная на потоке среда на локальной машине

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

    parpool('threads')

    Примечание

    Если вы выбираете 'threads', проверяйте, что ваш код поддерживается. Для получения дополнительной информации смотрите Поддержку Проверки Основанной на потоке Среды.

    Узнать, можно ли извлечь достаточную пользу из основанного на потоке пула, передачи данных меры в основанном на процессе пуле с ticBytes и tocBytes. Если передача данных является большой, такой как выше 100 Мбайт, то используйте 'threads'.

    Основанная на процессе среда на локальной машине

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

    parpool('local')

    Основанная на процессе среда на удаленном кластере

    Используйте эту настройку, чтобы увеличить ваши расчеты.

    parpool('MyCluster')
    где MyCluster имя кластерного профиля.

  • Использовать кластерные функции, такие как batch, создайте кластерный объект в выбранной среде при помощи parcluster функция. Обратите внимание на то, что кластерные функции поддерживаются только в основанных на процессе средах.

    СредаРекомендацияПример
    Основанная на процессе среда на локальной машине

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

    parcluster('local')

    Основанная на процессе среда на удаленном кластере

    Используйте эту настройку, чтобы увеличить ваши расчеты.

    parcluster('MyCluster')

    где MyCluster имя кластерного профиля.

Рекомендация

Установка по умолчанию к основанным на процессе средам рекомендуется.

  • Они поддерживают полный язык параллельного программирования.

  • Они назад совместимы с предыдущими релизами.

  • Они более устойчивы в случае катастрофических отказов.

  • Внешние библиотеки не должны быть ориентированы на многопотоковое исполнение.

Выберите основанные на потоке среды когда:

  • Ваш параллельный код поддерживается основанными на потоке средами.

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

Сравните рабочих процесса и распараллельте рабочих

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

Создайте некоторые данные.

X = rand(10000, 10000);

Создайте параллельный пул рабочих процесса.

pool = parpool('local');
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 6).

Время выполнение и передача данных меры некоторого параллельного кода. В данном примере используйте parfeval выполнение.

ticBytes(pool);
tProcesses = timeit(@() fetchOutputs(parfeval(@sum,1,X,'all')))
tocBytes(pool)
tProcesses = 3.9060

             BytesSentToWorkers    BytesReceivedFromWorkers
             __________________    ________________________

    1                   0                       0          
    2                   0                       0          
    3                   0                       0          
    4                   0                       0          
    5             5.6e+09                   16254          
    6                   0                       0          
    Total         5.6e+09                   16254     

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

delete(pool);
pool = parpool('threads');

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

tThreads = timeit(@() fetchOutputs(parfeval(@sum,1,X,'all')))
tThreads = 0.0232

Сравните времена.

fprintf('Without data transfer, this example is %.2fx faster.\n', tProcesses/tThreads)
Without data transfer, this example is 168.27x faster.

Рабочие потока превосходят рабочих процесса по характеристикам, потому что рабочие потока могут использовать данные X не копируя его, и у них есть меньше планирования наверху.

Решите задачу оптимизации параллельно на основанном на потоке пуле

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

Этот пример требует Global Optimization Toolbox.

Описание проблемы

Проблема состоит в том, чтобы сменить положение и угол орудия, чтобы запустить снаряд в максимально возможной степени за стенкой. Орудие имеет скорость морды 300 м/с. Стенка 20 м высотой. Если орудие слишком близко к стенке, оно стреляет в слишком крутой угол, и снаряд не перемещается достаточно далеко. Если орудие слишком далеко от стенки, снаряд не перемещается достаточно далеко. Для полных проблемных деталей смотрите, Оптимизируют ОДУ в параллели (Global Optimization Toolbox) или последняя часть видео Суррогатной Оптимизации.

Формулировка задачи MATLAB

Чтобы решить задачу, вызовите patternsearch решатель от Global Optimization Toolbox. Целевая функция находится в cannonobjective функция помощника, которая вычисляет расстояние земли снаряда за стенкой для данного положения и угла. Ограничение находится в cannonconstraint функция помощника, которая вычисляет, врезается ли снаряд в стену или нет, или даже достигает стенки прежде, чем поразить землю. Функции помощника находятся в отдельных файлах, которые можно просмотреть, когда вы запускаете этот пример.

Установите следующие входные параметры для patternsearch решатель. Обратите внимание на то, что, чтобы использовать Parallel Computing Toolbox, необходимо установить UseParallel к true в опциях оптимизации.

lb = [-200;0.05];
ub = [-1;pi/2-.05];
x0 = [-30,pi/3];
opts = optimoptions('patternsearch',...
    'UseCompletePoll', true, ...
    'Display','off',...
    'UseParallel',true);
% No linear constraints, so set those inputs to empty:
A = [];
b = [];
Aeq = [];
beq = [];

Решите на основанном на процессе пуле

Для сравнения решите задачу на основанном на процессе параллельном пуле сначала.

Запустите параллельный пул рабочих процесса.

p = parpool('local');
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 6).

Чтобы воспроизвести те же расчеты позже, отберите случайный генератор со значением по умолчанию.

rng default;

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

tProcesses = zeros(5,1);
for repetition = 1:numel(tProcesses)
    tic
    [xsolution,distance,eflag,outpt] = patternsearch(@cannonobjective,x0, ...
        A,b,Aeq,beq,lb,ub,@cannonconstraint,opts);
    tProcesses(repetition) = toc;
end
tProcesses = mean(tProcesses)
tProcesses = 2.7677

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

delete(p);

Решите на основанном на потоке пуле

Запустите параллельный пул рабочих потока.

p = parpool('threads');
Starting parallel pool (parpool) ...
Connected to the parallel pool (number of workers: 6).

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

rng default
tThreads = zeros(5,1);
for repetition = 1:numel(tThreads)
    tic
    [xsolution,distance,eflag,outpt] = patternsearch(@cannonobjective,x0, ...
        A,b,Aeq,beq,lb,ub,@cannonconstraint,opts);
    tThreads(repetition) = toc;
end
tThreads = mean(tThreads)
tThreads = 1.5790

Сравните производительность рабочих потока и рабочих процесса.

fprintf('In this example, thread workers are %.2fx faster than process workers.\n', tProcesses/tThreads)
In this example, thread workers are 1.75x faster than process workers.

Заметьте увеличение производительности из-за оптимизации основанного на потоке пула.

По окончании с расчетами, удаляете параллельный пул.

delete(p);

Что такое основанные на потоке среды?

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

Основанные на потоке среды имеют следующие преимущества перед основанными на процессе средами.

  • Поскольку рабочие потока могут совместно использовать память, они могут получить доступ к числовым данным без копирования, таким образом, они - больше эффективной памяти.

  • Связь между потоками является менее трудоемкой. Поэтому издержки планирования задачи или коммуникации межрабочего меньше.

Когда вы используете основанные на потоке окружения, имеете в виду следующие факторы.

  • Проверяйте, что ваш код поддерживается для основанной на потоке среды. Для получения дополнительной информации смотрите Поддержку Проверки Основанной на потоке Среды.

  • Если вы пользуетесь внешними библиотеками от рабочих, то необходимо гарантировать, что библиотечные функции ориентированы на многопотоковое исполнение.

Что такое Основанные на процессе Среды?

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

Основанные на процессе среды имеют следующие преимущества перед основанными на потоке средами.

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

  • Они более устойчивы в случае катастрофических отказов. Если рабочий процесса отказывает, то клиент MATLAB не отказывает. Если рабочий процесса отказывает, и ваш код не использует spmd или распределенные массивы, затем остальная часть рабочих может продолжить запускаться.

  • Если вы пользуетесь внешними библиотеками от рабочих, то вы не должны обращать внимание на потокобезопасность.

  • Можно использовать кластерные функции, такие как batch.

Когда вы используете основанную на процессе среду, имеете в виду следующий фактор.

  • Если ваши файлы доступов кода от рабочих, то необходимо использовать дополнительные опции, такие как 'AttachedFiles' или 'AdditionalPaths', сделать данные доступными.

Проверяйте поддержку основанной на потоке среды

Распараллельте поддержку рабочих только подмножество функций MATLAB, доступных рабочим процесса. Если вы интересуетесь функцией, которая не поддерживается, сообщите команде MathWorks Technical Support.

Функциями языка параллельного программирования, которые поддерживаются, является parpoolparfor, parfeval, parfevalOnAllвысокий, и parallel.pool.ConstantСогласно нижеследующим ограничениям.

  • Основанный на потоке параллельный пул не имеет связанного кластерного объекта.

  • afterEach и afterAll не поддержаны.

  • FevalQueue не поддержан.

  • Длинные массивы не поддерживают write и поддержите только табличный текст и входные параметры в оперативной памяти.

Другие функции языка параллельного программирования, включая spmd, distributed, и parallel.pool.DataQueue, не поддержаны.

В общем случае много базовых функций MATLAB поддерживаются, включая:

  • Основы языка

  • Математика

  • Типы фундаментальных выражений (двойные, один, логические, целочисленные типы, char, массивы ячеек, строка, таблица, расписание, категориальное, datetime и длительность)

  • Поток управления и логика (например, если, циклы for и циклы с условием продолжения)

  • Скрипты, функции и классы

  • Пользовательские классы

В общем случае функции, которые изменяют или вещи доступа за пределами рабочего потока, не поддерживаются, включая:

  • Импорт и экспорт данных

  • Графика

  • Внешние языки

Совет

Попытайтесь запустить свой код по основанному на потоке пулу. MATLAB отображает сообщение об ошибке, если он сталкивается с какими-либо неподдерживаемыми функциями.

Смотрите также

|

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте