Ryzen Schach Performance - BMI2 Problem

Kullberg

Computer Schach Freak
Thread Starter
Mitglied seit
18.02.2005
Beiträge
5.916
Zum Vergleich AMD Ryzen gegen Intel Skylake habe ich folgende Tests durchgeführt:

Hardware Intel: Xeon E3-1245v5 auf MSI C236A Workstation mit 2x 8 GB Samsung DDR4 ECC 2133
Hardware AMD: Ryzen 1800X auf Asus Prime B350 plus mit 2x 8 GB Crucial DDR4 2133
beide laufen unter Last auf allen logischen Kernen auf 3,7 GHz

Ergebnis:
Engine
Intel​
AMD​
Unterschied​
Komodo 10.3​
7,75 Mn/s​
14,86 Mn/s​
92%​
asmFishW_2017_02_15_popcnt​
10,60 Mn/s​
19,21 Mn/s​
81%​
asmFishW_2017_02_15_bmi2​
10,91 Mn/s​
14,25 Mn/s​
31%​
Stockfish_8_x64_popcnt​
8,36 Mn/s​
16,51 Mn/s​
97%​
Stockfish_8_x64_bmi2​
8,69 Mn/s​
12,36 Mn/s​
42%​


Bei diesen Ergebnissen ist jeweils eine Ungenauigkeit von ein paar Prozent, da Schach Engines, die multi-threaded laufen, nicht deterministisch arbeiten.
Es gibt unterschiedliche Kompiler Optionen - die popcnt Versionen nutzen die im Schach wertvolle Instruktion POPCNT aus dem Instruktionssatz SSE 4.2 - damit kann man z.B. mit einem Befehl zählen, wieviele Bauern auf dem Spielfeld sind. Die bmi2 Versionen nutzen darüberhinaus den BMI2-Instruktionssatz. Das sollte die Performance eigentlich verbessern - bei Intel klappt das auch, wie man an den Ergebnissen sieht. Beim Ryzen scheint da ein schwerwiegendes Problem zu sein.


Edit:
Im single-thread Modus (da läuft der Ryzen auf 4,1 GHz) gibt es folgende Ergebnisse:
Stockfish_8_x64_popcnt 1,591 Mn/s, Stockfish_8_x64_bmi2 1,156 Mn/s. Diese Ergebnisse sind übrigens extrem genau - im single-thread Modus sind die Ergebnisse deterministisch. Also 27,3% Performance Verlust durch die BMI2 Option.
 
Zuletzt bearbeitet:
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Ist Ryzen nciht 50% bis 100% schneller?
 
Ahh jetzt hab ich es endlich kapiert. :fresse:
Welcher compiler wurde genutzt? Hast du mal in den changelog geschaut, wie es da bezüglich ryzen support aussieht?
 
Interessantes Ergebniss....Ohne speziell auf AVX2 und BMI2 einzugehen würde mich interessieren in welchem Zustand das SMT des Ryzens und das HT des Intels waren, an oder aus,oder teils/teils? (Ich weiß gar nicht ob man das smt deaktivieren kann wie beim Intel im Bios?)War das ein reiner "CPU vs. CPU"-Vergleich um mal das compilieren zu testen?

Gibts noch eine weitere Testvariation mit abgeänderten Faktoren?
Aber @TE...dennoch interessantes Ergebnis und danke.:)
 
Die Programme hab ich nicht selbst kompiliert.
AsmFish ist Freeware / open source, es ist eine assembler Version von Stockfish. https://github.com/lantonov/asmFish/tree/executables/Windows
Stockfish ist auch Freeware / open source: https://stockfishchess.org/
HT bzw. SMT ist an bei beiden Rechnern, ehrlich gesagt hab ich im BIOS des Asus Boards die Option zum deaktivieren nicht gefunden. Ein SMT Problem scheint das nicht zu sein. Wenn ich beim Ryzen 8 Threads wähle und affinities setze, so dass jeder Core auch nur einien Thread abkriegt, wird das Ergebnis schlechter - genauso, wie wenn man bei Intel HT ausschaltet.

