Из документации на parfor
:
Тело цикла parfor не может содержать объявления глобальных или постоянных переменных.
В контексте вашей проблемы, то есть при вызове функции в parfor
, которая, в свою очередь, ссылается на global
, это означает: «parfor
, вероятно, не даст ожидаемых или значимых результатов».
В этом есть смысл. Рассмотрим следующие
Lab 1: Lab 2:
GetB(); GetB();
если содержимое GetB()
такое:
function GetB()
global B;
%# do something useful
B = rand;
end
какое значение будет у B
, когда на него будет сделана ссылка на Lab 1
? а на Lab 2
? Как сообщаются о различных результатах rand
? Будет беспорядок!
Написание кода, подходящего для parfor
циклов, может быть настоящей проблемой, когда этот код исходит из чего-то, что имеет в виду только обычные for
-циклы. Как правило, если вы заранее знаете, что собираетесь написать фрагмент кода Matlab с интенсивными вычислениями, с самого начала записывайте все функции и циклы как parfor
циклы. Это единственный способ, при котором такие ошибки не будут стоить вам дня на перекодировку ваших функций.
Преобразование из for
в parfor
совсем не тривиально.
person
Rody Oldenhuis
schedule
30.08.2012