1

コードで行列ベクトル積をベクトル化したいと考えています。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.

私は他にも多くのことや他のコードを試しましたが、何もベクトル化できませんでした。トリックは何ですか?

4

0 に答える 0