今天我问了一个关于Matlab-Simulink并行计算的问题,因为我之前的问题有点混乱,代码中有很多东西并不属于这个问题。
"我的问题是"
我想在parfor循环中模拟某个东西,而我的Simulink模拟使用“来自工作空间”块将所需的数据从工作空间集成到模拟中。由于某种原因,它不起作用。
我的代码如下所示:
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)矩阵,这是一个数据的例子。
现在,如果我模拟脚本,会出现以下错误消息:
- 错误 *
使用DemoScript时出错(第9行)
评估'DemoMDL/Mask'中的参数'DataInput'时发生错误
- 原因:*
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中的'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);
- 这是我的输出,没有模拟和显示数据 *
“〉〉”演示脚本000000000000000......
非常感谢。这是原始问题,但有更多(不必要的)细节:
较早问题
3条答案
按热度按时间3htmauhk1#
我怀疑问题在于,当MATLAB预处理
parfor
循环以确定哪些变量需要传递给worker时,它并不知道DemoData
是什么。在第一个示例中,它只是一个字符串,因此没有数据被传递。在第二个示例中,它明确地知道变量,因此确实传递了它。您可以尝试使用“模型工作空间”,也可以只插入行
DemoData = DemoData;
在
parfor
循环代码中。vm0i2vca2#
您的错误是因为工作人员没有访问客户端工作区中DemoData的权限。
当使用Simulink运行并行仿真时,如果将工作空间中的数据移动到模型工作空间中,则管理这些数据会更容易。然后每个工作人员都可以从其模型工作空间访问这些数据。您可以加载MAT文件或编写MATLAB代码来初始化模型工作空间中的数据。您可以使用Simulink模型菜单“视图”-〉“模型资源管理器”-〉“模型工作空间”来访问模型工作空间。
另请参阅http://www.mathworks.com/help/simulink/ug/running-parallel-simulations.html中有关“解决工作区访问问题”的文档。
ee7vknir3#
您也可以移动缐条
这样做可以确保数据在每个工作者基本工作空间(模型可以访问)中可用,而不是在客户端工作空间中可用。