Clearing the killers for the next ply whenever I find a cut move on the curent ply seemed to reduce tree size by something like 3%. Not using two equivalent killers, but reserving one killer slot exclusively for the refutation of the null move, (cleared before starting ach null-move search), and the other for refutations of other moves, reduced the tree size by another 3%.
From taking stats on cut moves, it turns out the null-move killer hardly produced any cutoffs, about 50 times less than the normal killer:
Code: Select all
d tot.node null-cuts other-cut hash-cut 0-kill killer 1st-mov 2nd 3rd
0. 36009975 18436892 2153913 1970 0 7 2094640 52185 5458
1. 3532329 2619598 4640805 6051 0 81579 4432204 117997 28309
2. 1121716 837451 209357 28422 0 18804 178712 16911 4624
3. 310864 217633 59290 19896 519 6500 51684 4062 1281
4. 120869 95279 17860 6091 163 2707 14405 2127 539
5. 30689 22245 4688 2553 42 638 4177 316 81
6. 10160 7525 1995 1423 1 355 1733 162 41
7. 2814 1983 520 473 2 116 501 11 2
8. 887 676 175 155 0 46 161 6 3
9. 148 86 53 53 0 27 53 0 0
10. 47 30 17 17 0 9 17 0 0
11. 0 0 1 1 0 0 1 0 0
Is it really counter-productive to try a second killer? Who else has a similar experience?
Note that I have a very high first-move cut rate: 97% in QS (d=0, 90% of the nodes) and 95% at d=1, not counting null move cuts (in QS the null-move cut entry represents stand pats). This is almost always the best capture, as there usually is no hash move at d=0 or d=1. (At d=0 because they are encountered for the first time, while the d=1 nodes are usually nodes that were encountered as QS nodes in the previous iteration, where they failed high through stand pat in the face of a threat.)