Impact des compilateurs sur les architectures CPU x86/x64

Tags : AMD; Intel;
Publié le 28/02/2012 par
Imprimer
Générique, ciblé, dispatché
Si nous avons parlé de la manière dont sont prises en compte les différents modèles de processeurs dans les optimisations que proposent les compilateurs, nous avons éludé la question la plus importante : comment arriver à réaliser un programme qui fonctionne de manière optimale sur tous les processeurs existants ?

Malheureusement, les compilateurs ne répondent pas réellement à cette question. Les développeurs ont donc plusieurs choix :
     Privilégier la compatibilité
C'est l'option la plus simple, et souvent celle choisie par les développeurs : réaliser un seul fichier exécutable dont l'intégralité du code fonctionnera sur tous les processeurs x86 modernes (généralement, à partir du Pentium Pro). Le compilateur ne génèrera alors aucun code utilisant les jeux instructions SSE ou AVX. C'est le mode de fonctionnement par défaut des compilateurs.
     Multiples builds
Les compilateurs étant particulièrement doués pour réaliser des versions spécifiques pour un modèle de processeur donné, les développeurs peuvent simplement réaliser plusieurs versions (on parle de builds) optimisées chacune pour différents types de processeurs.

On pourra ainsi trouver pour certains projets (très souvent des projets open source) des versions classiques, ainsi que des versions SSE2 ou autre (ces builds SSE2 utilisant les opérations arithmétiques SSE2 en lieu et place du x87).
     Dispatcher manuel
Les développeurs qui utilisent du code assembleur peuvent choisir de réaliser de multiples builds, mais ils peuvent également choisir la voix du dispatcher. Le concept est relativement simple, ajouter au démarrage du programme une vérification sur les capacités du processeur sur lequel on tourne. Dans ce cas, les développeurs peuvent aller très loin et proposer des sections assembleur pour de nombreux modèles de processeurs (des accélérations SSE, SSE2, AVX, etc...), y compris qui ne soient pas x86 (on peut trouver du code NEON, les instructions SIMD gérées par les processeurs ARM). Cela réclame un travail important de la part des développeurs. x264 propose un tel dispatcher.
     Dispatcher automatique
La dernière option consiste à demander au compilateur de générer une version du programme qui inclut un dispatcher. En plus d'une version basique fonctionnant partout, il peut ainsi être ajouté, par le compilateur, des optimisations ciblant un processeur donné. On peut ainsi profiter d'une large compatibilité, et de performances évoluées sur un modèle de processeur donné. En théorie, cela semble parfait...
Vos réactions

Top articles