如何避免parfor循环中的变量广播?

时间:2018-09-18 17:41:37

标签: matlab parfor

我正在使用parfor,不幸的是,我的两个变量xy都是矩阵,被广播并且不知道如何避免。我已经在MATLAB帮助中阅读了有关此内容的信息,但找不到解决方案。如何防止广播xy

这是我的代码:

parfor k=1:length(Lambda)

    lambda=Lambda(k);

    for p=1:length(Gamma)
        gamma=Gamma(p);

        for Fold=1:size(Fold_indices,2)

            x_Train=x(logical(Fold_indices(:,Fold)),1:end);

            Y_Train=y(logical(Fold_indices(:,Fold)),1:Num_Tasks);

            % Do sth with x_Train and Y_train
        end
    end
end

我试图将广播的数据(x)切成一个单元阵列,但这并不能很好地解决问题。

   B=cell(1,J);

    % Fill each entry of B with a matrix
      % ...do it here
 ....
    parfor k=1:length(Lambda)

        lambda=Lambda(k);

        for p=1:length(Gamma)
            gamma=Gamma(p);

            for Fold=1:J)

                x_Train=B{1,J};

                % Do sth with x_Train and Y_train
            end
        end
    end

有趣的是,当我将broadacaste变量(B)分配给其他变量(D)时,它不再被溴化。

  B=cell(1,J);

    % Fill each entry of B with a matrix
      % ...do it here
 ....
    parfor k=1:length(Lambda)
        D=B;
        lambda=Lambda(k);

        for p=1:length(Gamma)
            gamma=Gamma(p);

            for Fold=1:J)

                x_Train=B{1,J};

                % Do sth with x_Train and Y_train
            end
        end
    end

1 个答案:

答案 0 :(得分:1)

首先,您需要进行广播。每个工作程序都是一个单独的MATLAB实例,并且需要数据。将数据发送到工作人员的MATLAB实例称为广播。因此,在使用并行计算时并不能阻止它,甚至是它的核心。

第二:您不能避免在此处完整广播xy,因为您在每个单独的parfor迭代中都使用了它们。要避免整体广播,就不需要您在每次循环迭代中都使用所有矩阵,在这种情况下,您可以对变量进行切片,如this answer中所述;也就是说,您必须以不需要所有xy都在每个单独的工作人员上的方式来重写代码。