4.6.21. #pragma unroll [(n)]

此编译指示指示编译器通过 n 交互展开循环。

Note

可以使用 #pragma unroll [(n)] 展开向量化和非向量化循环。 即,#pragma unroll [(n)] 适用于 --vectorize--no_vectorize

语法


#pragma unroll


#pragma unroll (n)

其中:

n

是一个可选值,用于指示要展开的迭代次数。

缺省值

如果没有为 n 指定值,则编译器假定为 #pragma unroll (4)。

用法

使用 -O3-Otime 进行编译时,如果编译器认为展开循环比较有利,则会自动将其展开。 可以使用此编译指示请求编译器展开未自动展开的循环。

Note

仅当有证据表明(例如,从 --diag_warning=optimizations 中),编译器本身没有以最优方式展开循环时,才应使用此 #pragma

限制

使用 #pragma unroll [(n)] 时,只能将其紧靠 for 循环、while 循环或 do ... while 循环前面放置。

示例


void matrix_multiply(float ** __restrict dest, float ** __restrict src1,

    float ** __restrict src2, unsigned int n)

{

    unsigned int i, j, k;



    for (i = 0; i < n; i++)

    {

        for (k = 0; k < n; k++)

        {

            float sum = 0.0f;

            /* #pragma unroll */

            for(j = 0; j < n; j++)

                sum += src1[i][j] * src2[j][k];

            dest[i][k] = sum;


        }

    }

}

在此示例中,编译器没有正常完成其循环分析,因为 src2 是作为 src2[j][k] 进行索引的,而循环是按相反顺序嵌套的,即,j 位于 k 内部。 如果在示例中取消 #pragma unroll 注释,编译器将继续展开循环四次。

如果目的是增加大小不是 4 的倍数的矩阵(例如 n * n 矩阵),则可以改用 #pragma unroll (m),其中 m 是某个值,以使 nm 的整数倍数。

另请参阅

Copyright © 2007 ARM Limited. All rights reserved. ARM DUI 0348AC
Non-Confidential