4.6.21. #pragma unroll [(n)]

이 pragma는 n번의 이터레이션으로 루프를 언롤링하도록 컴파일러에 지시합니다.

Note

벡터화된 루트와 벡터화되지 않은 루프 모두 #pragma unroll [(n)]을 사용하여 언롤링할 수 있습니다. 즉, #pragma unroll [(n)]--vectorize--no_vectorize 모두에 적용됩니다.

구문

#pragma unroll
#pragma unroll (n)

인수 설명:

n

언롤링할 이터레이션 수를 나타내는 선택적인 값입니다.

기본값

n에 값을 지정하지 않으면 컴파일러에서 #pragma unroll (4)로 간주됩니다.

사용법

-O3 -Otime에서 컴파일하는 경우 컴파일러는 이러한 수행에 적합한 위치에 있는 루프를 자동으로 언롤링합니다. 이 pragma를 사용하면 자동으로 언롤링되지 않은 루프를 언롤링하도록 컴파일러에 요청할 수 있습니다.

Note

#pragma는 확실한 경우에만 사용해야 합니다. 예를 들어 컴파일러가 자체적으로 루프를 언롤링하지 않는 --diag_warning=optimizations에서 사용할 수 있습니다.

제한

#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;
        }
    }
}

이 예제에서 src2src2[j][k]로 인덱싱되어 있는 데 루프는 반대 순서(즉, k 내부에 j가 위치)로 중첩되어 있으므로 대개 컴파일러는 해당 루프 분석을 완료하지 못합니다. 이 예제에서 #pragma unroll 주석을 제거하면 컴파일러는 루프를 4번 언롤링합니다.

크기가 4의 배수가 아닌 매트릭스를 증가시키려는 경우(예: n * n 매트릭스) #pragma unroll (m)을 대신 사용할 수 있습니다. 여기서 mnm의 정수 배수가 되도록 하는 값입니다.

추가 참고

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