コードで行列ベクトル積をベクトル化したいと考えています。GCC で自動ベクトル化を使用しようとしましたが、まったく機能せず、どうすればうまくいくかわかりません。今、私は非常に単純なサンプルコードを試しています:
#define N 200000
double a[N] __attribute__(( aligned(16) ));
double b[N] __attribute__(( aligned(16) )) ;
double c[N] __attribute__(( aligned(16) )) ;
void f()
{
int i;
for( i = 0; i < N; i++ )
{
a[i] = b[i] + c[i];
}
}
int main( int argc,char** argv )
{
f();
return( 0 );
}
私はgccバージョン4.9.2を使用し、フラグを付けてコンパイルします(完全を期すため)
-Wall -O3 -ftree-vectorize -march=native -msse2 -fopt-info-vec-missed -ftree-vectorizer-verbose=1 -std=c++11 -fdiagnostics-color=auto
次の出力が得られます (意味がよくわかりませんが、ベクトル化がうまくいかないことは明らかです)。
optimization2.cpp:10:2: note: misalign = 0 bytes of ref b[i_11]
optimization2.cpp:10:2: note: misalign = 0 bytes of ref c[i_11]
optimization2.cpp:10:2: note: misalign = 0 bytes of ref a[i_11]
optimization2.cpp:10:2: note: virtual phi. skip.
optimization2.cpp:10:2: note: num. args = 4 (not unary/binary/ternary op).
optimization2.cpp:10:2: note: not ssa-name.
optimization2.cpp:10:2: note: use not simple.
optimization2.cpp:10:2: note: num. args = 4 (not unary/binary/ternary op).
optimization2.cpp:10:2: note: not ssa-name.
optimization2.cpp:10:2: note: use not simple.
optimization2.cpp:6:6: note: not vectorized: not enough data-refs in basic block.
optimization2.cpp:12:13: note: not vectorized: no vectype for stmt: vect__4.6_1 = MEM[(int *)vectp_b.4_9];
scalar_type: vector(4) int
optimization2.cpp:12:13: note: not vectorized: not enough data-refs in basic block.
optimization2.cpp:6:6: note: not vectorized: not enough data-refs in basic block.
optimization2.cpp:14:1: note: not vectorized: not enough data-refs in basic block.
optimization2.cpp:10:2: note: misalign = 0 bytes of ref b[i_12]
optimization2.cpp:10:2: note: misalign = 0 bytes of ref c[i_12]
optimization2.cpp:10:2: note: misalign = 0 bytes of ref a[i_12]
optimization2.cpp:10:2: note: virtual phi. skip.
optimization2.cpp:10:2: note: num. args = 4 (not unary/binary/ternary op).
optimization2.cpp:10:2: note: not ssa-name.
optimization2.cpp:10:2: note: use not simple.
optimization2.cpp:10:2: note: num. args = 4 (not unary/binary/ternary op).
optimization2.cpp:10:2: note: not ssa-name.
optimization2.cpp:10:2: note: use not simple.
optimization2.cpp:16:5: note: not vectorized: not enough data-refs in basic block.
optimization2.cpp:12:13: note: not vectorized: no vectype for stmt: vect__4.28_2 = MEM[(int *)vectp_b.26_9];
scalar_type: vector(4) int
optimization2.cpp:12:13: note: not vectorized: not enough data-refs in basic block.
optimization2.cpp:16:5: note: not vectorized: not enough data-refs in basic block.
optimization2.cpp:16:5: note: not vectorized: not enough data-refs in basic block.
私は他にも多くのことや他のコードを試しましたが、何もベクトル化できませんでした。トリックは何ですか?