3

関数内の特定のループの自動ベクトル化をオフにしたいと考えています。GCCでこれを行うにはどうすればよいですか? 関数全体の自動ベクトル化をオフにできることはわかって__attribute__((optimize("no-tree-vectorize")))いますが、関数内の個々のループに対してこれを行うにはどうすればよいですか (MSVC では add を使用できます#pragma loop(no_vector))。

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];
    }
}
4

1 に答える 1

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

于 2017-04-25T15:14:04.947 に答える