Примечание
Используя sim функция в пределах parfor цикл больше не рекомендуется. Для параллельного моделирования используйте parsim. См. раздел Запуск параллельного моделирования.
parfor позволяет выполнять параллельное (одновременное) моделирование модели (конструкции) Simulink ®. В этом контексте параллельные прогоны означают одновременное моделирование нескольких моделей для разных работников. Запросsim из в пределах parfor цикл часто помогает выполнять несколько прогонов моделирования одной и той же модели для различных входных данных или для различных настроек параметров. Например, можно сэкономить время моделирования при выполнении протягивания параметров и анализа Монте-Карло, запустив их параллельно. Обратите внимание, что параллельное моделирование выполняется с использованием parfor в настоящее время не поддерживает разложение модели на более мелкие соединенные части и одновременное выполнение отдельных частей на нескольких рабочих.
Режимы моделирования Normal, Accelerator и Rapid Accelerator поддерживаются sim в parfor. (См. разделы Выбор режима моделирования для получения подробной информации о выборе режима моделирования и Проектирование модели для эффективного ускорения для оптимизации времени выполнения моделирования.) В других режимах моделирования для получения полезных результатов необходимо решить любые проблемы доступа к рабочей области и параллелизма данных. В частности, при моделировании необходимо создавать отдельно именованные выходные файлы и переменные рабочей области. В противном случае каждое моделирование перезаписывает одни и те же переменные и файлы рабочей области или может иметь конфликты при попытке записи переменных и файлов одновременно.
Сведения о регенерации кода и обработке параметров в режиме быстрого ускорения см. в разделе Настройка параметров в режиме быстрого ускорения.
Также см. parfor(Панель инструментов параллельных вычислений).
Примечание
При открытии моделей внутри parfor оператор, закройте их снова с помощью bdclose all чтобы не оставлять временные файлы.
Этот фрагмент кода показывает, как можно использовать sim и parfor в обычном режиме. Сохранение изменений в модели перед моделированием в parfor. Сохраненная копия модели распространяется среди параллельных работников при моделировании в parfor.
% 1) Load model and initialize the pool.
model = 'sldemo_suspn_3dof';
load_system(model);
parpool;
% 2) Set up the iterations that we want to compute.
Cf = evalin('base', 'Cf');
Cf_sweep = Cf*(0.05:0.1:0.95);
iterations = length(Cf_sweep);
simout(iterations) = Simulink.SimulationOutput;
% 3) Need to switch all workers to a separate tempdir in case
% any code is generated for instance for StateFlow, or any other
% file artifacts are created by the model.
spmd
% Setup tempdir and cd into it
currDir = pwd;
addpath(currDir);
tmpDir = tempname;
mkdir(tmpDir);
cd(tmpDir);
% Load the model on the worker
load_system(model);
end
% 4) Loop over the number of iterations and perform the
% computation for different parameter values.
parfor idx=1:iterations
set_param([model '/Road-Suspension Interaction'],'MaskValues',...
{'Kf',num2str(Cf_sweep(idx)),'Kr','Cr'});
simout(idx) = sim(model, 'SimulationMode', 'normal');
end
% 5) Switch all of the workers back to their original folder.
spmd
cd(currDir);
rmdir(tmpDir,'s');
rmpath(currDir);
close_system(model, 0);
end
close_system(model, 0);
delete(gcp('nocreate'));Этот фрагмент кода идентичен фрагменту sim в parfor с обычным режимом
. Измените его следующим образом для использования sim и parfor в обычном режиме:
В пункте 1 измените parpool чтобы создать объект и использовать его для вызова имени кластера, выполните следующую команду.
p = parpool('clusterProfile');
% 'clusterProfile' is the name of the distributed clusterВ элементе 1 найдите файлы, от которых зависит модель, и присоедините эти файлы к модели для распространения среди работников кластера на удаленных компьютерах.
files = dependencies.fileDependencyAnalysis(modelName); p.addAttachedFiles(files);
Если у вас нет кластера MATLAB ® Parallel Server™, используйте локальный кластер. Дополнительные сведения см. в разделах Обнаружение кластеров и использование профилей кластеров (панель инструментов параллельных вычислений).
Запустите кластер перед запуском кода.
% 1) Load model and initialize the pool.
model = 'sldemo_suspn_3dof';
load_system(model);
parpool;
% 2) Set up the iterations that we want to compute.
Cf = evalin('base', 'Cf');
Cf_sweep = Cf*(0.05:0.1:0.95);
iterations = length(Cf_sweep);
simout(iterations) = Simulink.SimulationOutput;
% 3) Need to switch all workers to a separate tempdir in case
% any code is generated for instance for StateFlow, or any other
% file artifacts are created by the model.
spmd
% Setup tempdir and cd into it
addpath(pwd);
currDir = pwd;
addpath(currDir);
tmpDir = tempname;
mkdir(tmpDir);
cd(tmpDir);
% Load the model on the worker
load_system(model);
end
% 4) Loop over the number of iterations and perform the
% computation for different parameter values.
parfor idx=1:iterations
set_param([model '/Road-Suspension Interaction'],'MaskValues',...
{'Kf',num2str(Cf_sweep(idx)),'Kr','Cr'});
simout(idx) = sim(model, 'SimulationMode', 'normal');
end
% 5) Switch all of the workers back to their original folder.
spmd
cd(currDir);
rmdir(tmpDir,'s');
rmpath(currDir);
close_system(model, 0);
end
close_system(model, 0);
delete(gcp('nocreate'));Запуск моделирования Rapid Accelerator в parfor сочетает в себе скорость с автоматическим распределением предустановленного исполняемого файла в parfor рабочих. В результате этот режим исключает дублирование фазы диаграммы обновления.
Выполнение параллельного моделирования в режиме моделирования Rapid Accelerator с помощью sim и parfor команды:
Настройте модель для работы в режиме моделирования Rapid Accelerator.
Сохранение изменений в модели перед моделированием в parfor. Сохраненная копия модели распространяется среди параллельных работников при моделировании в parfor.
Убедитесь, что цель Rapid Accelerator уже создана и обновлена.
Отключите проверку актуальности цели Rapid Accelerator, установив sim параметр команды RapidAcceleratorUpToDateCheck кому 'off'.
Чтобы удовлетворить второму условию, можно изменять параметры только между моделированиями, не требующими перестроения модели. Другими словами, структурная контрольная сумма модели должна оставаться прежней. Следовательно, между моделированием можно изменять только настраиваемые параметры блок-схемы и настраиваемые параметры блока времени выполнения. Сведения о настраиваемых параметрах, для которых не требуется перестроение после внесения изменений, см. в разделе Определение необходимости перестроения при моделировании.
Чтобы отключить актуальную проверку цели Rapid Accelerator, используйте sim , как показано в этом примере.
parpool;
% Load the model and set parameters
model = 'vdp';
load_system(model);
% Build the Rapid Accelerator target
rtp = Simulink.BlockDiagram.buildRapidAcceleratorTarget(model);
% Run parallel simulations
parfor i=1:4
simOut{i} = sim(model,'SimulationMode', 'rapid',...
'RapidAcceleratorUpToDateCheck', 'off',...
'SaveTime', 'on',...
'StopTime', num2str(10*i));
close_system(model, 0);
end
close_system(model, 0);
delete(gcp('nocreate'));В этом примере вызов buildRapidAcceleratorTarget функция генерирует код один раз. Последующие вызовы sim с RapidAcceleratorUpToDateCheck выбор off гарантирует, что код не будет восстановлен. Таким образом, решаются проблемы параллелизма данных.
При установке RapidAcceleratorUpToDateCheck кому 'off', изменения, вносимые в значения параметров блока в модели (например, с помощью диалоговых окон блоков, с помощью set_param функция или путем изменения значений переменных MATLAB) не влияют на моделирование. Вместо этого используйте RapidAcceleratorParameterSets для передачи новых значений параметров непосредственно в моделирование.
Доступ к рабочей области для рабочих сессий MATLAB. По умолчанию для выполнения sim в parforавтоматически открывается параллельный пул, что позволяет выполнять код параллельно. Кроме того, можно сначала открыть работников MATLAB с помощью parpool команда. parfor затем запускает код в пределах parfor цикл в этих рабочих сессиях MATLAB. Однако работники MATLAB не имеют доступа к рабочей области клиентской сессии MATLAB, в которую были загружены модель и связанные с ней переменные рабочей области. Следовательно, если загрузить модель и определить связанные с ней переменные рабочей области вне и до parfor цикл, то ни модель не загружена, ни переменные рабочей области не определены в рабочих сессиях MATLAB, где parfor выполняются итерации. Обычно это происходит при определении параметров модели или внешних входных данных в базовой рабочей области клиентской сессии. Эти сценарии представляют собой проблемы с доступом к рабочей области.
Нарушение прозрачности. При выполнении sim в parfor с srcWorkspace установить в значение current, Simulink использует parfor рабочая область, которая является прозрачным рабочим пространством. Затем Simulink отображает ошибку нарушения прозрачности. Дополнительные сведения о прозрачных рабочих пространствах см. в разделе Обеспечение прозрачности в пакетных циклах или инструкциях spmd (Панель инструментов параллельных вычислений).
Доступ к словарю данных. Когда модель связана со словарем данных (см. Что такое словарь данных?), чтобы записать код в parfor который обращается к переменной или объекту, хранящемуся в словаре, необходимо использовать функции Simulink.data.dictionary.setupWorkerCache и Simulink.data.dictionary.cleanupWorkerCache для предотвращения проблем с доступом. Пример см. в разделе Управление вариантами протягивания с помощью параллельного моделирования.
Когда модель Simulink загружается в память в клиентском сеансе MATLAB, она видна и доступна только в этом сеансе MATLAB; он недоступен в памяти рабочих сеансов MATLAB. Аналогично, переменные рабочей области, связанные с моделью, которые определены в клиентской сессии MATLAB (такие как параметры и внешние входные данные), не доступны автоматически в рабочих сессиях. Поэтому необходимо обеспечить загрузку модели и определение переменных рабочей области, на которые ссылается модель, в рабочей сессии MATLAB с помощью следующих двух методов.
В parfor loop, используйте sim для загрузки модели и задания параметров, изменяющихся с каждой итерацией. (Альтернатива: загрузить модель, а затем использовать g(s)et_param для установки параметров в parfor цикл)
В parfor шлейф, используйте MATLAB evalin и assignin для назначения значений данных переменным.
Кроме того, можно упростить управление переменными рабочей области, определив их в рабочей области модели. Эти переменные будут автоматически загружены при загрузке модели в рабочие сессии. Однако этот способ имеет ограничения. Например, нельзя хранить сигнальные объекты, использующие класс хранения, отличный от Auto в рабочем пространстве модели. Подробное обсуждение рабочего пространства модели см. в разделе Рабочие пространства модели.
Задание значений параметров с помощью команды sim. Используйте sim в меню parfor для установки параметров, изменяющихся с каждой итерацией.
%Specifying Parameter Values Using the sim Command
model = 'vdp';
load_system(model)
%Specifying parameter values.
paramName = 'StopTime';
paramValue = {'10', '20', '30', '40'};
% Run parallel simulations
parfor i=1:4
simOut{i} = sim(model, ...
paramName, paramValue{i}, ...
'SaveTime', 'on'); %#ok
end
close_system(model, 0);
Эквивалентным методом является загрузка модели, а затем использование set_param для установки paramName в parfor цикл.
Задание значений переменных с помощью команды назначения. Значения переменных модели или моделирования можно передать работникам MATLAB с помощью assignin или evalin команда. В следующем примере показано, как использовать этот метод для загрузки переменных значений в соответствующую рабочую область работников MATLAB.
parfor i = 1:4
assignin('base', 'extInp', paramValue{i})%#ok
% 'extInp' is the name of the variable in the base
% workspace which contains the External Input data
simOut{i} = sim(model, 'ExternalInput', 'extInp'); %#ok
end
Управление вариантами сдвига с помощью параллельного моделирования. Использование параллельного моделирования для сдвига элемента управления исполнения (a Simulink.Parameter объект, значение которого влияет на условие исполнения Simulink.Variant объект), хранящийся в словаре данных, используйте этот код в качестве шаблона. Измените имена и значения модели, словаря данных и элемента управления исполнениями в соответствии с приложением.
Для сдвига значений параметров блока или переменных рабочей области, используемых для задания параметров блока, используйте Simulink.SimulationInput вместо программного интерфейса к словарю данных. См. раздел Оптимизация, оценка и значения параметров блока сдвига.
Для выполнения параллельного моделирования необходимо иметь лицензию Parallel Computing Toolbox™.
% For convenience, define names of model and data dictionary model = 'mySweepMdl'; dd = 'mySweepDD.sldd'; % Define the sweeping values for the variant control CtrlValues = [1 2 3 4]; % Grant each worker in the parallel pool an independent data dictionary % so they can use the data without interference spmd Simulink.data.dictionary.setupWorkerCache end % Determine the number of times to simulate numberOfSims = length(CtrlValues); % Prepare a nondistributed array to contain simulation output simOut = cell(1,numberOfSims); parfor index = 1:numberOfSims % Create objects to interact with dictionary data % You must create these objects for every iteration of the parfor-loop dictObj = Simulink.data.dictionary.open(dd); sectObj = getSection(dictObj,'Design Data'); entryObj = getEntry(sectObj,'MODE'); % Suppose MODE is a Simulink.Parameter object stored in the data dictionary % Modify the value of MODE temp = getValue(entryObj); temp.Value = CtrlValues(index); setValue(entryObj,temp); % Simulate and store simulation output in the nondistributed array simOut{index} = sim(model); % Each worker must discard all changes to the data dictionary and % close the dictionary when finished with an iteration of the parfor-loop discardChanges(dictObj); close(dictObj); end % Restore default settings that were changed by the function % Simulink.data.dictionary.setupWorkerCache % Prior to calling cleanupWorkerCache, close the model spmd bdclose(model) Simulink.data.dictionary.cleanupWorkerCache end
Примечание
Если словари данных открыты, использовать команду нельзя Simulink.data.dictionary.cleanupWorkerCache. Для идентификации открытых словарей данных используйте Simulink.data.dictionary.getOpenDictionaryPaths.
Проблемы параллелизма данных относятся к сценариям, для которых программное обеспечение одновременно пытается получить доступ к одному и тому же файлу для ввода или вывода данных. В Simulink они в первую очередь происходят в результате случайного характера parfor цикл при одновременном выполнении моделей Simulink. Наиболее распространенные случаи возникают при генерации или обновлении кода для цели моделирования блока Stateflow ®, блока модели или блока функции MATLAB во время параллельных вычислений. Причина в том, что Simulink пытается одновременно получить доступ к целевым данным из нескольких рабочих сеансов. Аналогично, блоки To File могут одновременно пытаться регистрировать данные в одних и тех же файлах во время параллельного моделирования и, таким образом, вызывать ошибки ввода-вывода. Или сторонний блоксет или написанная пользователем S-функция может вызвать проблему параллелизма данных при одновременной генерации кода или файлов.
Вторичная причина параллелизма данных связана с незащищенным доступом сетевых портов. Этот тип ошибки возникает, например, когда продукт Simulink предоставляет блоки, которые взаимодействуют через TCP/IP с другими приложениями во время моделирования. Одним из таких продуктов является HDL- Verifier™ для использования с имитатором Mentor Graphics ® ModelSim ® HDL.
Основное требование parfor - независимость различных итераций parfor тело. Это ограничение несовместимо с основным требованием моделирования посредством инкрементной генерации кода, для которого цель моделирования из предыдущего моделирования повторно используется или обновляется для текущего моделирования. Следовательно, во время параллельного моделирования модели, которое включает в себя генерацию кода (например, моделирование режима акселератора), Simulink одновременно пытается получить доступ (обновить) к цели моделирования. Однако можно избежать таких проблем параллелизма данных, создав временную папку в parfor и затем добавление нескольких строк кода MATLAB в цикл для выполнения следующих шагов:
Измените текущую папку на временную, доступную для записи.
Во временной папке загрузите модель, задайте параметры и входные векторы и смоделируйте модель.
Вернуться к исходной текущей папке.
Удалите временную папку и временный путь.
Таким образом, можно избежать проблем параллелизма, загрузив и смоделировав модель в отдельной временной папке. Ниже приведены примеры использования этого метода для решения распространенных проблем параллелизма.
Модель с потоком состояний, функциональным блоком MATLAB или блоком модели. В этом примере модель настроена на моделирование в режиме Accelerator или содержит поток состояний, блок функции MATLAB или блок модели (например, sf_bounce, sldemo_autotrans, или sldemo_mdlref_basic). В этих случаях Simulink генерирует код во время фазы инициализации моделирования. Моделирование такой модели в parfor приведет к созданию кода для тех же файлов, в то время как фаза инициализации выполняется в рабочих сеансах. Как показано ниже, можно избежать таких проблем параллелизма данных, запустив каждую итерацию parfor тело в другой временной папке.
parfor i=1:4
cwd = pwd;
addpath(cwd)
tmpdir = tempname;
mkdir(tmpdir)
cd(tmpdir)
load_system(model)
% set the block parameters, e.g., filename of To File block
set_param(someBlkInMdl, blkParamName, blkParamValue{i})
% set the model parameters by passing them to the sim command
out{i} = sim(model, mdlParamName, mdlParamValue{i});
close_system(model,0);
cd(cwd)
rmdir(tmpdir,'s')
rmpath(cwd)
end
Обратите внимание на следующее:
Можно также избежать других проблем параллелизма из-за ошибок ввода-вывода файлов, используя временную папку для каждой итерации parfor тело.
На платформах Windows ® рекомендуется вставить evalin('base', 'clear mex'); команда перед rmdir(tmpdir, 's'). Эта последовательность сначала закрывает MEX-файлы перед вызовом rmdir удалить tmpdir.
evalin('base', 'clear mex');
rmdir(tmpdir, 's')Модель с блоками в файл. При моделировании модели с блоками В файл изнутри parfor цикл, несравнимый характер цикла может привести к ошибкам ввода-вывода файла. Чтобы избежать таких ошибок во время параллельного моделирования, можно либо использовать приведенную выше идею временной папки, либо использовать sim в режиме ускорителя с опцией добавления суффикса к именам файлов, указанным в блоках модели «В файл». Путем предоставления уникального суффикса для каждой итерации parfor тело, вы можете избежать проблемы параллелизма.
rtp = Simulink.BlockDiagram.buildRapidAcceleratorTarget(model);
parfor idx=1:4
sim(model, ...
'ConcurrencyResolvingToFileSuffix', num2str(idx),...
'SimulationMode', 'rapid',...
'RapidAcceleratorUpToDateCheck', 'off');
end