浮動小数点10進数のハードウェアが浮動小数点2進数のように高速化されないのはなぜですか?

StackOverflow https://stackoverflow.com/questions/1447215

  •  22-07-2019
  •  | 
  •  

質問

ハードウェアに実装する価値はありますか?はいの場合、なぜですか?そうでない場合はなぜですか?


申し訳ありませんが、10進数の有理数について話しているのは明らかです! OK、 decNumber ++ decimal for .NET ...明確になったことを願っています: )

役に立ちましたか?

解決

IEEE 754:2008 標準の最新リビジョンは、実際にハードウェア10進浮動小数点を定義しています質問で参照されているソフトウェアに表示されている表現を使用したポイント番号。標準の以前のバージョン( IEEE 754:1985 )は、10進浮動小数点数を提供していませんでした。現在のほとんどのハードウェアは、2008年標準ではなく1985年標準を実装していますが、 Power6 チップにはそのようなサポートがあり、 z10 メインフレーム。

10進浮動小数点の標準化の取り組みは、 Webサイトを持つIBM UKのMike Cowlishawが主導しました。有用な情報でいっぱい(問題のソフトウェアを含む)。やがて、他のハードウェアメーカーも自社のチップに10進浮動小数点ユニットを導入する可能性がありますが、Intelがいつ追加するか(またはできないか)についての指示の声明は聞いていません。 Intelは、ソフトウェアライブラリを最適化しています。それ。

C標準委員会は、10進浮動小数点のサポートを追加しようとしています。その作業はTR 24732です。

他のヒント

一部のIBMプロセッサーには、専用の10進ハードウェアが含まれています(10進浮動小数点| DFP-ユニット)。

の貢献で 9月18日23:43に回答 ダニエル・プライデン

主な理由は、DFPユニットがチップ内でBFPユニットよりも多くのトランジスタを必要とすることです。その理由は、バイナリ環境で10進数を計算するBCDコードです。 IEEE754-2008には、過負荷を最小限に抑えるいくつかの方法があります。 DPD hxxp://en.wikipedia.org/wiki/Densely_packed_decimalメソッドは、BID hxxp://en.wikipedia.org/wiki/Binary_Integer_Decimalメソッドと比較してより効果的であるようです。

通常、0〜9の10進数の範囲をカバーするには4ビットが必要です。10〜15ビットは無効ですが、BCDでも可能です。 したがって、DPDは3 * 4 = 12ビットを10ビットに圧縮して、1024(10 ^ 2)の可能性で000から999の範囲をカバーします。

一般的に言うと、BFPはDFPよりも高速です。 また、BFPでは、DFPよりもチップ上のスペースが少なくて済みます。

IBMがなぜDFPユニットを実装したのかという質問に対する答えは非常に簡単です。 金融市場向けのサーバーを構築します。データがお金を表す場合、信頼できるはずです。

ハードウェアアクセラレーションされた10進数演算では、一部のエラーはバイナリのように発生しません。 1/5 = 0.2 => 0.0110011001100110011001100110 ...バイナリであるため、繰り返し小数部を回避できます。

そして、Excelの圧倒的なround()関数はもう使い物になりません:D (-> function = 1 *(0,5-0,4-0,1)wtf!)

あなたの質問を少し説明して欲しいです!

(わずかな)10進数の文字列加速がありますが、...

これは良い質問です。私の最初の反応は「マクロ操作は常に証明に失敗しました」でしたが、それについて考えた後、あなたが話していることは機能ユニットに実装された場合、はるかに速くなります。それは、これらの操作が問題に対処するのに十分であるかどうかにかかっていると思います。マクロ操作とアプリケーション固有の特別な目的の命令のかなり残念な歴史があります。特に、10進数の金融形式での古い試みは、今では単なる手荷物に過ぎません。たとえば、使用頻度が高いとは思えませんが、すべてのPCに Intel BCDオペコードがあり、で構成されています

DAA, AAA, AAD, AAM, DAS, AAS

かつて、10進文字列命令はハイエンドハードウェアで一般的でした。彼らがこれまでに多くのベンチマークの違いを作ったことは明らかではありません。プログラムは、物事のテスト、分岐、移動、アドレスの計算に多くの時間を費やします。 CPUに最小限の基本的な操作を与えると全体的な処理が速くなるように見えるため、通常はマクロ操作を命令セットアーキテクチャに入れることは意味がありません。可能な限り高速。

最近、すべてのバイナリopsでさえ実際には real ISAにあるわけではありません。 CPUは、実行時にレガシーISAを micro-ops に変換します。コアオペレーションに特化することで、すべてが高速化の一部です。今のところ、残ったトランジスターはいくつかのグラフィックスと3D作業、つまりMMX、SSE、3DNowを待っているようです!

クリーンシートデザインは、何か急進的なことをして、現在の(HW)科学的および(SW)10進浮動小数点形式を統一する可能性があると思いますが、息を止めないでください。