Edit: Komodo ist kommerziell: Komodo chess engine by Don Dailey, Larry Kaufman Mark Lefler
 
Zuletzt bearbeitet:
Leider hat das Brett nur "AI Tweaker" - da gibt es die Möglichkeit nicht. Aber ich denke, die single-thread Tests (edit im 1. Post) zeigen, dass es mit SMT nicht zusammenhängt, sondern dass mit dem BMI2 Instruktionssatz was faul ist.
 
Die Programme hab ich nicht selbst kompiliert.
AsmFish ist Freeware / open source, es ist eine assembler Version von Stockfish. https://github.com/lantonov/asmFish/tree/executables/Windows
Stockfish ist auch Freeware / open source: https://stockfishchess.org/
HT bzw. SMT ist an bei beiden Rechnern, ehrlich gesagt hab ich im BIOS des Asus Boards die Option zum deaktivieren nicht gefunden. Ein SMT Problem scheint das nicht zu sein. Wenn ich beim Ryzen 8 Threads wähle und affinities setze, so dass jeder Core auch nur einien Thread abkriegt, wird das Ergebnis schlechter - genauso, wie wenn man bei Intel HT ausschaltet.

Edit: Komodo ist kommerziell: Komodo chess engine by Don Dailey, Larry Kaufman Mark Lefler
Bezüglich Zuordnung der SMT Threads evt. auch hier mal rein schauen: SMT/CMT-Kernzuordnen in Windows-Betriebssystemen
Das Programm CorePairing ist vom user Helle53: bsp. https://abload.de/img/boinctn-grideinstein_atrc2.jpg

Wie lässt man die Benchmarks laufen, einfach .exe ausführen klappt nicht bei asm und stockfish, es kommt das CMD Fenster aber dann bleibt es ruhig.

ProcessLasso kannst für .exe Dateien Regel-Profile anlegen, einfach rechts-klick auf die .exe Datei und dann -> CPU Zugehörigkeit -> immer -> auswählen:
http://abload.de/img/seti_opencl_fx-9590_p2okdt.jpg
Damit kannst zwar SMT nicht abschalten aber die Last auf gerade oder ungerade Kerne festlegen. ;)
 
Zuletzt bearbeitet:
Ich hab selbst ein kleines Tool in C++ geschrieben, was Affinities automatisch optimal setzt - unabhängig von der Anzahl der Cores. Das verwende ich seit Jahren - und hab es gestern angepasst, dass es auch SMT bei AMD richtig benennt.
AffPri.png
Die Schach Engines werden üblicherweise durch eine GUI gesteuert. Eine Freeware GUI ist z.B. Arena: Arena Chess GUI for Linux and Windows - Welcome to Arena
Man kann die Engine aber auch durch Anklicken starten und dann Textbefehle eingeben, die dem UCI-Protokoll entsprechen. Eine Abfolge von Befehlen sieht z.B. so aus:

setoption name threads value 8
setoption name hash value 2048
go depth 30

