Not logged inCSS-Forum
Forum CSS-Online Help Search Login
CSS-Shop Impressum Datenschutz
Up Topic Hauptforen / CSS-Forum / Stockfish kompiliert mit VS2005 und VS2008
- - By Benno Hartwig Date 2010-04-26 21:13
Diverse Stickfish-Versionen habe ich mit Visual C++ 2005 Express kompiliert.
Sie liefen gut und auch nur ein kleines Stück langsamer als die herunterladbaren Versionen.

Nun habe ich hochgezogen auf Visual C++ 2008 Express. Kompilieren klappt immer noch gut, Engine läuft problemlos, aber nur mit weniger als 1/3 der Geschwindigkeit.
(jeweils Release-Version, jeweils Compiler auf Geschwindigkeit gestellt)

Habe dann in getrennten Virtuellen Maschinen auf neuem XP nochmal jeweils 2005 und 2008 installiert, jeweils ein neues Projekt mit Stockfish 171-Sourcen aufgesetzt.
2005-Kompilat ist fix und 2008-Kompilat ist '3 mal so langsam'.

Und nun weiß ich nicht weiter.
Hat jemand von euch Ähnliches bemerkt? Und ggf. einen guten Tip für das Kompilieren unter 2008 bereit?
Hat vielleicht sogar schon jemand Erfahrungen mit Kompilaten mittels 2010?

Dankbar für jeden Tip,
Benno
Parent - - By Alexander Wieck Date 2010-04-26 22:43
Wie hast du gemessen, Knotenzahl oder so?
Kann nur an den (offensichtlich unterschiedlichen) Default-Compiler-Projekteinstellungen liegen.
Gehe mal jeweils in den Projekteinstellungen C/C++ unter Befehlszeile/Commandline und vergleiche diese.
Parent - - By Benno Hartwig Date 2010-04-27 18:45 Edited 2010-04-27 18:47
Thanx, der Hinweis auf die Parameterleiste hilft vielleicht weiter, da sich hier ggf. die Unterschiede leichter finden lassen.

Ich habe jetzt noch einmal jeweils unter VS2005 und VS2008 die original stockfish717-Sourcen in einen Ordner gepackt und daraus ein neues Projekt generieren lassen.
Konsolanwendung, Release, keinerlei Optimierung, keine MFC-Einbindung.

Dann liefert VS2005 die Compiler-Parameter:
Code:
/O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /FD /EHsc /MD /Fo"Release\\" /Fd"Release\vc80.pdb" /W3 /nologo /c /Wp64 /Zi /TP /errorReport:prompt

und die Linker-Parameter:
Code:
/OUT:"Release\sf171_VS2005.exe" /INCREMENTAL /NOLOGO /MANIFEST /MANIFESTFILE:"Release\sf171_VS2005.exe.intermediate.manifest" /DEBUG /PDB:"c:\dokumente und einstellungen\Benno\eigene dateien\visual studio 2005\projects\sf171\release\sf171_VS2005.pdb" /SUBSYSTEM:CONSOLE /OPT:REF /OPT:ICF /MACHINE:X86 /ERRORREPORT:PROMPT kernel32.lib


VS2008 liefert die Compiler-Parameter:
Code:
/D "WIN32" /D "NDEBUG" /D "_CONSOLE" /FD /EHsc /MD /Fo"Release\\" /Fd"Release\vc90.pdb" /W3 /nologo /c /Wp64 /Zi /TP /errorReport:prompt

und die Linker-Parameter:
Code:
/OUT:"Release\sf171_VS2008.exe" /INCREMENTAL /NOLOGO /MANIFEST /MANIFESTFILE:"Release\sf171_VS2008.exe.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"c:\Dokumente und Einstellungen\Benno\Eigene Dateien\Visual Studio 2008\Projects\sf171_VS2008\Release\sf171_VS2008.pdb" /SUBSYSTEM:CONSOLE /OPT:REF /OPT:ICF /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:PROMPT kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib


Da gibt es schon einige Unterschiede, insbesondere beim Linker.
Mal forschen...

Den Geschwindigkeitsunterschied sah ich z.B. unter Arena
Feste Tiefe 15, Ausgangsstellung, dann Sh3 und die Engine rechnet mit schwarz.

Das VS2005-Kompilat liefert
bei 280645 K/sec
den Zug nach 5 sekunden
(1576664 Stellungen)


Das VS2008-Kompilat liefert
95886 K/sec
Zug nach 16 sekunden
(auch natürlich 1576664 Stellungen)


(1 Kern eines 1,6GHz-Core Duo)

