不再推荐在parfor循环中使用sim函数。为了运行并行模拟,使用parsim。请参阅运行并行模拟。
这个帕弗
命令允许您并行(同时)运行Simulink万博1manbetx®模拟您的模型(设计)。在这种情况下,并行运行意味着在不同的工作人员上同时进行多个模型模拟。调用sim卡
从内帕弗
对于不同的输入或不同的参数设置,循环通常有助于执行同一模型的多次模拟运行。例如,通过并行运行参数扫描和蒙特卡罗分析,可以节省模拟时间。请注意,运行并行模拟使用帕弗
目前不支持将模型分解为更小的连接部分,万博1manbetx并在多个worker上同时运行单个部分。
支持正常、加速器和快速加速器模拟模式万博1manbetxsim卡
在帕弗
。(见选择模拟模式有关选择模拟模式和的详细信息为有效加速设计你的模型用于优化模拟运行时。)对于其他模拟模式,您需要解决任何工作区访问问题和数据并发问题,以产生有用的结果。具体来说,模拟需要创建单独命名的输出文件和工作空间变量。否则,每个模拟都会覆盖相同的工作区变量和文件,或者在试图同时写入变量和文件时可能会发生冲突。
有关快速加速器模式下代码再生和参数处理的信息,请参阅快速加速模式参数调优。
同时,看到帕弗
。
如果在parfor语句中打开模型,请使用全部关闭
避免留下临时文件。
这个代码片段展示了如何使用sim卡
和帕弗
在正常模式。在中进行模拟之前保存对模型的更改帕弗
。在进行模拟时,将保存的模型副本分发给并行工作人员帕弗
。
% 1)加载模型并初始化池。模型=“sldemo_suspn_3dof”;load_system(模型);parpool;% 2)设置要计算的迭代。Cf = evalin('base', 'Cf');Cf_sweep = Cf * (0.05:0.1:0.95);迭代长度= (Cf_sweep);simout(迭代)= Simulink.万博1manbetxSimulationOutput;% 3)需要将所有工作人员切换到一个单独的tempdir,以防生成任何代码,例如StateFlow,或者模型创建了任何其他%文件工件。 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 with Normal Mode
. 按如下方式修改它以供使用sim卡
和帕弗
在正常模式:
在第1项中,修改parpool
命令创建一个对象并使用它调用集群名称。
p = parpool(“clusterProfile”);% 'clusterProfile'是分布式集群的名称
在第1项中,找到模型所依赖的文件,并将这些文件附加到模型中,以便分发到远程机器上的集群工作人员。
文件= dependencies.fileDependencyAnalysis (modelName);p.addAttachedFiles(文件);
如果你没有MATLAB®分布式计算服务器™群集,使用本地群集。有关详细信息,请参阅发现集群并使用集群配置文件(并行计算工具箱)。
在运行代码之前启动集群。
% 1)加载模型并初始化池。模型=“sldemo_suspn_3dof”;load_system(模型);parpool;% 2)设置要计算的迭代。Cf = evalin('base', 'Cf');Cf_sweep = Cf * (0.05:0.1:0.95);迭代长度= (Cf_sweep);simout(迭代)= Simulink.万博1manbetxSimulationOutput;% 3)需要将所有工作人员切换到一个单独的tempdir,以防生成任何代码,例如StateFlow,或者模型创建了任何其他%文件工件。 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卡
和帕弗
命令:
配置模型以在快速加速器模拟模式下运行。
在中进行模拟之前保存对模型的更改帕弗
。在进行模拟时,将保存的模型副本分发给并行工作人员帕弗
。
确保快速加速器目标已经建立并且是最新的。
通过设置快速加速器目标最新检查来禁用sim卡
命令选项RapidAcceleratorUpToDateCheck
到“关闭”
。
要满足第二个条件,您可以仅在不需要模型重建的模拟之间更改参数。换句话说,模型的结构校验和必须保持不变。因此,您只能在模拟之间更改可调框图参数和可调运行时块参数。有关在修改后不需要重新构建的可调参数的讨论,请参见确定模拟是否将重新生成。
若要禁用快速加速器目标最新检查,请使用sim卡
命令,如本示例所示。
parpool;%加载模型并设置参数model = 'vdp';load_system(模型);% Build the RapidAccelerator target rtp = S万博1manbetximulink.BlockDiagram.buildRapidAcceleratorTarget(model);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卡
在帕弗
,将自动打开并行池,使代码能够并行运行。或者,也可以先使用parpool
命令。这个帕弗
命令然后运行帕弗
在这些MATLAB工作会话中循环。然而,MATLAB工作人员不能访问MATLAB客户端会话的工作空间,在该会话中模型及其相关的工作空间变量已经加载。因此,如果您加载一个模型并定义它的相关工作区变量帕弗
循环,则既没有加载模型,也没有在MATLAB工作会话中定义的工作空间变量帕弗
迭代执行。当您在客户端会话的基本工作空间中定义模型参数或外部输入时,通常会出现这种情况。这些场景构成了工作区访问问题。
透明度违反。当您运行sim卡
在帕弗
与srcWorkspace
设置为现在的
,S万博1manbetximulink使用帕弗
工作区,这是一个透明的工作区。万博1manbetx然后,Simulink显示了一个违反透明度的错误。有关透明工作区的更多信息,请参见确保parfor循环的透明度(并行计算工具箱)。
数据字典的访问。当模型链接到数据字典时(参见什么是数据字典?),以编写代码帕弗
如果要访问存储在字典中的变量或对象,则必须使用函数万博1manbetxSimulink.data.dictionary.setupWorkerCache
和万博1manbetxSimulink.data.dictionary.cleanupWorkerCache
防止存取问题。例如,请参见采用并行仿真的扫描变型控制。
当在MATLA万博1manbetxB客户端会话中将Simulink模型加载到内存中时,它仅在该MATLAB会话中可见和可访问;它在MATLAB worker会话的内存中不可访问。类似地,与MATLAB客户端会话中定义的模型相关联的工作空间变量(如参数和外部输入)在工作会话中也不会自动可用。因此,必须使用以下两种方法确保加载了模型,并且在MATLAB worker会话中定义了模型中引用的工作空间变量。
在帕弗
循环,使用sim卡
命令加载模型并设置随每次迭代而更改的参数。(备选方案:加载模型,然后使用et_param g (s)
命令,设置参数帕弗
循环)
在帕弗
循环,使用MATLABevalin
和assignin
将数据值分配给变量的命令。
或者,您可以通过在模型工作空间中定义工作空间变量来简化工作空间变量的管理。当模型加载到工作会话中时,这些变量将自动加载。然而,这种方法存在局限性。例如,不能存储使用存储类以外的存储类的信号对象汽车
在模型工作区中。有关模型工作区的详细讨论,请参见模型的工作区。
使用sim命令指定参数值。使用sim卡
命令的帕弗
循环来设置随每次迭代而更改的参数。
%使用sim命令模型指定参数值= '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(model, 0);
一个等效的方法是加载模型,然后使用set_param
命令设置paramName
在帕弗
环
使用assignin命令指定变量值。可以通过使用的方法将模型或仿真变量的值传递给MATLAB工作人员assignin
或者是evalin
命令。下面的示例演示了如何使用此方法将变量值加载到MATLAB工作人员的适当工作空间中。
parfor i = 1:4 assignin('base', 'extInp', paramValue{i})%#ok % 'extInp'是base % workspace中包含外部输入数据的变量名simOut{i} = sim(模型,'ExternalInput', 'extInp');% #好的结束
采用并行仿真的扫描变型控制。使用并行模拟扫描变量控件(a万博1manbetx仿真软件。参数
对象,其值影响对象的变化条件万博1manbetx仿真软件。变体
对象),将此代码用作模板。更改模型、数据字典和变量控件的名称和值以匹配您的应用程序。
若要扫描用于设置块参数的块参数值或工作区变量的值,请使用万博1manbetx仿真软件。SimulationInput
对象,而不是数据字典的编程接口。看到优化、估计和扫描块参数值。
你必须有一个并行计算工具箱™ 执行并行模拟的许可证。
%为方便起见,请定义模型和数据字典的名称模型=“mySweepMdl”;dd =“mySweepDD.sldd”;%定义变量控件的扫描值CtrlValues=[1 2 3 4];%授予并行池中的每个worker一个独立的数据字典%这样他们就可以不受干扰地使用数据spmd万博1manbetxSimulink.data.dictionary.setupWorkerCache结束%确定模拟的次数numberOfSims =长度(CtrlValues);%准备一个未分发的数组以包含模拟输出simOut =细胞(1、numberOfSims);帕弗指数= 1:numberOfSims创建与字典数据交互的对象%必须为parfor循环的每次迭代创建这些对象dictObj = 万博1manbetxSimulink.data.dictionary.open (dd);sectObj = getSection (dictObj,设计数据的);entryObj = getEntry (sectObj,“模式”);假设MODE是一个Simulink。万博1manbetx参数object stored in the data dictionary%修改“MODE”的值temp = getValue (entryObj);temp.Value = CtrlValues(指数);setValue (entryObj、临时);在非分布式阵列中模拟和存储模拟输出simOut{指数}= sim(模型);每个worker必须丢弃所有对数据字典和%完成parfor循环的迭代后关闭字典discardChanges (dictObj);关闭(dictObj);结束%恢复由函数更改的默认设置%S万博1manbetximulink.data.dictionary.setupWorkerCache%在调用cleanupWorkerCache之前,关闭模型spmdbdclose Simulin万博1manbetxk.data.dictionary.cleanupWorkerCache(模型)结束
如果数据字典处于打开状态,则不能使用该命令万博1manbetxSimulink.data.dictionary.cleanupWorkerCache
。要识别开放数据词典,请使用万博1manbetxSimulink.data.dictionary.getOpenDictionaryPaths
。
数据并发问题是指软件同时尝试访问同一文件以进行数据输入或输出的情况。在Simulink中,它们主要是由于万博1manbetx帕弗
在Simulink模型的同时执行过程中。万博1manbetx最常见的情况出现在为statflow的模拟目标生成或更新代码时®,模型块或MATLAB功能块进行并行计算。在这种情况下,原因是Simulink试图从多个工作会话并发访问目标数据。同样地,万博1manbetx到文件在并行模拟期间,块可能同时尝试将数据记录到相同的文件中,从而导致I/O错误。或者,第三方块集或用户编写的S函数可能会在同时生成代码或文件时导致数据并发问题。
数据并发的第二个原因是网络端口不受保护的访问。例如,当Simulink产品在模拟过程中提供通过TCP/IP与其他应用程序通信的块时,就会发生万博1manbetx这种类型的错误。其中一个产品是HDL验证器™,用于导师图形®ModelSim®HDL模拟器。
核心要求帕弗
是不同迭代的独立性帕弗
的身体。此限制与通过增量代码生成的模拟的核心需求不兼容,对于增量代码生成,先前模拟的模拟目标将被重用或更新为当前模拟。因此,在涉及代码生成的模型的并行模拟期间(例如Accelerator模式模拟),Simulink会并发尝试访问(更新)模拟目标。万博1manbetx控件中创建临时文件夹可以避免此类数据并发问题帕弗
循环,然后向循环中添加几行MATLAB代码,执行以下步骤:
将当前文件夹更改为临时的可写文件夹。
在临时文件夹中,加载模型,设置参数和输入向量,对模型进行仿真。
返回到原始的当前文件夹。
删除临时文件夹和临时路径。
通过这种方式,您可以通过在一个单独的临时文件夹中加载和模拟模型来避免并发问题。下面是使用此方法解决常见并发问题的示例。
一个模型状态流,MATLAB功能块或模型块。在本例中,模型要么被配置为在Accelerator模式下模拟,要么包含statflow、MATLAB函数块或模型块(例如,sf_bounce
,sldemo_autotrans
或sldemo_mdlref_basic
)。对于这些情况,Simulink会在模万博1manbetx拟的初始化阶段生成代码。用计算机模拟这样一个模型帕弗
将导致在工作会话上运行初始化阶段时,为相同的文件生成代码。如下图所示,您可以通过运行帕弗
正文位于不同的临时文件夹中。
parfor i=1:4 cwd=pwd;addpath(cwd)tmpdir=tempname;mkdir(tmpdir)cd(tmpdir)load_system(model)%设置块参数,例如,To File block set_param的文件名(someBlkInMdl,blkParamName,blkParamValue{i})%通过将模型参数传递给sim命令out{i}=sim(model,mdlParamName,mdlParamValue{i})来设置模型参数;关闭系统(型号0);cd(cwd)rmdir(tmpdir,'s')rmpath(cwd)end
注意以下几点:
的每次迭代使用临时文件夹,还可以避免由于文件I/O错误而导致的其他并发问题帕弗
的身体。
在Windows上®平台,考虑插入evalin(“基地”,“明确的墨西哥人”);
命令之前删除目录(tmpdir, ' s ')
. 此序列在调用之前先关闭MEX文件rmdir
删除tmpdir
。
evalin(“基地”,“明确的墨西哥人”);删除目录(tmpdir, ' s ')
具有文件块的模型。如果你用到文件块从内部帕弗
循环的非顺序性质可能会导致文件I/O错误。为了避免在并行模拟期间出现这种错误,您可以使用上面的临时文件夹的想法或使用sim卡
命令,该命令在快速加速器模式下,具有向模型中指定的文件名附加后缀的选项到文件块。的每次迭代提供唯一的后缀帕弗
正文,可以避免并发问题。
rtp = 万博1manbetxSimulink.BlockDiagram.buildRapidAcceleratorTarget(模型);Parfor idx=1:4 sim(model,…ConcurrencyResolvingToFileSuffix, num2str (idx)……“SimulationMode”,“快速”,…“RapidAcceleratorUpToDateCheck”,“关闭”);结束