VOLATILE KEYWORD - C++ - Programmation
Marsh Posté le 21-08-2011 à 21:40:50
en embarque quand tu sniffes des registre materiels. sinon non et surtout pas pour ce que tu espere en faire en multithread
Marsh Posté le 23-08-2011 à 13:10:06
Joel F a écrit : en embarque quand tu sniffes des registre materiels |
Et dans les routines d'interruption.
Marsh Posté le 25-08-2011 à 14:51:53
Joel F a écrit : en embarque quand tu sniffes des registre materiels. sinon non et surtout pas pour ce que tu espere en faire en multithread |
Je serais pas contre une petite réargumentation à ce sujet. Mon Stroustrup et mon K&R n'ont pas vraiment éclairci le sujet.
Dans le cas d'un multi procs, ca peut sembler utile si ca vient effectivement forcer les relectures depuis la mémoire, non ?
Marsh Posté le 25-08-2011 à 16:48:58
theShOcKwAvE a écrit : Je serais pas contre une petite réargumentation à ce sujet. Mon Stroustrup et mon K&R n'ont pas vraiment éclairci le sujet. |
Le compilateur ne peut pas déterminer qu'une variable est modifiée quand c'est un registre hardware ou quand elle est modifiée depuis un autre thread. La variable volatile indique juste au compilateur de ne pas tenter d'optimiser une variable.
C'est assez bien expliqué ici: http://en.wikipedia.org/wiki/Volatile_variable
Je pense que par "sinon non et surtout pas pour ce que tu espere en faire en multithread", il voulait dire que déclarer une variable volatile ne remplace pas une section critique.
Et moi aussi je veux l'explication plus correcte/complète de Joel F
Marsh Posté le 25-08-2011 à 18:45:10
theShOcKwAvE a écrit : |
Euh, tu n'as pas du bien lire le Stroustrup alors, car il indique bien que la directive a pour effet d’empêcher certaines optimisations. Elle ne force rien du tout.
A+,
Marsh Posté le 26-08-2011 à 12:36:30
gilou a écrit : Euh, tu n'as pas du bien lire le Stroustrup alors, car il indique bien que la directive a pour effet d’empêcher certaines optimisations. Elle ne force rien du tout. |
Je t'avoue que je ne l'ai pas retrouvé dans le stroustrup et je viens d'y jeter à nouveau un oeil, je vois mal dans quel chapitre ca tombe. Cela dit, le K&R est aussi clair là-dessus : ca empêche certaines optimisations comme tu le dis, mais ... L'optimisation qu'on veut en général voir éviter, c'est la suppression de la relecture mémoire d'une variable qui sert dans une boucle mais qui n'y est pas modifiée. Retirer cette optimisation "force" donc à faire un accès à cette zone mémoire au sein de la boucle. C'est précisément le cas qui m'intéresse, d'où mon raccourci : "forcer les relectures". Maintenant que mon point est éclairci, la subtilité qui me chiffonne, c'est de savoir ce qui se passe au niveau du cache des processeurs dans ce genre de contexte. Il me semble que sur certaines architectures (power pc pour ne pas la citer), l'invalidation du cache d'autres processeurs quand l'un fait une modification mémoire est un peu bancale. L'idée, c'est donc de savoir si on peut avoir des garanties à ce niveau là.
Marsh Posté le 26-08-2011 à 13:31:29
theShOcKwAvE a écrit : Je t'avoue que je ne l'ai pas retrouvé dans le stroustrup et je viens d'y jeter à nouveau un oeil, je vois mal dans quel chapitre ca tombe. Cela dit, le K&R est aussi clair là-dessus : ca empêche certaines optimisations comme tu le dis, mais ... L'optimisation qu'on veut en général voir éviter, c'est la suppression de la relecture mémoire d'une variable qui sert dans une boucle mais qui n'y est pas modifiée. Retirer cette optimisation "force" donc à faire un accès à cette zone mémoire au sein de la boucle. C'est précisément le cas qui m'intéresse, d'où mon raccourci : "forcer les relectures". Maintenant que mon point est éclairci, la subtilité qui me chiffonne, c'est de savoir ce qui se passe au niveau du cache des processeurs dans ce genre de contexte. Il me semble que sur certaines architectures (power pc pour ne pas la citer), l'invalidation du cache d'autres processeurs quand l'un fait une modification mémoire est un peu bancale. L'idée, c'est donc de savoir si on peut avoir des garanties à ce niveau là. |
ARM p 110 dans mon édition de 1990, section 7.1.6 Type Specifiers.
Citation : There are no implementation-independant semantics for volatile objects; volatile is a hint to the compiler to avoid aggressive optimization involving the object because the value of the object may be changed by means undetectable by a compiler. |
C'est sans doute dans d'autres bouquins de lui aussi, mais faudrait que je cherche sous quelle pile ils sont planqués.
A+,
Marsh Posté le 26-08-2011 à 15:43:21
theShOcKwAvE a écrit : Dans le cas d'un multi procs, ca peut sembler utile si ca vient effectivement forcer les relectures depuis la mémoire, non ? |
volatile est sous-spécifié. Il force les accès de la machine virtuelle servant à définir la sémantique à correspondre aux accès de la machine physique, mais ce que signifie exactement accès n'est pas défini.
En pratique, volatile est implémenté pour servir les IO mappées en mémoire (et encore, gcc ne fait pas ce qu'il faut en théorie sur Sparc, je ne sais pas si ça marche en pratique, Sparc étant une spec, il est possible qu'aucune implémentation ne profite de la latitude qui fait que ce que gcc implémente n'est pas suffisant; mais c'est pas le propos ici).
Les cachent rendent ce qui est fait insuffisant pour du multi-thread. La synchronisation des differents caches d'un processeur necessite parfois des instructions supplementaires pour avoir l'effet voulu (certains systemes ne synchronisent meme pas les acces a un emplacement memoire, la plupart ne garantissent pas grand chose comme relation quand ca concernent plusieurs emplacement).
Voir sur le site du comité les papiers sur le modele memoire (tu peut chercher Hans Boehm comme auteur, il n'a touche quasiment qu'a ca)
Marsh Posté le 26-08-2011 à 17:57:53
Un Programmeur a écrit : |
merci
Marsh Posté le 21-08-2011 à 13:10:27
hI,
le mot clef volatile en c++ a t-il encore un intérêt ?
Merci.
---------------
.