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

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

В отличие от поведения a 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 вне цикла.

Похожие темы