Die Dokumentation für vzeroall
erscheint 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 ymm0
durch ymm15
betroffen 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 ymm15
nicht dasselbe wie das Löschen von "all", da " ymm16
through" ymm31
vorhanden ist.
Ist die Prosa oder der Pseudocode korrekt?
// clear only 16 registers even if AVX-512 is present
vzeroupper
kann 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).Antworten:
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.
quelle
ymm16
, um eine__m256
Umgebung 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__m128
in xmm0 quer belassen werden kann_mm256_zeroupper()
. godbolt.org/z/DwMyMV