2010-09-22 6 views
3

Certains programmes en C qui effectuent des calculs à virgule flottante étendus obtiennent de bons résultats sur une machine Linux, mais des résultats erronés sur la SPE du processeur de la cellule, mais pas sur le PPU de la cellule. J'utilise des compilateurs gcc. Je me demande s'il existe une option de compilation gcc pour augmenter la méthode d'arrondi ou similaire, donc j'obtiens des calculs de précision à un seul flotteur avec plus de précision. Je ne peux pas changer de doubler, comme sur la performance de SPE drastiques réduireEst-il possible d'augmenter la précision de l'arithmétique en virgule flottante avec gcc?

Merci

Répondre

1

Basé sur le IBM documentation for the differences from IEEE 754 on the SPU, il pourrait être un certain nombre de choses:

  • Zéro résultats de l'arithmétique les opérations sont toujours +0, jamais -0.
  • Les entrées dénormales de 2-149 à 2-126 aux opérations arithmétiques sont traitées comme zéro avec le même signe. Les opérations arithmétiques ne produisent jamais les résultats numériques , mais produisent à la place +0.
  • Les opérations arithmétiques ne prennent pas en charge IEEE Inf ou NaN. Ces modèles de bits représentent des nombres valides. Débordement résultats produisent la valeur maximale valeur du signe approprié.
  • opérations arithmétiques utilisent uniquement le cycle à zéro (côtelette, tronquer) mode d'arrondi, quel que soit le réglage du mode d'arrondi dans le à virgule flottante Statut et contrôle registre (FPSCR), qui ne touche que opérations arithmétiques à double précision .

Bien sûr, sur une page connexe, you can also compile SPU code for strict IEEE conformance:

Par défaut, XL C/C++ suit la plupart, mais pas toutes les règles de la norme IEEE . Si vous compilez avec 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 d'une manière qui peut améliorer les performances mais pourraient avoir une incidence sur le programme correct. Pour éviter ce problème, et à compiler pour le strict respect de la norme IEEE , procédez comme suit:

  • Utilisez le -qfloat = option du compilateur nomaf.
  • Si le programme modifie le mode d'arrondi à l'exécution, utilisez l'option -qfloat = rrm .
  • Si le code de données ou de programme contient des valeurs NaN de signalisation (NaNS), utilisez l'option -qfloat = nans. (Une signalisation NaN est différent d'un NaN calme, vous devez coder explicitement dans le programme ou des données ou créer en utilisant l'option du compilateur -qinitauto.)
  • Si vous compilez avec -O3, -O4, ou -O5, incluez l'option -qstrict après.
+0

merci beaucoup, mais malheureusement, ces options ne fonctionnent pas sur le compilateur gcc – flow

Questions connexes