bench/bin_float の設計
設計目標
2 進スタックの各層のコストを、すべての層が同じ結果を出さなければならない入力上で個別に計測します。これにより、ある層の変更が報告される 1 つの百分率の変化として現れます。
数学的背景
あるデータセットについて、、、 をブロック におけるカーネル、コア、checked の各経路の呼び出しあたりの時間とします(カーネル経路のないケースは 2 番目の量のみを報告します)。報告される量は
すなわち、ある層のその下の層に対する相対的な中央値対応オーバーヘッドです。推定量、対応付け、ブートストラップ区間は bench の設計で導出されています。
設計上の判断
ワークロード
| ケース | データセット | 実装 | プロトコル |
|---|---|---|---|
bin-float/add, bin-float/mul, bin-float/div | 53、128、512、2048 ビット | kernel/coefficient(BinCoeff)、core/bin-float(BinFloat の演算子)、full/checked(BinFloatResult) | Development |
28 個の関数(exp、exp2、exp10、expm1、ln、log2、log10、log1p、sqrt、rootn、pow、hypot、sin、cos、tan、sinpi、cospi、tanpi、asin、acos、atan、atan2、sinh、cosh、tanh、asinh、acosh、atanh)に対する bin-float/elementary/OP | 53、128、512 ビットの精度 | core/bin-float(異常終了するメソッド)、full/checked(BinFloatResult) | Development |
bin-float/autotune/square | 32 ビットのリムを 4、8、16、…、1024 個 | BinCoeff に対する mul-self(x.mul(x))と square(x.square()) | RegressionGate |
算術演算の入力は最上位ビットと最下位ビットが立った固定ビットパターンです。精度はオペランドのビット長の和に 4 を加えたもので、div の被除数は 2 つのパターンの積です。したがってすべての結果は厳密であり、すべての経路が同じ数を計算します。初等関数の入力はデータセットの精度での 1.25、0.5、0.25 で、それぞれ使用される関数の定義域内にあります。平方の入力は指定されたリム数のパターンです。この実験ではサイズごとに 2 つの等価なアルゴリズムのうち速い方を選び、交差するサイズを報告します。
正しさのオラクル
算術演算の出力は厳密な BinCoeff の結果と、初等関数の出力はコアの結果と(したがって checked 経路はコアと一致しなければなりません)、平方の出力は x.square() と照合されます。オラクルと一致しない出力は失敗として数えられ、性能テストは失敗がないことを表明します。したがって、異なるものを計算する経路同士を比較することはありません。
厳密な入力
結果が厳密なので、算術演算の作業量は経路間で同一になります。早く丸めることで勝てる経路はなく、計測される差は表現、コンテキスト処理、検査のコストです。
正しさ/不変条件
- プランテストは通常のテスト実行ですべての仕様をコンパイルするため、ベンチマークが気づかれないまま壊れることはありません。
- 性能テストは
failed_count == 0を表明します。すべての出力がオラクルと一致したということです。 - シードは固定(
20260715)されているため、計測順序とブートストラップの再標本は再現可能です。
却下した代替案
- サンプルごとのランダム入力。 入力の分散が計時の分散に混ざってしまいます。データセットごとに固定パターンを使えば、コードのコストを分離できます。
- エンドツーエンドの計時のみ。 単一の数値では、リグレッションがカーネル、コア、checked ラッパーのどこにあるのか判別できません。
境界
- native ターゲットのみ。他のターゲットについての主張はしません。
- 公開 API はありません。このパッケージは
tools/benchmark.pyのために存在します。 - 計測は性能ページの根拠であり、正しさの根拠には決してなりません。