今天我用问了一个关于并行计算的问题.因为我前面的问题有点混乱,而且代码中有很多不属于这个问题的东西。
我的问题是
我想在parfor-循环中模拟一些东西,而我的Simulink-模拟使用"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);我的模拟如下所示:

DemoData-File只是一个零(100,20)-Matrix。这是数据的一个例子。
现在,如果我模拟脚本,下面会出现错误消息:
错误
使用DemoScript时出错(第9行) “DemoMDL/Mask”中参数“DataInput”的错误评估
原因如下:
使用parallel_function>make_general_channel/channel_general (第907行)错误计算'DemoMDL/Mask‘中参数'DataInput’的错误使用parallel_function>make_general_channel/channel_general (第907行)未定义的函数或变量'DemoData‘。
你知道为什么会发生这种事吗?
奇怪的是,如果我试图访问parfor-循环中的“DemoData”,它就能工作。为了更好地使用该代码:
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 .
非常感谢。这就是最初的问题,还有更多(不必要的)细节:
发布于 2016-06-10 13:46:54
我怀疑问题是,当MATLAB对parfor循环进行预处理以确定哪些变量需要传递给工作人员时,它不知道DemoData是什么。在您的第一个示例中,它只是一个字符串,因此不会发送任何数据。在您的第二个示例中,它显式地了解了变量,因此确实传递了它。
您可以尝试使用,或者只是插入行
DemoData = DemoData;
在parfor循环代码中。
发布于 2016-06-10 13:41:40
您的错误是因为工作人员无法访问客户端工作区中的DemoData。
使用Simulink运行并行仿真时,如果将数据移动到工作空间模型中,将更容易管理工作区中的数据。然后,每个工作人员都可以从其模型工作区访问这些数据。您可以加载MAT文件或编写MATLAB代码来初始化模型工作区中的数据。您可以使用Simulink模型菜单视图-> model >访问模型工作区。
还请参阅http://www.mathworks.com/help/simulink/ug/running-parallel-simulations.html中关于“解决工作区访问问题”的文档。
发布于 2022-09-09 15:38:22
你也可以移动线
load DemoData在parfor循环中。这样做,您可以确保数据在每个工作人员基础工作区中都是可用的,模型可以访问wich,而不是客户端工作区。
https://stackoverflow.com/questions/37747380
复制相似问题