Wenn ich in den Projekt-Einstellungen jeweils auf Geschwindigkeit optimieren lasse, beliben die Verhältnisse sehr ähnlich.

Benno
Parent - - By Gerd Lahnstein Date 2010-04-27 22:51
Hallo Benno,

ja, das Verhalten von Stockfish 1.7.1 compiliert mit VS 2008 ist schon etwas eigenartig, allerdings liegt dies wohl NICHT am VS 2008 Compiler, sondern eher an den 1.7.1 Sources, wie folgender Vergleich zeigt:

Test mit Core 2 Duo P8700 2,53 GHz, ermittelt wurde Knoten/Sek wenn Tiefe 20 von der Ausgangsstellung erreicht ist (GUI Arena).

JA = Jim Ablett
GL = Gerd Lahnstein mit VS 2008, jeweils mit gleichen Compiler-Optionen für 1.7/1.7.1

Version 1.7 + 1 Kern
JA: 474.621 Knoten/Sek.
GL: 586.092
Hier ist meine Version interessanterweise sogar um den Faktor 1,23 (!) schneller als die von JA.

Version 1.7 + 2 Kerne
JA: 1.342.307 Knoten/Sek.
GL: 1.235.073
JA Version ist lediglich um den Faktor 1.09 schneller als meine.

Version 1.7.1 + 1 Kern
JA: 458.729 Knoten/Sek.
GL: 281.010
Die Performance bei meiner Version bricht regelrecht zusammen, die JA Version ist um den Faktor 1.63 (!) schneller.

Version 1.7.1 + 2 Kerne
JA: 1.320.180 Knoten/Sek.
GL: 1.227.098
JA Version ist lediglich um den Faktor 1.08 schneller als meine.

Fazit:
Sooooo übel ist VS 2008 gar nicht, mit Profile-Guided Optimization wäre möglicherweise zusätzlich noch etwas herauszuholen, leider ist dies in meiner VS 2008 Express Version nicht verfügbar.

Man müßte mal in den 1.7.1 Sources nachschauen, was die Ursache für drastische Performance-Einbuße bei 1.7.1 und VS 2008 sein könnte.

Gruß
Gerd
Parent - - By Gerd Lahnstein Date 2010-04-28 13:31
Hallo Benno,

die drastische Performance-Einbuße bei der mit VS 2008 compilierten Version 1.7.1 + Engine-Einstellung Threads=1 hat mir keine Ruhe gelassen, daher habe ich heute den Test nochmal wiederholt... und siehe da... alle Tests mit Engine-Einstellung Threads=1 erreichen deutlich mehr Knoten/Sek. Insbesondere die eigenartige Performance-Einbuße bei Version 1.7.1(VS 2008) + Engine-Einstellung Threads=1 trat nicht mehr auf.

Auch die JA-Versionen erreichen nun bei Engine-Einstellung Threads=1 eine erheblich bessere Leistung. Im Ressorcenmonitor sieht man zwar, daß in Wirklichkeit auch bei Threads=1 dennoch beide Kerne arbeiten, allerdings jeweils nur mit Teillast, wobei bei jedem einzelnen Testlauf die Verteilung unterschiedlich ist (mal 50/50 bis etwa 80/20), die CPU-Gesamt Leistung ist dabei 50%.

Ich habe keine Erklärung, warum der vorherige Test so eigenartige Ergebnisse bei Engine-Einstellung Threads=1 gezeigt hat.

Hier die Ergebnisse des zweiten Tests mit Core 2 Duo P8700 2,53 GHz, Windows 7 32bit, ermittelt wurde Knoten/Sek wenn Tiefe 20 von der Ausgangsstellung erreicht ist (GUI Arena).

JA = Jim Ablett
GL = Gerd Lahnstein, compiliert mit VS 2008 unter XP auf P4 mit jeweils gleichen Compiler-Optionen für 1.7/1.7.1

Version 1.7 + Engine-Einstellung Threads=1
JA: 748.991 Knoten/Sek.
GL: 685.195
JA-Version ist um den Faktor 1,09 schneller.

Version 1.7 + Engine-Einstellung Threads=2
JA: 1.362.381 Knoten/Sek.
GL: 1.248.752
JA-Version ist um den Faktor 1,09 schneller.

Version 1.7.1 + Engine-Einstellung Threads=1
JA: 778.651 Knoten/Sek.
GL: 681.966
JA-Version ist um den Faktor 1,14 schneller.

Version 1.7.1 + Engine-Einstellung Threads=2
JA: 1.36.547 Knoten/Sek.
GL: 1.259.365
JA-Version ist um den Faktor 1,08 schneller als meine.

