perf_support API
Luna-Flow/linear-algebra/perf_support はベンチマークサブシステムの共有ライブラリです。ベンチマークケースのレジストリを持ち、入力フィクスチャを読み込むか再生成し、@mutable の入力を準備し、ケースを 1 つ実行して結果のチェックサムを返します。perf と perf_runner はこの上に構築されています。
ソース: src/perf_support。ベンチマークの方法は perf_support の設計 と bench/README.md で説明しています。
型
Case
Case は 1 つのベンチマークケースのメタデータです。
pub struct Case {
id : String
operation : String
family : String
workload_tier : String
structure : String
timing_scope : String
input_layout : String
mutation_policy : String
size_tier : String
cost_model : String
rows : Int
cols : Int
rhs_cols : Int
}
operation は mul、mul_vec、determinant、inverse、rank、reduce_row_elimination、cholesky_decomposition、eigen、power_method のいずれかです。その他の文字列フィールドはワークロードを分類し(たとえば structure = "dense"、mutation_policy = "reusable_input" または "scratch_per_sample")、レポートで結果を要因ごとにまとめられるようにします。
PreparedCase
PreparedCase は、入力を @mutable の値に読み込んだケースです。
pub struct PreparedCase {
case_item : Case
matrix_a : @mutable.Matrix[Double]
matrix_b : @mutable.Matrix[Double]
vector_b : @mutable.Vector[Double]
}
レジストリ
cases
cases は登録済みの全ケースのリストで、bench/datasets/manifest.json から生成されます。
pub let cases : Array[Case]
dataset_version
dataset_version はフィクスチャ形式を示します。バージョンが異なるフィクスチャファイルは拒否されます。
pub let dataset_version : String
case_names, sample_case_names
case_names() はすべてのケース ID を返します。sample_case_names() は操作ごとに代表的なベースラインケースを 1 つずつ、中程度のサイズを優先して返します。
pub fn case_names() -> Array[String]
pub fn sample_case_names() -> Array[String]
find_case, find_prepared_case
ID でケースを検索し、必要に応じて入力を準備します。
pub fn find_case(String) -> Case?
pub fn find_prepared_case(String) -> PreparedCase?
準備
prepare_case, prepare_case_from_fixture
prepare_case(c) は bench/datasets/cases/<id>.json を読み込み、prepare_case_from_fixture(c, path) は指定されたファイルを読み込みます。
pub fn prepare_case(Case) -> PreparedCase
pub fn prepare_case_from_fixture(Case, String) -> PreparedCase
フィクスチャファイルがない場合は、ケースのシードから決定的に再生成してそのパスに書き込みます。バージョン、ID、メタデータ、形状のいずれかがケースと一致しないフィクスチャはプログラムを中断させます。
clone_prepared_case
clone_prepared_case(p) は、入力を変更するケースのために入力をディープコピーします。
pub fn clone_prepared_case(PreparedCase) -> PreparedCase
実行
run_prepared_case_inplace
run_prepared_case_inplace(p, scratch) はケースの操作を 1 回実行し、その結果のチェックサムを返します。scratch = true の場合は先に入力をコピーします。
pub fn run_prepared_case_inplace(PreparedCase, Bool) -> UInt64
各操作は検査なしの @mutable メソッド(unchecked_matmul、unchecked_determinant など)を呼び出します。power_method は 80 回の反復で実行します。None の結果は固定の番兵チェックサムに対応付けられます。
run_prepared_case_once, run_case_once
run_prepared_case_once(p) はケース自身の変更ポリシーに従って scratch を選びます。run_case_once(c) は既定のフィクスチャパスから準備して実行します。
pub fn run_prepared_case_once(PreparedCase) -> UInt64
pub fn run_case_once(Case) -> UInt64
case_diagnostic_payload
case_diagnostic_payload(c, checksum) は、ケースのメタデータとチェックサムを含む 1 行の JSON レコードを出力します。レポート用スクリプトが使います。
pub fn case_diagnostic_payload(Case, UInt64) -> String
例
let c = @perf_support.find_case("mul_baseline_dense_64").unwrap()
let checksum = @perf_support.run_case_once(c)
println(@perf_support.case_diagnostic_payload(c, checksum))