64ビットコンパイラのフローティングポイントサポート
-
27-09-2019 - |
質問
64ビットDelphiコンパイラのフローティングポイントサポートに何を期待すべきでしょうか?
64ビットコンパイラはSSEを使用して浮動小数点算術を実装しますか?
64ビットコンパイラは、現在の80ビットフローティングタイプ(拡張)をサポートしますか?
これらの質問は密接に関連しているので、私はそれらを単一の質問として尋ねます。
解決
double =拡張ビットの場合:
Allen BauerのTwitterアカウントKylix_rdを読む:
後知恵では、SSE2 REGは128ビットですが、2つの64ビットダブルとして使用されるためです。
他のヒント
私は主題に関する2つの投稿をしました(ここ と そこの)、要約すると、はい、64ビットコンパイラはSSE2(二重精度)を使用しますが、SSE(単一精度)を使用しません。すべてが二重精度のフロートに変換され、SSE2を使用して計算されます(編集: ただし、それを制御するオプションがあります)
これは、fiを意味し、二重精度のフロートの数学が高速である場合、単一の精度での数学が遅くなることを意味します(単一の精度と二重精度の間の冗長変換の多くがスローされます)、「拡張」は「二重」にエイリアスされ、中間計算精度は制限されます。精度を2倍にする。
編集: SSEコード生成を制御する文書化されていない(当時)指令がありました。 {$過剰予測オフ} SSEコード生成をアクティブにします。これは、期待の範囲内でパフォーマンスを取り戻します。
マルコ・ヴァン・デ・ボルトによると、彼の答え: 最終的な64ビットコンパイラのために32ビットDelphiプログラムを準備するにはどうすればよいですか:
X87 FPUはX64で非推奨され、一般にSSE2は植物栽培ポイントに使用されます。したがって、フローティングポイントとその例外処理はわずかに異なって動作する可能性があり、拡張は80ビットではない場合があります(しかし、64ビットまたは128ビットの可能性は低く)。これは、異なるFPUワードを期待するWIHT Cコードをインターフェースするときの通常の丸め(COPROコントロールワーク)の変更にも関連しています。
Phisはその答えについて次のようにコメントしました:
X87 FPUが非難されているとは言いませんが、Microsoftがそのようにするために最善を尽くすことを決めたのは確かです(そして、彼らは本当に80ビットのFP値を好まないようです) Win64でFPU/80ビットフロートを使用することは、技術的には明らかに可能です。
私はあなたの他の質問への答えを投稿しましたが、実際にここに行くべきだと思います:
明らかに、エルバカデロ以外の誰も、製品がリリースされる前に確かにこれに答えることができません。
まともなX64コンパイラは、SSE2命令セットをベースラインとして使用し、したがって、SSE機能を可能な限り多くのフローティングポイント計算を行い、X87 FPUの使用を最小限に抑える可能性が非常に高いです。ただし、X64アプリケーションコードでX87 FPUの使用を妨げる技術的な理由はないと言われるべきです(しばらく前から存在していた噂にもかかわらず、その点に関する詳細が必要な場合は、お願いします見て Agner Fogの呼び出しコンベンションマニュアル, 、具体的には、第6.1章「64ビットウィンドウで浮動小数点レジスタを使用できますか?」)。
編集1: :Delphi XE2 Win64は、実際には80ビットの浮動小数点計算をサポートしていません(例:DecussionUionを参照してください ここ (ただし、そのような値を読み取り/書き込むことができますが)。そのような機能をレコード +クラスオペレーターを使用してDelphi Win64に戻すことができます。 このTextendedX87タイプ (警告は適用されますが)。
64ビットのDelphiコンパイラが、Embarcaderoが実際にそれを出荷するまで、フローティングポイント算術をどのように実装するかはわかりません。それ以前は何でも憶測です。しかし、確かにわかったら、それについて何かをするには遅すぎるでしょう。
Allen Bauerのツイートは、SSE2を使用し、拡張タイプが80ビットではなく64ビットに減少する可能性があることを示しているようです。さまざまな理由から、それは悪い考えだと思います。 QualityCentralレポートで自分の考えを書きました 拡張は、64ビットプラットフォームで80ビットタイプのままである必要があります
64ビットDelphiに移動したときにコードを80ビットの精度から64ビット精度にドロップしたくない場合は、QualityCentralリンクをクリックしてレポートに投票してください。投票が多いほど、エンバカデロが聴く可能性が高くなります。 64ビットのフローティングポイントにSSE2を使用している場合、理にかなっている場合、FPUを使用して80ビットの浮動点を追加することは、Embarcaderoの追加作業になります。多くの開発者がそれを求めない限り、彼らがその仕事をするだろうとは思わない。
本当に必要な場合は、 TextendedX87ユニット に フィリップ・M・シュルター (SOのPhis)上記のように このembarcaderoフォーラムスレッド.
@Phis:私の情報で答えを更新するとき、私は私のものを削除します。