2011-09-10 80 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