exponenta event banner

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

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

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

Выбрать параллельную среду

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

  • Использование параллельных элементов пула, таких как 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 без копирования, и у них меньше накладных расходов на планирование.

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

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

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

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

Формулировка проблемы MATLAB

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

Установите следующие входные данные для patternsearch решатель. Обратите внимание, что для использования панели инструментов параллельных вычислений необходимо задать '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 these 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.

Рабочие потоки поддерживаются в автономных приложениях, созданных с помощью MATLAB Compiler™ и веб-приложений, размещенных на MATLAB Web App Server™.

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

См. также

|

Связанные темы