gpt4 book ai didi

matlab - MATLAB 问题中的 Parfor

转载 作者:行者123 更新时间:2023-12-02 07:25:25 28 4
gpt4 key购买 nike

为什么我不能在这段代码中使用parfor

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".

最佳答案

这里的问题是切片数组的索引不正确。 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

您会发现排序是任意的。因此,如果您将并行作业分配给不同的工作人员,则一个工作人员无法判断不同的迭代是否已完成。因此,您的变量索引不能取决于迭代器的过去/ future 值。

让我用一个简单的例子来演示这一点。考虑斐波那契数列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) 没有完成,那么您将错误地计算出斐波那契数列中的第 7 项为 0!

由于 MATLAB 无法判断您的计算是否可以保证正确运行并每次都能重现相同的结果,因此明确不允许此类不明确的赋值。 p>

关于matlab - MATLAB 问题中的 Parfor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7369037/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com