Not logged inCSS-Forum
Forum CSS-Online Help Search Login
CSS-Shop Impressum Datenschutz
Up Topic Hauptforen / CSS-Forum / Welche Compiler-Version macht den schnellsten Stockfish?
- - By Thomas Plaschke Date 2016-01-31 17:55
Ich hänge schon lange der Frage nach: Mit welchem Compiler lässt sich aus dem Stockfish-Code das schnellste Programm machen?

Ich habe verschiedene Versionen des minGW-Compilers (die gcc-Version für Windows) genommen und damit jeweils den Code compiliert. Außerdem habe ich noch eine Version mit Visual C++ 2013 gemacht. Alle Compilate sind PGO-Versionen (profile-guided-optimization).

In den eckigen Klammern steht die Compiler-Version: "[473p]" heißt Version 4.7.3 mit der Posix-Bibliothek.

Gemessen wurde die Laufzeit des Stockfish-Benchmarks. Dabei wurden die Suchinformationen ins "Null-Device" umgeleitet und die übrigen Bildschirmausgaben in eine Textdatei geschrieben. Deswegen sind die Zeiten nicht mit denen vergleichbar, die man nach der Eingabe von "bench" am Prompt erhält. Die Engines liefen auf Kern 1 des Prozessors mit der Priorität "REALTIME".
Die für die Programmversionen erzeugten Dateien wurden mit einem Excel-Makro eingelesen und ausgewertet. Dabei habe ich für jede Compilerversion ein individuelles Set an Compiler-Direktiven, die in das makefile eingebaut sind, verwendet. Aus "historischen" Gründen sind die "[xxxpEXP]"-Versionen keine "experimentellen" Parameter-Sets, sondern die Versionen, die mit dem "normalen" -O3 compiliert sind. Sie dienen dem Vergleich, ob Spielereien an den Parametern zu Verbesserungen geführt haben.

Die Tabelle weist die Ergebnisse von nur 10 Läufen aus. Ich habe auch Test mit weniger Programmversionen durchgeführt, dann aber mit 1000 Läufen über Nacht (Gesamtzeit des Tests über 5 Stunden). Es kamen dann auch "extremere" Werte in die Datensammlung. Irgendwas ruckt in so einem PC dann doch einmal und statt 0,3% Abweichung stehen dann 1,5 % zu Buche. Letztlich versaut das nicht den Schnitt, aber die Maximal-Werte sind dann nicht mehr so aussagekräftig.
Die letzte Spalte stellt das Verhältnis des Mittelwerts der Programmlaufzeiten zur abrok-Version (=stockfish_16012901_x64_modern) dar.
(Die Einheit der Werte Min, Max und Mittelwert ist ms, die Laufzeit im ist Format mm:ss.ms dargestellt)
Code:
Programm                         Min       Max       Diff  in Proz. Mittelw.  Laufzeit   % zu Dev
Stockfish160129[473p]            2969      2971         2     0,07% 2970,00   0:29.700     97,1%
Stockfish160129[484p]            2995      3002         7     0,23% 2998,10   0:29.981     98,0%
Stockfish160129[530p]            3012      3021         9     0,30% 3015,60   0:30.156     98,5%
Stockfish160129[492p]            3000      3005         5     0,17% 3001,80   0:30.180     98,1%
Stockfish160129[530pEXP]         3032      3037         5     0,16% 3034,00   0:30.340     99,1%
Stockfish160129[484pEXP]         3052      3059         7     0,23% 3054,70   0:30.547     99,8%
stockfish_16012901_x64_modern    3059      3062         3     0,10% 3060,10   0:30.601    100,0%
Stockfish160129[473pEXP]         3063      3068         5     0,16% 3065,60   0:30.656    100,2%
Stockfish160129[492pEXP]         3075      3079         4     0,13% 3076,80   0:30.768    100,5%
Stockfish160129VC13              3589      3605        16     0,45% 3595,30   0:35.953    117,5%

Demnach erzeugt für den i5-3570K der minGW-Compiler 4.7.3 den schnellsten Code.

Übrigens scheint minGW 5.3.0 aus dem doch sehr verwandten Code für "SugaR 2.0" das schnellste Programm zu machen.

Viele Grüße
Th. Plaschke
Parent - By Benno Hartwig Date 2016-02-01 08:26
Thanx für die Übersicht.
Interessant ist, dass auch bei die das VS-Kompilat recht langsam war.
Ich bekam damit auch keine schnellen Kompilate hin.
Aber weil MinGW wunderbar funktioniert, wenn er denn einmal korrekt zusammengbastelt ist,  und schon schnelle Kompilate erzeugt, habe ich VS für den SF dann auch nicht mehr vermisst.

