2014-12-05 12 views
2

에 줄이기 :루프 내가 선택적으로 다음과 같은 프로그램에서 두 번째 루프를 풀다하려고 그 소리

#include <stdio.h> 

int main() 
{ 
    int in[1000], out[1000]; 
    int i,j; 

    #pragma nounroll 
    for (i = 100; i < 1000; i++) 
    { 
     in[i]+= 10; 
    } 

    #pragma unroll 2 
    for (j = 100; j < 1000; j++) 
    { 
     out[j]+= 10; 
    } 

    return 1; 
} 

을 나는 다음과 같은 옵션을 연타 (3.5)를 실행하면 루프 모두 4 번 언 롤링합니다.

clang -std=c++11 -O3 -fno-slp-vectorize -fno-vectorize -mllvm -unroll-count=4 -mllvm -debug-pass=Arguments -emit-llvm -c *.cpp 

내가 뭘 잘못하고 있니? 또한 -fno-unroll-loops을 추가하거나 -unroll-count=4 플래그를 건너 뛸 경우 루프가 실행되지 않습니다.

또한 pragma 오류를 디버깅하는 방법에 대한 힌트가 있습니까?

답변

1

clang 3.5에는 이러한 pragma에 대한 지원이 없다고 생각합니다.

그러나 3.6부터, 당신은 자동 진단 기반 풀다 기능을 활성화 또는 비활성화 할 수 #pragma clang loop unroll(enable | disable)를 사용할 수 있습니다. 루프를 완전히 풀려면 #pragma clang loop unroll(full)을 줄임말로 사용하십시오. 또한 #pragma clang loop unroll_count(N) - N이 컴파일시 상수 인 경우 - 명시 적으로 펼치기 수를 지정할 수 있습니다.

더 많은 정보 here.

위의 물건의 관점에서 다시 귀하의 코드 :

#include <stdio.h> 

int main() 
{ 

    int in[1000], out[1000]; 
    int i,j; 

    #pragma clang loop unroll(disable) 
    for (i = 100; i < 1000; i++) 
    { 
    in[i]+= 10; 
    } 

    #pragma clang loop unroll_count(2) 
    for (j = 100; j < 1000; j++) 
    { 
    out[j]+= 10; 
    } 


    return 1; 
}