Распараллеливание с parfor в MATLAB

Я пытаюсь распараллелить цикл в MATLAB и получаю сообщение об ошибке: "Действительные индексы для X_train ограничены в циклах PARFOR". Мой код ниже:

parfor c = 1:num_channels

% sum_n_train calculated here

for n = 1:sum_n_train
    bin_n = bin(n);

    Xmj = X_train(bin_n, :);

% some calculations happen in between

    X_train(bin_n,:) = Xmj;
    X_train(bin_n, p) = X_train(bin_n, p) + 1;

    z_train(n)= zind;
end

z_train_cell{c} = z_train;
end

X_train - это матрица n by p, а Xmj - вектор 1 by p. Ошибка для X_train. Из прочтения документации я вижу, что индексирование для каждой переменной должно быть исправлено в цикле parfor. Даже когда я закомментирую строку X_train(bin_n, p) = X_train(bin_n, p) + 1; (индекс X_train которого отличается от двух других строк), однако я все еще получаю сообщение об ошибке. Может кто-нибудь объяснить, почему и как я могу обойти это?

2 ответа

Анализ

Я не могу попробовать это сам, но кажется, что вы пытаетесь написать одно и то же в нескольких случаях parfor петля.

Это похоже на

X_train(bin_n,:)=Xmx

Будет происходить каждый раз, когда вводится parfor, а именно: X_train(1,:) часто перезаписывается, как упоминал @Daniel.


Решение

Вот что вы можете сделать:

  1. Закомментируйте строки одну за другой, начните с самой простой и продолжайте, пока ошибка не исчезнет
  2. Добавьте измерение ко всем переменным, которые назначены в закомментированных строках. Это должно сделать назначения для них не перекрывающимися.

Пример:

 `X_train(c,bin_n,:)`

Затем снова раскомментируйте и запустите код! Если проблема все еще возникает, вам может понадобиться добавить измерение к большему количеству переменных.

Я дал ответ на подобную проблему здесь. MATLAB не знает, что делать с

X_train(bin_n,:)
X_train(bin_n, p) = X_train(bin_n, p) + 1;

поскольку он должен разделить X_train на нужные процессоры перед циклом, но он не знает, как разделить, пока вы не вычислите индексы bin_n. Проще говоря, вы не можете сохранить в переменных индексов.

Если ячейки не перекрываются, вам необходимо жестко закодировать эти индексы с постоянными значениями. Если бункеры перекрываются, то они зацикливаются, как будто решения зависят от порядка их выполнения (т. Е. Вы обновляете X_train в местах bin_n, но используете его через Xmj для вычисления других вещей в оставшейся части), что означает проблему в его текущая форма не может быть решена с помощью parfor.

Другие вопросы по тегам