ついにgccがiccを超えたかもしれない.

まだ正式版ではないけれど,かなり安定してきたらしい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

iccを使うときは環境変数GXX_ROOTをgcc-3.2にあわせて設定した.

ベクトル化の結果

コンパイラ foo()のベクトル化 sum()のベクトル化
gcc-4.1.0(20051222)
gcc-4.0.2(20050928) ×
gcc-3.2.3 × ×
icc-9(20050809Z)

foo()は条件分岐を含むループ,sum()は単純なループ.gcc-4.1なら両方ベクトル化できる模様.

実行時間(cpu:P4@2.8GHz)

コンパイラ 実行時間
gcc-4.1.0(20051222) 0m0.001s
gcc-4.0.2(20050928) 0m0.004s
gcc-3.2.3 0m0.005s
icc-9(20050809Z) 0m0.004s

今回のテストに限ればgcciccに勝ってしまっている.詳細はアセンブラレベルで確認する必要があるが,gcc-4系にはかなり期待できそう.