パフォーマンス最適化
rsshogi の最適化対象は、探索器が繰り返し呼ぶ局面表現、局面更新、利き計算、合法手生成のプリミティブである。
NPS は、rsshogi のプリミティブと利用側の探索条件を組み合わせた状態で測定する。
現行の低水準設計
Bitboard は 16 バイト整列の二つの u64 で 81 マスを表す。
x86_64 の SSE2 ビルドでは基本論理演算を 128 ビットで実行し、その他のビルドでは二ワードで同じ演算を行う。
飛び利きはビルド時生成の方向レイと占有から最寄り遮蔽駒までを抽出する。
AVX2 は角と飛の二方向レイを並列に処理する経路にだけ使われ、公開のビットボード型や API を増やさない。
固定長局面形式は 32 バイトのバッファを使い、局面データの格納・比較・復元を一定サイズで扱える。
測定の単位
最適化はまず正確性テストが通ることを前提にする。
ビットボードや飛び利きの変更は、全始点・遮蔽候補・疑似乱数占有をスカラー走査と比較するテストを保つ。
性能は変更前後で同じ Cargo profile、RUSTFLAGS、CPU 機能、入力局面、反復回数を使って比較する。
一回の短い測定ではなく、ばらつきとウォームアップを含めた複数回の結果で判断する。
ライブラリ内部の小さな時間差を NPS 改善と呼ぶには、実際の利用側で同じ局面・同じ探索設定の測定が必要である。
実務上の優先順位
最初にデータ構造とアルゴリズムの正しさを固定し、次にプロファイラで頻度と時間を確認する。
ホットパスでは、割り当て、繰り返す変換、同じ利きの再計算を減らす。
CPU 固有の intrinsic や新しい表引き方式は、同値フォールバックと測定上の優位がある場合に限る。
target-cpu=native は測定機専用のビルドに使い、配布物には対象 CPU に合う明示的な要件を設定する。
最適化の変更では、性能値、対象環境、正確性確認の三つを同じ記録に残す。
最初に測るもの
性能問題を見つけたら、最初にどの操作が何回呼ばれるかを確認する。
単発の関数が遅く見えても、探索全体でほとんど呼ばれなければ優先度は低い。
反対に、局面更新、利き、合法手生成のような操作は一局面あたりの差が小さくても累積する。
プロファイラで時間の比率を確認し、ホットパスを特定してから小さな計測用ベンチマークへ分解する。
計測用ベンチマークで原因を絞り、探索全体の測定で採否を決める。
比較実験の設計
比較する二つの実装以外の条件をそろえる。
少なくとも、ビルド profile、最適化フラグ、CPU 周波数条件、入力局面、反復回数、ウォームアップ、計時方法を固定する。
探索器で測るなら、探索深さや停止条件、スレッド数、定跡、評価関数、置換表の状態も固定する。
差が測定のばらつきと同程度なら、改善と断定せず、実験条件を変えずに繰り返す。
比較結果は中央値だけでなく、試行回数と分布または最小・最大を一緒に残す。
正確性ゲート
性能変更は、既存の正確性テストを通した後で測る。
飛び利きではスカラー走査との比較、局面更新では apply/undo の往復、手生成では既知局面の合法手集合が高信号のゲートになる。
高速経路だけを測って正確性ゲートを省略すると、候補手を欠落させた実装を改善と誤認する危険がある。
採用する変更は、公開 API の結果、局面不変条件、unsafe 契約を保ったうえで性能ゲートを通す。
データ局所性
ホットパスで頻繁に読む値は、必要なときに再計算するより、既にある局面キャッシュやビットボードを再利用できることがある。
ただしキャッシュは更新漏れという新しい不変条件を作るため、測定で再計算のコストが支配的だと確認してから加える。
構造体のサイズやフィールド順を変える最適化も、コピー量、キャッシュライン、借用関係、公開 ABI への影響を一緒に評価する。
アラインメントは SIMD データ境界を満たすために使い、効果は変更全体の測定で確認する。
よくある誤り
target-cpu=native の結果は、同じ CPU 要件を持つビルドの測定値として扱う。
CPU 固有命令を追加するときは、portable な代替経路と両方のテストを同時に維持する。
大きな表を導入するときは、計算量だけでなく初期化時間、バイナリサイズ、キャッシュ常駐量を測る。
手生成で候補を早く作れても、後続の合法性検査が増えれば探索全体では遅くなる。
最適化のレビューでは「速そう」に見える変更より、再現可能な測定と明確な正確性根拠を優先する。
変更記録の最小単位
一つの最適化変更には、対象関数または経路、比較対象、測定コマンド、環境、結果、正確性確認を残す。
結果が中立または悪化なら、その事実も残し、同じ前提の小変更を繰り返さない。
この記録は将来の実装者が、同じ測定を再現し、CPU や入力条件が変わったときだけ再評価できるようにする。