yaneurao / YaneuraOu

YaneuraOu is the World's Strongest Shogi engine(AI player) , WCSC29 1st winner , educational and USI compliant engine.
GNU General Public License v3.0
524 stars 140 forks source link

file_ofでテーブルを使わず、直接計算するように変更した #282

Closed KazApps closed 3 months ago

KazApps commented 3 months ago

改善点

file_ofでテーブルを使っていたところを乗算とシフトを使ったコードに変更したところ、Windows 11 + Zen 4 + clang 18では約3%の速度の向上が確認されました。ただし、これらの変更が他の環境でも同様の改善をもたらすかは確認できていないため、他の環境でもテストすることを推奨します。 なお、rank_ofはおそらくテーブルを使う方が早そうです。

変更点

以下のコードに変更しました。

// 与えられたSquareに対応する筋を返す。
constexpr File file_of(Square sq) { return (File)(sq * 115 >> 10); }

ベンチマーク

Windows 11 + R9-7945HX + RAM 32GBでのベンチマークの結果は以下の通りです。

変更前

Run  1: 28417182 nps
Run  2: 27780337 nps
Run  3: 28288643 nps
Run  4: 27709807 nps
Run  5: 27816678 nps
Run  6: 28180029 nps
Run  7: 28081823 nps
Run  8: 27698790 nps
Run  9: 28429205 nps
Run 10: 27552542 nps
Run 11: 27769954 nps
Run 12: 27718466 nps
Run 13: 28515207 nps
Run 14: 27776185 nps
Run 15: 28099695 nps
Run 16: 28624989 nps
Run 17: 27885181 nps
Run 18: 28434381 nps
Run 19: 28425748 nps
Run 20: 28159045 nps
-------------------------------------
Average nps over 20 runs: 28068194.3

変更後

Run  1: 30170188 nps
Run  2: 29096692 nps
Run  3: 29383185 nps
Run  4: 28427591 nps
Run  5: 29368491 nps
Run  6: 28492944 nps
Run  7: 28379802 nps
Run  8: 28394261 nps
Run  9: 29401226 nps
Run 10: 28870111 nps
Run 11: 28261435 nps
Run 12: 28893957 nps
Run 13: 29029794 nps
Run 14: 28898665 nps
Run 15: 28116279 nps
Run 16: 29309663 nps
Run 17: 29509273 nps
Run 18: 28191600 nps
Run 19: 29052729 nps
Run 20: 28280156 nps
-------------------------------------
Average nps over 20 runs: 28876402.1

rank_ofもテーブルを使わない実装にした場合

Run  1: 28395492 nps
Run  2: 28000165 nps
Run  3: 29850071 nps
Run  4: 29103396 nps
Run  5: 28263798 nps
Run  6: 28778338 nps
Run  7: 28079633 nps
Run  8: 28748382 nps
Run  9: 28738726 nps
Run 10: 28532690 nps
Run 11: 28483010 nps
Run 12: 28048906 nps
Run 13: 28467038 nps
Run 14: 28114889 nps
Run 15: 28676582 nps
Run 16: 28779106 nps
Run 17: 28733463 nps
Run 18: 27992675 nps
Run 19: 28129794 nps
Run 20: 28624714 nps
-------------------------------------
Average nps over 20 runs: 28527043.4
KazApps commented 3 months ago

このプルリクエストはあまりパフォーマンスが向上していなかったようなのでクローズします。ベンチマーク結果は以下の通りです。

環境: Windows 11 + R9-7945HX + RAM 32GB コマンド: bench threads 32 hash 16384を20回実行

環境 変更前 変更後 高速化
msys2 + clang 18 28068194.3 28876402.1 +2.9%
msys2 + gcc 14 26780341.1 27095826.4 +1.2%
AOCC 4.2(Windows用にクロスコンパイル) 28827380.3 28697989.1 -0.5%
WSL2 + clang 18 29317130.1 28561244.1 -2.6%
WSL2 + gcc 14 27955880.3 28031336.9 +0.3%
WSL2 + AOCC 4.2 26744295.3 29286278.1 +9.5%
WSL2 + Intel Compiler 2024.2.0 30443294.4 28994974.2 -5.0%
yaneurao commented 3 months ago

プルリク、ありがとうございます。 確認が遅くなって申し訳ありません。

file_ofを乗算で済ませるのは10年ほど前に今回プルリクをいただいたコードに似たコードを書いた覚えがあります。 当時のCPUだとわずかに遅くなったので、書いたコードをrevertしました。

現代の最新のCPU(ZEN4以降など)で、高速化するなら採用するに値すると思います。 AWSでZEN5が使えるようになったら、そこで試してみて、速くなるなら採用したいと思います。