Not logged inCSS-Forum
Forum CSS-Online Help Search Login
CSS-Shop Impressum Datenschutz
Up Topic Hauptforen / CSS-Forum / Wie kann man die Skalierbarkeit von Engines messen/vergleich
- - By Michael Huber Date 2010-12-20 18:13
Hallo miteinander,
aufgrund meines geringen Verständnisses zu Thema muss ich hier schon wieder mal doofe Fragen stellen.

Ich möchte gerne die Skalierbarkeit verschiedener Engines messen und vergleichen. Mein Ziel wäre es die Frage zu beantworten
welche Engine am meisten von mehr CPUs/Cores profitiert.

Meine Testumgebung wäre ein Server mit 24 Cores - d.h. ich könnte die Skalierbarkeit von 1 Core über 12 Cores (1 CPU AMD Opteron 6168) bis 24 Cores (2 CPUs AMD Opteron 6168) messen.

Dazu fallen mir folgende Möglichkeiten ein:

1.)
Messen der Summe der berechneten Nodes (über die Engine) über eine gewisse Zeit (z.B. 30 Minuten) in der Grundstellung.
Daraus Berechung der Nodes / Minute für die jeweilige Anzahl an Cores.

Allerdings stellt sich mir die frage - kann man sich da auf die Ausgaben der verschiedenen Engines verlassen?

2.)
Ermitteln in welcher Zeit eine Engine in der Grundstellung auf n Cores eine gewisse Rechentiefe erreicht und Vergleichen der Ergebnisse mit n+x Cores

Das Ganze wäre dann für alle interessierenden Engines die 24 Cores unterstützen (Deep Shredder, Deep Fritz, Deep Rybka, Zappa Mexico, Deep Junior.....)
zu wiederholen.

Aus den Ergebnisse mit verschiedener Anzahl Cores kann man dann ja leicht ermitteln wie weit die jeweilige Engine von einer linearen (idealen) Skalierbarkeit entfernt ist.

Sind das eurer Meinung nach brauchbare Ansätze um das gesteckte Ziel zu erreichen?
Sind euch dazu bessere Möglichkeiten bzw. Teststellungen bekannt?

  Michael
Parent - By Ingo Bauer Date 2010-12-20 20:17
Moin,

[quote="Michael Huber"]
Hallo miteinander,
aufgrund meines geringen Verständnisses zu Thema muss ich hier schon wieder mal doofe Fragen stellen.

Ich möchte gerne die Skalierbarkeit verschiedener Engines messen und vergleichen. Mein Ziel wäre es die Frage zu beantworten
welche Engine am meisten von mehr CPUs/Cores profitiert.

Meine Testumgebung wäre ein Server mit 24 Cores - d.h. ich könnte die Skalierbarkeit von 1 Core über 12 Cores (1 CPU AMD Opteron 6168) bis 24 Cores (2 CPUs AMD Opteron 6168) messen.

Dazu fallen mir folgende Möglichkeiten ein:

1.)
Messen der Summe der berechneten Nodes (über die Engine) über eine gewisse Zeit (z.B. 30 Minuten) in der Grundstellung.
Daraus Berechung der Nodes / Minute für die jeweilige Anzahl an Cores.

Allerdings stellt sich mir die frage - kann man sich da auf die Ausgaben der verschiedenen Engines verlassen?

2.)
Ermitteln in welcher Zeit eine Engine in der Grundstellung auf n Cores eine gewisse Rechentiefe erreicht und Vergleichen der Ergebnisse mit n+x Cores

Das Ganze wäre dann für alle interessierenden Engines die 24 Cores unterstützen (Deep Shredder, Deep Fritz, Deep Rybka, Zappa Mexico, Deep Junior.....)
zu wiederholen.

Aus den Ergebnisse mit verschiedener Anzahl Cores kann man dann ja leicht ermitteln wie weit die jeweilige Engine von einer linearen (idealen) Skalierbarkeit entfernt ist.

