Le couteau suisse pour les simulations atomiques
Après presque 3 ans de développement, la version beta 0.11 de Atomsk a été rendue disponible début 2021. Cette version améliore les performances grâce à une ré-écriture de certains algorithmes, ou bien grâce à la parallélisation avec OpenMP. Ces améliorations sont présentées ci-dessous.
D'importantes améliorations des performances ont été possibles grâce à la parallélisation du code avec OpenMP. Désormais, Atomsk peut créer plusieurs processus pour tirer parti de tous les cœurs du processeur de votre machine.
Qu'est-ce que cela veut dire ? Auparavant (version 0.10.6 et antérieures), Atomsk ne pouvait s'exécuter que sur un seul processus, ce qui signifie qu'il n'utilisait qu'un seul cœur de processeur. Or, la plupart des ordinateurs modernes ont un processeur doté de plusieurs cœurs. Par exemple, si votre processeur possède 4 cœurs, cela signifie que Atomsk ne pouvait exploiter que 25% de la puissance de calcul de votre ordinateur. Maintenant avec la version beta-0.11, Atomsk peut utiliser jusqu'à 100% de la capacité de calcul, ce qui le rend plus rapide.
Notez que seules certaines partie spécifiques du code sont réellement parallélisées. La majeure partie du code n'est pas parallélisée, donc ne vous attendez pas à ce que votre processeur soit utilisé à 100% à chaque fois que vous exécutez Atomsk, mais seulement lorsque vous réaliserez certaines opérations.
Pendant longtemps, Atomsk a utilisé l'algorithme "bubble sort" pour trier ses tableaux, en particulier les listes d'atomes. Cet algorithme est l'un des plus simples à implémenter, mais il est aussi très inefficace, avec un temps d'exécution proportionnel à N2 où N est le nombre d'atomes. Depuis la version beta-0.9, Atomsk utilise l'algorithme "Quick sort" qui est bien plus rapide, avec un temps d'exécution proportionnel à N. Bien qu'il ne s'agisse pas d'une nouvelle addition à la version beta-0.11, ce gain de performance vaut la peine d'être souligné. Cet algorithme de tri est utilisé par les options "-sort" et "-select".
L'option "-orthogonal-cell" a été introduite dans la version beta-0.10. Elle permet de convertir une boîte de géométrie arbitraire en une boîte orthogonale, tout en préservant la périodicité du cristal. Pour cela, elle calcule des combinaisons linéaires des vecteurs de boîte initiaux, et tente de trouver des combinaisons alignées avec les axes cartésiens X, Y et Z.
Telle qu'implémentée initialement, cette option n'était pas très efficace. Souvent elle ne parvenait pas à trouver une boîte orthogonale, ou prenait un temps fou pour la remplir avec des atomes. Cette option a été améliorée dans la version beta-0.11 : non seulement le nouvel algorithme est plus robuste et devrait trouver plus facilement une boîte orthogonale, mais il est également parallélisé avec OpenMP pour une rapidité accrue.
L'option "-select" est l'une des plus versatiles dans Atomsk. Elle permet de sélectionner des atomes selon plusieurs critères, et aussi de combiner plusieurs sélections (voir ce tutoriel en anglais).
L'une des possibilités est de demander à Atomsk de sélectionner un certain nombre d'atomes au hasard. Dans les versions précédentes (beta-0.10.6 et antérieures), cette option avait de très mauvaises performances, avec un temps d'exécution qui augmentait exponentiellement avec le nombre d'atomes. Cela rendait cette option pratiquement impossible à utiliser dans les systèmes qui comptaient plus que quelques centaines de milliers d'atomes.
L'algorithme pour sélectionner des atomes au hasard a été complètement changé, amenant de bien meilleures performances. Le nouvel algorithme a un temps d'exécution proportionnel au nombre d'atomes, et est incomparablement plus efficace dans les systèmes contenant des millions d'atomes.
Une autre possibilité de l'option "-select" est de sélectionner des atomes à l'intérieur d'une forme 3-D depuis un fichier au format STL (voir ce tutoriel en anglais). Dans la version beta-0.11, cette routine a été parallélisée avec OpenMP : elle peut désormais utiliser tous les cœurs de votre processeur. Le graphe ci-dessous compara l'ancienne version beta-0.10.6 qui n'était pas parallélisée (1 seul processus), avec la nouvelle version beta-0.11 exécutée sur un processeur à 8 cœurs.
Au vu de la liste d'articles citant Atomsk, le mode "--polycrystal" semble être l'un des plus populaires. Il permet de générer un polycristal en partant de n'importe quelle structure initial, qu'il s'agisse d'une maille élémentaire, ou d'un cristal contenant des macles, dislocations ou d'autres défauts.
Dans la version beta-0.11, le mode "--polycrystal" a été modifié pour être plus robuste. Il a aussi été parallélisé avec OpenMP, améliorant sensiblement ses performances. Bien que le gain ne soit pas aussi impressionnant que les options citées auparavant, les utilisateurs apprécieront sans doute le gain de temps. Le premier graphe ci-dessous montre le temps nécessaire à Atomsk pour construire un polycristal de 12 grains, en fonction du nombre d'atomes. Le second graphe montre le temps en fonction du nombre de grains, pour un polycristal de 4 millions d'atomes.