Как избежать трансляции переменных в цикле parfor? - PullRequest
0 голосов
/ 18 сентября 2018

Я использую parfor, к сожалению, две мои переменные, x и y, которые являются матрицами, транслируются и не знают, как этого избежать.Я читал об этом в справке MATLAB, но не смог найти решение.Как я могу предотвратить трансляцию x и y?

Вот мой код:

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 голосов
/ 18 сентября 2018

Сначала: вам нужно для трансляции.Каждый работник - это отдельный экземпляр MATLAB, и ему нужны данные.Отправка данных в экземпляр MATLAB работника называется broadcasting .Так что нет никаких препятствий, когда вы используете параллельные вычисления, это даже ядро.

Во-вторых: вы не можете избежать трансляции x и y в целом здесь, так как вы используете все этов каждой отдельной parfor итерации.Чтобы избежать вещания в целом, требуется, чтобы вам не требовалась вся матрица в каждой итерации цикла, и в этом случае вы можете нарезать свои переменные, как представлено в этот ответ ;т. е. вам придется переписывать свой код таким образом, чтобы вам не требовалось, чтобы все x и y были на каждом отдельном работнике.

...