临时变量
临时变量是任何作为直接、非索引赋值的目标的变量,但不是归约变量。在下面的 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 没有影响。