La documentación para vzeroallparece 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 ymm0a través ymm15afectados:
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 ymm15que no es el mismo que el de compensación "todos" porque ymm16a través de ymm31existir.
¿Es correcta la prosa o el seudocódigo?

// clear only 16 registers even if AVX-512 is presentvzeroupperen 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
ymm16para salvar un__m256entorno_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__m128se puede dejar un xmm0 de ancho_mm256_zeroupper(). godbolt.org/z/DwMyMV