Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1392 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

[C++/résolu] donnée static const Pi=3.14

n°1344466
tbp
Posté le 11-04-2006 à 20:41:56  profilanswer
 

Reprise du message précédent :

nargy a écrit :


> cette union ne sert qu'a s'assurer de l'abscence de constructeurs à l'initialization
- ok, j'imagine que c'est plus efficace sans présumer des capacités du compilateur et des options de compil.


Moui, effectivement ça a voir avec le fait de traiter des POD ou pas, mais en fait pas seulement: comment produire un +/- infinie dans un initialiseur? Ou un NaN?
 
 
 
 
 

nargy a écrit :


mais j'aurai quand même une question: comment fonctionne le cache? je ne demande pas une réponse exhaustive, mais si vous avez un lien sur une doc, ou quelques recommandations. J'ai toujours considéré que pour un code trop long ou des données trop fournies les optimisations par cache devenaient secondaires, dû à la saturation du cache.


Pas de lien sous la main. Tu as differentes caches, je ne parles que de celles pour les instructions & données, de differents niveaux 1/2/3/etc en ordre croissant de taille. En general tout cela fonctionne par 'ligne' avec une regle du genre MRU (Most Recently Used). En gros.
Par exemple sur un K8 (Opteron, AMD64) les lignes de cache de donnée font 64 octets, chacune étant plus ou moins independante des autres. Quand il manque de place, le cpu évince celle qui a été utilisée en dernier. En gros.
Il faut aussi noter qu'il n'y a pas d'unité plus petite que la ligne de cache. Quand tu fais une operation d'écriture au mileu d'une ligne, c'est tout la ligne qui est marquée comme tripotée. Moralité il ne faut pas mélanger ce qui est en lecture seule et ce qui est en écriture.
 
Donc il se peut que tu ais en cache tout un jeu de donnée provenant des 4 coins de la mémoire, tout est affaire de flux.
 

nargy a écrit :

trop fort ce lien!
on peut utiliser FLD1 pour -1.0, en bidouillant la pile?


Tout est possible. De toute façon gcc sait generer fld1, fldpi etc... pour peu qu'il reconnaisse la constante, qu'il estime que ça permet de gagner du temps (ou de la place si tu optmises pour la taille) etc...

mood
Publicité
Posté le 11-04-2006 à 20:41:56  profilanswer
 

n°1344469
++fab
victime du syndrome IH
Posté le 11-04-2006 à 20:43:14  profilanswer
 

Citation :

tiens ça a à voir avec mon problème http://www.open-std.org/jtc1/sc22/ [...] /n1469.pdf


C'est le proposal que j'évoquais plus haut. Il a le statut de "No interest, or superseded by other proposals".

Message cité 1 fois
Message édité par ++fab le 11-04-2006 à 20:46:08
n°1344470
nargy
Posté le 11-04-2006 à 20:43:50  profilanswer
 

> Non, non et non. Il n'y a rien de gratuit en ce bas monde. Si une constante est 'inlinée' comme vous dites, au lieu d'un accès mémoire explicite vous payez pour de la bande passante de decodage car l'instruction requiert plus de place pour etre encodée.
 
ok, ça j'imprime, choix entre cache et prefetch, mais... :D
 
...dans un programme compilé où tu est sûr que le cache va être saturé, autant du fait que tu as des mégas de données, et une grosse boucle de 3 kilomètres, est-ce que prefetch n'est pas plus performant pour de petites constantes (quelques octets seulement) à utiliser dans une seule sous-fonction?
 
Je veux dire, la constante devra de toutes façon être chargée dans un registre. Qu'elle le soit à partir du code ou des données, comme un tour de boucle ne tient absolument pas en cache, cette constante vient de toutes façons de la mémoire centrale. Ou bien le cache est capable de garder la constante d'un tour de boucle à l'autre? dans ce cas pour une petite constante ça ne pose pas de problème majeur, pour une grande si.
 
(note: avec -finline-limit=1Méga et un disque dur complet de swap pour compiler)

n°1344473
nargy
Posté le 11-04-2006 à 20:46:12  profilanswer
 

edit: posté trop tot, tu as répondu en grande partie à ma question.

n°1344474
Taz
bisounours-codeur
Posté le 11-04-2006 à 20:46:36  profilanswer
 

++fab a écrit :

Citation :

tiens ça a à voir avec mon problème http://www.open-std.org/jtc1/sc22/ [...] /n1469.pdf


C'est le proposal que j'évoquais plus haut. Il a le statut de "No interest, or superseded by other proposals".


oui je vois ça, je cherche les paliatifs. mais le problème évoqué est réel.

n°1344476
nargy
Posté le 11-04-2006 à 20:48:57  profilanswer
 

bon va falloir que je ne considère plus le cache comme une boîte noire. ya des astuces à trouver.