Benno
Parent - - By tobias Date 2016-02-02 11:04
Hallo Thomas,

die Suche nach dem schnellsten Stockfish ist auch für mich interessant gewesen als ich noch im Maschinenraum aktiv war. Mittlerweile sehe ich die Sache ein wenig entspannter, ganz von der Sache lösen konnte ich mich aber noch nicht.

Zitat:

Aus "historischen" Gründen sind die "[xxxpEXP]"-Versionen keine "experimentellen" Parameter-Sets, sondern die Versionen, die mit dem "normalen" -O3 compiliert sind. Sie dienen dem Vergleich, ob Spielereien an den Parametern zu Verbesserungen geführt haben.


Kannst du verraten, welche Veränderungen du da im Makefile vorgenommen hast?

Unter Windows hatte ich mit folgenden Änderungen am meisten Erfolg:
Code:
diff --git a/src/Makefile b/src/Makefile
index 358788b..b65dbd6 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -32,7 +32,7 @@ PREFIX = /usr/local
BINDIR = $(PREFIX)/bin

### Built-in benchmark for pgo-builds
-PGOBENCH = ./$(EXE) bench 16 1 1000 default time
+PGOBENCH = ./$(EXE) bench 1 1 1000 default time

### Object files
OBJS = benchmark.o bitbase.o bitboard.o endgame.o evaluate.o main.o \
@@ -248,7 +248,7 @@ endif
ifeq ($(optimize),yes)

        ifeq ($(comp),gcc)
-               CXXFLAGS += -O3
+               CXXFLAGS += -O3 -march=native

                ifeq ($(UNAME),Darwin)
                        ifeq ($(arch),i386)

Und anschließend Stockfish mit make profile-build ARCH=x86-64-blabla COMP=gcc kompilieren. (nicht COMP=mingw)

Eine weitere interessante Option ist der clang Compiler. Mit der Installationsdatei hier: http://llvm.org/releases/download.html#3.7.1 lässt er sich bequem installieren. Allerdings bin ich mir nicht sicher wie vollständig die Installation ist, da ich inzwischen Windows hinter mit gelassen habe.

Hier ist beschrieben wie mit clang pgo builds erstellt werden können.
https://github.com/official-stockfish/Stockfish/issues/167
https://github.com/official-stockfish/Stockfish/pull/169
Diese Anleitung funktioniert für mich unter Linux, allerdings vermag ich nicht beurteilen wie es unter Windows aussieht.

Momentan liegt clang für mich leicht hinter gcc. Dieses Jahr werden beide Compiler in einer neuen Versionen erscheinen, sodass die Karten evtl. neu gemischt werden.

Schöne Grüße
Tobias
Parent - - By Thomas Plaschke Date 2016-02-02 20:22
Erstmal vielen Dank für die Anregung es nochmal mit clang zu versuchen. Bei einem ersten Versuch bin ich kläglich gescheitert. Mir war nicht klar, dass nur der Compiler nzw. das frontend geliefert wird und ein kompatibler Compiler vorhanden und eingebunden sein muss.

Heute hat's dann endlich funktioniert    Aber von mingw zu clang wechseln werde ich dennoch nicht

Die meisten Optimierungsoptionen werden nicht verstanden. Ins clang-Manual habe ich natürlich noch nicht geschaut. Es will mir auch nicht gelingen, die libs als statics zu verlinken. Außerdemdem lassen sich keine lto und pgo -Versionen erstellen. Die Rechengeschwindigkeit des erzeugten Stockfishs liegt daher kaum verwunderlich zwischen denen mit Visual C++ erzeugten und der abrok-Version.

Meine Optimierungseinstellungen für die 4.7.3-Version sind folgende:
Code:

      CXXFLAGS += -O2
      CXXFLAGS += --param ipcp-unit-growth=75 --param inline-unit-growth=67 -finline-limit=256
      CXXFLAGS += --param predictable-branch-outcome=17
      CXXFLAGS += --param allow-store-data-races=1
      CXXFLAGS += --param omega-eliminate-redundant-constraints=1
      CXXFLAGS += -fipa-pta
      CXXFLAGS += -fivopts
      CXXFLAGS += -fira-algorithm=CB
      CXXFLAGS += -fira-region=all
      CXXFLAGS += -finline-functions
      CXXFLAGS += -funswitch-loops -ftree-loop-im
      CXXFLAGS += -funroll-loops
      CXXFLAGS += -fgcse -fgcse-lm -fgcse-sm -fgcse-las -fgcse-after-reload

