Auto-génération de routines pour une bibliothèque d'abstraction de fonctions intrinsèques SIMD

Présentation du sujet

Contexte

Les processeurs contemporains intègrent quasiment tous désormais des jeux d’instructions dits SIMD (Single Instruction Multiple Data), tels qu’AVX sur les processeurs Intel & AMD, NEON et SVE sur le processeurs ARM, ou plus récemment l’extension V de l’architecture RISC-V (RVV). L’exploitation de ces jeux d’instruction est importante car ils offrent un potentiel de gain de performances substanciel et à moindre coût.

L’emploi de ces jeux d’instructions implique soit 1) l’utilisation de compilateurs capables d’auto-vectoriser des codes sources séquentiels, soit 2) l’utilisation de pseudo-fonctions “intrinsèques”, que le compilateur remplace directement par les instructions SIMD correspondantes, soit 3) l’utilisation de code assembleur. La solution 1) est directement dépendante de la capacité (ou non) du compilateur choisi à vectoriser le code source considéré, et le cas échéant à produire (ou non) un code vectorisé efficace. La solution 3) est extrêmement couteuse en développement et maintenance, et n’est en pratique limitée qu'à de rares situations de nécessité absolue. La solution 2) basée sur l’usage de pseudo-fonctions intrinsèques présente donc un compromis intéressant entre le contrôle du code vectorisé produit et le coût de développement.

Bibliothèque MIPP

L’usage de pseudo-fonctions intrinsèques présente néanmoins une limitation importante en termes de portabilité, car chaque jeu d’instructions vectoriel vient avec son propre jeu de pseudo-fonctions intrinsèques spécifique. La bibliothèque C++ MIPP (lien GitHub), développée par l'équipe STORM (Inria & LaBRI) ainsi que par le LIP6 (Sorbonne Université) et plus récemment l’IFPEN, permet de réduire ce problème de portabilité en proposant une interface de programmation abstraite au-dessus de divers jeux de fonctions intrinsèques. Elle supporte actuellement les jeux d’instructions SSE / AVX / AVX-512 (Intel & AMD) ainsi que ARM NEON & SVE (partiellement). Elle permet grâce à son interface de programmation abstraite d'écrire des programmes indépendamment du jeu d’instructions sélectionné. Par ailleurs, l’utilisation de techniques de programmation générique C++ et d'inlining, le coût de cet abstraction est essentiellement éliminé à la compilation.

Objectifs

La maintenance et l'évolution de la bibliothèque MIPP est cependant relativement couteuse pour prendre en compte de nouveaux jeux d’instructions, et nécessite un effort de développement conséquent, répétitif et assez fastidieux. L’aspect répétitif de ce travail invite l’idée d’automatiser au-moins partiellement ce processus. C’est l’objet du travail proposé dans ce sujet de stage.

Un premier prototype d’approche par génération de code a été développé par Adrien Cassagne, auteur et développeur principal de la bibliothèque AFF3CT, comme preuve de concept. L’objectif est donc de construire sur ce prototype, et de le faire évoluer, de façon à permettre à la fois la prise en charge de jeux d’instructions SIMD à registres de taille pré-déterminée tels que SSE, AVX et NEON, et les nouveaux jeux SIMD à registres de taille abstraite tels que SVE (ARM) et RVV (RISC-V).

Mots-clés:

Calcul intensif, vectorisation, génération de code

Pré-requis:

  • Maîtrise de la programmation en langages C et C++
  • Maîtrise de la programmation Python
  • Maîtrise du développement en environnement Unix
  • Bon niveau d’anglais oral et écrit

Contacts:

  • Olivier Aumage (olivier.aumage@inria.fr) Centre de recherche Inria Bordeaux – Sud-Ouest 200 avenue de la vieille tour 33405 TALENCE

Lieu du stage:

  • Inria Bordeaux, équipe STORM
  • Possibilité de visite au laboratoire SIMULA, à Oslo en Norvège