The MMX and floating-point stack registers (MM0-MM7/ST0-ST7) are volatile. That is, these legacy floating-point stack registers do not have their state preserved across context switches.
これがドライバに限定されるのかどうかは、私も実際に実機で試したわけではないのではっきりしたことは言えませんけど、ドライバだけ実行環境が違うというのもヘンなので、おそらくユーザーアプリでも同じだと思います。AMD の文書(PDF) [amd.com] では、"Microsoft Windows for AMD64 will not context switch x87, 3DNow!, MMX for 64-bit native threads." となってますし。
無知な私におせーて! (スコア:1, 興味深い)
Re:無知な私におせーて! (スコア:1, 参考になる)
レジスタのやりくりロスが減るんじゃないかと。
(もちろんCPU内部にはより多くの物理レジスタがあってレジスタ
リネームされてるんでしょうけど)
浮動小数点周りは退化? (スコア:4, 参考になる)
けど、AMD64 版 Windows の 64bit モード下では、x87 FPU レジスタの内容を保存・復元しなくなりましたので、事実上 x87 FPU 浮動小数点演算や、その x87 FPU レジスタを間借りしている MMX/3DNow! が使えなくなってます。MMX/3DNow! はともかく x87 FPU が使えないとなると、80bit の拡張倍精度フォーマットが使えなくなりますし、超越関数(sin/cosなど)のハードウェア演算ができなくなるので、状況によっては 64bit化によるパフォーマンス低下も考えられます。
要するに、浮動小数点演算については、これからはすべて SSE/SSE2 を使えということらしいです。AMD64 版の各種 PC-UNIX では、x87 FPU も MMX/3DNow! もきちんとサポートされているので、これだけがちょっと残念。
Re:浮動小数点周りは退化? (スコア:1)
Windows の 64bit モードで x87 FPU レジスタが保存されないとなると、32bit モードで動かさざるを得ないアプリが半ダースほどあるので。
#、と言うか 64bit 版への移行は断念かも。
Re:浮動小数点周りは退化? (スコア:2, 参考になる)
・Legacy Floating-Point Support
The MMX and floating-point stack registers (MM0-MM7/ST0-ST7) are volatile. That is, these legacy floating-point stack registers do not have their state preserved across context switches.
一つ補足 (スコア:2, 参考になる)
Re:浮動小数点周りは退化? (スコア:2, 興味深い)
教えていただいた URL [microsoft.com] は該当の記載が無いので Google で "Legacy Floating-Point Support " を検索 [google.co.jp]したところ、Other Calling Convention Process Issues [microsoft.com]を発見できました。
これは Other Calling Convention Process Issues [microsoft.com]
とあるのでDDK、ディバイスドライバのついて限定されるのではないかと思います。これまでドライバでx87が使えたか知らないのですが、超越関数が使えないとチョットだけ不便な気がします。
ドライバ以外(通常の64bit アプリケーション)でx87が使えるかはもう少し調べてみます。
Re:浮動小数点周りは退化? (スコア:1)
これがドライバに限定されるのかどうかは、私も実際に実機で試したわけではないのではっきりしたことは言えませんけど、ドライバだけ実行環境が違うというのもヘンなので、おそらくユーザーアプリでも同じだと思います。AMD の文書(PDF) [amd.com] では、"Microsoft Windows for AMD64 will not context switch x87, 3DNow!, MMX for 64-bit native threads." となってますし。
Re:浮動小数点周りは退化? (スコア:1)
=^..^=
Enjoy Computing, Skiing, as much as Horse Racing.
Re:浮動小数点周りは退化? (スコア:1)
Re:浮動小数点周りは退化? (スコア:1)
コンパイラはx86や3DNow!、MMX のコードを生成しないと思います。
しかし(インラインアセンブラを含む)アセンブラで書かれた資産はちがいます。
#個人的には 64bit に移行する今がx87と決別するいい潮時だと思います。
Re:浮動小数点周りは退化? (スコア:0)
そもそも64ビットコンパイラではインラインアセンブラが使えないはずですが(gccは使えるのかな?)
GCCのばぁい(Re:浮動小数点周りは退化?) (スコア:1)
最低でもgcc3まではインラインアセンブラ有効です。
従って、PC U*ixベースで開発されているAV系のソフトでは、x86_64などのSIMD命令をインラインアセンブラで記述している(そしてcofigure段階でMPUを判別して関数レベルで最適なコード記述を選択している)ものが結構あります。
# 勿論、インラインアセンブラだけでなく、XviD [xvid.org]のように
# 独立したアセンブルソースで書いてある例も多々ありますが…
Re:浮動小数点周りは退化? (スコア:1)
そうです,過去に決別して,さぁ,
Welcome to EPIC world!(寂しいので誰か来て)
# x86をすっ飛ばして,Itaniumのアセンブラしか知らないから微妙に話についていけん.
Re:浮動小数点周りは退化? (スコア:1)
Calling conventions for different C++ compilers and operating systems (PDF) [agner.org] という文書では、MSDN の記述にある "context switches" とはタスク切り替えのことではなくて関数呼び出しのことを指しているのではないか、というようなことが書かれています。要するに MSDN のあの一文の意味は「関数呼び出しの前後で FP レジスタの値は保存されない」という意味ではないかという説。
確かに FXSAVE/FXRSTOR 命令を使えば、FP レジスタを含むすべてのレジスタを一括して保存できるので、タスク切り替えの前後で FP レジスタだけ保存されないというのもヘンな仕様だなぁとは思っていたのですが。
ハードウェアだから早いとは限らない・・・かも (スコア:1, 興味深い)
自分が設計しているボードに乗っている某MIPS系CPUではFPU内蔵しているのに、「ソフトのライブラリの方が高速」とかいってソフト屋さんは使ってくれていません。『ホントかな?』とは思うのですが。
#自分はハード屋です
Re:ハードウェアだから早いとは限らない・・・かも (スコア:1, 参考になる)
加算 - 5 clock
乗算 - 7 clock
除算(64bit) - 38 clock
sin 関数 - 160-180 clock
なので、ハードウェア演算に勝つには、最低でも除算を4回以下に抑える必要があるということになるけど、実際には、除算を使わない方法でないと勝てませんよね。
級数展開の式をループを使わずにそのまま書けば、除算を避けることが可能なので速いかも。
Re:ハードウェアだから早いとは限らない・・・かも (スコア:1)
ぴったりの関数がないとか、必要な精度がそんなに高くないとかいった場合は自前で書いたほうが速いというのは確かかと思います。
-- Takehiro TOMINAGA // may the source be with you!
Re:ハードウェアだから早いとは限らない・・・かも (スコア:1)
>自分が設計しているボードに乗っている某MIPS系CPUではFPU内蔵しているのに、「ソフトのライブラリの方が高速」とかいってソフト屋さんは使ってくれていません。
四則演算はさすがにFPUの方が速いと思います.その「ソフトのライブラリ」の中でFPUを使っているんじゃないですか?
Re:ハードウェアだから早いとは限らない・・・かも (スコア:0)
ほとんどのMIPS系のFPUはX86系のものより遅いですが、それでも普通はソフトウェアでやるより速いです。
参考までに、nbenchでは、
PentiumII400Mhz .......... 1.783 1.453 2.804
MIPS系400Mhz(FPU有り, 64bit bus, 2次cache) ... 1.399 1.512 1.115
MIPS系396