veilletech.fr
21 août Feed du jour
#06 RUST Article

Rust 1.98 : le calcul flottant s'autorise plus

Deux gains de performance, sans unsafe.

Rust 1.98 ajoute des méthodes « algébriques » sur les flottants, qui autorisent le compilateur à réordonner les opérations pour vectoriser, et un formatage d'entiers sur tampon fourni dont les performances égalent la bibliothèque itoa.

2 min de lecturevidéo 1:09
Partager
Sommaire4 sections
  1. Ce qui se passe
  2. Les méthodes algébriques sur les flottants
  3. Le formatage d'entiers sur tampon
  4. À retenir

Ce qui se passe

Rust 1.98.0 est disponible en stable. Mise à jour habituelle via rustup update stable. Deux ajouts de bibliothèque standard méritent l'attention pour qui travaille la performance.

Les méthodes algébriques sur les flottants

Les types f32 et f64 reçoivent des méthodes dites algébriques pour l'addition, la soustraction, la multiplication, la division et le reste.

Leur raison d'être demande un détour par une propriété contre-intuitive : l'addition flottante n'est pas associative. Une somme comme a + b + c + d doit donc être évaluée dans l'ordre d'écriture, en associant à gauche — ((a + b) + c) + d — car regrouper autrement peut changer le résultat.

Ces méthodes lèvent cette contrainte. Elles autorisent le compilateur à optimiser en s'appuyant sur les propriétés des nombres réels, même si ces propriétés ne tiennent pas avec les limites de la représentation flottante. Le compilateur peut alors réordonner la somme, par exemple en (a + b) + (c + d), et évaluer les sommes partielles simultanément.

Le gain principal n'est d'ailleurs pas là : c'est la vectorisation des boucles, souvent débloquée par ces méthodes.

L'ensemble exact des optimisations n'est pas spécifié, et la documentation le compare à ce qu'on obtient avec l'option -ffast-math d'autres langages.

Le compromis est explicite. Ces méthodes sont non déterministes, puisque le compilateur reste libre de ses choix d'une compilation à l'autre. En revanche — et c'est la garantie qui compte en Rust — elles ne provoquent jamais de comportement indéfini.

Le formatage d'entiers sur tampon

Tous les types entiers primitifs reçoivent une méthode format_into, qui prend en paramètre un tampon dimensionné pour contenir la forme décimale de n'importe quelle valeur du type. Le tampon reste opaque, et la méthode renvoie la chaîne formatée, empruntée à ce tampon.

L'intérêt est de court-circuiter l'essentiel de la répartition dynamique qu'implique un formatage classique par macro. Les mesures publiées dans le dépôt de référence sur le sujet placent format_into au niveau de la bibliothèque itoa elle-même — au point de pouvoir la remplacer, ainsi que ses équivalentes.

À retenir

Deux optimisations obtenues sans quitter le code sûr : l'une en autorisant explicitement le compilateur à réordonner du calcul flottant, l'autre en supprimant une indirection sur un chemin très fréquenté.

Source : Rust Blog