【问题标题】:Matlab parfor unclassified variablesMatlab parfor 未分类变量
【发布时间】:2020-07-08 03:11:24
【问题描述】:

以下代码从向量 v 计算 A 的矩阵元素。我尝试使用 parfor 来加快计算速度,因为 v 的维度非常大。我收到错误消息“parfor 中的变量 A 无法分类。”。有关如何解决问题的任何建议?

A = zeros(n,n);
for kk = 1:D
    % sk = <expressions...>
    % ek = <expressions...>
    parfor ll = 1:D
        % sl = <expressions...>
        % el = <expressions...>
        if (ek == el)
            A(sk,sl) = A(sk,sl) + v(kk) * v(ll);
        end
    end
end

【问题讨论】:

    标签: matlab parfor


    【解决方案1】:

    问题是您将A 分布在不同的内核上,但会自行调整其值。核心应该如何知道条目A(sk,sl) 没有在不同的核心上更改?它需要检查这一点,与所有其他内核通信,消除任何并行计算,这就是 MATLAB 抱怨它的原因:

    您可以通过在parfor-loop 之外创建A 的副本来避免此问题

    A = zeros(n,n);
    B = A;
    for kk = 1:D
        % sk = <expressions...>
        % ek = <expressions...>
        parfor ll = 1:D
            % sl = <expressions...>
            % el = <expressions...>
            if (ek == el)
                B(sk,sl) = A(sk,sl) + v(kk) * v(ll);
            end
        end
    end
    

    【讨论】:

    • 抱歉,这个解决方案很可能不会产生相同的输出。 A 用零初始化并添加到循环中的原因是多次循环迭代将产生相同的 (sk,sl) 值。如果不是这种情况,就没有理由添加到A,因为A(sk,sl) 将只是零。您的诊断是正确的,但解决方案是不使用parlor。这只是不适合非共享内存并行的任务。
    • 是的,这是真的,@CrisLuengo。在没有看到代码的情况下,我无法建议任何适当的并行化解决方案 =(
    【解决方案2】:

    您可以将其表述为 "reduction" 而不是 A,如下所示:

    parfor ll 1:D
        % compute stuff...
    
        % Make a new matrix for the increment
        Aincrement = zeros(n, n);
        % Fill out the element of the increment
        Aincrement(sk, sl) = v(kk) * v(ll);
        % Increment the whole of A so that parfor can 
        % treat A as a reduction variable
        A = A + Aincrement;
    end
    

    如果n 很大,这可能效率很低。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      • 2018-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-19
      相关资源
      最近更新 更多