С Parallel Computing Toolbox™ можно запустить параллельный код в различных параллельных средах, таких как основанные на потоке или основанные на процессе среды. Эти среды предлагают различные преимущества.
Обратите внимание на то, что основанные на потоке среды поддерживают только подмножество функций MATLAB®, доступных рабочим процесса. Если вы интересуетесь функцией, которая не поддерживается, сообщите команде MathWorks Technical Support. Для получения дополнительной информации о поддержке смотрите Поддержку Проверки Основанной на потоке Среды.
В зависимости от типа параллельной среды вы выбираете, функции, на которых работают или рабочие процесса, или распараллеливаете рабочих. Чтобы решить, какая среда является правильной для вас, консультируйтесь со следующей схемой и таблицей.
Чтобы использовать параллель объединяют функции, такой как parfor
или parfeval
, создайте параллельный пул в выбранной среде при помощи parpool
функция.
Среда | Рекомендация | Пример |
---|---|---|
Основанная на потоке среда на локальной машине | Используйте эту настройку для уменьшаемого использования памяти, быстрее планирования и более низких затрат на передачу данных. |
parpool('threads') Примечание Если вы выбираете Узнать, можно ли извлечь достаточную пользу из основанного на потоке пула, передачи данных меры в основанном на процессе пуле с |
Основанная на процессе среда на локальной машине | Используйте эту настройку для большинства вариантов использования и для прототипирования прежде, чем масштабироваться к кластерам или облакам. |
parpool('local') |
Основанная на процессе среда на удаленном кластере | Используйте эту настройку, чтобы увеличить ваши расчеты. | parpool('MyCluster') MyCluster имя кластерного профиля. |
Использовать кластерные функции, такой как batch
, создайте кластерный объект в выбранной среде при помощи parcluster
функция. Обратите внимание на то, что кластерные функции поддерживаются только в основанных на процессе средах.
Среда | Рекомендация | Пример |
---|---|---|
Основанная на процессе среда на локальной машине | Используйте эту настройку, если у вас есть достаточные локальные ресурсы, или моделировать прежде, чем масштабироваться к кластерам или облакам. |
parcluster('local') |
Основанная на процессе среда на удаленном кластере | Используйте эту настройку, чтобы увеличить ваши расчеты. |
parcluster('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).
Время выполнение и передача данных меры некоторого параллельного кода. В данном примере используйте a 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) или последняя часть видео Суррогатной Оптимизации.
Формулировка задачи 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 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 Technical Support.
parpool
, parfor
, parfeval
, parfevalOnAll
, tall
, и parallel.pool.Constant
поддерживаются согласно нижеследующим ограничениям.
Основанный на потоке параллельный пул не имеет связанного кластерного объекта.
afterEach
и afterAll
не поддерживаются.
FevalQueue
не поддерживается.
Длинные массивы не поддерживают write
и поддержите только табличный текст и входные параметры в оперативной памяти.
Другая функциональность языка параллельного программирования, включая spmd
, distributed
, и parallel.pool.DataQueue
, не поддерживается.
Следующая базовая функциональность MATLAB поддерживается на рабочем потока.
Функциональность в Основах языка за исключением функциональности во Вводе команд.
Функциональность в Математике кроме любых функций, которые строят фигуре.
Функциональность в Функциях, Классах и всей функциональности, связанной с попыткой, выгодой и MException
.
В общем случае функциональность, которая изменяет или вещи доступов за пределами рабочего потока, не поддерживается, включая следующую базовую функциональность MATLAB.
Функциональность в Импорте и анализе данных за исключением функциональности в Длинных массивах, Предварительно обрабатывая Данные и Описательную статистику.
Функциональность в графике и App Building.
Функциональность во внешних интерфейсах языка.
Функциональность, которая взаимодействует непосредственно со средой MATLAB или файловой системой.
gpuArray
поддерживается на рабочем потока.