Используя 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. В результате этот режим устраняет дублирование фазы схемы обновления.

Идти параллельно симуляции в Быстром режиме симуляции Акселератора с помощью команд 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 к циклу, чтобы выполнить следующие шаги:

  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')

Модель с К Блокам Файла.  Если вы моделируете модель с К блокам Файла изнутри цикла 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

Похожие темы