FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

RISC-Vベクトル拡張仕様書 v1.0 を読み直す (19. 浮動小数点テーブルサーチ命令)

RISC-Vベクトル拡張仕様書の読み直し。浮動小数点で使用されるテーブルサーチ命令。 平方根と逆数について、7ビットまでテーブルによりサーチを行う命令。

github.com

github.com


13.9. ベクトル浮動小数点逆平方根推定命令

    # 7ビットの浮動小数点逆平方根推定命令
    vfrsqrt7.v vd, vs2, vm

これは,7ビットの精度で1/sqrt(x)の推定値を返す、単項のベクトル-ベクトル命令です。

Note: 以前のドラフト版では、アセンブラ名として vfrsqrte7 を使用していましたが、要素幅の `ex' 表記との混同を招くと判断されました。 後方互換性のために、ツールチェインのエイリアスとして以前の名前を残すことができます。

次の表は、すべてのクラスの浮動小数点入力に対するこの命令の動作を示しています。

Input Output Exceptions raised
-∞ ≤ x < -0.0 canonical NaN NV
-0.0 -∞ DZ
+0.0 +∞ DZ
+0.0 < x < +∞ estimate of 1/sqrt(x)
+∞ +0.0
qNaN canonical NaN
sNaN canonical NaN NV

すべての正のノーマルおよびサブノーマル入力は、ノーマル出力を生成します。

Note: 出力値は、動的丸め込みモードに依存しません。 例外的なケースでは、指数の下位ビットと合数の上位6ビット(先頭の1ビットの後)が連結され、以下のテーブルのアドレスに使用されます。 このテーブルの出力は、結果として得られる信号の上位7ビット(先頭の1ビットの後)となり、結果として得られる信号の残りの部分はゼロとなります。 正常でない入力は、ルックアップの前に正規化され、指数が適切に調整されます。 出力の指数は、結果が引数の平方根の逆数に近似するように選択されます。

より正確には、結果は以下のように計算されます。 正規化された入力指数を、入力が正常な場合は入力指数と等しく、そうでない場合は0から符号の先頭のゼロの数を引いた値とします。 入力が非正規の場合、正規化された入力指数は、先頭の1ビットを捨てて、入力指数を1から正規化された入力指数を引いて左にシフトすることで与えられます。 出力指数は floor*1 = 0x5f080000 (≈ 9.800e18)、 および vfrsqrt7(0x7f765432 (≈ 3.274e38)) = 0x1f820000 (≈ 5.506e-20)となります。 Note: 7ビットの精度は、0,1,2,3回のニュートンラフソン反復を必要とし、それぞれbfloat16, FP16, FP32, FP64に近い精度に収束するために選ばれました。 将来的には、より高い推定精度の命令を定義することができます。

13.10. ベクトル浮動小数点逆数推定命令

    # 7ビットの浮動小数点逆数推定命令
    vfrec7.v vd, vs2, vm

Note: 以前のドラフト版では、アセンブラ名として vfrece7 を使用していましたが、 要素の幅を表す ex 記法との混同を招くと判断されました。 以前の名前は後方互換性のためにツールチェインのエイリアスとして保持することができます。

これは単項のベクトル・ベクトル命令で、7ビットの精度で1/xの推定値を返します。

次の表は、すべてのクラスの浮動小数点入力に対するこの命令の動作を示しています(Bは指数バイアスです)。

Input (x) Rounding Mode Output (y ≈ 1/x) Exceptions raised
-∞ any -0.0
-2B+1 < x ≤ -2B (normal) any -2-(B+1) ≥ y > -2-B (subnormal, sig=01…)
-2B < x ≤ -2B-1 (normal) any -2-B ≥ y > -2-B+1 (subnormal, sig=1…)
-2B-1 < x ≤ -2-B+1 (normal) any -2-B+1 ≥ y > -2B-1 (normal)
-2-B+1 < x ≤ -2-B (subnormal, sig=1…) any -2B-1 ≥ y > -2B (normal)
-2-B < x ≤ -2-(B+1) (subnormal, sig=01…) any -2B ≥ y > -2B+1 (normal)
-2-(B+1) < x < -0.0 (subnormal, sig=00…) RUP, RTZ greatest-mag. negative finite value NX, OF
-2-(B+1) < x < -0.0 (subnormal, sig=00…) RDN, RNE, RMM -∞ NX, OF
-0.0 any -∞ DZ
+0.0 any +∞ DZ
+0.0 < x < 2-(B+1) (subnormal, sig=00…) RUP, RNE, RMM +∞ NX, OF
+0.0 < x < 2-(B+1) (subnormal, sig=00…) RDN, RTZ greatest finite value NX, OF
2-(B+1) ≤ x < 2-B (subnormal, sig=01…) any 2B+1 > y ≥ 2B (normal)
2-B ≤ x < 2-B+1 (subnormal, sig=1…) any 2B > y ≥ 2B-1 (normal)
2-B+1 ≤ x < 2B-1 (normal) any 2B-1 > y ≥ 2-B+1 (normal)
2B-1 ≤ x < 2B (normal) any 2-B+1 > y ≥ 2-B (subnormal, sig=1…)
2B ≤ x < 2B+1 (normal) any 2-B > y ≥ 2-(B+1) (subnormal, sig=01…)
+∞ any +0.0
qNaN any canonical NaN
sNaN any canonical NaN NV

大きさが少なくとも2-(B+1)のサブノーマル入力は通常の出力を生成し、他のサブノーマル入力は無限の出力を生成します。 少なくとも2B-1の大きさを持つ通常の入力は、サブノーマルの出力を生成し、他の通常の入力は通常の出力を生成します。

Note: 出力値は、オーバーフロー例外が発生したときの動的丸めモードに依存します。 例外が発生しないケースでは、上位7ビットの仮数部(先頭の1ビットの後)が次の表のアドレスに使用されます。 このテーブルの出力は、結果として得られる信号の上位7ビット(先頭の1ビットの後)となり、結果として得られる信号の残りの部分はゼロとなります。 正常でない入力は、ルックアップの前に正規化され、指数が適切に調整されます。 出力の指数は、結果が引数の逆数に近似するように選択され、サブノーマル出力はそれに応じて非正規化されます。

より正確には、結果は以下のように計算されます。 正規化された入力指数を、入力が正常な場合は入力指数と等しく、そうでない場合は0から符号の先頭のゼロの数を引いたものとします。 正規化された出力指数は、(2B - 1 - 正規化された入力指数)に等しくなります。 正規化された出力指数が[-1, 2B]の範囲外である場合、その結果は上の表の例外的なケースの1つに対応します。

入力が非正規の場合、正規化された入力多項式は、入力多項式を1から正規化された入力指数を引いて左にシフトし、先頭の1ビットを捨てて与えられます。 それ以外の場合は、正規化された入力信号は入力信号と同じです。 次の表は、正規化された入力信号の7つのMSBの関数として、正規化された出力信号の7つのMSBを示したもので、正規化された出力信号の他のビットはゼロです。

正規化された出力指数が0または-1の場合、結果はサブノーマル数となります。 出力指数は0で、出力の仮数部は正規化された出力仮数部の左にある1ビットを連結し、 その量を正規化された出力指数から1を引いて右にシフトしたものになります。 それ以外の場合は、出力指数は正規化された出力指数に等しく、出力合言葉は正規化された出力仮数部に等しくなります。 出力符号は入力符号に等しくなります。

Note: 例えば、SEW=32の場合、vfrec7(0x00718abc (≈ 1.043e-38)) = 0x7e900000 (≈ 9.570e37)、 およびvfrec7(0x7f765432 (≈ 3.274e38)) = 0x00214000 (≈ 3.053e-39)となります。

Note: 7ビットの精度は、bfloat16, FP16, FP32, FP64に近い精度に収束するために、0,1,2,3回のNewton-Raphson反復を必要とすることから選ばれました。 将来的には、より高い推定精度の命令を定義することができます。

*1:3*B - 1 - 正規化された入力指数) / 2) に等しくなります。 出力符号は入力符号に等しくなります。

次の表は、正規化された入力指数のLSBと正規化された入力記号の6つのMSBの関数として、出力記号の7つのMSBを示したもので、出力記号の他のビットはゼロです。

Note: 例えば,SEW=32の場合,vfrsqrt7(0x00718abc (≈ 1.043e-38