Introducción
- Bienvenido a la clase de lenguaje ensamblador de FFmpeg. Esta clase ofrece una base sobre cómo se escribe lenguaje ensamblador en FFmpeg.
Conocimientos necesarios
- Se requiere conocimiento del lenguaje C, especialmente sobre punteros.
- Se requiere conocimiento de matemáticas de nivel preparatoria/secundaria superior (escalares y vectores, suma, multiplicación, etc.).
¿Qué es el lenguaje ensamblador?
- El lenguaje ensamblador es un lenguaje de programación con el que se escribe código que corresponde directamente a las instrucciones que procesa la CPU.
- La mayor parte del código en ensamblador de FFmpeg es SIMD (Single Instruction Multiple Data), lo que también se conoce como programación vectorial.
- SIMD es adecuado para procesar grandes cantidades de datos almacenados secuencialmente en memoria, como imágenes, video y audio.
¿Por qué escribirlo en lenguaje ensamblador?
- Para acelerar la velocidad del procesamiento multimedia. Al escribir código en ensamblador, se puede obtener una mejora de velocidad de más de 10 veces.
- En FFmpeg se escribe ensamblador directamente sin usar intrinsics. Los intrinsics suelen ser entre 10 y 15% más lentos que el ensamblador hecho a mano.
Tipos de lenguaje ensamblador
- Esta clase se centra en el lenguaje ensamblador x86 de 64 bits. También se conoce como amd64 y funciona igualmente en CPUs Intel.
- En la sintaxis de ensamblador x86 hay dos variantes, AT&T e Intel, y se usará la sintaxis Intel.
Material de apoyo
- La programación en ensamblador de FFmpeg se enfoca en el procesamiento de imágenes de alto rendimiento y tiene un enfoque particular.
- Los diagramas del libro "The Art of 64-bit assembly" pueden ser de ayuda.
Registros
- Los registros son áreas dentro de la CPU donde se procesan los datos. La CPU no manipula la memoria directamente, sino que carga los datos en registros, los procesa y luego los vuelve a escribir en memoria.
Registros de propósito general
- Los registros de propósito general (GPR) pueden contener datos o direcciones de memoria. En el código ensamblador de FFmpeg, los GPR funcionan principalmente como apoyo.
Registros vectoriales
- Los registros vectoriales (SIMD) contienen múltiples elementos de datos. Existen varios tipos de registros vectoriales.
- La mayoría de los cálculos de compresión y descompresión de video se basan en enteros.
Inclusión de x86inc.asm
- x86inc.asm es una capa de abstracción ligera utilizada en FFmpeg, x264 y dav1d para facilitar el trabajo de los programadores de ensamblador.
Código ensamblador escalar sencillo
- Se explica cómo funciona el código ensamblador escalar a través de un ejemplo.
Entender una función vectorial básica
- A través del primer ejemplo de una función SIMD, se explica el significado de cada línea.
- Se usan instrucciones como
movu y paddb para realizar operaciones vectoriales.
- La función modifica los datos de sus argumentos y no devuelve ningún valor.
1 comentarios
Opiniones de Hacker News
Hay otro material sobre el mismo tema en los casos de FFmpeg y dav1d
Creo que usar intrínsecos tiene más valor que escribir ensamblador, pero fue muy útil leer esto
Creo que esta guía es excelente
Me pregunto si hay algún "placer" en aprender o implementar ensamblador
El sufijo "q" indica el tamaño del puntero, y en sistemas de 64 bits es 8
Elogio a la referencia de K&R
La desventaja de usar ensamblador es que el código depende de la arquitectura
Me confunde la oposición al ensamblador en línea
Este material es perfecto
Me pregunto si todavía es cierto que el ensamblador es 10 veces más rápido que C