Die JA-Versionen sind nun ohne Ausnahme etwa um 8-14 Prozent schneller als die mit VS 2008 compilierten GL-Versionen.

Gruß
Gerd
Parent - By Thomas Cutter Date 2010-04-28 15:44
Zitat:
Im Ressorcenmonitor sieht man zwar, daß in Wirklichkeit auch bei Threads=1 dennoch beide Kerne arbeiten, allerdings jeweils nur mit Teillast, wobei bei jedem einzelnen Testlauf die Verteilung unterschiedlich ist (mal 50/50 bis etwa 80/20), die CPU-Gesamt Leistung ist dabei 50%.


Das liegt daran, daß der Prozess nicht an einen Core gebunden ist (Affinitiy). Kann man unter Windows zB in Taskmanager, Contextmenu vom Prozess festlegen. Dann sollte ein Thread=1 Programm auch nur noch genau auf einem Core laufen. Hinsichtlich dann ausbleibender L2-Cache-Misses auch einen Hauch schneller.

Ich gebe aber zu, daß das im Zeitalter der Multi-Core-CPUs eher akademischen Character hat.

Viele Grüße Thomas
Parent - - By Alexander Wieck Date 2010-04-27 22:58
/O2 (Geschwindigkeit optimieren) fehlt: irgendwie passend zum Thema 

Außerdem kannst du die Schalter mal durchprobieren, z.B. /TC (als C Code), C++ Exception-Handling aus, SSE2, Pufferüberlaufprüfung usw usf

Es spricht auch nichts dagegen, mal die VC++ 10 Express zu installieren, vielleicht kompiliert der ja noch ein paar % besser, bzw. hat noch weitere Schalter. Viel Spaß beim Testen.
Parent - - By Benno Hartwig Date 2010-04-28 21:44
[quote="Alexander Wieck"]/O2 (Geschwindigkeit optimieren) fehlt: irgendwie passend zum Thema  [/quote]Klar. Aber putzigerweise finde ich in den Projekteigenschaften "auf Geschwindigkeit optimieren (/O2) eingestellt. In der hier angezeigten Befehlszeile erscheint dieses /O2 aber nicht.
(Ist das bei euch auch so?)

Seinerzeit mit VS2005 hatte ich die Effektivität dieses Schalters getestet. Er brachte auch ein paar Prozent. Aber ein Faktor 3 ist so sicher bei weitem nicht erklärbar.

[quote="Alexander Wieck"]Außerdem kannst du die Schalter mal durchprobieren, z.B. /TC (als C Code), C++ Exception-Handling aus, SSE2, Pufferüberlaufprüfung usw usf
Es spricht auch nichts dagegen, mal die VC++ 10 Express zu installieren, vielleicht kompiliert der ja noch ein paar % besser, bzw. hat noch weitere Schalter. Viel Spaß beim Testen.[/quote]Ja, hier ist eine weiter Spielwiese. Da werde ich mal intensiver drauf schauen.

Auf einem anderen Rechner habe ich ohne weitere Anpassungen auch mal mit VS2008professional die Release-EXE erstellt.
Die war auch langsam. (also keine Express-Bremse)


Benno
Parent - By Benno Hartwig Date 2010-05-01 20:53
[quote="Benno Hartwig"][quote="Alexander Wieck"]/O2 (Geschwindigkeit optimieren) fehlt: irgendwie passend zum Thema  [/quote]Klar. Aber putzigerweise finde ich in den Projekteigenschaften "auf Geschwindigkeit optimieren (/O2) eingestellt. In der hier angezeigten Befehlszeile erscheint dieses /O2 aber nicht.[/quote]Nun bekomme ich schnelle Kompilate, und es hatte doch was mit diesem /O2 zu tun, welches, Asche auf mein Haupt, doch zu drastischen Geschwindigkeitsunterschieden führt.
Es verwirrte mich, dass in den Eigenschaften steht "Auf Geschwindigkeit optimieren /O2", wobei auch das übernehmen ausgegraut ist. Und es wird trotzdem kein /O2 in der Parameterzeile aufgenommen. 'Schnell' dachte ich, 'langsam' machte der Compiler.
Es half dann: 'keine Optimierung', Übernehmen, 'auf Geschwindigkeit optimieren', Übernehmen. Dann kam /O2 in die Parameter, und es kamen auch schnelle Kompilate.
Vielleicht hilft ja diese Info mal jemandem irgendwie weiter...

Thanx für eure Tips
Benno
Up Topic Hauptforen / CSS-Forum / Stockfish kompiliert mit VS2005 und VS2008

Powered by mwForum 2.29.3 © 1999-2014 Markus Wichitill