Sun Studio 12:C 用户指南

3.4.3 返回存储

变量私有化对改进程序中的并行性十分有用。然而,如果在循环外部引用私有变量,则编译器需要确保私有变量具有正确的值。请看以下示例:


示例 3–9 使用返回存储的并行化循环


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 的初始位置来完成。在很多情况下,编译器自动执行此操作。但是也存在不易计算最终值的情况:


示例 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 的最终值十分困难。在类似情况下,编译器不会并行化循环。