いいえ、非常にメモリ効率が悪いです。また、計算は実装が容易ではないハードウェアでも行われます(もちろん、実行できますが、多くの時間を費やすこともできます)。 10進形式のもう1つの欠点は、バイナリ形式の数値が形式がしばらくの間人気があったことを調査が示す前に、広く使用されていないことです。しかし、今ではプログラマーの方がよく知っています。 10進数形式は効率的ではなく、損失が大きくなります。また、追加のハードウェア表現には、追加の命令セットが必要であり、より困難なコードにつながる可能性があります。

使用するハードウェアはかなり一般的でした。

古いCPUにはハードウェアBCD(Binarayコード化10進数)演算がありました。 (以前のポスターで指摘されているように、小さなIntelチップは少しサポートされていました)

ハードウェアBCDは、数値に80ビットBCDを使用するFORTRANの高速化に非常に優れていました。

科学計算は、世界市場のかなりの割合を占めていました。

全員が(比較的言えば)自宅のPCでWindowsを実行しているため、市場は小さくなりました 割合として。だから誰ももうやらない。

ほとんどの場合、64ビットの倍精度(バイナリ浮動小数点)を使用してもかまいませんので、ほとんどの場合は機能します。

最新のハードウェアベクトルユニットで128ビットバイナリ浮動小数点を使用する場合、それは悪くありません。それでも80ビットBCDよりも精度は劣りますが、それが得られます。

以前の仕事で、以前はJPLだった同僚が、まだFORTRANを使用していることに驚きました。 " CとC ++に変換しました。精度不足の問題をどのように解決したかを彼に尋ねました。彼らは気づかなかった。 (彼らは以前と同じ宇宙探査機の着陸精度も持っていません。しかし、誰でも惑星を見逃すことができます。)

したがって、基本的にベクトル単位の128ビットの倍精度はより大丈夫で、広く利用可能です。

私の20セント。浮動小数点数として表現しないでください:)

10進浮動小数点標準(IEEE 754-2008)は、2社によって既にハードウェアに実装されています。 IBM のPOWER 6/7ベースのサーバー、および SilMinds SilAx PCIeベースのアクセラレーションカード。

SilMinds は、ハードウェアソリューション。時間の大幅な増加とエネルギー消費量の削減が示されています。

さらに、「Michael J. Schulte」による複数の出版物。その他は、非常にポジティブなベンチマーク結果を示し、DPDとBID形式の比較(両方ともIEEE 754-2008標準で定義されています)

次のPDFを見つけることができます。

  1. 10進浮動小数点ライブラリのパフォーマンス分析と、10進ハードウェアおよびソフトウェアソリューションへの影響

  2. 小数演算用のハードウェア設計の調査

  3. 10進浮動小数点ユニットによるエネルギーと遅延の改善

これらの3つの論文は、あなたの質問に十分すぎるほどです!

10進数の計算集中型のアプリケーションはないと推測します。一方、浮動小数点数はエンジニアリングアプリケーションで広く使用されており、膨大な量のデータを処理する必要があり、正確な結果を必要とせず、必要な精度内に留まる必要があります。

10進数(より一般的には小数)は、整数のペアとして比較的簡単に実装できます。汎用ライブラリはどこにでもあり、ほとんどのアプリケーションで簡単に十分に高速です。

究極の速度が必要な人は、実装を手動で調整します(たとえば、特定の使用法に合わせて除数を変更したり、操作を代数的に結合/並べ替えたり、SIMDシャッフルを巧妙に使用したりします)。最も一般的な機能をハードウェアISAにエンコードするだけでは、確実にそれらを満足させることはありません。おそらく、まったく役に立たないでしょう。

簡単な答えは、コンピューターはバイナリマシンであるということです。指は10本ではなく、2本です。したがって、2進数用のハードウェアの構築は、10進数用のハードウェアの構築よりもかなり速く、簡単で、効率的です。

ところで、10進数と2進数は基数ですが、固定小数点と浮動小数点は有理数を近似するメカニズムです。 2つは完全に直交しています:浮動小数点の10進数(.NETのSystem.Decimalはこの方法で実装されます)と固定小数点の2進数(通常の整数はこの特殊なケースです)を持つことができます。

浮動小数点演算は、本質的にハードウェアで小数を実装しようとする試みです。これは面倒です。だからこそ、10進型が部分的にソフトウェアで作成されるのです。 CPUがより多くのタイプをサポートしない理由は良い質問ですが、CISC対RISCプロセッサに戻ると思います-RISCはパフォーマンスの戦いに勝ったので、最近は物事をシンプルにしようとしています。

現代のコンピューターは通常、汎用です。浮動小数点演算は非常に一般的な目的ですが、Decimalははるかに具体的な目的を持っています。それが理由の一部だと思います。

典型的な数値積分タイプ" int"、" long"、" short" (等。)?これらのタイプの操作はハードウェアで確実に実装されるためです。任意の精度の大きな数(「BigNums」や「Decimals」など)について話している場合、これらのデータ型を使用する操作の希少性と、任意の大きなデータ形式を処理するためのハードウェア構築の複雑さの組み合わせである可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top