5

私はこのページに出くわし、奇妙な浮動乗算加算 関数があることに気付きました-fmaそしてfmaf。結果は次のようになります。

 (x * y) + z             #fma(x,y,z)

また、値は無限の精度であり、結果形式に1回丸められます

しかし、AFAICT私はこれまでそのような三項演算を見たことがありません。だから私はこの関数のcumstom使用法は何であるか疑問に思っています。

4

2 に答える 2

17

融合乗算加算命令の重要な側面は、中間結果の (事実上) 無限の精度です。これはパフォーマンスに役立ちますが、2 つの演算が 1 つの命令でエンコードされるため、それほどではありません — 中間結果の事実上無限の精度が重要な場合があり、通常の乗算​​と加算で回復するには非常にコストがかかるため、パフォーマンスに役立ちます。正確さはプログラマーが求めているものです。

a * b例:との比較1.0

アルゴリズムにとって、2 つの倍精度数aとの積がbゼロ以外の定数 ( を使用します1.0) に対してどこにあるかを判断することが重要であるとします。数値ab両方には、2 進数の完全な有意桁があります。a*bとして計算するdoubleと、結果は になる可能性があります1.0が、実際の数学的積が 1.0 をわずかに下回り、正確に 1.0 に切り上げられたのか、1.0 をわずかに上回って切り捨てられたのかはわかりません。FMA を使用しない場合のオプションは次のとおりです。

  1. a*b4 倍精度の数値として計算します。4 倍精度はハードウェアに実装されていませんが、ソフトウェア エミュレーション ライブラリがあります。4 倍精度では、積の数学的結果は正確に表現可能であり、それを 1.0 と比較できます。

  2. a*b切り上げモードと切り下げモードで倍精度で計算します。両方の結果が 1.0 の場合、a*b正確に 1.0 であることを意味します。RU(a * b) が 1.0 より大きい場合は、数学的積が 1.0 より大きいことを意味し、RD(a * b) が 1.0 未満の場合、数学的積が 1.0 より小さいことを意味します。ほとんどのプロセッサでは、このアプローチは丸めモードを 3 回変更することを意味し、変更ごとにコストがかかります (CPU パイプラインのフラッシュが必要になります)。

FMA 命令を使用すると、結果を計算fma(a, b, -1.0)して 0.0 と比較できます。浮動小数点数は 0 付近で密度が高くなり、中間積は計算で丸められないため、 と の数学的積が 1 より大きいことを意味することなどを確認できfma(a, b, -1.0) > 0ます。ab

例: Veltkamp/Dekker 乗算

double-double形式は、2 つの倍精度浮動小数点数の合計として数値を効率的に表現します。4 倍精度とほぼ同じ精度ですが、既存の倍精度ハードウェアを利用します。

Mul12(a, b)2 つの倍精度数を取り、aそれらbの積を double-double 数として計算する次の関数 を考えます。アルゴリズムは、Veltkamp と Dekker によるもので、この関数を倍精度の加算と乗算のみで計算します (参照)。6 回の乗算 (1 回は各アルゴリズムの一部でSplit()あり、アルゴリズムの本体では 4 回) と多くの加算が必要です。

FMA 命令が使用可能な場合、1 つの乗算と 1 つの FMA の2 つのMul12演算として実装できます。

high = a * b; /* double-precision approximation of the real product */
low = fma(a, b, -high); /* remainder of the real product */
/* now the real product of a and b is available as the sum of high and low */

その他の例

乗算と加算を行う命令としてだけでなく、その精度のために FMA が使用される例としては、平方根と除算の計算があります。これらの演算は、IEEE 754 標準に従って (数学的な結果の最も近い浮動小数点数に) 正しく丸める必要があります。これら 2 つの操作は、ハードウェア FMA 命令が使用可能な場合に効率的に実装できます。この側面は通常、コンパイル チェーンによって隠されていますが、IA-64 命令セット (Itanium) には除算の命令がありませんでした。代わりに、FMA を含む一連の命令 (通常はコンパイラによって生成される) によって、正しく丸められた除算を取得できます。

于 2013-08-14T18:44:22.957 に答える
2

通常、最適化として使用されます。ほとんどの浮動小数点ユニットにはfma命令があるため、2 つ以上の命令ではなく、1 つの命令で計算を実行できます。したがって、パフォーマンスが重要な浮動小数点コードの場合、これは便利な機能です。

于 2012-11-08T15:27:29.427 に答える