Проблема в том, что parfor
выполняет цикл по своей природе в случайном порядке, чтобы заставить вас сделать все вычисления независимыми от других. Ваш код зависит . Вы не можете запустить i=2
до i=1
, потому что значение a
не установлено в этом случае (что более или менее говорит длинная и сложная ошибка). Вы должны сделать каждую итерацию цикла независимой от всех остальных, чтобы иметь возможность распараллелить ее.
Основная причина этого заключается в том, что каждый работник не будет видеть, что другиеделает. Если вам потребуются результаты предыдущих итераций в последующих, не будет особого смысла распараллеливать в первую очередь.
parfor ii=1:5
disp(ii)
end
Это может привести, например, к 4 3 5 2 1
или любой другой перестановке. Это происходит потому, что каждое ядро получает одну итераций и выдает результат, как только это будет сделано.
Таким образом, для вашего "простого" примера решение будет следующим:1019 * сначала вычислить a=func1()
, а затем выполнить parfor ii = 2:2
.
В общем: рекурсивные циклы (т. Е. Цикл, в котором любая итерация зависит от результата предыдущей, но очень далекой) нельзя распараллелить. Таким образом, напишите свой код, чтобы он не был рекурсивным.