Sind das eurer Meinung nach brauchbare Ansätze um das gesteckte Ziel zu erreichen?
Sind euch dazu bessere Möglichkeiten bzw. Teststellungen bekannt?

  Michael
[/quote]

Da hst du das große Problem getroffen.

Im allgemeinen wird so etwas über Punkt 2  gemessen. Man nennt das "Time to depth", also die Zeit die eine Engine zum erreichen einer bestimmten Tiefe braucht. Damit kannst du Skalierbarkeit sehr gut messen. Leider mußt da das pro Stellung mehrmals wiederholen und dann natürlich nict nur für ein Stellung sondern für viele. Das "mehrmals" und "viele" kannst du nicht oft genug machen, sagen wir mal so 100 Stellungen pro Spielphase (Eröffnung, frühes Mittel-, spätes Mittelspiel, Endspiel), dann jede Stellung pro Enigne so mindestens 10 mal wiederholen und am Schluß über alles den Durchschnitt nehmen. Wenn du 24 Kerne hast , würde ich bei 1, 2, 4, 8, 12, 16 und 24 Kernen messen und eine Tiefe nehemen, die die jeweile Engine bei 12 Kernen so durchschnittlich (Achtung Rekursion) nach 5 Minunten erreicht. Weiterhin sollte es bei ordentlich großem Hash passieren, am besten ohne das die Enigne Einträge im Hash überschreibt.

Kleiner Hinweis: Solltest du irgend etwas herrausbekommen was jemandem nicht passt, waren es zu die falschen oder zu wenig Stellungen, nicht tief genug  gerechnet oder die falsche CPU/OS/Hashgröße.

Ich darf dich für eine genaure Prinzipbeschreibung hierhin verweisen: http://de.wikipedia.org/wiki/Sisyphos

Gruß
Ingo
Parent - - By Jörg Oster Date 2010-12-20 20:43
Hallo Michael,

[quote="Michael Huber"]
Hallo miteinander,
aufgrund meines geringen Verständnisses zu Thema muss ich hier schon wieder mal doofe Fragen stellen.

Ich möchte gerne die Skalierbarkeit verschiedener Engines messen und vergleichen. Mein Ziel wäre es die Frage zu beantworten
welche Engine am meisten von mehr CPUs/Cores profitiert.

Meine Testumgebung wäre ein Server mit 24 Cores - d.h. ich könnte die Skalierbarkeit von 1 Core über 12 Cores (1 CPU AMD Opteron 6168) bis 24 Cores (2 CPUs AMD Opteron 6168) messen.
[/quote]
nicht alle multiprozessorfähigen Engines unterstützen diese Anzahl von Cores. Stockfish z. B. von Haus aus nur 8!
Wie das bei den anderen Engines ist, weiß ich jetzt nicht so genau.

[quote="Michael Huber"]
Dazu fallen mir folgende Möglichkeiten ein:

1.)
Messen der Summe der berechneten Nodes (über die Engine) über eine gewisse Zeit (z.B. 30 Minuten) in der Grundstellung.
Daraus Berechung der Nodes / Minute für die jeweilige Anzahl an Cores.
[/quote]

Bob Hyatt (Crafty) hat im CCC schon öfters angedeutet, dass dies nicht unbedingt eine geeignete Möglichkeit ist, die Skalierung einer Engine auf n-cores einzuschätzen.
Besser ist, die Zeit bis zum Erreichen einer bestimmten Tiefe zu messen. Und das natürlich in mehreren Durchläufen.

[quote="Michael Huber"]
2.)
Ermitteln in welcher Zeit eine Engine in der Grundstellung auf n Cores eine gewisse Rechentiefe erreicht und Vergleichen der Ergebnisse mit n+x Cores

Das Ganze wäre dann für alle interessierenden Engines die 24 Cores unterstützen (Deep Shredder, Deep Fritz, Deep Rybka, Zappa Mexico, Deep Junior.....)
zu wiederholen.

