MATLAB: ошибка parfor

У меня есть следующий код MATLAB, который я хочу запустить с помощью parfor:

max = -1;
for i = 1:10
    for j = (i+1):10
       X = my_function(i, j);
       if (X > max)
           max = X;
       end
    end
end
disp(max)

Я хочу изменить первый для Parfor. Я прочитал пару уроков и документацию, но я не знаю, как получить такой же результат для max, используя parfor.

Я знаю, что есть некоторые проблемы с использованием I в for j = (i+1):10,

Буду признателен за любое предложение.

1 ответ

Решение

Вы не можете использовать parfor для зависимых итераций, т.е. в вашем случае max является зависимой (разделяемой) переменной между вашими итерациями цикла:

Вы не можете использовать цикл parfor, когда итерация в вашем цикле зависит от результатов других итераций. Каждая итерация должна быть независимой от всех остальных.

Это также отражено в отображаемом предупреждающем сообщении:

Предупреждение: временная переменная max будет очищаться в начале каждой итерации цикла parfor. Любое значение, присвоенное ему до цикла, будет потеряно. Если max используется до того, как он будет назначен в цикле parfor, произойдет ошибка во время выполнения. Смотрите параллельные циклы в MATLAB, "Временные переменные".

MATLAB реализует одно исключение из этого правила, а именно: Редукционные переменные:

Исключением из этого правила является накопление значений в цикле с использованием переменных редукции.

Итак, вы можете переписать свой код, чтобы использовать редукционные переменные:

maxX = -1;
for i = 1:10
    for j = (i+1):10
       maxX = max(maxX, my_function(i, j));
    end
end
disp(maxX)
Другие вопросы по тегам