XMMレジスタが大活躍
abdev 9月 27th, 2005- Pentium
- MMX Pentium
- Pentium 2
- Pentium 3
- Pentium 4
- K6
- K6-2
- Athlon
- Athlon XP
突然ですが、このリストは皆さんご存知の32ビットCPUの仲間たちですね。色々な技術がてんこ盛りのことだと思いますが、ベースとなるものはx86。特殊命令を除けば、すべて互換性があります。
ところで、VC++やABなどのネイティブコンパイラは浮動少数演算を行うときにFPUという特別なレジスタを利用することになるんですが…。このFPUというものはx86系のCPU、即ち上記リストで示したようなCPUであれば搭載している機構なんです。とすると、FPUに対応するネイティブコードを生成してやれば、ほとんどの32ビットCPUで演算可能になってくるんですね。そういう意味で、昨今までのネイティブコンパイラはFPUを使いまくっておったんだと思います。
しかし、時代は64ビットCPUの世界へと塗り替えられていきます。
- Pentium 4 (6xx)
- Athlon 64
- Opteron
これらは登場して間もない64ビットCPUです(以下AMD64)。もちろん、AMD64もx86と同様にFPUレジスタは積んでいますし、それだけで十分に実数演算を行うことができます。しかし、よ〜く考えてみると、このFPUレジスタってやつはちょっと使いづらいんです。スタックベースだし、128ビットは使えないし(80ビットまで)、本数も8本だし…。まぁ、通常の用途であれば、こんなもんで事足りるんだと思います。
しかし、64ビットCPUは、64ビット演算をフルに行いながらそのポテンシャルを引き出していかなければ意味がありません。せっかく、汎用レジスタが64ビットになったんだから、double型演算なんてのもお手の物であってほしいものです。rdx:raxとレジスタを連結させ、128ビット整数型/128ビット浮動小数型なんてのも使いたいもんです。
そこで登場するのがSSE2です。SSE2は今現在リリースされている64ビットCPUすべてが対応しているハズです。っつーことは、64ビットネイティブコードからはFPUなんか使わなくても、SSE2に対応するコードを吐けば、AMD64上の話では互換性は十分に保てるということになります。
SSE2では、XMM0〜XMM15という16本の128ビットレジスタを利用できます。しかも、スタックベースではないんで、通常の汎用レジスタ感覚で利用することができます。しかもしかも、32ビット値を4つ同時に、64ビット値であれば2つ同時に扱うことができてしまいます。
いいことづくめで互換性もあるSSE2なんで、AMD64対応のネイティブコード、実数演算はこれで決まりですね。
こんな発見をしつつ、64コンパイラの開発は進みます・・・・・
9月 27th, 2005 at 13時34分02秒
それどころかWin64では64bitスレッド切り替え時にFPUレジスタの保存を行わないので実質64bitアプリケーションはFPUを使えないようです。(ただWin64上で32bitアプリケーションを動かしたときには問題ないそうです)CPUの問題ではなくWin64の仕様ですが。
9月 27th, 2005 at 17時57分54秒
それは初耳っす。マルチスレッドでFPUの中身がぐちゃぐちゃになってしまうんじゃ、廃止するくらいの勢いなんでしょうか。それにしても、64コンパイラを作っていると、過去の不合理な仕様が改善されているんだな〜と身にしみて感じます。関数の呼び出し規約やSSE2の標準搭載なんかがそうですな。64コンパイラに関するお役立ち情報、バンバンお待ちしておりますんで、よろしくですm(__)m
9月 28th, 2005 at 23時58分22秒
どうも、最近怠けすぎのtakです。http://msdn.microsoft.com/library/default.asp?url=/library/en-us/kmarch/hh/kmarch/64bitAMD_128662cf-fa29-443b-a61e-d9576e48c7f4.xml.aspこれの“Legacy Floating-Point Support”のことですね。ただ、“This is preliminary documentation and subject to change.”と但し書きしてあるのでひき続き注意が必要です。