变量私有化对改进程序中的并行性十分有用。然而,如果在循环外部引用私有变量,则编译器需要确保私有变量具有正确的值。请看以下示例:
for (i=1; i < 1000; i++) { t = 2 * a[i]; /* S1 */ b[i] = t; /* S2 */ } x = t; /* S3 */ |
在3.4.3 返回存储中,在语句 S3 中引用的 t 值是循环计算的最终 t 值。在变量 t 私有化并且循环完成执行之后,需要重新将 t 的正确值存储到初始变量中。这称为返回存储。此操作通过将最后一次迭代中的 t 值重新复制到变量 t 的初始位置来完成。在很多情况下,编译器自动执行此操作。但是也存在不易计算最终值的情况:
for (i=1; i < 1000; i++) { if (c[i] > x[i] ) { /* C1 */ t = 2 * a[i]; /* S1 */ b[i] = t; /* S2 */ } } x = t*t; /* S3 */ |
正确执行后,语句 S3 中的 t 值通常并不是循环最终迭代中的 t 值。事实上,它是条件 C1 为真时的最后一次迭代。通常,计算 t 的最终值十分困难。在类似情况下,编译器不会并行化循环。