Power6 クラスターで Altivec 拡張機能をいじっていました。最適化を行わずに以下のコードをコンパイルすると、期待どおりにスピードアップが 4 であることに気付きました。しかし、-O3 フラグを付けて再度コンパイルしたところ、60 倍の高速化が実現しました。
誰かがこれについてもっと経験があり、コンパイラが私のコードをどのように再配置してそのようなスピードアップを実行しているかについての洞察を提供できるかどうか疑問に思っています. ここでのアセンブリと命令パイプラインによる唯一の可能な最適化ですか、それとも、今後の作業に含めることができる欠けているものが他にありますか?
int main(void) {
const int m = 1000;
__vector signed int va;
__vector signed int vb;
__vector signed int vc;
__vector signed int vd;
int a[m];
int b[m];
int c[m];
for( int i=0 ; i < m ; i++ ) {
a[i] = i;
b[i] = i;
c[i] = 0;
}
for( int cnt = 0 ; cnt < 10000000 ; cnt++ ) {
vd = (__vector signed int){cnt,cnt,cnt,cnt};
for( int i = 0 ; i < m/4 ; i+=4 ) {
va = vec_ld(0, &a[i]);
vb = vec_ld(0, &b[i]);
vc = vec_add(vd, vec_add(va,vb));
vec_st(vc, 0, &c[i]);
}
}
std::cout << c[0] << ", " << c[1] << ", " << c[2] << ", " << c[3] << "\n";
return 0;
}