【问题标题】:Parfor in MATLAB ProblemMATLAB 中的 Parfor 问题
【发布时间】:2011-09-14 13:08:58
【问题描述】:

为什么我不能在这段代码中使用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 中的并行 for 循环,“概述”。

【问题讨论】:

    标签: matlab


    【解决方案1】:

    这里的问题是切片数组的索引不正确。 parfor 循环异步运行,这意味着每次迭代的执行顺序是随机的。来自documentation

    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 中的并行 for 循环,“概述”

    但是为什么会报错呢?

    我已经展示了迭代以任意顺序执行。因此,假设一个工作者获取循环索引i=7 和表达式f(i)=f(i-1)+f(i-2);。它现在应该执行表达式并将结果返回给主节点。现在迭代i=6 完成了吗? f(6) 中存储的值是否可靠? f(5) 呢?你明白我在说什么吗?假设f(5)f(6)没有做完,那么你会错误地计算出斐波那契数列的第7项是0!

    由于 MATLAB 无法确定您的计算是否可以保证正确运行并每次都重现相同结果,因此明确禁止此类模棱两可的赋值。 p>

    【讨论】:

    • 它仍然给我错误:错误:parfor中的变量xr无法分类。请参阅 MATLAB 中的并行 for 循环,“概述”。 ==> Code1 在 36 parfor i=1:r 时出错
    • 我在看:mathworks.com/help/toolbox/distcomp/brdqtjj-1.html,不知道为什么 xr 不能分类
    • @user123668 我刚刚注意到您的代码中有一个错误。 parfor 无法实现您正在做的事情
    • 你能详细解释一下吗?感谢您的帮助!我真的很想知道为什么这个算法不能并行化。
    • @user123668 当然,在我写的时候给我一些时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多