为什么我不能在这段代码中使用parfor?
parfor i=1:r
for j=1:N/r
xr(j + (N/r) * (i-1)) = x(i + r * (j-1));
end
end这是一个错误:
错误:不能对parfor中的变量xr进行分类。参见MATLAB中的并行循环,“概述”。
发布于 2011-09-10 04:12:43
这里的问题是切片数组的索引不正确。asynchronously,运行parfor循环,这意味着每次迭代的执行顺序都是随机的。来自文档
MATLAB工作人员不按特定顺序对迭代进行评估,并且相互独立。因为每个迭代都是独立的,所以不能保证迭代以任何方式同步,也不需要这样做。
通过在命令行中键入以下内容,您可以轻松地验证上述语句:
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???错误:不能对parfor中的变量f进行分类。参见MATLAB中的并行循环,“概述”
但是为什么这会产生一个错误呢?
我已经证明迭代是以任意顺序执行的。因此,假设一个工作人员获得循环索引i=7和表达式f(i)=f(i-1)+f(i-2);。现在应该执行表达式并将结果返回给主节点。现在迭代i=6已经完成了吗?存储在f(6)中的值可靠吗?那f(5)呢?你看到我在说什么了吗?假设没有完成f(5)和f(6),那么您将错误地计算出Fibonnaci级数中的第七个项是0!
由于MATLAB无法判断您的计算是否能够保证每次都能正确运行并再现相同的结果,因此这种模糊的赋值是明确不允许的。
https://stackoverflow.com/questions/7369037
复制相似问题