主要内容

在parfor中使用sim功能

请注意

使用sim卡函数内parfor不再推荐使用循环。对于运行并行模拟,使用parsim.请参阅运行并行模拟

从parfor内呼叫sim的概述

parfor命令用于运行并行(同时)的Simulink®模型(设计)的模拟。在这种情况下,并行运行意味着在不同的工作人员上同时进行多个模型模拟。调用sim卡从内parfor循环通常有助于对不同的输入或不同的参数设置执行同一模型的多次模拟运行。例如,通过并行运行参数扫描和蒙特卡罗分析,可以节省模拟时间。注意,运行并行模拟使用parfor目前不支持将模型分解为更小的连接块,并在多个工作人员上同时运行单个块。

支持“普通”、“加速器”和“快速加速器”模拟模式sim卡parfor.(见选择模拟模式有关选择模拟模式和设计有效加速的模型用于优化模拟运行时间。)对于其他模拟模式,您需要解决任何工作区访问问题和数据并发问题,以产生有用的结果。具体来说,模拟需要创建单独命名的输出文件和工作空间变量。否则,每个模拟都会覆盖相同的工作空间变量和文件,或者在试图同时写入变量和文件时可能会发生冲突。

有关快速加速器模式下的代码再生和参数处理的信息,请参见快速加速器模式下的参数调整

同时,看到parfor(并行计算工具箱)

请注意

如果你在一个parfor语句,再次使用关闭它们bdclose所有避免留下临时文件。

sim in parfor与普通模式

此代码片段展示了如何使用sim卡而且parfor在正常模式。在模拟之前保存对模型的更改parfor.模型的保存副本在模拟时分发给并行工作人员parfor

% 1)加载模型并初始化池。openExample(“sldemo_suspn_3dof”);模型=“sldemo_suspn_3dof”;load_system(模型);parpool;% 2)设置我们想要计算的迭代。Cf = evalin('base', 'Cf');Cf_sweep = Cf * (0.05:0.1:0.95);迭代长度= (Cf_sweep);simout(迭代)= 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 in parfor与普通模式和MATLAB并行服务器软件

这段代码和里面的一模一样sim in parfor与普通模式

.修改如下,以便使用sim卡而且parfor在正常模式:

  • 在第1项中修改parpool命令如下创建一个对象并使用它调用集群名称。

    p = parpool(“clusterProfile”);% 'clusterProfile'是分布式集群的名称

  • 在第1项中,找到模型所依赖的文件,并将这些文件附加到模型中,以便分发给远程机器上的集群工作者。

    文件= dependencies.fileDependencyAnalysis (modelName);p.addAttachedFiles(文件);

  • 如果你没有MATLAB®并行服务器™集群,使用您的本地集群。有关更多信息,请参见发现集群并使用集群概要文件(并行计算工具箱)

在运行代码之前启动集群。

% 1)加载模型并初始化池。openExample(“sldemo_suspn_3dof”);模型=“sldemo_suspn_3dof”;load_system(模型);parpool;% 2)设置我们想要计算的迭代。Cf = evalin('base', 'Cf');Cf_sweep = Cf * (0.05:0.1:0.95);迭代长度= (Cf_sweep);simout(迭代)= 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 in parfor与快速加速器模式

运行快速加速器模拟parfor将预先构建的可执行文件的速度与自动分发结合起来parfor工人。因此,这种模式消除了更新关系图阶段的重复。

在快速加速器模拟模式中运行并行模拟sim卡而且parfor命令:

  • 配置模型以快速加速器模拟模式运行。

  • 在模拟之前保存对模型的更改parfor.模型的保存副本在模拟时分发给并行工作人员parfor

  • 确保快速加速器目标已经构建并且是最新的。

  • 禁用快速加速器目标最新检查sim卡命令选项RapidAcceleratorUpToDateCheck“关闭”

为了满足第二个条件,您只能在不需要模型重建的模拟之间更改参数。换句话说,模型的结构校验和必须保持不变。因此,您只能在模拟之间更改可调的框图参数和可调的运行时块参数。有关修改后不需要重新构建的可调参数的讨论,请参见确定模拟是否将重新构建

若要禁用快速加速器目标最新检查,请使用sim卡命令,如本示例所示。

parpool;%加载模型并设置参数model = 'vdp';load_system(模型);%构建快速加速器目标rtp = Simulink.BlockDiagram.buildRapidAcceleratorTarget(模型);运行并行模拟parfor i=1:4 simOut{i} = sim(model,'SimulationMode', 'rapid',…‘RapidAcceleratorUpToDateCheck’,‘off’,……‘SaveTime’,‘上’,……StopTime, num2str(10 *我));close_system(模型中,0);结束close_system(模型中,0); delete(gcp('nocreate'));

在本例中,调用buildRapidAcceleratorTarget函数只生成一次代码。随后的调用sim卡RapidAcceleratorUpToDateCheck选项保证代码不会重新生成。这样就解决了数据并发问题。

