2011-09-16 14 views
1

私たちが持っている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; 
} 

答えて

4

私はPower 7でいくつかのことをしていますが、XLCコンパイラでは非常に奇妙なことがあります。しかし、これほど奇妙ではありません! (少なくとも60xではない)

PowerPCシリーズ(少なくともPower6とPower7)の注意すべきことは、命令のレイテンシが非常に長く、順序外の実行が非常に弱いことですx86/x64に

したがって、内部ループ(あなたのコードに書かれているように)はIPCが非常に低くなります。

ここで、60倍のスピードアップを得ることができる唯一の方法は、が-O3で完全にアンロールされていることです。これは、内部ループのトリップ数を静的に63と決定できるので可能です。

このループをアンロールすると、基本的にパイプライン全体が充填されます。

もちろん私は推測しています。あなたの最善の策は、アセンブリを見ることです。

また、どのようにタイミングを取っていますか?私はPowerPCで見てきた奇妙な行動の多くは、タイマーそのものからである...

EDIT:

あなたのサンプルコードは非常に簡単ですので、(アセンブリ内で)見つけることは非常に簡単なはずその内側ループが部分的にまたは完全に展開されているかどうかに関係なく、

+0

私はこれを、AIXの「時間」コマンドだけで計時してきました。私はコード自体の中にタイマーを挿入しませんでした。また、なぜIPCがあるのか​​少し混乱していますか?作品はすべてシングルスレッドとシングルコアで完結していないのですか? – entitledX

+0

申し訳ありませんが、私は "Instructions per Cycle"のようにIPCを意味しました。私はそれもサイクルあたりの割り込みを表していることに気づいていない... :) "時間"コマンドはうまくいくはずです。私はいくつかの状況で時計()で奇妙なことを見た。 – Mysticial

関連する問題