Vielen Dank für diesen Beitrag, Michael Scheidl.
Ich denke, man kann praktische Erfahrungen mit den Tabellengrößen sammeln. Man kann auch Faustregeln aufstellen. Das erklärt aber weder wie Hashtabellen wirklich funktionieren noch die Erfahrungen oder Faustregeln. Dabei ist dazu nun wirklich viel und verständlich geschrieben worden.
Vielleicht liegt's auch an der Meinungstreue, mit der hier manche Meinung vertreten wird, dass sich hier kein (Schachprogrammier-)Praktiker zu solchen Themen äußert ...
Da ich selber von meinen - kleinen - Ausflügen in die Schachprogrammierung keine eigenen Erfahrungen mit der Erstellung von Hashtabellen beisteuern kann und nur in fremdem Code gestöbert habe, bitte ich meine Äußerungen natürlich mit einer Portion Vorsicht zu genießen (Ich bin auch nur Interpret). So viel vorweg.
- Ein Hashtabelleneintrag von Stockfish ist 16 Bytes groß. Was der Compiler daraus macht, wenn er möglicherweise die Speicherzugriffe des Programms optimiert ... Habe ich nicht kontrolliert. Könnte man prüfen. (x86 kommen Speichzugriffe auf 2-, 4- und 16-Bytegrenzen entgegen. Für die diversen Prozessorcaches spielen Cachelines auf 256 Byte-Grenzen eine Rolle. Pagegrenzen ebenfalls. Da sind überall ein paar Prozessortakte zu verlieren.).
- Programme, die mit mehreren Prozessen oder threads laufen, müssen für einen Informationsaustausch der Prozesse/threads untereinander sorgen. Hashtabellen sind dafür ein einfacher Weg. Je kleiner desto schlechter, oder? Ich weiß nicht, wie Stockfish das macht. Auch unter diesem Aspekt scheinbar ein Widerspruch: Je weniger Prozesse/threads desto besser möglicherweise.
- Es wäre neu für mich, dass die Hashtabellengröße gut bemessen ist, wenn das Programm sie auch "voll" bekommt. In volle oder fast volle Tabellen bekommt man keine Informationen hinein, ohne vorhandene Informationen zu überschreiben. Schlimm genug, worauf Michael Scheidl vermutlich völlig zu recht hinweist, dass die Tabellen nach mehreren Züge unweigerlich voll werden und dann die Hash-Ersetzungslogik das Beste aus der Situation machen muss.
- Hashtabelleneinträge veralten. Irgendwie müssen sie wieder recycelt werden.
- Ich habe mit einem i5 (4 threads) experimentiert und für Stockfish eine Tabellengröße von 1024 MByte als gute Größe für Kurzanalysen von ca. 10-120 Sekunden ermittelt. Vergleiche bis 8 GBytes zeigten etwas bessere Lösungszeiten. Höhere Knotenzahlen waren mit kleineren Hashgrößen 64-256 MBytes zu erreichen. Aber was bringt das schon?
Meine 5 Cents zu dem Thema
Viele Grüße
Th. Plaschke