Aus den Ergebnisse mit verschiedener Anzahl Cores kann man dann ja leicht ermitteln wie weit die jeweilige Engine von einer linearen (idealen) Skalierbarkeit entfernt ist.
[/quote]
Besser. Aber mit nur einer Teststellung ist es wohl nicht getan. Möglichst viele aus unterschiedlichen Spielphasen wären vonnöten. Ein wahres Mammut-Projekt...
Ich habe mich mal etwas eingehender mit den SMP-Einstellungen ("Minimum Split Depth" u. "Maximum Number of Threads per Split Point") von Stockfish beschäftigt. Sehr zeitaufwändig!

[quote="Michael Huber"]
Sind das eurer Meinung nach brauchbare Ansätze um das gesteckte Ziel zu erreichen?
Sind euch dazu bessere Möglichkeiten bzw. Teststellungen bekannt?

  Michael
[/quote]
Da möchte ich dich ans "Programming and Technical Discussions"-Forum vom CCC http://www.talkchess.com verweisen. Dort kann dir bestimmt mehr und kompetenter geholfen werden.

Gruß,
Jörg.
Parent - - By Michael Huber Date 2010-12-21 11:15
Vielen Dank für euren Input!

Ich hatte schon befürchtet, dass ich mir die Geschichte wieder mal zu einfach vorstelle.
Allerdings ist mir nicht klar warum ich die Messungen in verschiedenen Stellungen durchführen müsste.

Ich hätte mir das soooo einfach vorgestellt:
Engine 1: auf 1 Core benötigt 24 Minuten bis zu Rechentiefe 25 und auf 24 Cores 1 Minute
Engine 2: auf 1 Core benötigt 24 Minuten bis zu Rechentiefe 25 und auf 24 Cores 1,3 Minute
Also skaliert Engine 1 besser.

Kann ich eine einfache Aussage wie Engine 1 skaliert besser als Engine 2 wirklich nicht auf Basis einer
Messung in einer beliebigen Stellung treffen? Und, warum darf man das nicht? 

LG und noch einen schönen Tag,

Michael
Parent - By Michael Scheidl Date 2010-12-21 12:01
Ich denke schon daß man das darf bzw. daß es so sinnvoll ist. - Ich würde aber mehrere, möglichst unterschiedliche Stellungen nehmen (3...5 oder so), und die Messungen je Stellung nicht nur bei einer einzelnen bestimmten Tiefe vergleichen, sondern vielleicht bei zwei oder drei. Also z.B. jeweils wie lange bis Tiefen 12, 16, 20. Dann könnte man Durchschnitte des Zeitverhältnisses über gleiche Tiefen und über alle Stellungen bilden, und einen Gesamtdurchschnitt.

Auf jeden Fall würde ich die Anzahl Kerne einbeziehen, die ich in der Praxis dann am meisten pro Engine verwenden würde. Von allgemeinem Interesse sind Relationen zwischen 1, 2 und 4 Cores, sowie evtl. 6 und 8 Cores für die Poweruser.

Wobei solche Resultate sicherlich auch vom jeweiligen CPU-Typ abhängen...
Parent - By Heiko Bruns Date 2010-12-21 12:36
Hallo,

die Wahrscheinlichkeit das Engine 2 die gleiche Zeit bei 1 Core wie Engine 2 erreicht, ist schon unwahrscheinlich bzw. Zufall.

Verschiedene Stellungen aus den drei großen Bereichen des Spiels sollte man nehmen, weil das Erreichen der Rechentiefe sehr stark von der Bewertungsfunktionen abhängig ist.
Diese ist bei allen Engines unterschiedlich und kann sich auch in der Eröffnung, im Mittelspiel und Endspiel ändern.

mfG
Heiko
Parent - By Ernest Bonnem Date 2010-12-21 19:35
[quote="Michael Huber"]Kann ich eine einfache Aussage wie Engine 1 skaliert besser...[/quote]
Probiere es mal selbst zuerst..., dann wirst Du schon eine bessere Erfahrung der Probleme haben! 
Up Topic Hauptforen / CSS-Forum / Wie kann man die Skalierbarkeit von Engines messen/vergleich

Powered by mwForum 2.29.3 © 1999-2014 Markus Wichitill