使用parfor进行Simulink仿真(并行计算)

时间:2016-06-10 11:41:11

标签: matlab parallel-processing simulink parfor

我今天问了一个关于使用Matlab-Simulink进行并行计算的问题。由于我之前的问题有点混乱,代码中有很多东西并不真正属于这个问题。

我的问题是

我想在parfor-Loop中模拟某些东西,而我的Simulink-Simulation使用" From Workspace"阻止将工作空间中所需的数据集成到模拟中。由于某种原因,它不起作用。

我的代码如下所示:

load DemoData
path = pwd;

apool = gcp('nocreate');
if isempty(apool)
    apool = parpool('local');
end

parfor k = 1 : 2
    load_system(strcat(path,'\DemoMDL'))
    set_param('DemoMDL/Mask', 'DataInput', 'DemoData')


       SimOut(k) = sim('DemoMDL')
    end

delete(apool);

我的模拟如下

DataFromWorkspace

DemoData-File 只是一个零(100,20)-Matrix。这是数据的一个例子。

现在,如果我在出现以下错误消息时模拟脚本:

错误

  

使用DemoScript时出错(第9行)

     

评估参数' DataInput'时出错在' DemoMDL / Mask'

引起:

Error using parallel_function>make_general_channel/channel_general (line 907)
Error evaluating parameter 'DataInput' in 'DemoMDL/Mask'
    Error using parallel_function>make_general_channel/channel_general (line 907)

    Undefined function or variable 'DemoData'.

现在你知道为什么会这样吗?

奇怪的是,如果我尝试访问“演示数据”'在parfor-Loop里面它起作用。对于使用该代码的示例:

load DemoData
path = pwd;

apool = gcp('nocreate');
if isempty(apool)
    apool = parpool('local');
end

parfor k = 1 : 2
    load_system(strcat(path,'\DemoMDL'))
    set_param('DemoMDL/Mask', 'DataInput', 'DemoData')
    fprintf(num2str(DemoData))
end

delete(apool);

在没有模拟和显示数据的情况下输出我的输出

'>>' DemoScript 00000000000000000 .....

非常感谢。这是原始问题,有更多(不必要的)细节:

EarlierQuestion

2 个答案:

答案 0 :(得分:3)

我怀疑问题在于,当MATLAB预处理parfor循环以确定需要传递给工作人员的变量时,它不知道DemoData是什么。在您的第一个示例中,它只是一个字符串,因此不会发送任何数据。在你的第二个例子中,它明确知道变量,因此确实传递了它。

您可以尝试使用模型工作区,也可以只插入行

DemoData = DemoData;

parfor循环代码中。

答案 1 :(得分:2)

您的错误是因为工作人员无法访问客户端工作区中的DemoData。

使用Simulink运行并行仿真时,如果将数据移动到模型工作区,则可以更轻松地管理工作区中的数据。然后每个工作人员都可以从其模型工作区访问此数据。您可以加载MAT文件或编写MATLAB代码来初始化模型工作区中的数据。您可以使用Simulink模型菜单View-> Model Explorer-> Model Workspace访问模型工作区。

另请参阅http://www.mathworks.com/help/simulink/ug/running-parallel-simulations.html上的文档,其中涉及"解决工作空间访问问题"。