PLDI '21論文読み会: High Performance Correctly Rounded Math Libraries for 32-bit Floating Point Representations
by
Idein
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
High Performance Correctly Rounded Math Libraries for 32-bit Floating Point Representations PLDI2021読み会@Idein 2021/09/24 藤井裕也
Slide 2
Slide 2 text
概要 ● 正しく丸められた32bitの数学ライブラリを実装する ○ 正しく丸められた、とは ■ 正しい実数から32bitに丸めた値のこと ○ よく使われているライブラリには誤った出力がある ○ 正確なライブラリもあるが性能が低い ● 著者らの16bit版のライブラリが存在する ○ 32bitにそのまま適用するにはいくつか課題がある ● この論文では16bit版の手法を改良して32bit版を実装する ○ floatとposit32の両方 ■ posit32: 0付近の精度が高いような浮動小数点の規格
Slide 3
Slide 3 text
先行研究の問題点 ● mini-max approach ○ すべての入力に対する誤差のうち、最大の誤差を最小化する ○ 誤差発生ポイントがいくつかある ■ range reduction ■ output compensation ■ 多項式の評価 ● RLIBM ○ 16bit版の著者らの実装 ○ 上記の誤差発生ポイントを抑えて、結果的に誤差がないようにしている ○ 線形計画問題にしてLP solverで解いている ■ 32bitだと制約の数が多すぎる
Slide 4
Slide 4 text
論文のキモ ● 16bit版の手法を改良して、LP solverで解けるようにする ● いろんな手段でLPの制約の数を減らしていく ○ counterexample guided polynomial generation ○ piecewise polynominal ○ range reductionの改良
Slide 5
Slide 5 text
改良点1: counterexample guided polynomial generation ● 入力を全部試さず、サンプリングする ● サンプリングした入力でLPを解いて多項式を生成して、全入 力をテスト ● テストに落ちる入力があればサンプルに加えてLPを解く...を 繰り返し
Slide 6
Slide 6 text
改良点2: piecewise polynomials ● 入力をsub-domainに分割して、各sub-domainに対して個別 の多項式を生成 ● 入力の範囲とそれに対応する多項式を表で持っておく
Slide 7
Slide 7 text
改良点3: range reductionの改良 ● 実装する数学関数の特性を使う ○ そのため、関数ごとに別の方法を考えなければならない ● 論文中ではsinの例で説明している ○ 他の例は別論文になっているらしい
Slide 8
Slide 8 text
sin(𝛑x)の例 ● 32bit = 40億通り以上の入力 ● 32bit floatではsin(𝛑x)は以下の3つの範囲に分けられる ● 一番上のパターンだけで8億通り近くあるので、range reductionを使う
Slide 9
Slide 9 text
sin(𝛑x)の例 range reduction (1/2) ● sinの三角関数や周期関数の特性を使って考慮すべき入力を 減らす ● ○ ○ J = K + L (Kは整数部分、Lは小数部分) ● [0.5, 1)は[0, 0.5)の鏡像なので、入力は[0,0.5)だけ考えれば 良い ● これでもまだ1億8400万通りくらい入力がある
Slide 10
Slide 10 text
sin(𝛑x)の例 range reduction (2/2) ● ○ L’ = N/512 + R ● sinpi(N/512)とcospi(N/512)は事前に計算しておく ● ● 入力は0から1/512の範囲まで減らせたが、cosも必要になっ た
Slide 11
Slide 11 text
sin(𝛑x)の例 多項式の生成 (1/5) 1. 正しいライブラリを使って、各入力に対する正解値を求める 2. range reductionの結果狭くなった入力Rに対する正解値を求 める 3. 入力をsub-domainに分割する 4. 各sub-domainに対する多項式を生成する
Slide 12
Slide 12 text
sin(𝛑x)の例 多項式の生成 (2/5) ● 正しいライブラリを使って、各入力に対する正解値の範囲を 求める ○ rounding intervalと呼んでいる ● まず32bitでの正解値を求める ● doubleの精度で、丸めると正解値になる上限と下限を求める
Slide 13
Slide 13 text
sin(𝛑x)の例 多項式の生成 (3/5) ● range reductionの結果の入力Rに対する正解値を求める ● 範囲は狭まったが、sinpi(R)とcospi(R) (R ∈[0,1/512)) が必 要になった ● 32bitで正しい結果になるsinpi(R)とcospi(R)を求める ○ sinpi(R)とcospi(R)の結果が32bitで正しいことは不十分 ○ sinpi(R)とcospi(R)を使った結果の式が32bitで正しい必要がある
Slide 14
Slide 14 text
sin(𝛑x)の例 多項式の生成 (4/5) ● 入力をsub-domainに分割する ○ 入力を減らしたとはいえ、まだ1億1千万通りもある ○ ビットパターンで入力を分割する ● sub-domainのインデックスのbitはMSBから始めない ○ 事前に範囲を絞ったので、R=0以外の入力は左から6bit分共通している
Slide 15
Slide 15 text
sin(𝛑x)の例 多項式の生成 (5/5) ● 各sub-domainに対する多項式を生成する 1. 入力をいくつかサンプルしてLP solverで解く 2. 得られた多項式でsub-domainの入力全部をテストする 3. 正しくない答えになった入力があれば、サンプルに加えて1に 戻る
Slide 16
Slide 16 text
精度の評価 (32bit float)
Slide 17
Slide 17 text
精度の評価 (posit32) ● posit32向けのライブラリは無いが、精度が良い0付近でも doubleと同じ ● doubleのライブラリと比較
Slide 18
Slide 18 text
多項式生成にかかった時間 (float) 2.10GHz Intel Xeon Gold 6230Rで実行
Slide 19
Slide 19 text
多項式生成にかかった時間 (posit32)
Slide 20
Slide 20 text
実行時間の評価 ● 平均してglibcの1.1倍、intelの1.5倍速い ○ ベクトル化するとintelのライブラリのほうが速くなるが誤差がすごい増えるらし い
Slide 21
Slide 21 text
まとめ ● 32bitの数学ライブラリを作成した ○ 正確に丸められている ○ 既存のライブラリより高速に動作する ○ posit32向けのライブラリは初