GCC >= 4.4 で利用可能なグラファイト ループ最適化フレームワークを利用しようとしていますが、反復回数が不明な場合、変換を適用できないようです。たとえば、このコード例:
int __attribute__((hot))
f(double * restrict a, double *restrict b, double *restrict c, const int n)
{
for (int i = 0; i < n; i++) {
c[i] = a[i] + b[i*2];
}
}
コンパイルされた gcc 4.7 (グラファイト/clog が有効) の場合:
gcc -floop-strip-mine -O2 -c -std=c99 file.c
ストリップマイニングは行われません。
しかし、反復回数を定数 (たとえば 100) にすると、宣伝どおりにストリップ マイニングが実行されます。
反復回数が多いというヒントを与えてみました (assert( n > 1000), __builtin_expect(n, 1000)) が、それは役に立ちません。プロファイル情報を使用した簡単な実験も役に立ちませんでした。
だから私の質問は、gcc は未知の反復回数でストリップマイニングを行うことができますか?