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))