Vengineerの妄想(準備期間)

人生は短いけど、長いです。人生を楽しみましょう!

GCC 5.3.0で #pragma omp simd


ChromebookUbuntu 14.04LTS環境で、GCC 5.3.0をビルドすること数時間。

早速、OpenMP 4.0 の #pragma omp simd を試してみました。
下記のコードに対して、g++ -O -fopenmp-simd -mavx -S sample_simd_div.cpp でアセンブラ出力してみました。

結果として、div_0以外のdiv_1/div_2/div_3はすべてAVXのコードになりました。凄いね。

void div_0( const float * a, const float * b, float * c )
{
    for( int i=0 ; i<4 ; i++ )
        c[i] = a[i] / b[i];
}

void div_1( const float * __restrict__ a, const float * __restrict__ b, float * __restrict__ c )
{
    for( int i=0 ; i<4 ; i++ )
        c[i] = a[i] / b[i];
}

void div_2( const float * a, const float * b, float * c )
{
    #pragma omp simd
    for( int i=0 ; i<4 ; i++ )
        c[i] = a[i] / b[i];
}

void div_3( const float * __restrict__ a, const float * __restrict__ b, float * __restrict__ c )
{
    #pragma omp simd
    for( int i=0 ; i<4 ; i++ )
        c[i] = a[i] / b[i];
}