2011-09-10 84 views
2

爲什麼我不能在這段代碼中使用parforParfor in MATLAB問題

parfor i=1:r 

    for j=1:N/r 

     xr(j + (N/r) * (i-1)) = x(i + r * (j-1)); 

    end 

end 

這是錯誤:

Error: The variable xr in a parfor cannot be classified. See Parallel for Loops in MATLAB, "Overview".

回答

12

這裏的問題是,切片陣列的索引不當。 parfor循環以異步方式運行,這意味着每次迭代的執行順序是隨機的。從documentation

MATLAB workers evaluate iterations in no particular order, and independently of each other. Because each iteration is independent, there is no guarantee that the iterations are synchronized in any way, nor is there any need for this.

您可以輕鬆地通過鍵入命令行下面驗證上述聲明:

parfor i=1:100 
    i 
end 

你會看到,順序是任意的。因此,如果您在不同的工作人員之間分配平行工作,則一名工人無法判斷是否完成了不同的迭代。因此,您的變量索引不能取決於迭代器的過去/將來值。

讓我來演示一個簡單的例子。考慮斐波納契系列1,1,2,3,5,8,...。您可以生成該系列的第一個10個詞語容易(在天真for循環)爲:

f=zeros(1,10); 
f(1:2)=1; 
for i=3:10 
    f(i)=f(i-1)+f(i-2); 
end 

現在讓我們做同樣的一個parfor循環。

f=zeros(1,10); 
f(1:2)=1; 
parfor i=3:10 
    f(i)=f(i-1)+f(i-2); 
end 

??? Error: The variable f in a parfor cannot be classified. See Parallel for Loops in MATLAB, "Overview"

但爲什麼這個給出一個錯誤?

我已經表明,迭代以任意順序執行。假設工人獲得循環索引i=7和表達式f(i)=f(i-1)+f(i-2);。現在應該執行該表達式並將結果返回給主節點。現在迭代完成了i=6?存儲在f(6)中的值是否可靠?那麼f(5)?你看到我在做什麼?假設f(5)f(6)沒有完成,那麼你會錯誤地計算Fibonnaci系列中的第7項是0!

由於MATLAB有沒有告訴你,如果計算可以保證運行正確每一次重現相同的結果,這樣的曖昧分配中明令禁止的。

+0

它仍然給我錯誤:錯誤:無法對parfor中的變量xr進行分類。 請參見MATLAB中的「並行循環」,「概述」。 錯誤==> Code1在36 parfor i = 1:r – user123668

+0

我在看:http://www.mathworks.com/help/toolbox/distcomp/brdqtjj-1.html並找不到原因xr不能被分類 – user123668

+0

@ user123668我剛剛注意到你的代碼有錯誤。你在做什麼是不可能的'parfor' – abcd