まだ正式版ではないけれど,かなり安定してきたらしい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なら両方ベクトル化できる模様.