RIEN RIEN RIEN RIEN RIEN RIEN RIEN RIEN RIEN RIEN RIEN RIEN RIEN RIEN RIEN RIEN

cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 - 4 nov. 2007 à 11:57
 florenth - 7 nov. 2007 à 19:19
@rt15 : figure-toi que j'ai été aussi surpris que toi !
Mais comme tu fais bien de le rappeler: 80 bits au lieu de 32, ça doit (un tout petit peu) ralentir les affectations mais ça prend surtout beaucoup plus de place en mémoire (imagine une matrice de 1000x1000 en Extended (c'est assez courant comme dimensions), fait 9.5 Mo !! Le temps que ça prend à transférer dans le CPU pour y faire des calculs doit être énorme comparé à un Double ou ça ne ferait "que" 3.8 Mo.

Après, reste à savoir que le temps du calcul est supérieur au temps d'une affectation. Donc finalement, je crois bien qu'Extended est dans tous les cas plus rapide.

"D'un flottant à l'autre, les instructions change pas vraiment, juste les tailles des opérandes"
=> Regardes le code ASM que génère Delphi (en commentaire dans le code), y'a quand même une petite différence entre "Single/Double" et Extended.
Mais d'après ta citation du manuel Intel, tout s'explique.

-----------------------------------------

Petit détail à part: j'ai changé le type de flottant utilisé pour mon programme de morphing de bitmap, et j'augmente mes performances en passant ma matrice au format Extended plutôt que Single. Donc je le redis: utilisez des Extended !!!!

SAUF dans les fichiers, car ce format est non standardisé ISO, donc ça risque de changer suivant les CPU (même si j'y crois pas trop).
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
7 nov. 2007 à 15:06
Le Extended le plus rapide des flottants, arf j'avais dit tout le contraire, vu que c'est le plus précis et le plus gros. Pour les calculs, OK, mais pour les affectations, passage par valeur en argument d'une fonction... Là y doit déjà plus souffrir.

Pour les calculs sur les flottants, le compilo de Delphi fait du code machine qui va utiliser la FPU. D'un flottant à l'autre, les instructions change pas vraiment, juste les tailles des opérandes.

Un petit tour dans le intel manual volume 1, chapitre 7.4 parlant des types de flottants supportés par la FPU :
"With the exception of the 80-bit extended-real format, all of these data types exist in memory only. When they are loaded into FPU data registers, they are converted into extended-real format and operated on in that form."

Donc la FPU à l'air de convertir automatiquement tout ce qu'on lui donne en Extended... Ceci explique peut être cela.
cedricbi Messages postés 185 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 21 mars 2011
6 nov. 2007 à 11:57
En fait la vitesse des Extended, Double, Single dépendent du processeur utilisé... ce qui n'est pas pour arranger les choses!
Donc, on en peut pas tirer de conclusion général des tests ; ce qui est valable pour un P4, ne l'est pas pour un P3, et peut-être pas pour un Core...
Merci à vous deux d'avoir jette un œil sur cette source !

@Cantador:
Je ne sais pas si tu as regardé les résultats des tests, mais chez moi, le type Extended est plus rapide que Single et Double, peu importe le calcul effectué (dans l'exemple, je n'ai mis que des additions)

@Cedricbi:
Justement, j'y avais pensé à utiliser Abs() mais j'ai renoncé car c'est intéressant d'avoir des valeurs négatives: ça veut dire que la charge processeur n'était pas constante et que donc, les valeurs ne sont pas fiables !
cedricbi Messages postés 185 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 21 mars 2011
5 nov. 2007 à 21:06
Franchement parfait !

Pour prouver l'efficacité :
Je suis sur un P3 800 MHz donc 1 temps d'horloge = 1250 ps, ce qui est l'argement confirmé par les calculs!

Mesures données avec une précision de ± 8 picosecondes

MOV :
MOV AL, BL 1280 ps
MOV AH, BH 1249 ps
MOV AX, BX 1252 ps
MOV EAX, EBX 1270 ps


Malgré le fait que cela soit parfait, deux petites ameillorations :
- Déjà pour mesure la précision on peut mettre T := Abs(MesurePrecision); (modif absolument minime mais bon faut bien trouver quelque chose à dire !)
- Autre petit ajout qui pourrait être sympathique : refaire la même procédure que MesurePerf mais au lieu d'utilise QueryPerformanceCounter utiliser l'instruction assembleur RDTSC (http://en.wikipedia.org/wiki/RDTSC) qui permet de compter le nombre de cycle d'horloge exécuté depuis le dernier Reset du CPU! De cette manière on a deux infos qu'on peut comparer et ainsi avoir quelque chose d'encore plus précis !
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
4 nov. 2007 à 11:57
je rectifie :
- utilisez des Integer.
- n'utilisez pas des Extended.
Rejoignez-nous