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