n°1344477
chrisbk
-
Posté le 11-04-2006 à 20:50:59  profilanswer
 

Taz a écrit :

1) pas d'accord du tout. Et puis ça coute peut etre plus cher sur ton x86, pas ailleurs. Je vois pas plus court qu'un li ... l'inline de constantes permet très souvent de propager d'autres optimisations. Montre moi comment gcc peut optimiser a + b avec a et b extern const int ...


 
Whole program optimisation dans VS. Generation de code au moment du link, ca permet d'avoir une meilleure vue du programme. (comme l'inlining de fonctions pas dans des .h, ce genre de gag)
 
Faudrait regarder en detail quelles sont les optims que VS peut effectuer et effectue a ce moment la


Message édité par chrisbk le 11-04-2006 à 20:51:46
n°1344479
Taz
bisounours-codeur
Posté le 11-04-2006 à 20:52:04  profilanswer
 

certes, cela dit, faut avoir le temps CPU et la RAM pour faire ça ...

n°1344482
Taz
bisounours-codeur
Posté le 11-04-2006 à 20:52:44  profilanswer
 

t'as une option de bourrin dans gcc 4.1 pour ça :)

n°1344485
tbp
Posté le 11-04-2006 à 20:53:36  profilanswer
 

Taz a écrit :

1) pas d'accord du tout. Et puis ça coute peut etre plus cher sur ton x86, pas ailleurs. Je vois pas plus court qu'un li ... l'inline de constantes permet très souvent de propager d'autres optimisations. Montre moi comment gcc peut optimiser a + b avec a et b extern const int ...


 
Comme ça:

Code :
  1. extern const float a;
  2. float foo(const float c) {
  3. const float b = 1;
  4. return c+a+b;
  5. }
  6. int main() { return 0; }
  7. const float a = 1;


 
Sans -ffast-math, juste pour le fld1 ;)

Code :
  1. 00401050 <foo(float)>:
  2.   401050:       push   %ebp
  3.   401051:       fld1
  4.   401053:       mov    %esp,%ebp
  5.   401055:       flds   0x8(%ebp)
  6.   401058:       leave
  7.   401059:       fadd   %st(1),%st
  8.   40105b:       faddp  %st,%st(1)
  9.   40105d:       ret
  10.   40105e:       mov    %esi,%esi


 
-ffast-math

Code :
  1. 00401050 <foo(float)>:
  2.   401050:       flds   0x40e004
  3.   401056:       fadds  0x4(%esp)
  4.   40105a:       ret
  5.   40105b:       nop
  6.   40105c:       lea    0x0(%esi),%esi


et surprise, ya un 2.f en 0x40e004.

mood
Publicité
Posté le 11-04-2006 à 20:53:36  profilanswer
 

n°1344488
chrisbk
-
Posté le 11-04-2006 à 20:54:26  profilanswer
 

Taz a écrit :

certes, cela dit, faut avoir le temps CPU et la RAM pour faire ça ...


 
oué, forcement, generalement tu l'actives que lors de la compilation de release finale :d Dans VS 8 y ont rajouter un optimiser qui se base sur les resultats d'un profiling pour encore grapiller une brochette de pourcent, l'idée est marrante.  
 

n°1344489
chrisbk
-
Posté le 11-04-2006 à 20:55:17  profilanswer
 

tbp a écrit :

Comme ça:
 
..
 
 
et surprise, ya un 2.f en 0x40e004.


 
t'es ne float, taz parlait en int. En int le compilo a le droit de faire de la simplification mathématique, ce genre de chose. Et pour ca il a besoin de connaitre la valeur des constantes

Message cité 1 fois
Message édité par chrisbk le 11-04-2006 à 20:55:43
n°1344490
++fab
victime du syndrome IH
Posté le 11-04-2006 à 20:55:34  profilanswer
 

Taz a écrit :

oui je vois ça, je cherche les paliatifs. mais le problème évoqué est réel.


 
Si on utilise les fonctions inline (comme dans les classes de traits standards), et qu'on considère le papier de Gaby Dos Reis sur les expressions constantes généralisées, on a peut être le résultat voulu, non ?

n°1344493
Taz
bisounours-codeur
Posté le 11-04-2006 à 20:56:54  profilanswer
 

tbp a écrit :

Comme ça:

Code :
  1. extern const float a;
  2. float foo(const float c) {
  3. const float b = 1;
  4. return c+a+b;
  5. }
  6. int main() { return 0; }
  7. const float a = 1;


 
Sans -ffast-math, juste pour le fld1 ;)

Code :
  1. 00401050 <foo(float)>:
  2.   401050:       push   %ebp
  3.   401051:       fld1
  4.   401053:       mov    %esp,%ebp
  5.   401055:       flds   0x8(%ebp)
  6.   401058:       leave
  7.   401059:       fadd   %st(1),%st
  8.   40105b:       faddp  %st,%st(1)
  9.   40105d:       ret
  10.   40105e:       mov    %esi,%esi


 
