La mise en œuvre rapide des fonctions trigonométriques pour c++

Version courte: j'aimerais savoir s'il existe des implémentations de la norme fonctions trigonométriques qui sont plus rapides que celles incluses dans math.h.

Version longue: j'ai un programme assez lourd sur les objets numériques (c'est une simulation physique) et que les besoins à l'appel de fonctions trigonométriques, surtout sin et cos, beaucoup. Actuellement, je suis tout simplement en utilisant les implémentations inclus dans math.h. Profilage montre que les appels à ces fonctions de coût plus que je m'attendais (en espérant).

Alors qu'il est certainement plus beaucoup de place pour l'optimisation dans d'autres parties du code, plus rapides sin et cos pourrait me donner quelques autres pour cent. Donc, avez-vous des suggestions?

Dans un autre post l'utilisation de tables de consultation est suggéré. Mais peut-être qu'il existe des alternatives? Ou ready-made et testé de recherche de solutions, dans certaines bibliothèques?

  • La plupart des fast-des êtres transcendantaux sont orientées vers les moteurs de jeu, qui ne se soucie pas que beaucoup au sujet de l'exactitude. Quelle est l'importance de la précision à votre problème?
  • Profil en premier. "peut donner un certain pourcentage supplémentaire" n'est pas la peine d'essayer de l'optimiser.
  • Comme indiqué dans ma question, je SUIS de profilage et de mon attente serait "un couple de pour cent" dans l'exécution, peut-être de 2% ou 3%, mais c'est une estimation très approximative certainement. Mais avec des durées maximales de l'ordre de jours, n'importe quel pourcentage je peux obtenir, peut-être bien la peine..
  • Les tables de recherche type de 1985. Les Processeurs modernes sont beaucoup plus rapides à effectuer des calculs de lecture de la mémoire. À moins que votre table de recherche est très petite, et vous faites beaucoup de sin/cos dans un lot, donc vous avez la garantie que le LUT au niveau-1 cache c'est pas la peine. J'ai vu minimax polys dans l'ESS lancer efficacement dans 18-20 cycles (pipelining ftw). C'est environ deux fois plus que le meilleur des cas pour un LUT, et légèrement plus rapide que la moyenne des cas, surtout si vous faites autre chose que la forme synthétique de référence (mais, il n'enlève pas les lignes de cache à partir d'un autre code).
  • Oui, ce serait finalement la question. Je serais éventuellement avoir à le tester, mon instinct me dit que la précision d'-à-dire 4 ou 5 chiffres serait suffisant dans la plupart des endroits..
  • Cependant, comme les précédents intervenants ont déjà laissé entendre, vous devez d'abord déterminer si une douzaine de cycles est un problème. Sauf si vous avez plusieurs millions de trig appels de fonction, image par image, il ne devrait pas question sur un CPU qui n'est pas l'âge de 15 ans (et si vous faites cela, vous êtes susceptible de faire quelque chose de mal).
  • Lorsque le goulot d'étranglement est fonctions trigonométriques, une chose à considérer est l'utilisation de formules trigonométriques pour réduire le nombre d'appels. Si par exemple vous êtes le calcul de sin(nx) et cos(nx) pour un tas de nombres entiers consécutifs n, il peut être intéressant de calculer cos x et sin x et utiliser les récidives (cos(a+b) = cos a cos b - sin a sin b et sin(a+b) = sin a cos b + cos a sin b)
  • Voir stackoverflow.com/questions/523531/... C'est pour Java, mais les formules de travail en C++.
  • math.h ne comprend pas tout de la mise en œuvre. La mise en œuvre dans la bibliothèque qui sera lié à votre code. Pour répondre à votre question, vous avez à dire ce PROCESSEUR cible et le compilateur que vous utilisez.
  • J'ai mis en œuvre rapide de la fonction sinus sur le cpu côté qui est au moins deux fois plus rapide de mathématiques.h ' s la fonction sinus cependant, j'ai utilisé une très petite table de recherche(20 chars). la précision est également pas mal du tout; moyenne relative des taux d'erreur est 0.095%. vous pouvez le vérifier à partir de http://www.hevi.info/tag/fast-sine-function/
  • Avez-vous déjà vérifier si votre algorithme est parallélisable? Si vous pouvez l'obtenir pour fonctionner sur un (GPU via openCL par exemple), alors au lieu de 2%-3% vous pourriez être à la recherche à 90%-95% plus rapide (developer.nvidia.com/opencl)

InformationsquelleAutor janitor048 | 2011-04-25