Используя функцию 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® 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
. В результате этот режим устраняет дублирование фазы схемы обновления.
Идти параллельно симуляции в Быстром режиме симуляции Акселератора с помощью команд 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
, 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
используйте 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
вместо программируемого интерфейса к словарю данных. Смотрите Оптимизируют, Оценка и Значения Параметров блоков Развертки.
У вас должна быть лицензия 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 пробует к одновременно целевым данным о доступе из нескольких сеансов рабочего. Точно так же К Файлу блоки могут одновременно попытаться к данным логов к тем же файлам во время параллельных симуляций и таким образом вызвать ошибки ввода-вывода. Или сторонний blockset или написанная пользователем S-функция могут вызвать проблему параллелизма данных при одновременной генерации кода или файлов.
Вторичная причина параллелизма данных происходит из-за незащищенного доступа сетевых портов. Этот тип ошибки происходит, например, когда продукт Simulink обеспечивает блоки, которые связываются через TCP/IP с другими приложениями во время симуляции. Одним таким продуктом является HDL Verifier™ для использования с симулятором HDL Mentor Graphics® ModelSim®.
Базовое требование 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')
Модель с К Блокам Файла. Если вы моделируете модель с К блокам Файла изнутри цикла 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