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

问题描述 投票:-1回答:1

我正在使用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)时,它就会停止变为brodcated。

  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
matlab parfor
1个回答
1
投票

首先:你需要播出。每个worker都是一个单独的MATLAB实例,它需要数据。将数据发送到工作人员的MATLAB实例称为广播。因此,当您使用并行计算时,它无法阻止它,它甚至是它的核心。

第二:你不能完全避免在这里完整地播放xy,因为你在每个单独的parfor迭代中都使用了所有这些。避免广播作为一个整体要求你不需要在每个循环迭代中都需要所有矩阵,在这种情况下你可以切片变量,如this answer中所示;即你必须以这样一种方式重写你的代码,即你不要求所有的xy都在每个单独的工作者身上。

© www.soinside.com 2019 - 2024. All rights reserved.