首页 文章

并行运行Simulink模型

提问于
浏览
2

我想在具有不同数据的许多内核上以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并行运行 . 你能告诉我这个错误以及如何解决吗?非常感谢你!

Answer to 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 回答

  • 2

    我怀疑这是因为你的数据 data 只存在于主MATLAB的工作空间中,而不是存在于工作者的 matlabpool 中的任何实例中 . 有关如何解决此问题的更多详细信息,请查看文档中的Workspace Access Issues,其中一些示例说明了这两种方法:

    但是,MATLAB工作人员无法访问已加载模型及其相关工作空间变量的MATLAB客户端会话的工作空间 . 因此,如果加载模型并在parfor循环之外和之前定义其关联的工作空间变量,则既不加载模型,也不在MATLAB工作程序会话中定义parfor迭代执行的工作空间变量 . 当您在客户端会话的基本工作空间中定义模型参数或外部输入时,通常就是这种情况 . 这些场景构成了工作区访问问题

    [...]

    解决工作区访问问题当Simulink模型在MATLAB客户端会话中加载到内存中时,它只能在该MATLAB会话中可见并可访问;它不能在MATLAB工作器会话的内存中访问 . 类似地,与MATLAB客户端会话中定义的模型关联的工作空间变量(例如参数和外部输入)在工作器会话中不会自动可用 . 因此,您必须确保加载模型,并使用以下两种方法在MATLAB工作程序会话中定义模型中引用的工作空间变量 . 在parfor循环中,使用sim命令加载模型并设置随每次迭代而变化的参数 . (替代方案:加载模型,然后使用g(s)et_param命令在parfor循环中设置参数)在parfor循环中,使用MATLAB evalin和assignin命令将数据值分配给变量 . 或者,您可以通过在工作空间中定义工作空间变量来简化它们的管理 . 当模型加载到工作程序会话中时,将自动加载这些变量 . 但是,这种方法存在局限性 . 例如,您不能在模型工作区中具有可调参数 . 有关模型工作区的详细讨论,请参阅模型工作区 .

    EDIT

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

    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 ,以便模型是自包含的 .

相关问题