コンピュータ将棋など…。
× [PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
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 |
カレンダー
フリーエリア
なのはの応援をしていただき、かつ協力いただける方は、アマゾンでの買い物は下のリンクからお願いします
最新CM
[04/27 とおりすがり]
[10/21 おてだま]
[10/20 おてだま]
[01/24 なのはminiふぁん]
[01/08 sakura]
最新記事
(06/12)
(04/17)
(08/13)
(06/08)
(06/06)
最新TB
プロフィール
HN:
かず
性別:
非公開
ブログ内検索
カウンター
アクセス解析
|