当您设置RapidAcceleratorUpToDateCheck“关闭”,对模型中的块参数值所做的更改(例如,通过使用块对话框,通过使用set_param函数,或通过改变MATLAB变量的值)不影响仿真。相反,使用RapidAcceleratorParameterSets直接向模拟传递新的参数值。

工作空间访问问题

MATLAB工作会话的工作区访问。缺省情况下,运行sim卡parfor,一个并行池会自动打开,使代码能够并行运行。或者,你也可以先打开MATLAB工作者使用parpool命令。的parfor命令,然后运行parfor循环这些MATLAB工作会话。然而,MATLAB工作者不能访问MATLAB客户端会话的工作空间,其中已经加载了模型及其相关的工作空间变量。因此,如果您加载一个模型并在类的外部和之前定义其相关的工作区变量parfor循环,那么既没有加载模型,也没有在MATLAB工作会话中定义的工作空间变量parfor迭代执行。当您在客户端会话的基本工作空间中定义模型参数或外部输入时,通常会出现这种情况。这些场景构成了工作区访问问题。

透明度违反。当您运行sim卡parforsrcWorkspace设置为当前的, Simulink使用parfor工作区,这是一个透明的工作区。然后,Simulink显示一个违反透明度的错误。有关透明工作区的更多信息,请参见确保parfor-Loops或spmd语句的透明度(并行计算工具箱)

数据字典的访问。当模型链接到数据字典时(参见什么是数据字典?),以便编写代码parfor如果要访问存储在字典中的变量或对象,则必须使用函数Simulink.data.dictionary.setupWorkerCache而且Simulink.data.dictionary.cleanupWorkerCache防止访问问题。示例请参见基于并行仿真的扫变控制

解决工作区访问问题

当Simulink模型在MATLAB客户端会话中加载到内存中时,它只在该MATLAB会话中可见和可访问;它在MATLAB工作会话的内存中不可访问。类似地,与MATLAB客户端会话中定义的模型相关的工作空间变量(如参数和外部输入)在工作会话中不能自动使用。因此,您必须通过使用以下两种方法确保模型已加载,并且模型中引用的工作空间变量已在MATLAB工作会话中定义。

  • parfor循环,使用sim卡命令来加载模型,并设置随每次迭代而更改的参数。(可选:加载模型,然后使用et_param g (s)命令,设置参数parfor循环)

  • parfor循环,使用MATLABevalin而且assignin将数据值赋给变量的命令。

或者,您可以通过在模型工作区中定义工作空间变量来简化工作空间变量的管理。当模型被加载到工作会话中时,这些变量将被自动加载。然而,这种方法也有局限性。例如,不能存储使用其他存储类的信号对象汽车在模型工作区中。有关模型工作区的详细讨论,请参见模型的工作区

使用sim命令指定参数值。使用sim卡命令的parfor循环以设置随每次迭代而更改的参数。

%使用sim命令model = 'vdp';load_system(model) %指定参数值。paramName =“StopTime”;paramValue = {'10', '20', '30', '40'};运行并行模拟parfor i=1:4 simOut{i} = sim(model,…我paramName paramValue{},……“SaveTime”、“关于”);%#ok结束close_system(模型,0);

等效的方法是加载模型,然后使用set_param命令设置paramNameparfor循环。

使用assignin命令指定变量值。方法可以将模型或仿真变量的值传递给MATLAB工作者assignin或者是evalin命令。下面的例子说明了如何使用这种方法将变量值加载到MATLAB工作者的适当工作区中。

parfor i = 1:4 assignin('base', 'extInp', paramValue{i})%#ok % 'extInp'是base %工作区中包含外部输入数据的变量名simOut{i} = sim(模型,'ExternalInput', 'extInp');% #好的结束

基于并行仿真的扫变控制。使用并行模拟来扫描变量控制(a仿真软件。参数对象,其值影响对象的可变条件仿真软件。变体对象)存储在数据字典中,请使用此代码作为模板。更改模型、数据字典和变量控件的名称和值,以匹配您的应用程序。

若要扫描用于设置块参数的块参数值或工作区变量的值,请使用仿真软件。SimulationInput对象,而不是到数据字典的编程接口。看到优化、估计和扫描块参数值

必须拥有并行计算工具箱™许可证才能执行并行模拟。

为方便起见,定义模型和数据字典的名称。模型=“mySweepMdl”;dd =“mySweepDD.sldd”定义变量控件的扫描值CtrlValues = [1 2 3 4];为并行池中的每个worker分配一个独立的数据字典。这样他们就可以不受干扰地使用数据。spmdSimulink.data.dictionary.setupWorkerCache结束确定要模拟的次数numberOfSims =长度(CtrlValues);准备一个非分布式数组来包含模拟输出。simOut =细胞(1、numberOfSims);parfor指数= 1:numberOfSims创建对象与字典数据交互。您必须为parfor循环的每次迭代创建这些对象。dictObj = Simulink.data.dictionary.open (dd);sectObj = getSection (dictObj,设计数据的);entryObj = getEntry (sectObj,“模式”);假设MODE是一个Simulink。参数object stored in the data dictionary%修改“MODE”的值temp = getValue (entryObj);temp.Value = CtrlValues(指数);setValue (entryObj、临时);模拟并将模拟输出存储在非分布式数组中simOut{指数}= sim(模型);每个worker必须丢弃对数据字典和的所有更改%结束parfor循环迭代时关闭字典discardChanges (dictObj);关闭(dictObj);结束恢复由函数更改的默认设置% Simulink.data.dictionary.setupWorkerCache在调用cleanupWorkerCache之前,关闭模型spmdbdclose Simulink.data.dictionary.cleanupWorkerCache(模型)结束

