Question

Je travaille sur une dynamique des fluides de Navier-Stokes solveur qui devrait fonctionner en temps réel. Par conséquent, la performance est importante.

En ce moment, je regarde un certain nombre de boucles serrées que chaque compte pour une part importante du temps d'exécution: il n'y a pas seul goulet d'étranglement. La plupart de ces boucles font un peu d'arithmétique à virgule flottante, mais il y a beaucoup de ramifications entre.

Les opérations à virgule flottante sont pour la plupart limitées à des additions, soustractions, multiplications, divisions et comparaisons. Tout cela se fait en utilisant des flotteurs 32 bits. Ma plate-forme cible est x86 avec au moins SSE1 instructions. (I ai vérifié dans la sortie de l'assembleur que le compilateur génère en effet des instructions SSE).

La plupart des valeurs à virgule flottante que je travaille ont une assez petite borne supérieure et la précision des valeurs proches de zéro n'est pas très important. Ainsi, la pensée me vint: peut-être passer à l'arithmétique point fixe pourrait accélérer les choses? Je sais que la seule façon d'être est vraiment sûr de le mesurer, qui pourrait prendre des jours, donc je voudrais connaître les chances de réussite au préalable.

point fixe était l'arrière de la rage dans les jours de Doom, mais je ne suis pas sûr où il se anno 2010. Compte tenu de la quantité de silicium est pompé de nos jours dans la performance en virgule flottante, est-il une chance que point fixe arithmétique va encore me donner un coup de pouce significatif de la vitesse? Quelqu'un at-il une expérience du monde réel qui peut demander à ma situation?

Était-ce utile?

La solution

Comme d'autres l'ont dit, si vous utilisez déjà SIMD à virgule flottante, je doute que vous aurez beaucoup d'amélioration au point fixe.

Vous avez dit que le compilateur émet des instructions SSE, mais il ne semble pas que vous avez essayé d'écrire votre code SSE vectorisé. Je ne sais pas à quel point les compilateurs sont généralement à cela, mais il y a quelque chose à mener une enquête.

Deux autres zones à regarder sont:

  1. Accès à la mémoire - si tous vos calculs sont effectués en ESS, puis erreurs de cache pourrait prendre plus de temps que le calcul réel.

    1. Vous pouvez précharger des données avec par exemple _mm_prefetch ou __builtin_prefetch (selon votre compilateur / plate-forme).
    2. Vérifiez vos fonctions coûteuses pour aliasing entre les entrées et sorties; ceux-ci peuvent conduire à la mémoire supplémentaire lecture / écriture.
    3. Envisagez de stocker vos données différemment - si votre solveur fluide solveurs pour coordonnées x indépendamment de son y, il pourrait être plus convivial cache pour les stocker dans différents tableaux. Si elles sont résolues pour ensemble, envisager entrelacer (par exemple x y x y ...)
  2. déroulage - vous devriez être en mesure d'obtenir un avantage de performance de vos boucles internes dérouler. L'objectif est de ne pas (comme beaucoup de gens pensent) pour réduire le nombre de contrôles de terminaison de boucle. Le principal avantage est de permettre des instructions indépendantes à entrelacer, pour masquer la latence d'instruction. Il présentation intitulé VMX Optimisation: Taking it un niveau qui pourrait aider un peu; il est axé sur les instructions altivec sur Xbox360, mais certains des conseils déroulage pourrait aider sur SSE ainsi.

Comme d'autres l'ont mentionné, le profil, le profil, le profil. Et puis laissez-nous savoir ce qui est encore lent:)

PS - sur un de vos autres messages , je vous convaincu d'utiliser SOR au lieu de Gauss-Seidel dans votre solveur de matrice. Maintenant que je pense, est-il une raison que vous n'êtes pas à l'aide d'un solveur tri-diagonale?

Autres conseils

Memory Stick avec virgule flottante. point fixe est vraiment utile que si vous pouvez travailler dans les 8 bits ou 16 bits et utiliser SIMD (traitement d'image et audio sont des cas d'utilisation typique).

processeurs modernes ont généralement 2 FPU et vous pouvez émettre jusqu'à 2 FP instructions par cycle d'horloge. Vous avez également la possibilité d'alors l'optimisation en utilisant 4 voies FP SIMD (SSE).

Si vous avez encore du mal à obtenir de bonnes performances puis essayez d'utiliser un meilleur compilateur, comme la CCI d'Intel. En outre, Intel 64 executables bits ont tendance à être un peu plus rapide que leurs homologues 32 bits en raison du nombre accru de registres dans le modèle 64 bits, donc construire 64 bits si vous le pouvez.

Et bien sûr, vous devriez le profil de votre code aussi, afin que vous sachiez pour certains où les points chauds sont. Vous ne dites pas ce que OS que vous utilisez, mais VTune sur Windows, Zoom sur Linux ou Shark sur Mac OS X tout ce que vous aide à trouver rapidement et facilement vos goulots d'étranglement.

Votre machine est assez bien optimisé pour virgule flottante, de sorte que vous ne serez probablement pas économiser beaucoup en allant à des fractions de point fixe.

Vous dites qu'il n'y a pas un seul goulot d'étranglement, mais il peut y avoir plusieurs, et si vous parvenez à raser l'un d'eux, alors les autres prendront des pourcentages plus élevés du temps restant, attirer votre attention sur eux, afin que vous puissiez les raser aussi.

Vous avez probablement fait cela, mais je veillerait non seulement que les fonctions qui prennent du temps sont aussi vite que possible, mais ils sont appelés plus que nécessaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top