Используя функцию sim в цикле parfor больше не рекомендуется. Для идущих параллельно моделирований используйте parsim. Смотрите, Идут параллельно Моделирования.
Команда parfor
позволяет вам идти параллельно (одновременные) моделирования Simulink® своей модели (дизайн). В этом контексте найдите что-либо подобное средним моделированиям многоуровневой модели выполнений в то же время на различных рабочих. Вызов sim
из цикла parfor
часто помогает для выполнения нескольких выполнений моделирования той же модели для различных входных параметров или для различных установок параметров. Например, можно сохранить время симуляции, выполняющее развертки параметра и исследования Монте-Карло путем выполнения их параллельно. Обратите внимание на то, что идущие параллельно моделирования с помощью parfor
в настоящее время не поддерживают разложение модели в меньшие связанные части и выполнение отдельных частей одновременно на нескольких рабочих.
Нормальный, Акселератор и Быстрые режимы моделирования Акселератора поддержаны sim
в parfor
. (См. Выбор Simulation Mode для получения дополнительной информации о выборе режима моделирования и Дизайна Ваша Модель для Эффективного Ускорения для оптимизации времени выполнения моделирования.) Для других режимов моделирования необходимо решить любые проблемы доступа к рабочей области и проблемы параллелизма данных, чтобы привести к полезным результатам. В частности моделирования должны создать отдельно названные выходные файлы и переменные рабочей области. В противном случае каждое моделирование перезаписывает те же переменные рабочей области и файлы, или может иметь столкновения, пытающиеся записать переменные и файлы одновременно.
Для получения информации о регенерации кода и обработке параметра в Быстром Режиме Accelerator, смотрите, что Параметр Настраивает Быстрый Режим Accelerator.
Кроме того, смотрите parfor
.
Если вы открываете модели в 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® Distributed Computing 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
. В результате этот режим устраняет дублирование фазы схемы обновления.
Идти параллельно моделирования в Быстром режиме моделирования Акселератора с помощью команд parfor
и sim
:
Сконфигурируйте модель, чтобы запуститься в Быстром режиме моделирования Акселератора.
Сохраните изменения в своей модели прежде, чем моделировать в 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
в parfor
, параллельный пул открывается автоматически, позволяя коду запуститься параллельно. Также можно также сначала открыть работников MATLAB, использующих команду parpool
. Команда parfor
затем запускает код в цикле parfor
на этих сеансах работника MATLAB. У работников MATLAB, однако, нет доступа к рабочей области клиентского сеанса MATLAB, где модель и ее связанные переменные рабочей области загрузились. Следовательно, если вы загружаете модель и задаете ее связанные переменные рабочей области за пределами и перед циклом parfor
, затем и при этом модель не загружена, и при этом переменные рабочей области не заданы на сеансах работника MATLAB, где the parfor
итерации выполняются. Это обычно имеет место, когда вы задаете параметры модели или внешние входные параметры в базовом рабочем пространстве клиентского сеанса. Эти сценарии составляют проблемы доступа к рабочей области.
Нарушение прозрачности. Когда вы запускаете sim
в parfor
с набором srcWorkspace
к current
, Симулинк использует рабочую область parfor
, которая является прозрачной рабочей областью. Симулинк затем отображает ошибку для нарушения прозрачности. Для получения дополнительной информации о прозрачных рабочих областях смотрите, Гарантируют Прозрачность в циклах parfor (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
используйте evalin
MATLAB и команды assignin
, чтобы присвоить значения данных переменным.
Также можно упростить управление переменными рабочей области путем определения их в рабочем пространстве модели. Эти переменные затем автоматически загрузятся, когда модель загрузится в сеансы рабочего. Существуют, однако, ограничения к этому методу. Например, вы не можете хранить объекты сигнала, которые используют класс памяти кроме Auto
в рабочем пространстве модели. Для детального обсуждения рабочего пространства модели смотрите Рабочие пространства модели.
Определение Значений параметров Используя sim Команду. Используйте the 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
вместо программируемого интерфейса к словарю данных. Смотрите Оптимизируют, Оценка и Блочные Значения параметров Развертки.
У вас должны быть Параллельные вычисления лицензия 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
.
Проблемы параллелизма данных обращаются к сценариям, для которых программное обеспечение предпринимает одновременные попытки получить доступ к тому же файлу для ввода данных или вывести. В Симулинке они, в основном, происходят в результате непоследовательной природы цикла parfor
во время одновременного выполнения моделей Симулинка. Наиболее распространенные падения возникают, когда код сгенерирован или обновлен для цели моделирования Stateflow®, Блока модели или блока MATLAB function во время параллельных вычислений. Причина, в этом случае, состоит в том, что Симулинк пробует к одновременно целевым данным доступа от нескольких сеансов рабочего. Точно так же К Файлу блоки могут одновременно попытаться к данным логов к тем же файлам во время параллельных моделирований и таким образом вызвать ошибки ввода-вывода. Или сторонний blockset или написанная пользователем S-функция могут вызвать проблему параллелизма данных при одновременной генерации кода или файлов.
Вторичная причина параллелизма данных происходит из-за незащищенного доступа сетевых портов. Этот тип ошибки происходит, например, когда продукт Simulink обеспечивает блоки, которые связываются через TCP/IP с другими приложениями во время моделирования. Одним таким продуктом является HDL Verifier™ для использования с симулятором HDL Mentor Graphics® ModelSim®.
Базовое требование parfor
является независимостью различных итераций тела parfor
. Это ограничение не совместимо с базовым требованием моделирования через инкрементную генерацию кода, для которой моделирование предназначаются от предшествующего моделирования, снова используется или обновляется для текущего моделирования. Следовательно во время параллельного моделирования модели, которая вовлекает генерацию кода (такую как моделирование Режима Accelerator), Simulink предпринимает параллельные попытки получить доступ (обновляют) цель моделирования. Однако можно избежать таких проблем параллелизма данных путем создания временной папки в цикле parfor
и затем добавления нескольких строк кода MATLAB к циклу, чтобы выполнить следующие шаги:
Измените текущую папку на временную, перезаписываемую папку.
Во временной папке загрузите модель, установите параметры и входные векторы, и моделируйте модель.
Возвратитесь к оригиналу, текущей папке.
Удалите временную папку и временный путь.
Этим способом вы избегаете проблем параллелизма путем загрузки и моделирования модели в отдельной временной папке. Следующее является примерами, которые используют этот метод, чтобы решить общие вопросы параллелизма.
Модель с Stateflow, блоком MATLAB function или Блоком модели. В этом примере или модель сконфигурирована, чтобы моделировать в Режиме Accelerator, или это содержит Stateflow, блок MATLAB function или Блок модели (например, 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
в Быстром Режиме Accelerator с опцией, чтобы добавить суффикс к именам файлов, заданным в модели К блокам Файла. Путем обеспечения уникального суффикса для каждой итерации тела parfor
можно избежать проблемы параллелизма.
rtp = Simulink.BlockDiagram.buildRapidAcceleratorTarget(model); parfor idx=1:4 sim(model, ... 'ConcurrencyResolvingToFileSuffix', num2str(idx),... 'SimulationMode', 'rapid',... 'RapidAcceleratorUpToDateCheck', 'off'); end