10

異なるx86CPU(組み込みのFPUを備え、かなり最近、たとえばこのミレニアムを起動した)は、比較対象のCPUで同じ命令が使用可能であり、同じ入力で同じ動作パラメーターを使用していると仮定して、浮動小数点プリミティブに対してまったく同じ結果を生成します。丸めモード?私はタイミングの違いにも、Pentium FDIVバグ(その事件が古くからあるという理由だけで資格がない)にも興味がありません。

加算、減算、否定、および整数への丸めについては、答えは「はい」だと思います。これらには正確な定義があり、実装の相違がどのようなものであるかはほとんど想像できません(オーバーフローの検出におけるバグの可能性はほとんどありません)。アンダーフローですが、それは一部のアプリケーションでは災害になるので、これはずっと前に捕らえられて修正されていたと思います)。

乗算は、実装が異なる可能性が高いようです。2つのDPFPNの積の(たとえば)最も近い表現可能な倍精度浮動小数点数(64ビット、仮数の52 + 1を含む)を決定するには、仮数の積を(約)104ビット精度。これは、数LSBの場合、おそらく労力の無駄です。これも試みられ、正しく行われたのだろうか。それとも、IEEE-754、またはいくつかのデファクトスタンダードが何かを規定していますか?

分割はさらに繊細に見えます。

そして、一般的な設計を除いて、使用できるさまざまな数学的方法を考えると、はるかに複雑なもの(三角関数、ログなど)のすべての実装が正確に同期できるとは思えません。

私は純粋な騒々しさの組み合わせからそれを求めています。私の答えを改善する意欲; また、VMで実行されているプログラムが、実行されているふりをしているCPUと実際のCPUとの間の不一致を検出できるようにする方法が必要です。

4

2 に答える 2

13

アセンブリレベルでは、基本的な浮動小数点命令(加算、減算、乗算、除算、平方根、FMA、丸め)は、IEEE754標準で説明されているように、常に同じ結果を生成します。異なるアーキテクチャで異なる結果を生成する可能性のある命令には、超越演算を計算するための複雑なFPU命令(FSIN、FCOS、F2XM1など)と近似SSE命令(近似逆数を計算するためのRCPSS / RCPPS、およびRSQRTSS、RSQRTPS)の2種類があります。おおよその逆数平方根を計算するため)。超越的なx87FPU操作はマイクロコードで実装され、AMDK5を除くすべてのIntelおよびAMDCPUは同じマイクロコードを使用するため、検出に使用することはできません。これは、VIA、Cyrix、Transmeta、およびその他の古いCPUの検出にのみ役立つ可能性がありますが、それらを考慮することは非常にまれです。おおよそのSSE命令は、IntelとAMDで異なる方法で実装されます。また、AFAIKでは、古い(K8より前の)AMDCPUと新しいAMDCPUでの実装にいくつかの違いがあります。その違いを利用して、IntelのふりをしているAMD CPUを検出することも、その逆も可能ですが、それは限られたユースケースです。

于 2012-10-27T17:25:24.650 に答える
2

正誤表で非常によく文書化されている極端な場合を除いて、すべてのIA-32命令はプロセッサ間で同じように動作します。

もちろん、明らかな例外は、CPUIDMSRアクセスです。

明らかな例外ではないのは、さまざまな論理、整数、および浮動小数点演算です。Maratyszczaが彼の答えに書いたように、より複雑な操作の多くはマイクロコードによって計算されます。このマイクロコードは、マイクロアーキテクチャが異なるプロセッサ間で大きく異なる可能性がありますが、結果は同じであることが保証されています。Intelは、その1つとして(他のx86開発者の直接の知識はありません)、プロセッサ間の下位互換性を確保するために膨大なリソースを投資し、「バグ」(バグを新しい仕様に変更する)の動作を再現します。

VMX(仮想化)とSMM(システム管理)のようにアーキテクチャの動作が異なる場合、制御構造にはリビジョンIDが含まれます。同じリビジョンIDを使用するすべてのプロセッサは、これらのアーキテクチャに関して同じように動作することが保証されています。

元の質問に答えるために、 IEEE 754によると、FP操作はx87、SSE、AVXのいずれであっても、すべてのプロセッサで同じ結果になります。

于 2012-10-27T17:49:47.117 に答える