Introducción al punto flotante y SIMD de x86-64
De operaciones escalares XMM a SSE y AVX packed, alineación y detección de funciones
Introducción al punto flotante y SIMD de x86-64
Este artículo se ha creado con fines didácticos. Partimos de x86-64 user mode con SSE2; la familia AVX necesita soporte de CPU y estado habilitado por el SO.
Ver XMM no prueba que el código esté vectorizado. addss suma un float inferior y addps cuatro floats packed. El mismo almacenamiento sirve para operaciones escalares y packed.
XMM no es un tipo
packed float32 : 4 lanes × 32 bits
packed float64 : 2 lanes × 64 bits
scalar float32 : 32 bits inferiores
scalar float64 : 64 bits inferiores
packed int32 : 4 lanes × 32 bits
addss xmm0, xmm1
addsd xmm0, xmm1
addps xmm0, xmm1
addpd xmm0, xmm1
El opcode decide la interpretación. x87 usa un modelo antiguo de stack registers; SSE/SSE2 usa XMM y principalmente dos operandos; AVX añade YMM y tres operandos VEX; AVX-512 añade ZMM y máscaras.
Operaciones por lane y alineación
movups xmm0, [rcx]
movups xmm1, [rdx]
addps xmm0, xmm1
El resultado es [a0+b0, a1+b1, a2+b2, a3+b3], no una suma entera de 128 bits con carry entre lanes.
movaps xmm0, [rcx] ; aligned
movups xmm0, [rcx] ; unaligned
movdqa xmm0, [rcx]
movdqu xmm0, [rcx]
Una forma aligned puede fallar con una dirección incorrecta. La alineación de la asignación base no alinea automáticamente cada offset de campo; también importan cache lines y páginas.
Orden FP y NaN
La suma IEEE 754 no es asociativa. Una reducción vectorial cambia el orden y puede diferir bit a bit del escalar. El contrato debe cubrir tolerancia, NaN, infinito, signed zero, redondeo y opciones fast-math.
ucomiss xmm0, xmm1
jp unordered_case
ja above_case
NaN produce unordered. ucomiss y comiss difieren en excepciones; identifique el opcode real que creó los flags.
Shuffle, reducción y AVX
shufps xmm0, xmm1, imm8
pshufd xmm0, xmm1, imm8
Decodifique el immediate con el manual. Muchos shuffles indican conversión AoS/SoA, transpose, broadcast o reducción horizontal.
Antes de AVX verifique CPUID, soporte del SO para extended state, XGETBV para XMM/YMM y garantía de CPUs desplegadas. AVX no implica AVX2 ni AVX-512. vzeroupper evita en algunos límites penalizaciones legacy-SSE de ciertas CPUs.
System V suele tratar XMM como caller-saved; Microsoft x64 preserva los 128 bits bajos de xmm6–xmm15. ASM Windows requiere save/restore y unwind correctos.
Tail y overread
Longitudes no divisibles por el ancho vectorial necesitan tail escalar o máscara. Leer más allá porque “parece haber padding” viola contratos de objeto, página, sanitizer o concurrencia salvo garantía explícita de la API.
La autovectorización puede fallar por alias, dependencias, calls, strict FP, modelo de costes o ISA objetivo. Revise primero informes e intrinsics.
Resumen
XMM es almacenamiento de 128 bits; el opcode define scalar/packed y tipo de lane. SIMD procesa varios elementos, pero añade contratos de alineación, tail, reasociación FP, detección de funciones y preservación ABI. Demuestre corrección y mida luego la carga real.