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).