Используя sim функционируют в parfor

Примечание

Используя sim функция в parfor цикл больше не рекомендуется. Для идущих параллельно симуляций используйте parsim. Смотрите, Идут параллельно Симуляции.

Обзор Вызова sim из parfor

parfor команда позволяет вам идти параллельно (одновременные) симуляции Simulink® своей модели (проект). В этом контексте найдите что-либо подобное средним симуляциям многоуровневой модели запусков одновременно на различных рабочих. Вызов sim из parfor цикл часто помогает для выполнения нескольких запусков симуляции той же модели для различных входных параметров или для различных установок параметров. Например, можно сохранить время симуляции, выполняющее развертки параметра и исследования Монте-Карло путем выполнения их параллельно. Обратите внимание на то, что идущие параллельно симуляции с помощью parfor в настоящее время не поддерживает разложение вашей модели в меньшие связанные части и выполнение отдельных частей одновременно на нескольких рабочих.

Нормальный, Акселератор и Быстрые режимы симуляции Акселератора поддерживаются sim в parfor. (См. Выбор Simulation Mode для получения дополнительной информации о выборе режима симуляции и Проекта Ваша Модель для Эффективного Ускорения для оптимизации времени выполнения симуляции.) Для других режимов симуляции необходимо решить любые проблемы доступа к рабочей области и проблемы параллелизма данных, чтобы привести к полезным результатам. А именно, симуляции должны создать отдельно названные выходные файлы и переменные рабочей области. В противном случае каждая симуляция перезаписывает те же переменные рабочей области и файлы, или может иметь столкновения, пытающиеся записать переменные и файлы одновременно.

Для получения информации о регенерации кода и обработке параметра в Быстром Режиме Accelerator, смотрите, что Параметр Настраивает Быстрый Режим Accelerator.

Кроме того, смотрите parfor.

Примечание

Если вы открываете модели в parfor оператор, закройте их снова использование bdclose all постараться не оставлять временные файлы.

sim в parfor с Режимом normal mode

Этот фрагмент кода показывает, как можно использовать 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 and MATLAB Parallel Server Software

Этот фрагмент кода идентичен тому в 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'));

sim в parfor с Быстрым Режимом Accelerator

Выполнение Быстрых симуляций Акселератора в 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 в 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 пробует к одновременно целевым данным о доступе из нескольких сеансов рабочего. Точно так же блоки To File могут одновременно попытаться к данным логов к тем же файлам во время параллельных симуляций и таким образом вызвать ошибки ввода-вывода. Или сторонний blockset или написанная пользователем S-функция могут вызвать проблему параллелизма данных при одновременной генерации кода или файлов.

Вторичная причина параллелизма данных происходит из-за незащищенного доступа сетевых портов. Этот тип ошибки происходит, например, когда продукт Simulink обеспечивает блоки, которые связываются через TCP/IP с другими приложениями в процессе моделирования. Одним таким продуктом является HDL Verifier™ для использования с симулятором HDL Mentor Graphics® ModelSim®.

Решение вопросов параллелизма данных

Базовое требование parfor независимость различных итераций parfor тело. Это ограничение не совместимо с базовым требованием симуляции через инкрементную генерацию кода, для которой симуляция предназначаются от предшествующей симуляции, снова используется или обновляется для текущей симуляции. Следовательно во время параллельной симуляции модели, которая вовлекает генерацию кода (такую как симуляция Режима Accelerator), Simulink предпринимает параллельные попытки получить доступ (обновляют) цель симуляции. Однако можно избежать таких проблем параллелизма данных путем создания временной папки в parfor цикл и затем добавляющий нескольких линий кода MATLAB к циклу, чтобы выполнить следующие шаги:

  1. Измените текущую папку во временную, перезаписываемую папку.

  2. Во временной папке загрузите модель, установите параметры и входные векторы, и симулируйте модель.

  3. Возвратитесь к оригиналу, текущей папке.

  4. Удалите временную папку и временный путь.

Этим способом вы избегаете проблем параллелизма путем загрузки и симуляции модели в отдельной временной папке. Следующее является примерами, которые используют этот метод, чтобы решить общие вопросы параллелизма.

Модель с помощью 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, блокируется изнутри 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

Похожие темы