忍者ブログ
コンピュータ将棋など…。
[345] [344] [343] [342] [341] [340] [339] [338] [337] [336] [335]
Windows 32bit環境で cygwin 上の gcc で開発していて、64bit演算の一部を MMX 組み込み関数に置き換えてみたところ、かえって遅くなってしまいました。
MMX より通常の32bit演算を2回やるほうがレイテンシやスループットが少ないからか? と思って、アセンブリ出力を見てみると、MMX を使わないときはなんとSSE2を使って、128bit演算していました!!

で、簡単なテストプログラムを、
 ・ VC6 + プロセッサパック
 ・ VC8(Visual Studio 2005)
 ・ gcc-4.5.0
でコンパイルして比較してみました。
プログラムが簡単すぎたせい(?)か 32bit×2 と 64bit は同じコードが出力されていて、gcc は SSE2 を使って128bitで演算していました(vc6 / vc8 は 32bit で演算していました)。

ただ、vc6 は律儀にループしていましたが、vc8 では 4回分まとめていて、ループ回数が1/4 になっていました。
また、MMX 部分では vc6 と vc8 とで、ループの演算位置が異なり、メモリリードのレイテンシに重ねていた vc6 のほうが速い結果となりました(これは予想外)。

ということで、実行環境、プログラムやコンパイラによって変わってくると思いますが、うちの環境では速い順に、
  gcc(通常=SSE2) < gcc(MMX) < vc6(MMX) < vc8(通常) < vc8(MMX) < vc6(通常)
となりました。

一応、32bit環境下で64bit演算するのに MMX のほうが速くなる可能性があるということがわかりましたが、浮動小数を使うときには emms を入れなければいけないし、64bit 環境だったら汎用レジスタでいいし、もういらないかもしれないですねw

コンパイルオプション:
  vc6 : cl -Ox mmx.cpp
  vc8 : cl -Ox -arch:SSE2 mmx.cpp
  gcc : g++ -O3 -msse2 mmx.cpp

ソースファイルとアセンブリ出力 : ダウンロード(mmx_test.zip)
PR

コメント


コメントフォーム
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字


トラックバック
この記事にトラックバックする:


忍者ブログ [PR]
カレンダー
05 2017/06 07
S M T W T F S
1 2 3
4 5 6 7 8 9 10
11 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
フリーエリア
なのはの応援をしていただき、かつ協力いただける方は、アマゾンでの買い物は下のリンクからお願いします
プロフィール
HN:
かず
性別:
非公開
バーコード
ブログ内検索
最古記事
カウンター
アクセス解析