まだ正式版ではないけれど,かなり安定してきたらしいgcc4.1.変更点一覧*1によると,とにかく最適化が改善された模様.
そこで,とりあえず以下のようなコードをつかって,最適化(特にauto-vectorization)ぐあいを確認してみた.
#define SZ 320*240*10 void foo(const int * __restrict__ s, int * __restrict__ d) { int i; for (i=0;i<SZ;i++){ *d = (*s>0)?*s:0; d++; s++; } } int sum(const int * __restrict__ s) { int sum=0; int i; for (i=0; i<SZ; i++){ sum += *s; s++; } return sum; } int main() { static int src[SZ]; static int dst[SZ]; foo(src, dst); return sum(dst); }
コンパイルオプション
コンパイラ | コンパイルオプション |
---|---|
gcc-4.1.0(20051222) | -O3 -ftree-vectorize -ftree-vectorizer-verbose=5 -mmmx -msse3 |
gcc-4.0.2(20050928) | -O3 -ftree-vectorize -ftree-vectorizer-verbose=5 -mmmx -msse3 |
gcc-3.2.3 | -O3 |
icc-9(20050809Z) | -xN -O3 |
ベクトル化の結果
コンパイラ | foo()のベクトル化 | sum()のベクトル化 |
---|---|---|
gcc-4.1.0(20051222) | ○ | ○ |
gcc-4.0.2(20050928) | ○ | × |
gcc-3.2.3 | × | × |
icc-9(20050809Z) | ○ | ○ |
foo()は条件分岐を含むループ,sum()は単純なループ.gcc-4.1なら両方ベクトル化できる模様.