2016-12-15 161 views
3

在該最小可執行代碼段:MATLAB PARFOR廣播變量具有錯誤的值

a = []; 
workers = parpool('local',4); 
someboolean = false; 
parfor i = 1:4 
    if someboolean % broadcast variable 
     b = a(i); % ERROR 
    else 
     b = 0; 
    end 
end 

... someboolean的值是「真」並且執行無效行導致以下錯誤:

Error using bugscript (line 4)
Index exceeds matrix dimensions.

行號是指最後一條非平行線,如果b = a(i)分配被刪除,則錯誤消失。

我一直沒有能夠找到互聯網上的其他人遭受同樣的問題。任何人都可以解釋發生了什麼?我正在使用MATLAB R2015a。

回答

7

問題是因爲MATLAB執行靜態代碼分析以確定每個工作人員在循環中每次迭代需要哪些變量。由於它看到您正在訪問循環內部的a(i),因此它會嘗試提取該值並使其可供本地工作人員使用,以防需要它時使用。對於sliced variables,此行爲對於通過僅發送該迭代所訪問的數據來減少發送給每個工作者的數據量而言是必要的。如果a有數千個值,並且每次迭代只訪問其中的一個值,這一點尤其重要。您只需要發送a中的單個條目而不是整個數組。

在你的情況下,嘗試訪問a(i)發送到工人,這是這個過程(而不是環內容本身)會導致您看到的錯誤。

沒有恐懼,廣播的變量,someboolean的價值實際上是在false如你所期望的,你可以用下面的循環確認。

parfor i = 1:4 
    disp(someboolean) 
end 

作爲一個解決方案,我只想值,以便(即使不是用它)認爲a切片成功和有效的數據能夠被髮送到工人預分配a

a = NaN(1,4); 
0

我看到你的代碼2個問題:

  1. 所有工作過程嘗試更新的同時b變量。這不會導致錯誤,但會有未定義的行爲。你不知道哪個進程有最後一次更新。

  2. a您的a數組未被初始化爲至少有4個值,並且工作人員嘗試訪問數組邊界之外。這會導致錯誤,您應該從初始化a開始。