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)