Примечание
Используя sim
функция в parfor
цикл больше не рекомендуется. Для идущих параллельно симуляций использовать parsim
. Смотрите Запуск параллельной симуляции.
parfor
команда позволяет вам идти параллельно (одновременный) Simulink® симуляции вашей модели (проект). В этом контексте найдите что-либо подобное средним симуляциям многоуровневой модели запусков одновременно на различных рабочих. Вызов sim
из a parfor
цикл часто помогает для выполнения нескольких запусков симуляции той же модели для различных входных параметров или для различных установок параметров. Например, можно сохранить время симуляции, выполняющее развертки параметра и исследования Монте-Карло путем выполнения их параллельно. Обратите внимание на то, что идущее параллельно использование симуляций parfor
в настоящее время не поддерживает разложение вашей модели в меньшие связанные части и выполнение отдельных частей одновременно на нескольких рабочих.
Нормальный, Акселератор и Быстрые режимы симуляции Акселератора поддерживаются sim
\in parfor
. (См. Выбор Simulation Mode для получения дополнительной информации о выборе режима симуляции и Проекта Ваша Модель для Эффективного Ускорения для оптимизации времени выполнения симуляции.) Для других режимов симуляции необходимо решить любые проблемы доступа к рабочей области и проблемы параллелизма данных, чтобы привести к полезным результатам. А именно, симуляции должны создать отдельно названные выходные файлы и переменные рабочей области. В противном случае каждая симуляция перезаписывает те же переменные рабочей области и файлы, или может иметь столкновения, пытающиеся записать переменные и файлы одновременно.
Для получения информации о регенерации кода и обработке параметра в Быстром Режиме Accelerator, смотрите, что Параметр Настраивает Быстрый Режим Accelerator.
Кроме того, смотрите parfor
(Parallel Computing Toolbox).
Примечание
Если вы открываете модели внутри a parfor
оператор, закройте их снова использование bdclose all
постараться не оставлять временные файлы.
Этот фрагмент кода показывает, как можно использовать sim
и parfor
в Режиме normal mode. Сохраните изменения в своей модели прежде, чем симулировать в 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 с Режимом normal mode
. Измените его можно следующим образом для использования sim
и parfor
в Режиме normal mode:
В пункте 1 измените parpool
команда можно следующим образом, чтобы создать объект и использовать его, чтобы вызвать кластерное имя.
p = parpool('clusterProfile'); % 'clusterProfile' is the name of the distributed cluster
В пункте 1 найдите файлы, от которых зависит модель, и присоедините те файлы к модели для распределения кластерным рабочим на удаленных машинах.
files = dependencies.fileDependencyAnalysis(modelName); p.addAttachedFiles(files);
Если у вас нет MATLAB® Кластер Parallel Server™, используйте свой локальный кластер. Для получения дополнительной информации смотрите, Обнаруживают Кластеры и Профили Кластера Использования (Parallel Computing Toolbox).
Запустите свой кластер прежде, чем запустить код.
% 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'));
Выполнение Быстрых симуляций Акселератора в parfor
скорость объединений с автоматическим распределением предварительно созданного исполняемого файла к parfor
рабочие. В результате этот режим устраняет дублирование фазы схемы обновления.
Идти параллельно симуляции в Быстром режиме симуляции Акселератора с помощью sim
и parfor
команды:
Сконфигурируйте модель, чтобы запуститься в Быстром режиме симуляции Акселератора.
Сохраните изменения в своей модели прежде, чем симулировать в parfor
. Сохраненная копия вашей модели распределяется, чтобы быть параллельной рабочим при симуляции в parfor
.
Убедитесь, что Быстрая цель Акселератора уже создается и актуальна.
Отключите актуальную проверку цели Быстрого Акселератора путем установки sim
опция команды RapidAcceleratorUpToDateCheck
к 'off'
.
Чтобы удовлетворить второму условию, можно изменить параметры только между симуляциями, которые не требуют, чтобы модель восстановила. Другими словами, структурная контрольная сумма модели должна остаться то же самое. Следовательно, можно изменить только настраиваемые параметры блок-схемы и настраиваемые параметры блоков во время выполнения между симуляциями. Для обсуждения настраиваемых параметров, которые не требуют восстанавливания последующего за их модификациями, смотрите, Определяют, Восстановит ли Симуляция.
Чтобы отключить Быстрый Акселератор предназначаются для актуальной проверки, используют 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
\in parfor
, параллельный пул открывается автоматически, позволяя коду запуститься параллельно. В качестве альтернативы можно также открыть сначала работников MATLAB, использующих parpool
команда. parfor
команда затем запускает код в parfor
цикл на этих сеансах работника MATLAB. У работников MATLAB, однако, нет доступа к рабочей области клиентского сеанса MATLAB, где модель и ее связанные переменные рабочей области загрузились. Следовательно, если вы загружаете модель и задаете ее связанные переменные рабочей области за пределами и прежде a parfor
цикл, затем и при этом модель не загружена, и при этом переменные рабочей области не заданы на сеансах работника MATLAB где parfor
итерации выполняются. Это обычно имеет место, когда вы задаете параметры модели или внешние входные параметры в базовом рабочем пространстве клиентского сеанса. Эти сценарии составляют проблемы доступа к рабочей области.
Нарушение прозрачности. Когда вы запускаетесь sim
\in parfor
с srcWorkspace
установите на current
, Simulink использует parfor
рабочая область, которая является прозрачной рабочей областью. Simulink затем отображает ошибку для нарушения прозрачности. Для получения дополнительной информации о прозрачных рабочих областях смотрите, Гарантируют Прозрачность в циклах parfor или spmd Операторах (Parallel Computing Toolbox).
Словарь данных доступ. Когда модель соединена со словарем данных (см. то, Что Словарь Данных?), чтобы написать код в parfor
это получает доступ к переменной, или возразите, что вы храните в словаре, необходимо использовать функции Simulink.data.dictionary.setupWorkerCache
и Simulink.data.dictionary.cleanupWorkerCache
предотвратить проблемы доступа. Для примера смотрите, что Управление Вариантом Развертки Использует Параллельную Симуляцию.
Когда модель Simulink загружается в память на клиентском сеансе MATLAB, это только отображается и доступно в том сеансе работы с MATLAB; это не доступно в памяти о сеансах работника MATLAB. Точно так же переменные рабочей области сопоставили с моделью, которые заданы на клиентском сеансе MATLAB (таком как параметры, и внешние входные параметры) не автоматически доступны на сеансах рабочего. Необходимо поэтому гарантировать, что модель загружается и что переменные рабочей области, на которые ссылаются в модели, заданы на сеансе работника MATLAB при помощи следующих двух методов.
В parfor
цикл, используйте 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
команда, чтобы установить the paramName
в parfor
цикл.
Определение Значений переменных Используя Команду assignin. Можно передать значения модели или переменных симуляции работникам 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
Разверните Различное Управление Используя Параллельную Симуляцию. Использовать параллельную симуляцию, чтобы развернуть различное управление (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®, блок Model или блок MATLAB function во время параллельных вычислений. Причина, в этом случае, состоит в том, что Simulink пробует к одновременно целевым данным о доступе из нескольких сеансов рабочего. Точно так же блоки To File могут одновременно попытаться к данным логов к тем же файлам во время параллельных симуляций и таким образом вызвать ошибки ввода-вывода. Или сторонняя библиотека или написанная пользователем S-функция могут вызвать проблему параллелизма данных при одновременной генерации кода или файлов.
Вторичная причина параллелизма данных происходит из-за незащищенного доступа сетевых портов. Этот тип ошибки происходит, например, когда продукт Simulink обеспечивает блоки, которые связываются через TCP/IP с другими приложениями в процессе моделирования. Одним таким продуктом является HDL Verifier™ для использования с Mentor Graphics® ModelSim® Симулятор HDL.
Базовое требование parfor
независимость различных итераций parfor
тело. Это ограничение не совместимо с базовым требованием симуляции через инкрементную генерацию кода, для которой симуляция предназначаются от предшествующей симуляции, снова используется или обновляется для текущей симуляции. Следовательно во время параллельной симуляции модели, которая вовлекает генерацию кода (такую как симуляция Режима Accelerator), Simulink предпринимает параллельные попытки получить доступ (обновляют) цель симуляции. Однако можно избежать таких проблем параллелизма данных путем создания временной папки в parfor
цикл и затем добавляющий нескольких линий кода MATLAB к циклу, чтобы выполнить следующие шаги:
Измените текущую папку во временную, перезаписываемую папку.
Во временной папке загрузите модель, установите параметры и входные векторы, и симулируйте модель.
Возвратитесь к оригиналу, текущей папке.
Удалите временную папку и временный путь.
Этим способом вы избегаете проблем параллелизма путем загрузки и симуляции модели в отдельной временной папке. Следующее является примерами, которые используют этот метод, чтобы решить общие вопросы параллелизма.
Модель с помощью Stateflow, блока MATLAB function или блока Model. В этом примере или модель сконфигурирована, чтобы симулировать в Режиме Accelerator, или это содержит Stateflow, блок MATLAB function или блок Model (например, 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')
Модель с С Блоками Файла. Если вы симулируете модель with To File, блокируется изнутри a parfor
цикл, непоследовательная природа цикла может вызвать ошибки файлового ввода-вывода. Чтобы избежать таких ошибок во время параллельных симуляций, можно или использовать временную идею папки выше или использовать sim
команда в Быстром Режиме Accelerator с опцией, чтобы добавить суффикс к именам файлов, заданным в блоках модели To File. Путем обеспечения уникального суффикса для каждой итерации parfor
тело, можно избежать проблемы параллелизма.
rtp = Simulink.BlockDiagram.buildRapidAcceleratorTarget(model); parfor idx=1:4 sim(model, ... 'ConcurrencyResolvingToFileSuffix', num2str(idx),... 'SimulationMode', 'rapid',... 'RapidAcceleratorUpToDateCheck', 'off'); end