Dans le prolongement de la réponse de moyner , la puce intégrée sqrt
est généralement une rsqrt
, c'est-à-dire une racine carrée réciproque qui calcule . Donc, si dans votre code vous n'utilisez que1/r(si vous faites de la dynamique moléculaire, vous l'êtes), vous pouvez calculerdirectement et vous épargner la division. La raison pour laquelleest calculé au lieu deest que son itération de Newton n'a pas de divisions, seulement des additions et des multiplications.a → 1 / a--√1 / rr = rsqrt(r2)
rsqrt
sqrt
En remarque, les divisions sont également calculées de manière itérative et sont presque aussi lentes que rsqrt
dans le matériel. Si vous recherchez l'efficacité, vous feriez mieux d'essayer de supprimer les divisions superflues.
Certaines architectures plus modernes telles que les architectures POWER d'IBM ne fournissent pas en rsqrt
soi, mais une estimation précise sur quelques bits, par exemple FRSQRTE . Lorsqu'un utilisateur appelle rsqrt
, cela génère une estimation puis une ou deux (autant que nécessaire) itérations de l'algorithme de Newton ou de Goldschmidt en utilisant des multiplications et des ajouts réguliers. L'avantage de cette approche est que les étapes d'itération peuvent être canalisées et entrelacées avec d'autres instructions sans bloquer le FPU (pour une très belle vue d'ensemble de ce concept, bien que sur des architectures plus anciennes, voir la thèse de doctorat de Rolf Strebel ).
Pour les potentiels d'interaction, l' sqrt
opération peut être entièrement évitée en utilisant un interpolant polynomial de la fonction potentielle, mais mon propre travail (implémenté dans mdcore
) dans ce domaine montre que, au moins sur les architectures de type x86, l' sqrt
instruction est assez rapide.
Mise à jour
Étant donné que cette réponse semble attirer un peu l'attention, je voudrais également répondre à la deuxième partie de votre question, à savoir est-ce que cela vaut vraiment la peine d'essayer d'améliorer / d'éliminer les opérations de base telles que sqrt
?
Dans le contexte des simulations de dynamique moléculaire ou de toute simulation basée sur des particules avec des interactions à coupure limitée, il y a beaucoup à gagner de meilleurs algorithmes pour la recherche de voisins. Si vous utilisez des listes de cellules , ou quelque chose de similaire, pour trouver des voisins ou créer une liste Verlet , vous calculerez un grand nombre de distances erronées par paire. Dans le cas naïf, seulement 16% des paires de particules inspectées se trouveront réellement dans la distance de coupure les unes des autres. Bien qu'aucune interaction ne soit calculée pour de telles paires, l'accès aux données de particules et le calcul de la distance par paires parasites ont un coût élevé.
Mon propre travail dans ce domaine ( ici , ici et ici ), ainsi que celui d'autres (par exemple ici ), montre comment ces calculs parasites peuvent être évités. Ces algorithmes de recherche de voisins dépassent même les listes de Verlet, comme décrit ici .
Le point que je tiens à souligner est que bien qu'il puisse y avoir des améliorations à gagner d'une meilleure connaissance / exploitation de l'architecture matérielle sous-jacente, il y a aussi des gains potentiellement plus importants à repenser les algorithmes de niveau supérieur.
rsqrtps
et AVXvrsqrtps
sont également des estimations, ils obtiennent les 11 à 12 premiers bits corrects et vous devez affiner avec une ou deux itérations de Newton si vous voulez plus de précision. Ce sont des instructions 5/1 et 7/1 (latence / débit inverse) sur Sandy Bridge (voir les documents Intel ou les tableaux d'instructions d'Agner Fog qui sont comparables à la multiplication. En revanche, la précision complète(v)sqrtps
(ou double précision(v)sqrtpd
) prend 10-43 / 10-43 (voir les tableaux d'instructions pour plus de détails).La racine carrée est implémentée dans le matériel sur la plupart des processeurs, c'est-à-dire qu'il existe des instructions d'assemblage spécifiques et que les performances doivent être comparables dans la plupart des langues car il est très difficile de foirer l'implémentation. Vous ne pourrez probablement jamais battre l'instruction FSQRT, car elle a été conçue par un concepteur de matériel intelligent.
La façon dont elle est implémentée dans le matériel peut varier, mais il s'agit probablement d'une sorte d'itération à point fixe, par exemple la méthode de Newton-Raphson qui effectue un nombre spécifique d'itérations jusqu'à ce que le nombre de chiffres requis soit calculé. Les méthodes itératives en matériel sont en général beaucoup plus lentes que les autres opérations, car plusieurs cycles doivent être achevés avant que le résultat ne soit prêt.
Il y a aussi quelques instructions Streaming SIMD qui peuvent être utilisées sur les registres XMM pour des calculs vectoriels rapides trouvés ici . Ces registres sont assez petits, mais si vous avez un nombre connu de coordonnées (par exemple, un système de coordonnées cartésiennes tridimensionnelles), elles peuvent être un peu plus rapides.
Si votre langue est suffisamment bas, vous pouvez toujours taper à une précision inférieure ou utiliser un nombre de précision inférieur pour vos coordonnées. La précision simple est souvent plus que suffisante, et d'après ce dont je me souviens, elle sera plus rapide lors du calcul des racines carrées car les itérations peuvent être terminées plus tôt.
Il devrait être assez facile de comparer différentes langues: il suffit d'écrire une longue série de nombres aléatoires dans un fichier, de le charger dans différentes langues, puis de chronométrer les racines carrées.
la source
Il peut y avoir des améliorations de performances, mais il faut d'abord établir le profil pour savoir que le calcul de l'inverse du sqrt est le goulot d'étranglement (et non, par exemple, le chargement des positions et la sauvegarde des forces).
Le projet GROMACS MD est né d'une idée d'exploiter les détails du format à virgule flottante IEEE pour créer un schéma d'itération de Newton-Raphson pour calculer une approximation acceptable de l'inverse de la racine carrée (voir l'annexe B.3 de http: / /www.gromacs.org/Documentation/Manual ), mais il n'y a pas de CPU HPC en cours d'utilisation où GROMACS utilise toujours cette idée.
la source