Bilan 2025 des publications et de la vie scientifique de la Direction des applications militaires
Juillet 2026

Julia : un langage de programmation pour les supercalculateurs de demain ?

Les codes de simulation doivent être adaptés pour suivre les changements fréquents d’architectures des supercalculateurs ; cela engendre un travail considérable pour les experts en développement de codes et en calcul haute performance. Pour rendre l’évolution des codes plus fluide, le CEA ‑ DAM a exploré les capacités du langage de programmation Julia [1].

Le cycle de vie d’un code de simulation au CEA - DAM se compte souvent en décennies, alors que les supercalculateurs sont renouvelés tous les cinq à sept ans. À cette contrainte usuelle d’évolution matérielle s’est ajoutée récemment l’arrivée des cartes graphiques accélérateurs de calcul (GPU). Celles-ci sont mieux adaptées à certaines simulations sur les supercalculateurs que les processeurs classiques (CPU) seuls. Utiliser l’un ou l’autre de manière interchangeable impose désormais de disposer de modèles de programmation avancés permettant d’offrir de hautes performances dans tous les cas. Développer un code de simulation performant est un travail considérable : il devient impératif qu’il soit également portable, c’est-à-dire qu’il puisse fonctionner sur tout type de matériel d’aujourd’hui et de demain, sans travail majeur de réécriture. La portabilité devient ainsi un enjeu d’importance en calcul haute performance pour l’efficacité, la pérennité et la flexibilité de codes de simulation.

Les logiciels actuels sont majoritairement basés sur le langage C++ (p. ex. Arcane, Kokkos [2]) et toutes sont complexes, pouvant nécessiter des adaptations constantes de la part des équipes de développement. Julia, un langage de programmation conçu originellement aux États-Unis pour le calcul scientifique, a été proposé comme solution unifiant les besoins des développeurs et des utilisateurs avec des performances similaires à celles de langages comme Fortran ou C++ [3]. Grâce à ses nombreuses bibliothèques bâties par la communauté, il est utilisable sur accélérateurs GPU [4] et utilisé dans de nombreux domaines. Afin d’évaluer ce langage pour le calcul haute performance, il faut s’assurer qu’il est aussi performant que les solutions préexistantes : nous avons évalué la portabilité des performances de Julia sur plusieurs configurations matérielles de grande taille, en les comparant à celles obtenues avec C++ Kokkos [1].

Les deux langages de programmation ont été utilisés dans le cas de simulations d’écoulement de matière, importantes pour le CEA - DAM, l’objectif étant d’obtenir des performances similaires et satisfaisantes sur différents types d’architectures matérielles. Les résultats sur processeur classique (figure 1a) montrent que le code écrit en Julia offre des performances très compétitives par rapport à celles obtenues avec le code C++ Kokkos. Les enjeux de portabilité sont plus importants sur accélérateurs GPU où les capacités du matériel varient fortement entre les différents constructeurs (Nvidia, AMD, etc.). La figure 1b montre que C++ Kokkos et Julia peuvent tous deux utiliser efficacement des architectures d’accélérateur différentes. Contrairement à Kokkos, qui propose une solution complète pour réutiliser le même code avec ou sans accélérateur, Julia y parvient en combinant de multiples bibliothèques développées par la communauté.

Le dernier point examiné concerne les simulations à très grande échelle qui nécessitent de faire communiquer des centaines, voire des milliers, de processeurs. La solution de référence pour réaliser les communications est la bibliothèque de passage de messages MPI (Message Passing Interface), parfaitement compatible avec Julia : la figure 2 l’illustre en utilisant 128 accélérateurs Nvidia simultanément. D’autres essais, réalisés sur plus de 2 000 processeurs classiques, ont montré que l’utilisation de Julia et de ses bibliothèques pouvait certes ralentir le démarrage du calcul de quelques minutes (compilation à la volée), sans affecter toutefois les performances du reste de l’application.

Il existe donc des solutions alternatives à C++ qui garantissent la portabilité des performances compatible avec les usages du calcul haute performance au CEA - DAM. Par rapport au C++, Julia donne la possibilité de simplifier le travail des développeurs de codes, sans impacter négativement les capacités d’optimisation. Certes, Julia reste aujourd’hui peu utilisé dans l’industrie, car beaucoup d’outils (analyse de code, débuggage, etc.) ne supportent pas correctement ce langage, ce qui réduit fortement son attractivité. Néanmoins, Julia permet d’explorer d’autres méthodes de travail grâce à la nature dynamique et interactive du langage. De telles méthodes pourraient à terme s’avérer plus adaptées à chaque type d’utilisateur en offrant une programmation plus aisée qu’actuellement.

L. Briand, H. Jourdren, M. Pérache CEA - DAM, centre DAM Île-de-France

figure 1

Performances sur [a] processeur classique AMD Milan (64 cœurs de calcul) et [b] avec accélérateur GPU Nvidia A100 et accélérateur AMD MI250 des deux implémentations du solveur en fonction du nombre de mailles. À l’aide de bibliothèques développées par la communauté, Julia atteint les mêmes niveaux de performance que Kokkos, et le dépasse sur processeur classique pour les petits maillages (< 107  mailles). Sur GPU AMD, Julia égale Kokkos, ce qui n’est pas le cas sur GPU Nvidia, où il reste encore à répliquer des optimisations faites par Kokkos qui ne le sont pas en Julia.

figure 2

Mesures de performances à grande échelle en employant jusqu’à 128 GPU Nvidia A100, 512 processeurs classiques AMD Milan et 2 048 processeurs Intel Xeon Phi, en utilisant le code écrit en Julia. Les processeurs se partagent équitablement le travail et doivent pour cela communiquer. Avec de grands nombres de processeurs, ces communications peuvent entraîner une perte d’efficacité et la performance n’est plus proportionnelle au nombre de processeurs.

références

1

L. Briand, H. Jourdren, M. Pérache « Julia versus C++ Kokkos for performance portable cartesian CFD solvers on heterogeneous architectures », The International Journal of High Performance Computing Applications, https://doi.org/10.1177/10943420251341179, 39, p. 481-501 (2025).

2

C. R. Trott et al. « Kokkos 3: Programming model extensions for the exascale era », IEEE Transactions on Parallel and Distributed Systems, https://doi.org/10.1109/TPDS.2021.3097283, 33, p. 805-817 (2022).

3

J. Bezanson, A. Edelman, S. Karpinski, V. B. Shah « Julia: A fresh approach to numerical computing », SIAM Review, https://doi.org/10.1137/141000671, 59, p. 65-98 (2017).

4

T. Besard, C. Foket, B. De Sutter « Effective extensible programming: Unleashing Julia on GPUs », IEEE Transactions on Parallel and Distributed Systems, https://doi.org/10.1109/TPDS.2018.2872064, 30, p. 827-841 (2019).