私たちが持っているpower6クラスタでAltivec拡張を使って遊んでいただけです。私は、以下のコードを最適化せずにコンパイルしたとき、私が期待していたように私のスピードアップは4だったことに気付きました。しかし、-O3フラグで再びコンパイルしたとき、私は60のスピードアップを得ることができました!IBM xlCコンパイラによるAltivecによるループ最適化
これ以上の経験を積んだ人がいれば、コンパイラがどのようにコードを整理してそのような高速化を実行するかについての洞察を得ることができます。ここでアセンブリと命令のパイプライン処理による唯一の最適化は可能ですか?それとも、私の将来の作業に含めることができないものがありますか?
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;
}
私はこれを、AIXの「時間」コマンドだけで計時してきました。私はコード自体の中にタイマーを挿入しませんでした。また、なぜIPCがあるのか少し混乱していますか?作品はすべてシングルスレッドとシングルコアで完結していないのですか? – entitledX
申し訳ありませんが、私は "Instructions per Cycle"のようにIPCを意味しました。私はそれもサイクルあたりの割り込みを表していることに気づいていない... :) "時間"コマンドはうまくいくはずです。私はいくつかの状況で時計()で奇妙なことを見た。 – Mysticial