Présentation
- Bienvenue au cours de langage assembleur de FFmpeg. Ce cours fournit les bases de la manière dont le langage assembleur est écrit dans FFmpeg.
Connaissances requises
- Une connaissance du langage C est nécessaire, en particulier des pointeurs.
- Des connaissances en mathématiques de niveau lycée sont nécessaires (scalaires et vecteurs, addition, multiplication, etc.).
Qu’est-ce que le langage assembleur ?
- Le langage assembleur est un langage de programmation qui permet d’écrire du code correspondant directement aux instructions traitées par le CPU.
- La majeure partie du code assembleur de FFmpeg utilise le SIMD (Single Instruction Multiple Data), aussi appelé programmation vectorielle.
- Le SIMD est bien adapté au traitement de grandes quantités de données stockées séquentiellement en mémoire, comme les images, la vidéo et l’audio.
Pourquoi écrire en langage assembleur ?
- Pour accélérer le traitement multimédia. Une implémentation en assembleur peut apporter un gain de performance de plus de 10x.
- Dans FFmpeg, on écrit directement le code assembleur sans utiliser d’intrinsics. Les intrinsics sont en général 10 à 15 % plus lents que de l’assembleur écrit à la main.
Types de langage assembleur
- Ce cours se concentre sur le langage assembleur x86 64 bits. Il est aussi connu sous le nom d’amd64 et fonctionne également sur les CPU Intel.
- Il existe deux syntaxes pour l’assembleur x86 : AT&T et Intel, et nous utiliserons la syntaxe Intel.
Ressources complémentaires
- La programmation assembleur dans FFmpeg est centrée sur le traitement d’image haute performance et adopte une approche particulière.
- Les schémas du livre "The Art of 64-bit assembly" peuvent être utiles.
Registres
- Les registres sont les zones où le CPU traite les données. Le CPU ne manipule pas directement la mémoire : il charge les données dans les registres, les traite, puis les réécrit en mémoire.
Registres à usage général
- Les registres à usage général (GPR) peuvent contenir des données ou des adresses mémoire. Dans le code assembleur de FFmpeg, les GPR servent principalement d’appui.
Registres vectoriels
- Les registres vectoriels (SIMD) contiennent plusieurs éléments de données. Il existe différents types de registres vectoriels.
- La plupart des calculs de compression et de décompression vidéo reposent sur des entiers.
Inclusion de x86inc.asm
x86inc.asm est une couche d’abstraction légère utilisée dans FFmpeg, x264 et dav1d pour faciliter le travail des programmeurs assembleur.
Code assembleur scalaire simple
- Le fonctionnement du code assembleur scalaire est expliqué à l’aide d’un exemple.
Comprendre une fonction vectorielle de base
- Un premier exemple de fonction SIMD explique la signification de chaque ligne.
- Des instructions comme
movu et paddb sont utilisées pour effectuer des opérations vectorielles.
- La fonction modifie les données de ses arguments et ne renvoie aucune valeur.
1 commentaires
Commentaire Hacker News
Il existe aussi d'autres ressources sur le même sujet, comme les cas de FFmpeg et de dav1d
Je pense qu'utiliser des fonctions intrinsèques a plus de valeur qu'écrire de l'assembleur, mais la lecture de ce document a été très utile
Je trouve ce guide excellent
Je me demande s'il y a du « plaisir » à apprendre ou à pratiquer l'assembleur
Le suffixe "q" indique la taille d'un pointeur, qui vaut 8 sur un système 64 bits
Des compliments sur la référence à K&R
L'inconvénient de l'utilisation de l'assembleur est que le code dépend de l'architecture
L'opposition à l'assembleur inline est déroutante
Cette ressource est parfaite
Je me demande s'il est toujours vrai que l'assembleur est 10 fois plus rapide que le C