Временная переменная является любой переменной, которая является целью прямого, неиндексируемого присвоения, но не является переменной сокращения. В следующем parfor
- цикл, a
и d
временные переменные:
a = 0; z = 0; r = rand(1,10); parfor i = 1:10 a = i; % Variable a is temporary z = z + i; if i <= 5 d = 2*a; % Variable d is temporary end end
В отличие от поведения for
- цикл, MATLAB® очищает любые временные переменные перед каждой итерацией parfor
- цикл. Чтобы помочь гарантировать независимость итераций, значения временных переменных не могут быть переданы от одной итерации цикла другому. Поэтому временные переменные должны быть установлены в теле parfor
- цикл, так, чтобы их значения были заданы отдельно для каждой итерации.
MATLAB не передает временные переменные обратно клиенту. Временная переменная в parfor
- цикл не оказывает влияния на переменную с тем же именем, которое существует вне цикла. Это поведение отличается от обычного for
- циклы.
Временные переменные в parfor
- цикл очищен в начале каждой итерации. MATLAB может иногда обнаруживать случаи, в которых итерации цикла используют временную переменную, прежде чем он будет установлен в той итерации. В этом случае MATLAB выпускает статическую ошибку, а не ошибку времени выполнения. Существует мало точки в разрешении выполнения продолжить, если ошибка времени выполнения, как гарантируют, произойдет. Этот вид ошибки часто возникает из-за беспорядка между for
и parfor
, особенно относительно правил классификации переменных. Например:
b = true; parfor i = 1:n if b && some_condition(i) do_something(i); b = false; end ... end
Этот цикл приемлем как обычный for
- цикл. Однако как parfor
- цикл, b
временная переменная, потому что она происходит непосредственно как цель присвоения в цикле. Поэтому это очищено в начале каждой итерации, таким образом, ее использование в условии if
как гарантируют, будет неинициализированным. Если вы изменяете parfor
к for
, значение b
принимает последовательное выполнение цикла. В этом случае, do_something(i)
выполняется только для нижних значений i
до b
набор false
.
Другая частая причина неинициализированных временных файлов может возникнуть, когда у вас есть переменная, что вы намеревались быть переменной сокращения. Однако, если вы используете его в другом месте в цикле, затем это классифицируется как временная переменная. Например:
s = 0; parfor i = 1:n s = s + f(i); ... if (s > whatever) ... end end
Если единственные случаи s
два в первом операторе тела, s
был бы классифицирован как переменная сокращения. Но в этом примере, s
не переменная сокращения, потому что она имеет использование за пределами присвоений сокращения в линии s > whatever
. Поскольку s
цель присвоения (в первом операторе), это - временный файл. Поэтому MATLAB выдает ошибку, но указывает на возможную связь с сокращением.
Если вы изменяете parfor
к for
, использование s
вне сокращения присвоение использует итерации, выполняемые в особом порядке. В parfor
- цикл, имеет значение, что цикл “не заботится” о значении переменной сокращения, как это продвигается. Это только после цикла, что значение сокращения становится применимым.
ans
ПеременнаяВ теле parfor
- цикл, ans
переменная классифицируется как временная переменная. Все факторы и ограничения для временных переменных применяются к ans
. Например, присвоения на ans
в parfor
- цикл не оказывает влияния на ans
вне цикла.