Registriert vzeroall Null ymm16 bis ymm31?

8

Die Dokumentation für vzeroallerscheint inkonsistent. Die Prosa sagt:

Der Befehl setzt den Inhalt aller XMM- oder YMM-Register auf Null.

Der Pseudocode unten dass, zeigt jedoch, daß in 64-Bit - Modus - Register ymm0durch ymm15betroffen sind:

IF (64-bit mode)
    limit ←15
ELSE
    limit ← 7
FOR i in 0 .. limit:
    simd_reg_file[i][MAXVL-1:0] ← 0

Auf AVX-512 ist das Löschen von unterstützenden Maschinen ymm15nicht dasselbe wie das Löschen von "all", da " ymm16through" ymm31vorhanden ist.

Ist die Prosa oder der Pseudocode korrekt?

BeeOnRope
quelle
5
Laut Google ist der Pseudocode korrekt. Nur 0-15 sind betroffen. Die bochs Implementierung sagt auch:// clear only 16 registers even if AVX-512 is present
Jester
1
@Jester, das AMD-Handbuch sagt dasselbe. Wahrscheinlich im Zusammenhang mit Prozessoren mit AVX512-Unterstützung muss die obere Hälfte der Register aus Leistungsgründen nicht mehr auf Null gesetzt werden. Nach Broadwell wurde kein Vzeroupper benötigt (der alle AVX512-Prozessoren enthält). Ich gehe davon aus, dass sie beschlossen haben, das Verhalten von vzeroall und vzeroupper nicht zu ändern, da die Verwendung dieser Anweisungen auf diesen Prozessoren nicht mehr erforderlich war und sie daher hauptsächlich aus älteren Gründen vorhanden sind.
Michael Petch
1
@MichaelPetch: vzeroupper wird manchmal noch auf Skylake benötigt; Wenn Sie es nicht verwenden, können SSE-Anweisungen langsamer werden (falsche Abhängigkeit): Warum ist dieser SSE-Code ohne VZEROUPPER auf Skylake sechsmal langsamer? . Aber schmutziges ymm / zmm16..31 kann dieses Problem nicht verursachen, da sie mit Legacy-SSE nicht zugänglich sind. (Und ich denke, nehmen Sie nicht an Übergängen im geretteten oberen Zustand teil, die Ice Lake anscheinend wieder eingeführt hat). Außerdem hat SKX einen Turboeffekt für ein schmutziges zmm: Dynamische Bestimmung, wo ein
Peter Cordes
2
In mancher Hinsicht vzeroupperkann der Effekt der Nichtverwendung auf neueren CPUs aufgrund des Effekts des Zusammenführens von Uops und der impliziten Erweiterung viel schlimmer sein (das wurde in den Kommentaren erwähnt, die Peter verlinkt hat).
BeeOnRope
1
Der Unterschied zwischen den Registern "high" 16-31 und "low" 0-15 scheint folgendermaßen zu sein: Verschmutzung tritt nur bei den niedrigen Registern auf: Wenn die CPU nicht in den schmutzigen oberen Zustand versetzt wird, tritt dies nicht auf, wenn Sie nur obere Register schreiben . Sobald Sie sich jedoch im schmutzigen Zustand befinden, sind alle Register betroffen, einschließlich der oberen Register. Dies steht ein wenig im Widerspruch zu meiner ursprünglichen Theorie. Meine ursprüngliche Theorie war, dass die implizite Erweiterung kein (nur?) Zusammenführungseffekt war, da dies bei VEX-codierten AVX-Anweisungen der Fall war, die keine Zusammenführung durchführen.
BeeOnRope

Antworten:

6

Es scheint, als wäre es ein Beschreibungsproblem gewesen. Wenn Sie sich das neueste SDM ansehen, werden Sie feststellen, dass die Beschreibung in letzter Zeit geändert wurde und jetzt heißt es, dass VZEROALL YMM16 ... YMM31 nicht ändert.

Intel neueste SDM (Oktober 2019)

Matt. Stroh
quelle
Vielen Dank! Ich habe meine SDM-Kopie überprüft, die ich normalerweise ziemlich aktuell halte, aber in diesem Fall nicht aktuell genug.
BeeOnRope
1
Ich habe ein bisschen gegoogelt, und ich glaube, ich habe dank Ihres Q einen Fehler in LLVM gefunden, bei dem VZEROALL implementiert wurde, um alle YMM-Register einschließlich YMM16 auf Null zu setzen -20170130 /…
Matt. Stroh
1
@ Matt.Stroh: Diese falsche Änderung hat es entweder nie geschafft oder wurde seitdem rückgängig gemacht. Das aktuelle clang9.0 wird verwendet ymm16, um eine __m256Umgebung zu speichern _mm256_zeroall(): godbolt.org/z/HK7_Xy . Das macht nur Sinn, wenn es weiß, dass zeroall ymm16 nicht berührt. clang3.9.1 wird in den Speicher übertragen, sodass es möglicherweise für diese Version verwendet wurde, oder es wird einfach nicht so effizient optimiert. Hmm, clang (3.9 und aktuell) weiß nicht, dass a __m128in xmm0 quer belassen werden kann _mm256_zeroupper(). godbolt.org/z/DwMyMV
Peter Cordes