Simulink-Simulation with parfor (Parallel Computing)

依然范特西╮ 提交于 2019-12-22 09:30:00

问题


I asked today a question about Parallel Computing with Matlab-Simulink. Since my earlier question is a bit messy and there are a lot of things in the code which doesnt really belong to the problem.

My problem is

I want to simulate something in a parfor-Loop, while my Simulink-Simulation uses the "From Workspace" block to integrate the needed Data from the workspace into the simulation. For some reason it doesnt work.

My code looks as follows:

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);

My simulation looks as follows

The DemoData-File is just a zeros(100,20)-Matrix. It's an example for Data.

Now if I simulate the Script following error message occures:

Errors

Error using DemoScript (line 9)

Error evaluating parameter 'DataInput' in 'DemoMDL/Mask'

Caused by:

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'.

Now do you have an idea why this happens??

The strange thing is, that if I try to acces the 'DemoData' inside the parfor-Loop it works. For excample with that code:

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);

Thats my output without simulating and displaying the Data

'>>'DemoScript 00000000000000000 .....

Thanks a lot. That's the original question with a lot more (unnecessary) details:

EarlierQuestion


回答1:


I suspect the issue is that when MATLAB is pre-processing the parfor loop to determine what variables need to be passed to the workers it does not know what DemoData is. In your first example it's just a string, so no data gets sent over. In your second example it explicitly knows about the variable and hence does pass it over.

You could try either using the Model Workspace, or perhaps just inserting the line

DemoData = DemoData;

in the parfor loop code.




回答2:


Your error is because workers did not have access to DemoData in the client workspace.

When running parallel simulations with Simulink it would be easier to manage data from workspace if you move them to model workspace. Then each worker can access this data from its model workspace. You can load a MAT file or write MATLAB code to initialize data in model workspace. You can access model workspace using the Simulink model menu View->Model Explorer->Model Workspace.

Also see documentation at http://www.mathworks.com/help/simulink/ug/running-parallel-simulations.html that talks about "Resolving workspace access issues".



来源:https://stackoverflow.com/questions/37747380/simulink-simulation-with-parfor-parallel-computing

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!