请注意

如果数据字典是打开的,则不能使用该命令Simulink.data.dictionary.cleanupWorkerCache.要识别开放数据字典,请使用Simulink.data.dictionary.getOpenDictionaryPaths

数据并发性问题

数据并发问题是指软件同时尝试访问同一个文件以获得数据输入或输出的情况。在Simulink中,它们主要是由于parfor在同时执行Simulink模型时循环。最常见的情况发生在为Stateflow的模拟目标生成或更新代码时®模型并行计算时的函数块。在这种情况下,原因是Simulink试图从多个工作会话并发访问目标数据。同样的,到文件在并行模拟过程中,块可能同时试图将数据记录到相同的文件,从而导致I/O错误。或者第三方块集或用户编写的s函数在生成代码或文件的同时可能导致数据并发问题。

造成数据并发的另一个原因是对网口的无保护访问。例如,当Simulink产品在模拟过程中提供通过TCP/IP与其他应用程序通信的块时,就会发生这种类型的错误。其中一个这样的产品是HDL验证器™用于导师图形®ModelSim®高密度脂蛋白模拟器。

解决数据并发问题

的核心要求parfor是不同迭代的独立性吗parfor的身体。这一限制与通过增量代码生成进行模拟的核心需求不兼容,对于增量代码生成,来自先前模拟的模拟目标将被重用或更新以用于当前模拟。因此,在涉及代码生成的模型的并行模拟过程中(例如加速器模式模拟),Simulink会并发尝试访问(更新)模拟目标。但是,可以通过在控件中创建临时文件夹来避免此类数据并发问题parfor循环,然后在循环中添加几行MATLAB代码,执行以下步骤:

  1. 将当前文件夹更改为可写的临时文件夹。

  2. 在临时文件夹中,加载模型,设置参数和输入向量,并模拟模型。

  3. 返回到原始的当前文件夹。

  4. 删除临时文件夹和临时路径。

通过这种方式,您可以在单独的临时文件夹中加载和模拟模型,从而避免并发问题。以下是使用此方法解决常见并发问题的示例。

一个模型StateflowMATLAB功能块或模型块。在本例中,模型被配置为在加速器模式下进行模拟,或者它包含一个Stateflow、一个MATLAB函数块或一个模型块(例如,sf_bouncesldemo_autotrans,或sldemo_mdlref_basic).对于这些情况,Simulink在模拟的初始化阶段生成代码。模拟这样的模型parfor将导致代码生成到相同的文件,而初始化阶段在工作会话上运行。方法的每次迭代,可以避免此类数据并发问题parfor体在另一个临时文件夹中。

Parfor i=1:4 CWD = pwd;Addpath (cwd) tmpdir = tempname;mkdir(tmpdir) cd(tmpdir) load_system(model) %设置块参数,例如,文件名的To File块set_param(someBlkInMdl, blkParamName, blkParamValue{i}) %设置模型参数,通过传递它们到sim命令out{i} = sim(模型,mdlParamName, mdlParamValue{i});close_system(模型中,0);Cd (cwd) rmdir(tmpdir,'s') rmpath(cwd)结束

请注意以下几点:

  • 方法的每次迭代使用临时文件夹,还可以避免由文件I/O错误引起的其他并发问题parfor的身体。

  • 在Windows上®平台,考虑插入evalin(“基地”,“明确的墨西哥人”);命令之前删除目录(tmpdir, ' s ').该序列在调用之前首先关闭mex文件删除文件夹删除tmpdir

evalin(“基地”,“明确的墨西哥人”);删除目录(tmpdir, ' s ')

具有To文件块的模型。如果你用到文件从一个parfor循环的非顺序性质可能会导致文件I/O错误。要避免在并行模拟过程中出现这种错误,可以使用上面的临时文件夹思想或使用sim卡在快速加速器模式下使用附加后缀到模型中指定的文件名的选项到文件块。的每次迭代提供唯一的后缀parfor体,可以避免并发问题。

rtp = Simulink.BlockDiagram.buildRapidAcceleratorTarget(模型);Parfor idx=1:4 sim(型号,…ConcurrencyResolvingToFileSuffix, num2str (idx)……“SimulationMode”,“快速”,…“RapidAcceleratorUpToDateCheck”,“关闭”);结束

相关的话题

Baidu
map