Est-il possible d'augmenter la précision de l'arithmétique en virgule flottante avec gcc?
-
04-10-2019 - |
Question
certains programmes en C qui ne extensives calculs à virgule flottante obtenir des résultats bons sur une boîte de linux pc, mais des résultats erronés sur la SPE du processeur cellulaire, mais pas sur le PPU de la cellule. J'utilise compilateurs gcc. Je me demande s'il y a une option de compilation gcc pour augmenter méthode d'arrondi ou similaire si je reçois des calculs de précision à flotteur unique avec plus de précision. Je ne peux pas changer de doubler, comme sur la performance de SPE drastique réduire
Merci
La solution
Basé sur IBM documentation pour les différences de IEEE 754 sur SPU, il pourrait être un certain nombre de choses:
- Résultats zéro à partir des opérations arithmétiques sont toujours +0, -0 jamais.
- entrées dénormalisés 2-149 à 2-126 pour des opérations arithmétiques sont traités zéro avec le même signe. Arithmétique opérations ne produisent jamais denormal résultats, mais produisent +0 la place.
- Les opérations arithmétiques ne prennent pas en charge IEEE Inf ou NaN. Ces modèles de bits représenter des nombres valides. Débordement produisent des résultats de l'ampleur maximale valeur de signe approprié.
- Les opérations arithmétiques utilisent uniquement le cycle à zéro (chop, troncature) mode d'arrondi, quelle que soit la Le réglage du mode d'arrondi dans la Virgule flottante Statut et contrôle Registre (FPSCR), qui ne touche que arithmétique double précision opérations.
Bien sûr, sur une page connexe, vous pouvez aussi compiler le code SPU pour IEEE stricte conformité :
Par défaut, XL C / C ++ suit la plupart, mais pas toutes les règles de l'IEEE la norme. Si vous compilez le l'option -qnostrict, qui est activé par défaut au niveau d'optimisation ou -O3 plus, certaines règles à virgule flottante IEEE sont violés de manière qui peuvent améliorer performance, mais pourrait affecter le programme exactitude. Pour éviter ce problème, et pour établir la conformité stricte avec la norme IEEE, procédez comme suit:
- Utilisez les -qfloat = nomaf option du compilateur.
- Si le programme change le mode d'arrondi à l'exécution, utilisez la -qfloat = RRM option.
- Si le code de données ou programme contient des valeurs de signalisation NaN (SIAA), utilisez la -qfloat = Nans option. (Nan A est différent d'un calme NaN, vous doit coder explicitement dans la programme ou des données ou créer en utilisant l'option du compilateur -qinitauto.)
- Si vous compilez avec -O3, -O4 ou -O5, ajoutez l'option -qstrict après.