Sortie de LLVM 3.9 et Clang 3.9, avec des optimisations LTO repensées pour consommer moins de mémoire
et de nouvelles analyses de code C et C++
La suite de compilateurs LLVM a vu une nouvelle version biannuelle paraître à la mi-août, avec quelques nouveautés intéressantes dans le domaine du calcul de haute performance (OpenCL, OpenMP), notamment, mais aussi pour diminuer les temps de compilation avec les optimisations lors de l’édition des liens (LTO).
Nouveautés pour LLVM
LLVM fournit un nouveau mode pour effectuer une passe LTO sur le code compilé. ThinLTO diminue drastiquement les besoins en mémoire et s’exécute nettement plus vite qu’une passe LTO habituelle, mais sans atteindre les mêmes gains en performance pour les exécutables générés. La manière de penser est radicalement différente : ThinLTO est prévu pour s’exécuter massivement en parallèle, en n’utilisant que des résumés des différents modules à optimiser pour les passes globales.
Au niveau des plateformes, LLVM peut générer des binaires pour les nouveaux processeurs Intel (génération Skylake, ainsi que les coprocesseurs Xeon Phi en utilisant les instructions AVX-512. Côté ARM, les processeurs Qualcomm Kryo et Broadcom Vulcan sont gérés (les cœurs Cortex M8 et l’architecture ARMv8.2-A le sont de manière expérimentale).
Pour effectuer ses optimisations, la suite de compilation utilise une analyse de la mémoire utilisée par le code, principalement des interactions entre les opérations. Celle-ci est, jusqu’à présent, effectuée par une passe MemoryDependenceAnalysis, dont les inconvénients sont la lenteur et le manque de précision. Elle devrait être remplacée par MemorySSA, dont la complexité algorithmique est linéaire en la taille du code (quadratique pour MemoryDependenceAnalysis). Cette passe travaille sur une représentation virtuelle des opérations en mémoire sous forme SSA.
Nouveautés pour Clang
Le compilateur phare autour du projet LLVM est, sans nul doute, Clang, un compilateur pour les langages de la famille du C (principalement, le C++, mais aussi Objective-C, OpenCL ou encore CUDA).
La version 3.9 implémente maintenant complètement OpenCL 2.0, avec des fonctionnalités comme la conversion entre les espaces d’adressage de l’hôte et du périphérique et de meilleurs messages de diagnostic pour les noyaux OpenCL.
Côté OpenMP, version 4.5 de la norme est maintenant complètement implémentée, à l’exception des parties sur le déchargement du code sur un accélérateur l’infrastructure est toujours en chantier — cela signifie que OpenMP est géré jusqu’à la version 3.1 complètement, puis seulement en partie pour les versions 4.0 et 4.5. Les nouveautés incluent des données membres dans des clauses statiques de fonctions non statiques et l’utilisation de telles variables comme itérateurs de boucle. Le code généré est aussi bien plus stable et rapide.
Comme pour chaque version, les analyses de code ont été améliorées. Pour cette fois, une nouvelle passe vérifie l’utilisation de l’API MPI. Sous Windows, les tests pour les fuites de mémoire, les doubles libérations de mémoire et les utilisations après libération sont activées par défaut.
Sources : notes de version de LLVM et de Clang.
Partager