La documentación para vzeroall
parece inconsistente. La prosa dice:
La instrucción pone a cero el contenido de todos los registros XMM o YMM.
El pseudocódigo debajo de eso, sin embargo, indica que en el modo de 64 bits sólo registra ymm0
a través ymm15
afectados:
IF (64-bit mode)
limit ←15
ELSE
limit ← 7
FOR i in 0 .. limit:
simd_reg_file[i][MAXVL-1:0] ← 0
En AVX-512 máquinas de soporte de compensación hasta ymm15
que no es el mismo que el de compensación "todos" porque ymm16
a través de ymm31
existir.
¿Es correcta la prosa o el seudocódigo?
// clear only 16 registers even if AVX-512 is present
vzeroupper
en las CPU más nuevas puede ser mucho peor debido al efecto de fusionar uops y ensanchamiento implícito (eso es lo que se mencionó en los comentarios que Peter vinculó).Respuestas:
Parece que fue un problema de descripción, si observa el último SDM , verá que la descripción se modificó últimamente y ahora dice que VZEROALL no cambia YMM16 ... YMM31.
fuente
ymm16
para salvar un__m256
entorno_mm256_zeroall()
: godbolt.org/z/HK7_Xy . Eso solo tiene sentido si sabe que zeroall no toca ymm16. clang3.9.1 se derrama en la memoria, por lo que tal vez estaba en esa versión, o tal vez simplemente no se optimiza tan eficientemente. Hmm, clang (3.9 y actual) no sabe que__m128
se puede dejar un xmm0 de ancho_mm256_zeroupper()
. godbolt.org/z/DwMyMV