置換表と衝突と再利用性
少し、置換表の性能の話題があったので調べました。っていうほど詳しく調べてませんが。
昨年のいくつかの実験で、置換表の効果はそこまで大きくないという見解がありましたが*1。あまり詳しく調べてないので、適当にパラメタいじって出力。
対象はFFO#40(終盤解析20手完全読み)で、終盤7手置換表無しなので、node数に比べてヒット数も衝突数も異常に少ないです(私の場合の最善はこの辺のライン)。衝突時の挙動はいわゆるdirect map(衝突したら上書き)。
エントリ数 | 時間 | node数 | ヒット数 | 衝突 | 非衝突 |
---|---|---|---|---|---|
2^18=256K | 12.4sec | 17.6M | 39K | 400K | 230K |
2^19=512K | 10.5sec | 14.8M | 27K | 200K | 340K |
2^20=1M | 9.6sec | 13.4M | 26K | 100K | 400K |
2^21=2M | 9.9sec | 13.6M | 26K | 58K | 450K |
2^22=4M | 9.9sec | 13.5M | 26K | 30K | 480K |
2^20エントリで速いのは、偶然かキャッシュの問題か。キャッシュはないか。あと、カウントするために++入れただけで0.7secくらい遅くなりました。マジカヨ。それから、こないだコンパイルし直してから、また遅くなりました。マジカヨ。
上から伺えることは、必要なサイズはおそらく500Kくらい(上の場合は)。その2倍程度のサイズの置換表以上ではたいした性能差はでない。エントリが足りないときの速度低下が大きい。
そういえば、#41以上は手数が増えるからキャッシュミス率あがってるのかもしれない。すると、やはりset associativeにした方がいいか。しかし、検索が遅くなるし、しかしミス率上昇の方が問題か…。ブツブツ。
*1:小さな置換表でもせいぜい性能比2倍程度