Временные переменные

Временная переменная является любой переменной, которая является целью прямого, неиндексируемого присвоения, но не является переменной сокращения. В следующем 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 вне цикла.

Похожие темы