Quel est le coût de calcul de

26

L'un des principaux problèmes auxquels nous devons faire face dans les simulations moléculaires est le calcul des forces dépendantes de la distance. Si nous pouvons restreindre les fonctions de force et de distance pour avoir des puissances égales de la distance de séparation , alors nous pouvons simplement calculer le carré de la distance et ne pas avoir à nous soucier de . S'il y a des puissances impaires, cependant, nous devons traiter .rr2=rrrr=r2

Ma question est: combien coûte l'informatique telle qu'implémentée dans les bibliothèques de langages courants (C / C ++, Fortran, Python), etc.? Y a-t-il vraiment beaucoup d'améliorations de performances à effectuer en ajustant manuellement le code pour des architectures spécifiques?X

aeismail
la source

Réponses:

39

Dans le prolongement de la réponse de moyner , la puce intégrée sqrtest 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.une1/une1/rr = rsqrt(r2)rsqrtsqrt

En remarque, les divisions sont également calculées de manière itérative et sont presque aussi lentes que rsqrtdans 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 rsqrtsoi, 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' sqrtopé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' sqrtinstruction 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.

Pedro
la source
6
SSE rsqrtpset AVX vrsqrtpssont é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).
Jed Brown
@JedBrown: Merci de l'avoir signalé! J'avais oublié que SSE et ses extensions le fournissent également.
Pedro
16

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.

moyner
la source
0

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.

mabraham
la source