Question

Je sais que x87 a une précision interne plus élevée, ce qui est probablement la plus grande différence que les gens voient entre elle et les opérations SSE. Mais je me demande, est-il un autre avantage à utiliser x87? J'ai l'habitude de taper -mfpmath=sse automatiquement dans tout projet, et je me demande si je me manque quelque chose d'autre que le x87 FPU offre.

Était-ce utile?

La solution

Pour asm écrit à la main, x87 a des instructions qui n'existent pas dans le jeu d'instructions SSE.

Du haut de ma tête, il est tous les trucs trigonométrique comme FSIN, CFST, Fatan, fatan2 et des choses exponentielle / logarithme.

Avec gcc -O3 -ffast-math -mfpmath=387, GCC9 encore fait sin(x) en ligne comme une instruction fsin, quelle que soit la mise en œuvre libm aurait utilisé. ( https://godbolt.org/z/Euc5gp ).

MSVC appelle __libm_sse2_sin_precise lors de la compilation pour x86 32 bits.


Si votre code passe la plupart du temps à faire la trigonométrie, vous pouvez voir un léger gain de performances ou une perte si vous utilisez x87, selon que votre niveau implémentation bibliothèque mathématiques en utilisant SSE1 / SSE2 est microcode plus rapide ou plus lent que le lent pour fsin sur quelque CPU que vous utilisez.

CPU fournisseurs ne mettent pas beaucoup d'efforts dans l'optimisation du microcode pour obtenir des instructions x87 dans les dernières générations de processeurs, car il est généralement considéré comme obsolète et rarement utilisé. (Regardez compte UOP et le débit pour obtenir des instructions x87 complexes tables d'instruction de Agner Fog dans les générations récentes de processeurs: plus cycles que les processeurs plus anciens). Le plus récent de la CPU, le x87 plus probable sera plus lent que beaucoup d'instructions SSE ou AVX pour calculer log, exp, pow, ou trigonométriques.

Même si x87 est disponible, toutes les bibliothèques mathématiques choisissent d'utiliser des instructions complexes comme fsin pour la mise en œuvre des fonctions comme sin(), ou en particulier exp / log où des tours entiers pour manipuler les binaires modèles FP à base de journaux sont utiles.

Certains algorithmes DSP utilisent beaucoup de triglycéride, mais en général bénéficient d'un beaucoup de l'auto-vectorisation avec les bibliothèques mathématiques SIMD.

Cependant, pour les mathématiques-code où vous passez la plupart de votre temps à faire des additions, multiplications etc. SSE est généralement plus rapide.


Toujours en rapport avec: Intel erreur Bounds par sous-estime 1.3 trillion - le pire des cas pour fsin (annulation catastrophique pour les entrées fsin très proche pi ) est très mauvais. Le logiciel peut faire mieux, mais uniquement avec des techniques de précision étendue lente.

Autres conseils

  1. Il est présent sur les machines vraiment vieux.

EOF

FPU instructions sont plus petites que les instructions SSE, elles sont donc idéales pour des trucs demoscene

  • Il est important héritage et une petite compatibilité du système avec le x87: SSE est une caractéristique de processeur relativement nouveau. Si votre code est exécuté sur un microcontrôleur embarqué, il y a une bonne chance, il ne soutiendra pas les instructions SSE.

  • Même les systèmes qui ne disposent pas d'un FPU installé fournira souvent émulateurs 80x87 qui fera la course de code transparente (plus ou moins). Je ne sais pas de tout émulateurs certainement SSE un de mes systèmes ne pas, les nouveaux éléments si Adobe Photoshop versions refuse d'exécuter.

  • Les instructions de 80x87 ont de bonnes caractéristiques de fonctionnement parallèles qui ont été explorées à fond et analysés depuis son introduction en 1982 ou plus. Divers clones du x86 pourraient bloquer sur un jeu d'instructions SSE.

Conversion entre float et double est plus rapide avec x87 (généralement gratuit) qu'avec SSE. Avec x87, vous pouvez charger et stocker un float, double ou long double ou de la pile de registre et il est converti ou de précision étendue sans frais supplémentaires. Avec SSE, des instructions supplémentaires sont nécessaires pour effectuer la conversion de type si types sont mélangés, parce que les registres contiennent des valeurs de float ou double. Ces instructions de conversion sont assez rapides, mais prennent du temps supplémentaire.

La vraie solution est de ne pas mélanger float et double trop, de ne pas utiliser x87, bien sûr.

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