matlab 基于parfor(并行计算)的Simulink仿真

uyto3xhc  于 2022-11-24  发布在  Matlab
关注(0)|答案(3)|浏览(275)

今天我问了一个关于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......
非常感谢。这是原始问题,但有更多(不必要的)细节:
较早问题

3htmauhk

3htmauhk1#

我怀疑问题在于,当MATLAB预处理parfor循环以确定哪些变量需要传递给worker时,它并不知道DemoData是什么。在第一个示例中,它只是一个字符串,因此没有数据被传递。在第二个示例中,它明确地知道变量,因此确实传递了它。
您可以尝试使用“模型工作空间”,也可以只插入行
DemoData = DemoData;
parfor循环代码中。

vm0i2vca

vm0i2vca2#

您的错误是因为工作人员没有访问客户端工作区中DemoData的权限。
当使用Simulink运行并行仿真时,如果将工作空间中的数据移动到模型工作空间中,则管理这些数据会更容易。然后每个工作人员都可以从其模型工作空间访问这些数据。您可以加载MAT文件或编写MATLAB代码来初始化模型工作空间中的数据。您可以使用Simulink模型菜单“视图”-〉“模型资源管理器”-〉“模型工作空间”来访问模型工作空间。
另请参阅http://www.mathworks.com/help/simulink/ug/running-parallel-simulations.html中有关“解决工作区访问问题”的文档。

ee7vknir

ee7vknir3#

您也可以移动缐条

load DemoData

这样做可以确保数据在每个工作者基本工作空间(模型可以访问)中可用,而不是在客户端工作空间中可用。

相关问题