@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és3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 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és185Date d'inscriptionmercredi 18 décembre 2002StatutMembreDernière intervention21 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és185Date d'inscriptionmercredi 18 décembre 2002StatutMembreDernière intervention21 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
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és4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202113 4 nov. 2007 à 11:57
je rectifie :
- utilisez des Integer.
- n'utilisez pas des Extended.
7 nov. 2007 à 19:19
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).
7 nov. 2007 à 15:06
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.
6 nov. 2007 à 11:57
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...
6 nov. 2007 à 11:35
@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 !
5 nov. 2007 à 21:06
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 !
4 nov. 2007 à 11:57
- utilisez des Integer.
- n'utilisez pas des Extended.