[gull] Linux sur processeur Core Duo?
Daniel Cordey
dc at mjt.ch
Fri Aug 11 15:46:58 CEST 2006
On Friday 11 August 2006 14:46, Marc SCHAEFER wrote:
> Sont-ce des registres accessibles par le programmeur assembleur (donc il
> faut recompiler tous les programmes en langages plus évolués, et avoir
> le compilateur ad-hoc),
Oui. tous les compilateurs, dont gcc, ont des flags permettant de preciser
le "type" de processeur. L'inconvenient de cette pratque est que l'on rend
alors le code incompatible avec les generations precedentes. C'est donc une
arme a double tranchant.
> Et s'il y a trop de registres, il faut ensuite les sauvegarder lors d'un
> changement de contexte, ce qui peut poser des problèmes nouveaux.
Surtout une chute des performances qui varie d'une architecture a l'autre.
Pour limiter les degats, HP a developpe a develppe son compilateur en
definissant un Procedure Calling Convention qui determine quels registres
doivent etre sauves lors d'un appel de fonction. En gros, un certain nombre
de parametres sont passes dans les registres, de meme que pour la valeur de
retour (return(x)). Le compilateur optimize l'utilisation des registres dans
chaque fonction et s'arrange pour ne pas entre en conflit avec les appels
successifs. C'est un peu complique a respecte lorsque l'on programme en
assembleur, mais totatelement transparent en passant par le compilateur.
Naturellement, si l'on optimize sont code pour une architecture determinee,
il ne sera pas compatible avec les precedentes, car le nombre de registre n'a
cesse d'augmenter (PA-RISC 1.0, 1.1, 2.0). L'avantage etant un usage tres
restreint du stack... (ce n'est pas du tout le mode standard de gcc qui ne
passe aucun argument dans les registres par defaut !) A contrario,
l'architecture SPARC a fait le pari du "windowing"; soit des groupes de
registres commutables. L'avantage etant que le compilateur n'a pas a gerer
l'utilisation des registres inter-proceduraux, si ce n'est une sorte d'index
dans la "window". C'est hyper rapide... L'inconvenient est que, comme le
compilateur ne chrceh pas a optimiser l'utilisation de ses registres, il doit
tous les transfer aveuglement dans le stack lorsqu'il n'y a plus de "windows"
a disposition. C'est-a-dire que le nombre de "window" determine
la "profondeur" des appels de fonctions, avant de devoir passer
systemqtiquement par le stack. Or, comme les registres "coutent" cher en
place dans un CPU, cela limite le nombre de "windows" a disposition...
Quelque soit le nombre, celui-ci n'est pas assez important pour les systemes
mutli-utilisateurs ou les problemes de recursivite. Raison pour laquelle SUN
souffre d'un handicap de performance dans les grands serveurs; ce qui
l'oblige a multiplie les processeurs, etc. pour lutter face a d'autres
architectures plus efficaces dans ce domaine.
Le compilateur gcc effectue deja un certain nombre d'optimisation de l'usage
des registres, tout en etant tres attentif a rester compatible avec
l'architecture employee. Si l'on commence a jouer avec les differentes
options d'optimisation relatives a l'emploi des registres, il y a plus que de
tres fortes chances que le code genere ne soit plus compatible avec les
librairies, le loader, etc. C'est tres dangereux et cela doit etre employe
uniquement lorsque l'on maitrise bien le confinement de l'execution du code.
Pour info, il y a 233 fois le mots 'register' dans ma doc de gcc... C'est
touchy... :-)
dc
More information about the gull
mailing list