3
votes

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

DataFromWorkspace

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

2

2 Answers

3
votes

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
votes

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