Oracle® Solaris Studio 12.4:C 用户指南

退出打印视图

更新时间: 2014 年 12 月
 
 

3.2.3 返回存储

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

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