L'auteur discute de son expérience dans l'optimisation d'une mise en œuvre en Rust de l'algorithme RaBitQ, qui est un algorithme de recherche de voisin le plus proche approximatif. Ils ont initialement utilisé la bibliothèque nalgebra mais ont trouvé qu'elle était plus lente que prévu. Ils ont ensuite utilisé des outils de profilage comme samply et le Profiler Firefox pour identifier les goulots d'étranglement dans le code. L'auteur a trouvé que les appels à f32::clone() prenaient beaucoup de temps et a décidé de préallouer la mémoire pour les vecteurs et de la réutiliser dans l'itération. Ils ont également mis en œuvre la fonction binarize_vector avec AVX2, ce qui a amélioré le QPS de 32% pour GIST. L'auteur a également utilisé la quantification scalaire pour éliminer plus d'appels à f32::clone() dans le code et a remplacé certaines fonctions nalgebra par des mises en œuvre manuelles. Ils ont également trouvé un autre crate algebra appelé faer, qui est optimisé avec SIMD et offre de meilleures performances d'itération de ligne et de colonne. L'auteur a également réimplémenté le produit de point binaire avec AVX2, ce qui a amélioré le QPS de 11% pour GIST.
dev.to
Improve an algorithm performance step by step
Create attached notes ...
