kmraの日記: イマドキのコンパイラコードと性能
インテル C++ Composer XE 2011の紹介記事(アセンブラコードつき)があったので見てみたら…
floatの積和演算(d += a[i] * b[i]、128要素)
C++ Composer XE 2011:SSEを使ったコードが出力される
Visual Studio 2010:fpuを使ったコードが出力される
感想:さすが、自動ベクトル化すごい、と思ったところで
注目の実行時間は
C++ Composer XE 2011 9.325秒
Visual Studio 2008 9.722秒
感想:なんだ、誤差の範囲じゃん…
しかし、この後驚愕の事実が…
実はVisual Studioでもオプション設定を行うことでSSEを利用するコードを出力できる。
なんだって~
ただし、インテル C++ Composer XE 2011で生成されたコードとは異なり、乗算/加算にはパックド命令は使用されておらず、同時に1つのデータしか処理していない。実行時間も9.800秒と、SSE2を利用しない場合よりもわずかではあるが劣る結果となった。
SSE使っても速くならないのはご愁傷様だけど、Intel純正コンパイラでも結局大して速くなってないから正直微妙…
メモリ速度ネックなのか、CPU内でそもそも演算器が足りていないのか、はたまた要素数128でprintfして終了したのをそのまま計ったために、起動/終了のオーバーヘッド丸見えなのかよく分からないが、紹介記事であるのに微妙である。
ところで、Intel純正コンパイラのコードをよく見てみると
・ループ展開はしている(SIMD4並列*ロードレイテンシ隠蔽2並列*4)
・ロードレイテンシの隠蔽は少しだけ(2並列分)
・ソフトウェアパイプライニングは行われていない
というところで、あまりすごいコードではない。
もう少し長いベクトル長でないとコンパイラのやる気が出なかったのかもしれない。
イマドキのコンパイラコードと性能 More ログイン