-ffast-math

Code :
  1. 00401050 <foo(float)>:
  2.   401050:       flds   0x40e004
  3.   401056:       fadds  0x4(%esp)
  4.   40105a:       ret
  5.   40105b:       nop
  6.   40105c:       lea    0x0(%esi),%esi


et surprise, ya un 2.f en 0x40e004.


t'as pas l'impression de tricher là ...

n°1344501
skelter
Posté le 11-04-2006 à 21:01:36  profilanswer
 

ca dois jouer le fait que la définition de a se trouve dans la meme TU ?

n°1344502
chrisbk
-
Posté le 11-04-2006 à 21:01:57  profilanswer
 

bah ouais

n°1344511
tbp
Posté le 11-04-2006 à 21:07:17  profilanswer
 

Evidement que ça joue, vous croyez aux miracles vous?
 
Le coup du 'whole programm optimization' c'est rien d'autre que de changer la visibilité des fonctions et des données (en gros tout coller en statique par défaut au lieu d'extern) et de scotcher toutes les unitées ensembles.
 
Je ne triche donc pas plus que les compilateurs.
 
 

chrisbk a écrit :

t'es ne float, taz parlait en int. En int le compilo a le droit de faire de la simplification mathématique, ce genre de chose. Et pour ca il a besoin de connaitre la valeur des constantes


Tu crois qu'il fait quoi la le compilateur?


Message édité par tbp le 11-04-2006 à 21:10:29
n°1344514
Taz
bisounours-codeur
Posté le 11-04-2006 à 21:10:31  profilanswer
 

et si on mets extern, c'est du flan ?

n°1344525
tbp
Posté le 11-04-2006 à 21:15:07  profilanswer
 

Taz a écrit :

et si on mets extern, c'est du flan ?


Du tout. Mais le fait que le compilo produise une constante addressable et comment il l'utilise (si il arrive a completement la deduire) sont 2 faits parfaitement distincts.

n°1344528
Taz
bisounours-codeur
Posté le 11-04-2006 à 21:16:36  profilanswer
 

#
extern const float a;
#
 
#
float foo(const float c) {
#
    const float b = 1;    
#
    return c+a+b;
#
}
 
compile ça et reviens ...

n°1344533
tbp
Posté le 11-04-2006 à 21:30:16  profilanswer
 

Qu'essaies tu de me démontrer? Qu'un compilo ne fait pas dans la voyance?
 
Ta question initiale était...

Taz a écrit :

Montre moi comment gcc peut optimiser a + b avec a et b extern const int ...


... et j'y ais répondu. Si tu ne saisis pas les tenants et aboutissants, j'en suis désolé.

n°1344607
nargy
Posté le 11-04-2006 à 23:18:33  profilanswer
 

fast-math c'est sympa en local, sur ta propre machine, sinon si tu execute le prog sur une machine exotique avec le même jeu d'instruction et des calculs flottants plus précis t'obtient pas le même résultat.
(rem: ça c'est un autre débat, la précision des flottants)
 
tbp> tu ne fait pas de la compilation séparée là. remarque que ça me pose pas de problème, j'ai déjà essayé, et c'est vrai que ça améliore un chouia:
for i in *.cpp do echo "#include \"$i\"" >> optim.C ; done
 
Perso, j'en concluerai que sur des petites boucles ça vaut sûrement le coup de se prendre la tête sur une optim inline/extern, pas forcément sur une grande boucle. Je verrai donc à la fin, si je peut optimiser encore en découpant mon code et mes données judicieusement.
 
Merci à tous.

n°1344610
Taz
bisounours-codeur
Posté le 11-04-2006 à 23:27:17  profilanswer
 

tbp a écrit :

Qu'essaies tu de me démontrer? Qu'un compilo ne fait pas dans la voyance?
 
Ta question initiale était...
 
... et j'y ais répondu. Si tu ne saisis pas les tenants et aboutissants, j'en suis désolé.


vas-y, joue au con.

n°1344615
nargy
Posté le 11-04-2006 à 23:47:52  profilanswer
 

Citation :

vas-y, joue au con.


il a raison, c'est la meilleure solution: le compilo peut utiliser à la fois la définition extern et inline.

n°1344623
skelter
Posté le 11-04-2006 à 23:56:34  profilanswer
 

la variable ne peut etre définie qu'une fois, ou est l'interet

n°1344627
tbp
Posté le 12-04-2006 à 00:03:06  profilanswer
 

Vu que je suis d'humeur taquine... :)
 
 

nargy a écrit :

fast-math c'est sympa en local, sur ta propre machine, sinon si tu execute le prog sur une machine exotique avec le même jeu d'instruction et des calculs flottants plus précis t'obtient pas le même résultat.
(rem: ça c'est un autre débat, la précision des flottants)


Si la précision differe le resultat sera different, fast-math ou pas.
Ce qui compte generalement c'est le nombre d'ulp en bout de course. A ce point du débat, on se doit de connaitre son compilo, et donc ce qu'implique reelement fast-math. Ca n'a rien de magique.
 

nargy a écrit :


tbp> tu ne fait pas de la compilation séparée là. remarque que ça me pose pas de problème, j'ai déjà essayé, et c'est vrai que ça améliore un chouia:
for i in *.cpp do echo "#include \"$i\"" >> optim.C ; done


Sauf que pour que ça porte vraiment ses fruits il faut à priori triturer la visibilité de divers élements afin que d'exposer plus d'optimisations potentielles, entre autres choses.
Je rappelle à toutes fins utiles que, par exemple, les fonctions membres d'une classe ont un linkage externe par défaut (empechant l'utilisation d'une convention d'appel plus aggressive). Etc...
 
Pour l'instant, --combine & --whole-program ne sont pas disponible pour le C++ avec g++. Mais ça ne saurait trop tarder.
 

nargy a écrit :


Perso, j'en concluerai que sur des petites boucles ça vaut sûrement le coup de se prendre la tête sur une optim inline/extern, pas forcément sur une grande boucle. Je verrai donc à la fin, si je peut optimiser encore en découpant mon code et mes données judicieusement.


Au contraire. C'est lorsque le compilo perd de vue les données chaudes, comme on dit outre-atlantique, qu'il faut le guider, à la main s'il le faut. Et ça a d'autant plus de chance d'arriver que le code en question grossit.

n°1344637
tbp
Posté le 12-04-2006 à 00:17:18  profilanswer
 

skelter a écrit :

la variable ne peut etre définie qu'une fois, ou est l'interet


L'interet c'est de produire une section read-only avec des données intialisées...


Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00033118  00401000  00401000  00000400  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE, DATA
  1 .data         00004594  00435000  00435000  00033600  2**4
                  CONTENTS, ALLOC, LOAD, DATA
  2 .rdata        00004a80  0043a000  0043a000  00037c00  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  3 PIPOBIMBO     00000220  0043f000  0043f000  0003c800  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  4 .bss          00008ea0  00440000  00440000  00000000  2**4
                  ALLOC
  5 .idata        00001888  00449000  00449000  0003cc00  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  6 .stab         001e0fc0  0044b000  0044b000  0003e600  2**2
                  CONTENTS, READONLY, DEBUGGING, EXCLUDE
  7 .stabstr      00276ec8  0062c000  0062c000  0021f600  2**0
                  CONTENTS, READONLY, DEBUGGING, EXCLUDE


... ce qui n'entrave en rien les 'optimisations' si tel est votre souhait, comme je l'ai démontré.
 
D'ailleurs je viens de remarquer que l'alignement est foireux, c'est nouveau ça. Crotte.

n°1344639
nargy
Posté le 12-04-2006 à 00:27:07  profilanswer
 

> Si la précision differe le resultat sera different, fast-math ou pas.
 
Si le résultat correct dépends d'un arrondi du dernier chiffre, ça marche plus avec 1 chiffre de plus en calcul interne. C'est du chipotage de toutes façon. (Jusqu'au jour où t'a un bug de calcul inexplicable)
 
> Au contraire. C'est lorsque le compilo perd de vue les données chaudes
Oui, ok. Plutôt: en priorité optimiser les petites boucles internes avant la grosse globale.

n°1344643
tbp
Posté le 12-04-2006 à 00:37:57  profilanswer
 

Un dernier point, les compilo ont des heuristiques pour regrouper les fonctions & données afin d'améliorer la localité des accès, mais d'une part il faut leur permettre de re-organiser le bazar et cela reste des heuristiques.
 
D'ou le principe des 'profile guided optimizations' qui remplacent ces heuristiques par des mesures, gcc/msvc/icc proposent tous à des degrés divers qque chose dans ce gout la (avec plus ou moins de bonheur).
 
Il n'empeche que le programmeur est à priori le mieux placé pour savoir ce qui est pertinent. Ou pas ;)

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
[Résolu]Problème avec un script de dockbar type mac OS[résolu] Supprimer des modules
[Résolu] ViewStatePourvoir lire dans une lib static
[ RESOLU ] structure boucleresolu :donner la valeur d'une var de sess à un champ caché ds un form
(résolu) [Java 3D] Comment centrer la vue sur des objets WaveFront[RESOLU]Mon neurone va exploser
[Résolu] typeid(résolu) [Java 3D] Changer l'apparence d'objets WaveFront
Plus de sujets relatifs à : [C++/résolu] donnée static const Pi=3.14


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR