Go言語ではSIMD演算ができないと昨日の日記(正確には3月くらいの下書き)で書きおいていたのにNNUEの実装をしていた。
インラインアセンブラとか使えないので,基本的には先日公開したpythonコードの移植になる。
三駒より桁違い(正確には7,8倍くらい)に遅くなった。(20knps弱程度)
まぁ,SIMD無しだとそんなもんかって感じ。
ループ展開して4割弱改善したが三駒の方が明らかに強いわな。
ところで,選手権では立ち話でNNUEのサイズ変更をしたかどうかの話をしていたのだがどうも食いつきが悪かった。早々に諦めたチームが多かったのだろう。
うちはギリギリまで多くのパターンをテストしていたため散々な目にあったが,それで得た知識・経験は結構ある。
NNUEのミソは差分更新であるとされているが,ベンチマーク計測をして感じたのは二層目の512要素を32要素にする部分の行列演算も結構な肝である。
8ビット演算で512x32要素の行列演算をするのであるが,この際このサイズに落ち着いたのが昨今32kbで統一されていたL1キャッシュサイズと無関係ではない。(詳細は省く)
まぁ,何が面白いのかと言うとインテルの次世代チップであるIce LakeではL1キャッシュの5割増とL2キャッシュの倍増が謳われているし,AMDのRyzenの新しいやつもL3キャッシュ増量と若干レイヤーが異なるにしてもキャッシュ増量が見込まれている。
単純な速度調整であっても影響するが計算精度と速度の関係がややこしいモデルではこの調整が難儀なのは間違いない。
AMDは追う側なので既存バイナリの実行速度に最適化されているが,インテルは少し姿勢が違う。Ice Lake世代のCore-Xプロセッサが出た時に専用設計をしたものが結構速くなる可能性があると予想しておこう。
CUDAとかインラインアセンブラとか得意な人がチームに入ってくれないかなぁとか,誰か私に丁寧に教えてくれないかなぁとか去年くらいから思ってる。
---
6/6追記
YSSのベンチマークではL2キャッシュが効いている旨が述べられている。
Haswell世代までだが計測量が多く結構面白いCPU序列じゃないだろうか。