2016-06-10 393 views
3

我今天問了一個關於使用Matlab-Simulink進行並行計算的問題。由於我之前的問題有點混亂,代碼中有很多事情並不屬於這個問題。用parfor(並行計算)的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); 

我的模擬程序如下所示

DataFromWorkspace

DemoData-文件僅僅是一個零(100,20) -矩陣。這是Data的一個例子。

現在,如果我模擬腳本以下錯誤消息occures:

錯誤

使用DemoScript誤差(第9行)

錯誤評估參數 '的DataInput' 在「DemoMDL /掩碼'

引起:

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',它就會起作用。對於該代碼excample:

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 000000000億.....

非常感謝。這是一個很多(不必要的)細節原題:

EarlierQuestion

回答

2

你的錯誤是因爲工人沒有在客戶工作區訪問DemoData。

當使用Simulink運行並行仿真時,如果將工作空間中的數據移動到模型工作區,那麼管理工作區中的數據會更容易。然後每個工作人員可以從其模型工作區訪問這些數據。您可以加載MAT文件或編寫MATLAB代碼來初始化模型工作區中的數據。您可以使用Simulink模型菜單View-> Model Explorer-> Model Workspace來訪問模型工作區。

另請參閱文檔http://www.mathworks.com/help/simulink/ug/running-parallel-simulations.html,其中討論了「解決工作區訪問問題」。

3

我懷疑問題是,當MATLAB預處理parfor循環來確定需要傳遞給工作人員的變量時,它不知道DemoData是什麼。在你的第一個例子中,它只是一個字符串,所以沒有數據被髮送。在你的第二個例子中,它顯式地知道變量,並因此傳遞它。

你可以嘗試或者使用模型工作區,或者只是將在parfor循環代碼行

DemoData = DemoData;