【问题标题】:Matlab Parallel Computing with Simulink Model使用 Simulink 模型进行 Matlab 并行计算
【发布时间】:2016-10-11 03:04:35
【问题描述】:

我正在开展一个项目,其中并行计算将是一个巨大的优势。该项目模拟了多个Simulink 模型。我使用普通的 for 循环进行了模拟,但由于模拟需要几天时间,我决定尝试 "parfor"-Loop

但这就是问题的开始。首先,我会给你我的代码、工作区和给我带来问题的 Simulink-part 的图片:

这是我的代码:

apool = gcp('nocreate');

if isempty(apool)

apool = parpool('local'); 

end

wpath = pwd;

parfor k = 1:number_of_models  

    load_system(strcat(wpath,'\Models_Folder\',House(k).model_name));
    set_param(House(k).model_name, 'Stoptime', num2str(foreruntime));
    set_param(House(k).mask_name, 'Data_contr', num2str(controlvector(k)));
    set_param(House(k).mask_name, 'Data_cons', strcat('GlobalData(',num2str(k),').consume.',MaskParam(k).consume_input))
    SimOut(k) = sim(House(k).model_name);
end

delete(apool);

令人困惑的是,如果我删除该列:

 SimOut(k) = sim(House(k).model_name);

代码运行良好 -> modelparameters 设置在 parfor loop

但如果我不删除该列,则会出现以下错误:

Error using Forerunsimple (line 9)

Error evaluating parameter 'Data_cons' in 'model_house_14/House'

Caused by:

    Error using parallel_function>make_general_channel/channel_general (line 907)
    Error evaluating parameter 'Data_cons' in 'model_house_14/House'
    Error using parallel_function>make_general_channel/channel_general (line 907)
    Undefined variable "GlobalData" or class "GlobalData".

正如您在图片中看到的,变量"GlobalData" 是在工作区中定义的。所以在我看来它应该工作。显然不是。您知道可能是什么问题吗?

【问题讨论】:

  • 嗨,Elias,欢迎来到 SO!您的帖子不错,但您必须考虑将代码作为文本发布在您的问题中,而不是作为屏幕截图!
  • 感谢您的帮助 :) 当然将代码作为文本发布更有意义,我会记住这一点。我对 SO 和 Matlab-Simulink-Coding 很陌生,所以请原谅我对某些事情的不了解 :)
  • 是的,当然,对我来说没问题。这里的老人们应该帮助新人。请注意,有些是艰难的。不要以个人名义冒犯。

标签: matlab parallel-processing simulation simulink parfor


【解决方案1】:

你可能想看看这个问题,恕我直言,它是相关的,实际上可能是同一个问题:

MATLAB: What happens for a global variable when running in the parallel mode?

有一个工作区全局变量似乎是空的,即使它已被定义。

用户 Edric 提供了一个链接和一个简短的解释,即全局变量不会传递给工作人员(例如 simulink 作为并行运行)。

此博客条目的链接是:“Getting parfor loops up and running”: http://blogs.mathworks.com/loren/2009/10/02/using-parfor-loops-getting-up-and-running/

【讨论】:

  • 谢谢 Henrik,我会阅读这个问题。但实际上我没有使用全局变量。最初我尝试过,但我认为这是一个坏主意。所以“GlobalData”只是一个内部带有数据数组的普通结构。有趣的是我可以访问 parfor-Loop 中的 GlobalData 文件。例如,我可以在 parfor-Loop 中使用“fprintf”显示数据。但是,如果模拟想要访问 parfor-Loop 内的 GlobalData,则会发生错误:/
  • 我刚刚阅读了这篇文章,我认为这不是完全相同的问题:/ 好吧,我什至可以使用 parfor-Loop 内的数据生成一个变量,但它不起作用。这是一个简化的代码示例: >parfor i=1:20 Temp = load('someData.mat') set_param(model, 'Data_cons', 'Temp') simout = sim(model) end for some reason the model can't finde临时变量...
  • 好的,以前从未见过,并且目前没有带有 simulink 许可证的 matlab 安装,所以 .. :(
  • 没问题。这是一个较新问题的链接,经过简化:stackoverflow.com/questions/37747380/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-08
  • 2017-11-27
相关资源
最近更新 更多