并行运行Simulink模型

时间:2015-06-04 13:09:22

标签: matlab parallel-processing simulink

我想在具有不同数据的许多核心上以parfor循环运行复杂的Simulink模型。 但是,我还没有成功,所以我创建了一个简单的模型,并尝试与相同的数据并行运行。

模型看起来像这样,添加了两个信号: enter image description here 使用代码:

function Result  = Add (X, Y)
Result = X + Y;

运行模型的脚本如下:

if matlabpool('size') == 0
    matlabpool('open',4);
end

parfor i = 1:4
    data=ones(1,20);
    X=timeseries(data);
    Y=timeseries(data);
    output = sim('model_test','StopTime','5');
    Result = output.get('Res');
end

但是,会发生以下错误: enter image description here

我不明白为什么变量不存在。我知道并行计算在变量访问方面总是至关重要的,但我还没有成功使用simulink并行运行。你能告诉我这个错误以及如何解决吗? 非常感谢你!

答案am304 :谢谢,答案帮助了我,我现在知道如何在parfor循环中使用set_param更改常量,我理解为什么它不适用于时间序列。 然而对于时间序列,我仍然在苦苦挣扎。 我尝试了几个版本,也就是这个版本:

if matlabpool('size') == 0
matlabpool('open',4);
end

data=ones(1,20);
X=timeseries(data);
Ybase=timeseries(data);

parfor i = 1:4
    Y = evalin('base', 'Ybase');
    output = sim('model_test','StopTime','5');
    Result{i} = output.get('Res');
end

变量Ybase存在于工作空间中,但会发生以下错误:

enter image description here

如您所见,变量Ybase存在于基础工作区中。你知道如何使用evalin或assignin正确访问吗?

谢谢和问候!

1 个答案:

答案 0 :(得分:2)

我怀疑这是因为您的数据data仅存在于主MATLAB的工作空间中,而不存在于matlabpool对工作人员启动的任何实例中。有关如何解决此问题的更多详细信息,请查看文档中的Workspace Access Issues,并举例说明这两种方法:

  然而,

MATLAB工作者无法访问工作区   MATLAB客户端会话所在的模型及其相关工作空间   变量已加载。因此,如果您加载模型并定义它   parfor循环之外和之前的相关工作空间变量,   然后既没有加载模型,也没有工作区变量   在parfor迭代所在的MATLAB工作器会话中定义   执行。定义模型参数时通常就是这种情况   或客户端会话的基本工作空间中的外部输入。这些   场景构成了工作区访问问题。

[...]

  

解决工作区访问问题

     

当Simulink模型在MATLAB客户端会话中加载到内存中时,它只是可见的   可在MATLAB会话中访问;它无法在内存中访问   MATLAB工作者会话。同样,工作区变量   与在MATLAB客户端会话中定义的模型相关联   (例如参数和外部输入)不是自动的   在工人会议中可用。因此,你必须确保   加载模型并在中引用工作空间变量   model使用以下内容在MATLAB工作程序会话中定义   两种方法。

     
      
  • parfor循环中,使用sim命令加载模型并设置随每次迭代而变化的参数。 (备选:   加载模型,然后使用g(s)et_param命令设置   parfor循环中的参数)
  •   
  • parfor循环中,使用MATLAB evalinassignin命令将数据值分配给变量。或者,你可以   通过定义工作空间变量来简化它们的管理   模型工作区。然后这些变量将自动生成   将模型加载到工作程序会话时加载。那里   然而,这种方法的局限性。例如,你不能   在模型工作区中具有可调参数。详细说明   有关模型工作区的讨论,请参阅Model Workspaces
  •   

修改

以下是我在你的特定例子中会做的事情:

if matlabpool('size') == 0
   matlabpool('open',4);
end

data=ones(1,20);
X=timeseries(data);
Y=timeseries(data);

parfor i = 1:4
    assignin('base','Y',Y);
    output = sim('model_test','StopTime','5');
    Result{i} = output.get('Res');
end

另一种选择是在模型工作区中包含XY,以便模型是自包含的。