|
Publicité ' | ||||||||||||||||||||||||
|
|
#21 | |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 9 589 ![]() |
Citation:
Et cela aurrait dû être fait par le compilateur, automatiquement dans les options O1 , O2, ou O3 Je ne vois pas ce que ajouter un élément d'optimisation à la norme d'un langage ajooute, à part le fait de le rendre moins général... et compliquer la vie de ceux qui l'apprennent.. Et si un pomgrammeur était assez stupide pour faire pointer par B ou A le même buffer que val (dans le bon ordre), alors il n'a rien à faire à programmer des choses complexes... C'estcomme pour la rotation d'un point x,y.. Si le programmeur est assez stupide pour ne pas se servir des coordonnées AVANT les opérations, ben..il n'y a plus rien à faire pour lui.. Je troue cela aberrant : alors ça marche pour un truc,mais pas si on complexifie la tâche (comme l'exemple de la rotation).. Et , par rapport au Fortran, la chose ne corrige rien : si on fait la même chose en Fortran, on obtiendra la même incertitude...
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
|
|
|
00
|
|
|
#22 | |
|
Membre éprouvé
![]() Développeur informatique Inscription : octobre 2005 Messages : 203 ![]() |
Citation:
Et le compilo n'y peut rien. Si on ne lui dit pas que ça n'overlap pas, il ne peut pas deviner. Il est obligé de prendre en compte le cas de l'overlap... On peut faire le parallèle avec memcpy/memmove. D'un côté, memcpy est souvent plus rapide car il n'y a pas d'overlap (C'est du moins ce qu'est censé garantir le programmeur, comme pour restrict). De l'autre memmove gère l'overlap et est souvent plus lent. De ce fait, memcpy est en quelque sorte l'implémentation de memmove avec des arguments restrict. Bref, ajouter restrict permet littéralement de modifier le comportement d'une fonction et donc les optimisation possibles pour le compilo. |
|
|
|
00
|
|
|
#23 | |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 9 589 ![]() |
Citation:
Faire Code :
memmove ( &(tab[2]), &(tab1), (n-2)*sizeof(...)); Code :
memmove ( &(tab[1]), &(tab2), (n-2)*sizeof(...)); Pourquoi faudrait-il avoir un paramètre à un compilo pour empêcher de faire ça ?? Et si la fonction est f(a,b,c), et que a, b, et c sont des tableaux, ou alors on les programmeurs sont des c.ns de pas avoir lu la doc ou alors c'est qu'on n'a pas fourni la bonne doc... Je trouve que c'est vraiment inutile (surtout dans une norme de langage), et que cela va à l'encontre et de la souplesse / rigueur qu'implique le C et de la symbolique des options de compil -O1, -O2, ou -O3, qui "optimisent" de la meilleure manière, sans que le programmeur ait à savoir quoi : on peut même s'apercvoir que, dans d'assez nombreux cas justement -O3 optimise trop, avec le genre de mécanisme décrit dans le lien.. Sauf que justement c'est une option de compil... Et comme je disais, cela ne rapproche en rien du Fortran.. Si une routine Fortran est f(a,b,c), et que la doc dit que A, B, et C dovent être différents, ce n'est pas Fortran qui va râler en tant que tel si le programmeur utilise le même tableau.. Ce genre de manip est aux risques et périls de l'utilisateur, il faut savoir ce qu'on fait.. Il y a plein d'exemples en C : les fonctions de tris de qsort, les sockets, les unions, les doubles pointeurs, les void*, etc etc..
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
|
|
|
00
|
|
|
#24 | ||||||||||
|
Membre éprouvé
![]() Développeur informatique Inscription : octobre 2005 Messages : 203 ![]() |
Le but de restrict n'est pas du tout d'empêcher le développeur ou le compilateur de faire des bêtises.
Le but est de préciser au compilo qu'il n'y a pas d'overlap. Cette information permet au compilo de générer un code plus rapide dans certains cas. Et le compilo ne peut généralement pas deviner cette information que l'on utilise -O3 ou pas. Pour le déterminer, il faut qu'il vérifie dans le source que lors des appels (Ou de l'appel, si la fonction est inliné) qu'il ne peut pas y avoir d'overlap car les paramètres sont "différents". Jolie casse tête. Et dans certains cas, c'est même tout à fait impossible car il ne peut pas connaître tous les appels d'avance (Cas d'une fonction exportée par une librairie). Considérons une fonction plus proche de ce qui peut exister, c'est à dire une fonction updatePoints qui prend en paramètre : 1/ Un tableau de points(Coordonnées x et y). 2/ Le nombre d'élément du tableau. 3/ Un pointeur vers un point delta. Le but de la fonction est d'ajouter à tous les points du tableau le delta contenu dans le paramètre trois. Code :
Code C :
La différence entre updatePoints1 et updatePoints2 est simplement l'ajout du mot clé restrict. La différence se fait dans le code généré. En effet, comme restrict indique que delta n'est pas modifié quand lpPoints est modifié, la valeur de delta n'a pas à être lue à chaque tour de boucle. Code sans restrict : Code :
Code :
Bref, restrict, c'est une information qui en théorie peut bien aider le compilo à générer du code plus rapide. Il semble donc intéressant de l'avoir dans la norme. [ ************** edit ************** ] A noter que dans les faits, avec les flags de compilation : gcc -O3 test.c -o test.exe -std=c99 -fstrict-aliasing gcc 3.4.5 (Version ancienne... Il semble qu'il y ait eu des amélioration de restrict en 4.5) ne réalise pas l'optimisation permise par restrict ci-dessus. Par contre, on peut forcer gcc 3.4.5 à réaliser l'optimisation en faisant une copie du contenu de lpDelta dans une variable locale. Le code C paraît alors moins optimisé, mais le code machine généré est comme celui ci-dessus "avec restrict". Code c :
[ ************** edit 2 ************** ] gcc 4.6.1 réalise correctement l'optimisation avec le mot clé restrict. ![]() (Et il fait aussi l'optimisation en cas de copie locale de delta comme ci-dessus) |
||||||||||
|
|
30
|
|
|
#25 | |
![]() ![]() R&D en systemes informatiques bas niveau Unix/Linux Inscription : mai 2004 Messages : 7 191 ![]() |
Citation:
Un autre exemple serait, par exemple, le fait de preciser si un test de boucle est probablement pris ou non (si mes souvenirs sont bons : pnt pour ceux qui ont fait de l'assembleur Sparc). Par exemple, dans le cas du test du retour d'un appel a malloc/calloc, il est peu probable que le code de traitement de l'erreur soit appele (ou dans ce cas, il est probable que l'on quitte le programme), et donc le fait que le code "probablement execute" soit proche et le code "probablement pas execute" soit loin est une information interessante, et les gains ne sont pas negligeables (non, je n'ai plus les informations). Mais est-ce que, pour autant, cette option de compilation doit etre introduite dans le langage sous forme de l'ajout d'un mot-clef ? |
|
|
|
01
|
|
|
#26 | |
![]() ![]() Cyrille Network programmer Inscription : juin 2010 Messages : 1 551 ![]() |
Citation:
Ca semble bien être une option du langage sur les paramètres des fonctions de notre choix, pour indiquer au compilo l'optimisation à réaliser. Je vois pas comment le compilo pourrait en être conscient avec une simple option de compilation, tout en gardant le fonctionnement possible sans le restrict de temps en temps (ou inversement). edit : jean-marc ci-dessous a parfaitement réécrit ma pensée. |
|
|
|
00
|
|
|
#27 |
|
Expert Confirmé Sénior
![]() ![]() ![]() Inscription : novembre 2005 Messages : 4 970 ![]() |
Ajouter restrict peut changer un programme valide en un programme non conforme (supprimer un restrict ne devrait pas le faire), ça peut donc sembler du ressort du langage plus que des annotations.
__________________
Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça. |
|
|
10
|
|
|
#28 | |
![]() ![]() R&D en systemes informatiques bas niveau Unix/Linux Inscription : mai 2004 Messages : 7 191 ![]() |
Citation:
On peut citer par exemple realloc, souvent mal utilise au point que si l'allocation echoue, il y a une fuite memoire, ou bien encore le fait que les commandes memcpy et memmov existent en parallele. Oui, il est tout a fait possible de modifier le C pour que realloc se comporte a ne pas modifier le pointeur si l'allocation echoue, ou bien encore de supprimer memcpy pour ne garder que memmov qui fonctionne dans tous les cas, ou bien d'introduire de nouveaux mots-clef pour que le developpeur puisse ajouter une restriction ici ou la. Dans certains cas, comme avec restrict, ce gain sera visible dans l'executable, ce qui peut sembler une bonne chose. Dans d'autres cas, ce gain serait visible en refusant par exemple de compiler certaines erreurs classiques, ce qui eviterait de voir ici des posts du genre "mon programme segfault alors qu'il est correct". Mais est-ce que le gain est reel ? |
|
|
|
00
|
|
|
#29 |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 9 589 ![]() |
That is the question...
Et c'est bien ça qui m'embête : à ajouter inline, restrict, etc etc, on finit par transformer un langage de programmation en un langage où il y a mélange entre programmation et instructions d'optimisation de compilateur.. Ce qui, de mon point de vue, est une extrême mauvaise chose, ne povant qu'entraîner non seulement un usage abusif, non compatible, additionné d'un mélange des concepts, et surtout une fainéantise intellectuelle qui va à l'encotre de la philosophie du C.. Je ré-itère que c'est bien pour discuter des options d'optimisation qu'il y a des flags O2 ou O3.. Si je parlais en "OO", je dirais que la classe "programme" n'a pas à se soucier de la classe "exécutable" ni de sa méthode assoiciée "build"...
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
|
|
00
|
|
|
#30 | |||
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 709 ![]() |
J'ai du mal à comprendre pourquoi certains ne "veulent" pas que ça soit un mot-clé du langage, car je ne vois pas comment le compilateur pourrait deviner le non chevauchement des entités... Si on souhaite avoir un tel mécanisme, il doit obligatoirement passer par un mot clé du langage, non ?
Après, j'entends parfaitement les arguments disant que ce n'est pas le rôle du langage de faire des optimisations mais au compilateur de se débrouiller. En même, il existe bien des directives #pragma pour influencer le compilateur (je ne m'en suis jamais servi perso Code :
Je trouve dommage de se priver d'"outils" pour faciliter la programmation ou améliorer la performance sous couvert d'une envie d'excellence, voire d'élitisme : Citation:
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^ Pour vos problèmes d'embarqué, utilisez le forum dédié ! |
|||
|
30
|
|
|
#31 | |
![]() ![]() R&D en systemes informatiques bas niveau Unix/Linux Inscription : mai 2004 Messages : 7 191 ![]() |
Citation:
Si on veut lister tous les concepts que l'on pourrait ajouter au C, on peut discuter longtemps : pourquoi ne pas ajouter un systeme de gestion des listes chainees, c'est quand meme vachement pratique. On pourrait aussi, pourquoi pas, ajouter la surcharge des operateurs, il y a des gens qui ont l'air de trouver ca vraiment genial. ... Oui, une norme peut evoluer, ce n'est pas ce que je critique. Ce que je critique, ce sont les evolutions proposees dans cette nouvelle version, car je trouve que la plupart n'ont pas de raisons d'etre, et que d'autres manquent. Par exemple, pour la gestion des threads, que va-t-il se passer avec la gestion des signaux, sachant que threads et signaux ne font pas du tout bon menage ? C'est au compilateur de s'en debrouiller, ou bien au developpeur, ou bien au systeme ? [troll] Et puis lorsqu'on voit comment a ete implementee C99, et que l'on se dit que C11 est dans la droite ligne de son predecesseur, on se dit que de toute maniere, C11 sera aussi inimplementee que C99, et que donc ce n'etait meme pas la peine de la sortir [/troll] |
|
|
|
00
|
|
|
#32 | |
|
Expert Confirmé Sénior
![]() ![]() ![]() Inscription : novembre 2005 Messages : 4 970 ![]() |
Citation:
- ne pas comprendre à quoi ça sert, - comprendre à quoi ça sert et préférer que l'objectif soit atteint d'une autre manière - comprendre à quoi ça sert et trouver que ce n'est pas assez important pour être normalisé. et certains s'expriment -- pour donner force à leur propos ? -- de manière ambigue ("je ne comprends pas pourquoi on a ajouté restrict" est quelque chose qui peut être écrit pour signifier les trois positions). Ma position est la troisième (C99 a eu un très important accent numérique -- restrict, complex, des fonctions mathématiques -- qui a un intérêt relativement faible dans son domaine historique par rapport à la complexité que ça ajoute). Mais à partir du moment où c'est normalisé, le mot clé me semble la bonne méthode.
__________________
Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça. |
|
|
|
00
|
|
|
#33 |
|
Membre éprouvé
![]() Développeur informatique Inscription : octobre 2005 Messages : 203 ![]() |
Les développeurs C++ bavaient devant C++11
. Ils trépignent en attendant que les compilos se mettent à jour.![]() Les développeurs C en sont encore à critiquer C99. Certains se demandent même si une quelconque évolution est nécessaire voire bénéfique. Perso, je ne sais pas ce que j'aurai aimé voire dans C11. |
|
|
10
|
|
|
#34 | |||||||
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 9 589 ![]() |
Citation:
Code C :
ou bien Code C :
PS : ton "optimisation" montrée avec restrict est détruite par l'usage des indices dans le tableau : à chaque point tu fais deux multiplications et une addition pour calculer l'adresse, ce qui est nettement plus lent que l'optimisation montrée par l'usage de restrict... Donc, c'est comme vouloir otimiser des if ou des switch.. . L'optimisation est principalement dans l'algo et la réflexion (comme pour le calcul d'adresse ci-dessus : tu dois le faire 5 milliards de fois, ça coûte 10 milliards de multiplications de plus qu'incrémenter un pointeur...) Citation:
Maintenant, je vais pas me batre dessus, mais je trouve simplement qu'on dérive vers une fois de plus (ce que ça n'était pas) un truc de geeks..c'est dans l'air du temps, ça ne m'empêche pas de ne pas être d'accord.. Citation:
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
|||||||
|
|
00
|
|
|
#35 | ||
|
Membre éprouvé
![]() Développeur informatique Inscription : octobre 2005 Messages : 203 ![]() |
Bin... Avec gcc 4.6.1, il me génère exactement la même chose qu'avec restrict. Il n'inclus bien sûr pas la lecture de lpDelta à chaque tour de boucle du fait de la copie. Et il génère les mêmes adds (Alors qu'on pourrait s'attendre à ce qu'il incrémente les "pointeurs") :
Code :
|
||
|
|
00
|
|
|
#36 | |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 9 589 ![]() |
Citation:
Exactement ce que je disais.. Donc il n'y avait pas besoin de ce mot, pusiue avec ce qui existait on peut le faire
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
|
|
|
00
|
|
|
#37 | ||
|
Membre éprouvé
![]() Développeur informatique Inscription : octobre 2005 Messages : 203 ![]() |
Bench. Six écritures différentes de la fonction.
1/ C, implémentation innocente. 2/ C, copie de lpDelta (Ce qui revient à utiliser restrict). 3/ C, déplacement du pointeur de souviron34. 4/ ASM, stupide, relecture de lpDelta à chaque tour de boucle. 5/ ASM, en utilisant le scale. 6/ ASM, en déplaçant le pointeur. Eh bin sous VC6, paramètre par défaut de compilation en release (/O2 apparemment), processeur intel core 2 cadencé à 2.33Ghz, ça donne égalité "parfaite". Le compilo a l'air pas mauvais et le processeur semble effacer les petites différences. Pour espérer gratter, faudrait regarder du côté des threads ou des d'instructions SIMD (Les gains ou pertes dépendrait beaucoup du nombre de points). C'est vrai que vu sous cet angle, restrict, c'est pas franchement indispensable... ![]() Code C :
|
||
|
|
00
|
|
|
#38 |
|
Expert Confirmé Sénior
![]() |
La page Wikipédia mentionne les préfixes de chaîne littérales pour Unicode.
J'espère qu'on va pouvoir les chaîner sans répéter sans arrêt le préfixe maintenant... Edit: Oui enfin, on peut (Chapitre 6.4.5 "string literals", versets 5 et 9)
__________________
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant. "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?" Apparently everyone. -- Raymond Chen. Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen. |
|
|
00
|
|
|
#39 |
|
Expert Confirmé Sénior
![]() |
News: Microsoft a confirmé il y a deux mois que les développeurs C99 pouvaient aller se faire voir.
__________________
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant. "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?" Apparently everyone. -- Raymond Chen. Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen. |
|
|
00
|
|
|
#40 |
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 709 ![]() |
Si GCC a réussi à le faire, est-ce que c'est si compliqué pour Microsoft de le faire ?
J'ai du mal à comprendre pourquoi les gens (car malheureusement, ce n'est pas que Microsoft) restent bloqués au C ANSI, qui a plus de 20 ans.
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^ Pour vos problèmes d'embarqué, utilisez le forum dédié ! |
|
10
|
Copyright © 2000-2013 - www.developpez.com