【问题标题】:Access variable in nested parfor loop in MATLAB [duplicate]MATLAB中嵌套parfor循环中的访问变量[重复]
【发布时间】:2016-02-02 18:24:40
【问题描述】:

考虑 MATLAB 中的以下代码:

function parallelProblem
N = 10;
A = rand(N);
parfor i=1:N
    for k=2:N
        A(i,k) = f(A(i,k-1));
     end
end

end

function y=f(x)
y = x;
end

这是我正在处理的有问题的代码的摘要。基本上这个想法是这样的:我必须变量ik并且我可以在不同i之间没有通信的情况下执行我的计算,但是k的不同值之间的通信是必需的。

因此我想在i 上并行化循环。但是,对于上面的代码,我得到了错误

parallelProblem

Error: File: parallelProblem.m Line: 6 Column: 9
The variable A in a parfor cannot be classified.
See Parallel for Loops in MATLAB, "Overview".

将鼠标悬停在单词 parfor 上(带下划线)给出

The PARFOR loop can not run due to the way the variable 'A' is used.

悬停在f(A(i,k-1)) 上会给出

Valid indices for 'A' are restricted in PARFOR loops

In PARFOR loop, variable 'A' is indexed in different ways, potentially causing dependencies between iterations.

从直观的角度来看,我认为没有理由让代码并行工作。有什么办法,我可以修改我的代码以获得所需的结果?

【问题讨论】:

    标签: matlab parallel-processing parfor


    【解决方案1】:

    问题是您正在覆盖Aparfor 中的循环没有按顺序执行,MATLAB 看到您正在覆盖 A 的值,然后使用它们。您可以使用辅助变量轻松解决此问题:

    function parallelProblem
    
    N = 5;
    A = magic(N);
    Aresult=[];
    parfor i=1:N,N
        b=[];
        for k=2:N
            b(k) = f(A(i,k-1));
        end
       Aresult(i,:)=b;
    end
    
    end
    

    【讨论】:

    • 感谢您的修复。这似乎有效。但是,我认为覆盖值不会有问题,因为我覆盖了仅在同一 niteration 中使用的值。不同的n 之间没有通信,我只写了由n 读取的变量部分,它也在写入。还是 MATLAB 无法区分这与不是设置的情况?
    • @k1next 我认为在这种情况下它只是 MATLAB 完全无法区分。
    • 谢谢!这有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 2016-09-12
    • 1970-01-01
    相关资源
    最近更新 更多