变量私有化对改进程序中的并行性十分有用。然而,如果在循环外部引用私有变量,则编译器需要确认私有变量具有正确的值。请看以下示例:
示例 3-9 使用返回存储的并行化循环for (i=1; i < 1000; i++) { t = 2 * a[i]; /* S1 */ b[i] = t; /* S2 */ } x = t; /* S3 */
在此示例中,在语句 S3 中引用的 t 值是循环计算的最终 t 值。在变量 t 私有化并且循环完成执行之后,需要重新将 t 的正确值存储到初始变量中。此过程称为返回存储,通过将最终迭代中 t 的值重新复制到变量 t 的原始位置实现。在许多情况下,编译器会自动执行此操作,但有时不容易计算最后一个值。
示例 3-10 不能使用返回存储的循环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 的最终值会比较困难。在与此示例类似的情况下,编译器不会并行化循环。