Ich müsste lügen, wenn ich sagen würde, dass ich wüsste, was hinter jedem Parameter steckt. Bei einigen ist der Geschwindigkeitsgewinn fraglich. Eventuell funktionieren sie nur in Verbindung mit anderen. "-fipa-pta" ist so ein Kandidat. "Perform interprocedural pointer analysis and interprocedural modification and reference analysis. This option can cause excessive memory and compile-time usage on large compilation units." heißt es im Handbuch. Tatsächlich könnte man auf sie wohl verzichten.
Eine kuriose Beobachtung war, dass einige Optimierungseinstellungen, die mit einer "-O"-Stufe eigentlich eingeschaltet sein sollten, trotzdem einen Leistungsgewinn brachten. Die mit "--param" eingeleiteten Optimierungen sind nur Veränderungen der Compilereinstellungen selbst und daher keine "echten" Optimierungsfunktionen. Einen erstaunlich deutlichen Gewinn brachte die Veränderung von "predictable-branch-outcome". Die Einstellungen zu "ipcp-unit-growth",  "inline-unit-growth" und "finline-limit" sollten genau beobachtet werden, da sie großen Einfluss auf die Codegröße haben können. Übertreibt man es, schiebt man Teile des Codes aus dem Cache. Da auch andere Optimierungen die Größe des Codes beeinflussen, sollte man bei unerwarteten Rückschritten an diese Parameter denken (deswegen stehen sie bei mir in der ersten Zeile. Sie sind nämlich deutlich höher als die Standardwerte.).
Außerdem setze ich noch "-march=corei7 -mtune=native". "corei7", weil popcnt und sse4.2 gesetzt werden und der Core-i7 die erste Intel-CPU war, die das hatte (-und mein i5 diese Befehle ausführen kann. Für PGO nicht unerheblich.). Bleibt noch "mtune", das die einzige auf meinen Rechner abgestimmte Optimierung ist .

Viele Grüße
Th. Plaschke
Parent - - By Benno Hartwig Date 2016-02-04 16:21
Thanx,
wirklich sehr interessante Vorschläge!!
Ich will mal ausprobieren, wie sich die Kompilate dann bei mir so verhalten...

Ich hoffe mal frech, dass dieserart gefundene "schnelle" Einstellungen auch bei den kommenden SF-Versionen vorteilhaft bleiben.
Und sich das System einmal so zurecht-getunt zu haben, ist dann sicher sehr schön!

Dass die Kompilate von verschiedenen MinGW-Versionen unterschiedlich schnell sind (wenigstens etwas), finde ich aber erst mal schon überraschend.

Benno
(bislang nur so mit dem make-file gearbeitet, wie es SF-Paket steckt.)
Parent - By Thomas Plaschke Date 2016-02-04 17:14
Zumindest für die "laufenden"  Neuerungen von Stockfish scheint dieses Setting seit einiger Zeit konstant "optimal" zu bleiben. Für SF Matefinder vermutlich auch - da bin ich mir aber nicht ganz sicher.
Bei den Stockfish-Abkömmlingen wird's gemischt. Die schnellste SugaR-Variante erhalte ich mit minGW 5.3.0. - Und wenn ich mich recht entsinne - ich kann gerade nicht nachsehen - wird Crafty 25.01 mit der Compilerversion 4.9.2 am schnellsten.
Es geht aber immer nur um ein paar Prozent und dürfte nur für diejenigen interessant sein, die für ihren Rechner die schnellste Exe haben wollen.

Kurios ist, dass Compilate mit identischem Setting auf meinem i5 manchmal schneller sind, wenn sie auf dem i3-Notebook kompiliert worden sind.

Ich find's aber auch vom Compiler her interessant. Wenn man alle Optionen, die angeblich von den "-O"-Optimierungsstufen umfasst sind, von Hand schaltet ist's noch lang nicht dasselbe. - Also mich hat das überrascht.

Viele Grüße
Th. Plaschke
Parent - - By Chess Player Date 2016-02-02 19:29
Zitat:
ch hänge schon lange der Frage nach: Mit welchem Compiler lässt sich aus dem Stockfish-Code das schnellste Programm machen?


Ich auch. Gilt das dann für alle anderen engines auch?
Parent - By Thomas Plaschke Date 2016-02-02 20:27
Vermutlich. Aber natürlich weiß ich nicht, wie alle anderen engines erzeugt werden.
Für die x86/AMD64-Architektur steht der Intel-Compiler in dem Ruf, hervorragend zu optimieren. Vermutlich werden viele Programmierer auf dieses Produkt zurückgreifen, wenn sie das letzte Quäntchen Geschwindigkeit aus ihrem Code pressen wollen.

Viele Grüße
Th. Plaschke
Up Topic Hauptforen / CSS-Forum / Welche Compiler-Version macht den schnellsten Stockfish?

Powered by mwForum 2.29.3 © 1999-2014 Markus Wichitill