Использование функции sim в parfor

Примечание

Используя sim функция в пределах parfor цикл больше не рекомендуется. Для выполнения параллельных симуляций используйте parsim. Пожалуйста, смотрите Run Parallel Simulations.

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

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

Режимы симуляции Normal, Accelerator и Rapid Accelerator поддерживаются sim в parfor. (См. «Выбор режима симуляции» для получения дополнительной информации о выборе режима симуляции и «Проект вашей модели для эффективного ускорения» для оптимизации времени запуска симуляции.) Для других режимов симуляции необходимо решить любые проблемы доступа к рабочей области и проблемы параллелизма данных, чтобы получить полезные результаты. В частности, симуляции должны создавать отдельно именованные выходные файлы и переменные рабочей области. В противном случае каждая симуляция перезаписывает одни и те же переменные рабочей области и файлы или может иметь столкновения, пытающиеся записать переменные и файлы одновременно.

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

Кроме того, см. parfor (Parallel Computing Toolbox).

Примечание

Если вы открываете модели внутри 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 и программным обеспечением MATLAB Parallel Server

Этот фрагмент кода идентичен фрагменту в 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 с Rapid Режима Accelerator

Выполнение симуляций Rapid Accelerator в parfor сочетает скорость с автоматическим распределением предварительно созданного исполняемого файла в parfor рабочие. В результате этот режим устраняет дублирование фазы схемы обновления.

Чтобы запустить параллельные симуляции в режиме симуляции Rapid Accelerator с помощью sim и parfor команды:

  • Сконфигурируйте модель для запуска в режиме симуляции Rapid Accelerator.

  • Сохраните изменения в модели перед симуляцией в parfor. Сохраненная копия вашей модели распространяется среди параллельных рабочих при симуляции в parfor.

  • Убедитесь, что целевой объект Rapid Accelerator уже создан и обновлен.

  • Отключите актуальную проверку цели Rapid Accelerator путем установки sim опция команды RapidAcceleratorUpToDateCheck на 'off'.

Чтобы удовлетворить второму условию, можно изменять параметры только между симуляциями, которые не требуют перестроения модели. Другими словами, структурная контрольная сумма модели должна остаться неизменной. Следовательно, можно изменить только настраиваемые параметры диаграммы блока и настраиваемые параметры блоков во время выполнения между симуляциями. Для обсуждения настраиваемых параметров, которые не требуют перестроения после их изменений, смотрите Определение, будет ли симуляция перестроена.

Чтобы отключить актуальную проверку цели Rapid Accelerator, используйте 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, где была загружена модель и связанные с ней переменные рабочей области. Следовательно, если вы загружаете модель и задаете связанные с ней переменные рабочей области вне и перед a parfor цикл, тогда ни модель не загружена, ни переменные рабочей области не определены в Работника MATLAB сессиях, где 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 цикл, используйте 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 команда для установки 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

Сдвиньте управление вариантом с помощью параллельной симуляции.  Чтобы использовать параллельную симуляцию для сдвига управления вариантом (a 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 в цикл для выполнения следующих шагов:

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

Модель с блоками в файл.  Если вы симулируете модель с To File блоками изнутри parfor цикл, неравноценный характер цикла может вызвать ошибки ввода-вывода файла. Чтобы избежать таких ошибок во время параллельных симуляций, можно либо использовать идею временной папки выше, либо использовать sim команда в режиме Rapid Accelerator с опцией добавления суффикса к именам файлов, заданным в блоках To File модели. Путем предоставления уникального суффикса для каждой итерации parfor тело, вы можете избежать проблемы параллелизма.

rtp = Simulink.BlockDiagram.buildRapidAcceleratorTarget(model); 
       parfor idx=1:4 
       sim(model, ... 
           'ConcurrencyResolvingToFileSuffix', num2str(idx),... 
           'SimulationMode', 'rapid',... 
           'RapidAcceleratorUpToDateCheck', 'off'); 
        end

Похожие темы