2014-05-16 7 views
1

함수의 특정 루프에 대한 자동 벡터화를 해제하고 싶습니다. 어떻게 GCC에서이 작업을 수행 할 수 있습니까? 나는 __attribute__((optimize("no-tree-vectorize")))으로 전체 함수에 대해 자동 벡터화를 해제 할 수 있지만 함수의 개별 루프에 대해 어떻게 수행합니까 (#pragma loop(no_vector)을 사용할 수있는 MSVC 사용).GCC의 함수에서 특정 루프의 자동 벡터화 사용 안 함

void dot_int(int * __restrict a, int * __restrict b, int * __restrict c) { 
    for(int i=0; i<1024; i++) {   
     c[i] = a[i] + b[i]; 
    } 
    //#pragma loop(no_vector) //don't vectorize this loop 
    for(int i=0; i<1024; i++) {   
     c[i] = a[i] + b[i]; 
    } 
} 
+0

왜 그렇게하고 싶은지 물어봐도 될까요? – Biffen

+0

저는 벡터화 된 루프를 벡터화 된 파트와 벡터화되지 않은 파트로 분리하려고합니다. 지금은 내가 얻을 수있는 방법입니다. 별도의 인라인 함수를 사용해 보았지만 작동하지 않았습니다. –

답변

0

내 생각에는 누구나 해결책을 생각해 냈습니다. 그것은 정말로 반대입니다. 특정 루프에서 자동 벡터화를 비활성화하는 대신 특정 루프에서만 자동 벡터화를 활성화합니다.

-O2으로 컴파일하고 #pragma omp simd과 같이 사용하십시오.

void dot_int(int * __restrict a, int * __restrict b, int * __restrict c) { 
    #pragma omp simd 
    for(int i=0; i<1024; i++) {   
     c[i] = a[i] + b[i]; 
    } 

    for(int i=0; i<1024; i++) {   
     c[i] = a[i] + b[i]; 
    } 
} 

#pragma omp simd의 벡터화 반드시 -O3와 벡터화와 같은 코드를 생성하지 않습니다 생각.