Bedeutet: verwende 8 Threads, 2048 MB Hash, rechne die Position (ohne Eingabe Grundstellung) bis zu einer Tiefe von 30 Halbzügen. Im Ergebnis steht dann time **** (verbrauchte milli Sekunden), nps (Knoten per Sekunde - der gesuchte Performance Wert), nodes (die Gesamtzahl von berechneten Knoten = Positionen) und score (Bewertung der Stellung in cp = centipawns = 1/100 Bauern.
 
Bei meinem neuen Asrock AB350 Pro4 ist es nun möglich, SMT auszuschalten. Mit einem 1700X gibt es folgende Werte (alles asmFishW - die CPU läuft unter Last auf 3,5 GHz):

mit SMT popcnt Version: 18,49 Mn/s
mit SMT bmi2 Version: 13,69 MN/s
ohne SMT popcnt Version: 13,48 Mn/s
onhe SMT bmi2 Version: 9,41 Mn/s

Somit sollte klar sein, dass es kein SMT Problem sein kann.
 
asmFish kannte ich als Projekt von tthsqe aus dem FAsm-Forum. Gestern sind neue Versionen veröffentlich worden und so habe ich auch mal getestet, jeweils 5 Durchläufe:

Jeweils asmFishW-Version vom 15.3.2017, Windows7/64, Hash 2GB, Tiefe 30

AMD Ryzen 7 1800X, 16 Threads, alle Kerne @3.7GHz, Asus Prime X370-Pro:
Popcnt:
18.215.946nps, 8cp, 2.118.569.234n, g1f3 e7e6
18.307.576nps, 24cp, 1.232.887.103n, d2d4 e7e6
18.275.286nps, 6cp, 1.650.093.853n, d2d4 g8f6
18.279.639nps, 7cp, 2.532.077.382n, e2e4 e7e6
18.244.647nps, 14cp, 1.976.132.497n, d2d4 e7e6
BMI2:
14.134.673nps, 11cp, 1.906.866.418n, d2d4 g8f6
14.177.738nps, 20cp, 1.719.915.666n, d2d4 e7e6
14.206.293nps, 12cp, 1.368.733.801n, e2e4 e7e5
14.119.422nps, 18cp, 1.899.161.152n, g1f3 d7d5
14.220.873nps, 14cp, 1.484.147.259n, g1f3 d7d5

Intel i7-7700K, 8 Threads, alle Kerne @5.0GHz, Asus Prime Z270-A:
Popcnt:
12.830.001nps, 5cp, 1.148.002.859n, d2d4 g8f6
12.890.656nps, 17cp, 1.268.621.023n, d2d4 e7e6
12.839.685nps, 11cp, 1.334.903.602n, d2d4 e7e6
12.825.199nps, 10cp, 1.358.714.454n, d2d4 g8f6
12.834.243nps, 20cp, 1.790.710.651n, d2d4 g8f6
BMI2:
13.230.070nps, 16cp, 978.204.936n, d2d4 e7e6
13.159.586nps, 14cp, 943.292.312n, d2d4 g8f6
13.139.103nps, 15cp, 1.182.072.615n, e2e4 e7e6
13.149.357nps, 13cp, 1.234.987.636n, d2d4 g8f6
13.176.356nps, 8cp, 1.005.303.295n, d2d4 g8f6

Bei der Knoten-Anzahl gibt es doch ganz schöne Unterschiede.
Naja, wenigstens will Intel nicht den Gaul ziehen... :haha:
 
Hast Du Werte für den Stromverbrauch des i7-7700K unter Last?
Mein Ryzen 7 1800X liegt bei ca. 160W an der Steckdose, den kleinen Xeon hab ich nicht gemessen.

Meine Werte waren mit den default Werten für Hash - deshalb sehen die auch etwas besser aus. AsmFishW ist allerdings in der Lage, large pages zu verwenden. Wenn man den Computer entsprechend konfiguriert und das in asmFishW auch einschaltet (Befehl = setoption name largepages value true), kriegt man bei größeren hash Werten eine deutlich bessere Performance. Damit das System das erlaubt, muss man in den group policies das Recht für "lock pages in memory" aktivieren und UAC deaktivieren oder die engine als Administrator laufen lassen.
 
Siehe: instlatx64

Code:
Intel Skylake:
Inst 2017 BMI2  : BZHI r32, r32, r32            L:   0.45ns=  1.0c  T:   0.23ns=  0.50c
Inst 2018 BMI2  : BZHI r64, r64, r64            L:   0.45ns=  1.0c  T:   0.23ns=  0.50c
Inst 2019 BMI2  : MULX r32, r32, r32            L:   1.96ns=  4.3c  T:   0.53ns=  1.17c
Inst 2020 BMI2  : MULX r64, r64, r64            L:   1.81ns=  4.0c  T:   0.45ns=  1.00c
Inst 2021 BMI2  : PDEP r32, r32, r32            L:   1.36ns=  3.0c  T:   0.45ns=  1.00c
Inst 2022 BMI2  : PDEP r64, r64, r64            L:   1.36ns=  3.0c  T:   0.45ns=  1.00c
Inst 2023 BMI2  : PEXT r32, r32, r32            L:   1.36ns=  3.0c  T:   0.45ns=  1.00c
Inst 2024 BMI2  : PEXT r64, r64, r64            L:   1.36ns=  3.0c  T:   0.45ns=  1.00c
Inst 2025 BMI2  : RORX r32, r32, r32            L:   0.45ns=  1.0c  T:   0.23ns=  0.50c
Inst 2026 BMI2  : RORX r64, r64, r64            L:   0.45ns=  1.0c  T:   0.23ns=  0.50c
Inst 2027 BMI2  : SARX r32, r32, r32            L:   0.45ns=  1.0c  T:   0.23ns=  0.50c
Inst 2028 BMI2  : SARX r64, r64, r64            L:   0.45ns=  1.0c  T:   0.23ns=  0.50c
Inst 2029 BMI2  : SHLX r32, r32, r32            L:   0.45ns=  1.0c  T:   0.23ns=  0.50c
Inst 2030 BMI2  : SHLX r64, r64, r64            L:   0.45ns=  1.0c  T:   0.23ns=  0.50c
Inst 2031 BMI2  : SHRX r32, r32, r32            L:   0.45ns=  1.0c  T:   0.23ns=  0.50c
Inst 2032 BMI2  : SHRX r64, r64, r64            L:   0.45ns=  1.0c  T:   0.23ns=  0.50c

Ryzen:
2017 BMI2       :BZHI r32, r32, r32          L:   0.28ns=  1.0c  T:   0.11ns=  0.38c
2018 BMI2       :BZHI r64, r64, r64          L:   0.28ns=  1.0c  T:   0.09ns=  0.32c
2019 BMI2       :MULX r32, r32, r32          L:   1.11ns=  4.0c  T:   0.56ns=  2.00c
2020 BMI2       :MULX r64, r64, r64          L:   1.11ns=  4.0c  T:   0.56ns=  2.00c
2021 BMI2       :PDEP r32, r32, r32          L:   5.00ns= 18.0c  T:   5.00ns= 18.00c
2022 BMI2       :PDEP r64, r64, r64          L:   5.00ns= 18.0c  T:   5.00ns= 18.00c
2023 BMI2       :PEXT r32, r32, r32          L:   5.00ns= 18.0c  T:   5.00ns= 18.00c
2024 BMI2       :PEXT r64, r64, r64          L:   5.00ns= 18.0c  T:   5.00ns= 18.00c
2025 BMI2       :RORX r32, r32, r32          L:   0.28ns=  1.0c  T:   0.13ns=  0.45c
2026 BMI2       :RORX r64, r64, r64          L:   0.28ns=  1.0c  T:   0.11ns=  0.41c
2027 BMI2       :SARX r32, r32, r32          L:   0.28ns=  1.0c  T:   0.11ns=  0.38c
2028 BMI2       :SARX r64, r64, r64          L:   0.28ns=  1.0c  T:   0.09ns=  0.31c
2029 BMI2       :SHLX r32, r32, r32          L:   0.28ns=  1.0c  T:   0.11ns=  0.38c
2030 BMI2       :SHLX r64, r64, r64          L:   0.28ns=  1.0c  T:   0.09ns=  0.31c
2031 BMI2       :SHRX r32, r32, r32          L:   0.28ns=  1.0c  T:   0.11ns=  0.38c
2032 BMI2       :SHRX r64, r64, r64          L:   0.28ns=  1.0c  T:   0.09ns=  0.31c

PDEP und PEXT sind 6 mal langsamer als Intel.
 
Zuletzt bearbeitet:
Danke, damit ist das Problem erklärt. Die beiden Befehle werden zwar soweit ich weiß nur in der Erzeugung der möglichen Züge verwendet, aber bei der mageren Performance sollte man die dann tunlichst meiden. Interessanterweise sinkt übrigens der Stromverbrauch entsprechend, wenn man die BMI2 Versionen verwendet.
AVX2 soll ja auch nicht überzeugend sein - da dürfte auch der Grund liegen, weshalb die neuen Prime Versionen zuwenig Last erzeugen.
 
Die andern BMI2 Befehle kann man ruhig benutzen. Und eigentlich erzeugen Compiler PEXT und PDEP nur äußerst selten. Man muß schon die intrinsics direkt aufrufen, um die beiden Befehle zu benutzen.
PDEP und PEXT sind wahrscheinlich gar nicht im Silikon implementiert, sondern werden per Micrcode simuliert.
 
Die andern BMI2 Befehle kann man ruhig benutzen. Und eigentlich erzeugen Compiler PEXT und PDEP nur äußerst selten. Man muß schon die intrinsics direkt aufrufen, um die beiden Befehle zu benutzen.
PDEP und PEXT sind wahrscheinlich gar nicht im Silikon implementiert, sondern werden per Micrcode simuliert.
"Man muß schon die intrinsics direkt aufrufen, um die beiden Befehle zu benutzen." Was meinst du damit?
Um beide Befehle zusammen zu "benutzen" oder um (mindestens) einen der beiden Befehle zu "benutzen"?
 
"Man muß schon die intrinsics direkt aufrufen, um die beiden Befehle zu benutzen." Was meinst du damit?
Um beide Befehle zusammen zu "benutzen" oder um (mindestens) einen der beiden Befehle zu "benutzen"?

Um PDEP oder PEXT zu generieren muss man _pext_u64(), _pdep_u64(), etc. direkt aufrufen.
Ich kenne zumindest keinen Compiler der die beiden Befehle von sich aus erzeugt.
 
Um PDEP oder PEXT zu generieren muss man _pext_u64(), _pdep_u64(), etc. direkt aufrufen.
Ich kenne zumindest keinen Compiler der die beiden Befehle von sich aus erzeugt.
Danke für die schnelle Antwort. Liegt es daran, dass die Befehle an sich nutzlos sind, weil es bessere alternativen gibt oder daran dass die Compiler noch nichts mit Ryzen anfangen könen?
 
Danke für die schnelle Antwort. Liegt es daran, dass die Befehle an sich nutzlos sind, weil es bessere alternativen gibt oder daran dass die Compiler noch nichts mit Ryzen anfangen könen?

Die Compiler sind einfach noch nicht schlau genug, die Situationen zu erkennen, in denen die Befehle vorteihaft wären.
Falls sich das in Zukunft ändern sollte, würden natürlich die hohen Ryzen Latenzen berücksichtigt und deshalb alternative Assembler Befehle bevorzugt (mit -march=znver1).
Die beiden Befehle sind nicht nutzlos, ganz im Gegenteil. Siehe zum Beispiel: chessprogramming - BMI2
 
Habe mir die BMI2-Exe angeschaut:
PEXT.PNG
Von den BMI2-Instruktionen wird nur PEXT verwendet (133-mal). Vor Jahren hatte ich ein Programm zur Ermittlung von Latenz/Durchsatz geschrieben, dann aber doch aus Faulheit auf die Veröffentlichungen von Agner Fog zurückgegriffen. Leider hat er aber zu Ryzen noch nichts gebracht; also habe ich mein altes Prog mal mit PEXT gefüttert. Der i7-7700K zeigt für die 3-Register-Variante brav 3 Latenz-Takte an, so wie A.Fog es für den Skylake (hier = Kaby Lake) auch angibt (die Mem-Variante ist ein Thema für sich). Der 1800X aber bringt mich zur Verzweiflung :( ! Fast jeder Durchlauf zeigt andere Werte an: Von 27 bis in die 80 ist alles dabei. Ich habe testweise noch POPCNT eingebaut; das ist stabil (alle Wald-und Wiesen-Instruktionen sowieso). Thread auf bestimmten Core festnageln brachte nichts. Ryzen scheint also mit PEXT ein Problem zu haben. Nun macht eine Instruktion nicht das komplette Programm unbrauchbar, aber ärgerlich (komisch) ist es schon. Das mit dem Microcode wäre eine Erklärung...
 
Habe mir die BMI2-Exe angeschaut:
Anhang anzeigen 395250
Von den BMI2-Instruktionen wird nur PEXT verwendet (133-mal). Vor Jahren hatte ich ein Programm zur Ermittlung von Latenz/Durchsatz geschrieben, dann aber doch aus Faulheit auf die Veröffentlichungen von Agner Fog zurückgegriffen. Leider hat er aber zu Ryzen noch nichts gebracht; also habe ich mein altes Prog mal mit PEXT gefüttert. Der i7-7700K zeigt für die 3-Register-Variante brav 3 Latenz-Takte an, so wie A.Fog es für den Skylake (hier = Kaby Lake) auch angibt (die Mem-Variante ist ein Thema für sich). Der 1800X aber bringt mich zur Verzweiflung :( ! Fast jeder Durchlauf zeigt andere Werte an: Von 27 bis in die 80 ist alles dabei. Ich habe testweise noch POPCNT eingebaut; das ist stabil (alle Wald-und Wiesen-Instruktionen sowieso). Thread auf bestimmten Core festnageln brachte nichts. Ryzen scheint also mit PEXT ein Problem zu haben. Nun macht eine Instruktion nicht das komplette Programm unbrauchbar, aber ärgerlich (komisch) ist es schon. Das mit dem Microcode wäre eine Erklärung...
Was meint den der Instrustion Latency dump von AIDA64?

Ein Auszug vom FX-9590:
Inst 755 MMXP : PEXTRW r32, mm, im8 L: [diff. reg. set] T: 0.19ns= 0.92c
Inst 756 MMXP : PINSRW mm, r32, im8 L: [diff. reg. set] T: 0.21ns= 1.00c
Inst 757 MMXP : PEXTRW + PINSRW r32 L: 0.42ns= 2.0c T: 0.41ns= 1.92c
Inst 758 AMD64 : PEXTRW r64, mm, im8 L: [diff. reg. set] T: 0.19ns= 0.92c
Inst 759 AMD64 : PINSRW mm, r64, im8 L: [diff. reg. set] T: 0.21ns= 1.00c
Inst 760 AMD64 : PEXTRW + PINSRW r64 L: 0.42ns= 2.0c T: 0.41ns= 1.92c
Bin mir aber nicht sicher, ob es genau die Befehle sind, es gibt auch SSE 4.1 und AVX "PEXT".
 
Das BMI2-PEXT hat nichts mit den SSE/AVX-PEXTRB/PEXTRD/PEXTRQ/PEXTRW zu tun. PEXT ist so eine Art Bit-Sammler und benutzt nur General-Register, während die anderen aus MMX/XMM-Registern was "rauspicken".
Zur sonntäglichen Erbauung habe ich mal alle BMI2-Instruktionen auf Kaby Lake und Ryzen getestet:
BMI2.jpg
"Krumme" Werte sind natürlich passend auf-/abzurunden. Ich habe so aber eine bessere Übersicht.
PDEP und PEXT haben bei Ryzen riesige Schwankungs-Werte (s.o.), die anderen Instruktionen sind stabil.
Was auch immer AMD da treibt...
 
Habe etliche Tests gemacht um auf plausible stabile Werte zu kommen. Ergebnis: Der Ryzen muss massiv "vorgeheizt" werden! Vor jedem Instruktions-Testlauf muss etliche Millisekunden lang der Core beschäftigt werden, dann kann die Messung erfolgen. Auch die Mess-Schleife selbst musste verlängert werden. Sieht jetzt so aus:
BMI2_A2.PNG
Schon wesentlich besser, aber beim Kaby Lake sind derartige Klimmzüge nicht nötig.
 
Könnte das mit Ryzens " Core awaking problemen " zusammen hängen ? Oder ist es eher Glück in welchem Cache die Wete liegen und welcher core cluster angesprochen wird (cache trasnfer bevor gerechnet wird?)
 
Das wird mit Sicherheit am CoreParking liegen. Einfach mal mit dem Profil Höstleistung gegentesten.
 
Höchstleistung ändert nichts an der schwachen Performance der BMI2 Versionen der Schachprogarmme. Übrigens liegen bei Schach (fast) immer 100% Prozessorlast an, nur wenn ein neuer Zug kommt, geht die Last ganz kurz runter.
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh