Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Omniprésence de l'x86 est-il une bonne chose pour Linux ?

176 réponses
Avatar
PP
Bonsoir à tous,

en lisant un peu partout sur internet des news, notamment les dernières
sur www.blogarm.net, je m'attriste de l'omniprésence de l'architecture
x86 partout.

Cette dernière semble être de plus en plus compétitive face aux
spécialistes du secteur comme ARM par exemple dans l'embarqué et les
SoC. Peut-être pas du point de vue technique mais au moins marketing !

Ma peur de voir encore une fois le couple WIntel envahir le marché de
nous imposer une vision uniforme est effrayante.

Le seul point positif peut-être de cette histoire, c'est que Linux
pourrait être choisi encore plus facilement pour tous les matériels
équipés en x86. Ce qui ouvrirait une perspective de personnalisation de
nos équipement encore plus grande !?

Qu'en pensez-vous ?

10 réponses

Avatar
JKB
Le Fri, 01 Oct 2010 23:41:51 +0200,
PP écrivait :
Le 01/10/2010 16:54, pehache-tolai a écrit :
On 1 oct, 14:25, JKB wrote:

Comme tu l'écris, si le truc est bien programmé !
Est-ce les programmeurs sous x86, savent bien programmer en multicœur ?



La réponse est clairement non pour l'immense majorité des
développeurs.



Autrement dit, tous des cons, sauf JKB...





Je n'ai jamais dit ça et je ne prétends pas être meilleur que les
autres. Sauf que programmer une application multithreadée, ça ne
s'improvise pas et ça se fait à la main. Tous les outils qui
prétendent faire ça automatiquement le font _mal_. Il suffit de
regarder un code généré par OpenMP pour s'en convaincre (une
multiplication de matrice par exemple). La programmation
multithreadée, ça se fait pour être efficace à grands coups de
pthread_*() ou équivalent. Des codes vraiment efficaces sur des
processeurs multicoeurs, je n'en connais pas beaucoup parce que
c'est chiant à écrire. Tu passes juste 95% du temps à déboguer les
merdes des synchronisations et des routines non "thread safe". Si
là-dedans, ton bout de code utilise des signaux et que tu dois
utiliser des mutexes dans des gestionnaires de signaux (donc de
manière asunchrones), je te souhaite bien du plaisir.

je ne vois pas pourquoi tu dis cela.
JKB a un point vu plutôt interessant je trouve.
Il ne se contente pas de regarder l'amélioration des performances des
processeurs, mais de voir comment ils y arrivent.
Je suis assez convaincu par JKB, même si je suis de plus en plus
désappointé par le réactivité de Intel et de son x86.

Enfin, bon, je garde espoir, le Toshiba AC100 ferait tourner enfin une
Ubuntu 10.10, ce qui est je pense un évenement majeur!

imaginez la logithèque linux, accessible à un netbook de ce genre ...

ET même si ARM tegra2 c'est 32bits c'est pas bien, au moins c'est
différent et certainement mieux en terme d'héritage technologique !



Pourquoi un processeur 32 bits, ce ne serait pas bien ? Parce qu'on
ne peut pas adresser plus de 4 Go de mémoire ? Encore une légende
urbaine. On ne peut pas adresser plus de 4 Go de mémoire parce qu'on
mélange la taille de l'unité arithmétique et celle des registres. Il
y a quinze ans, j'ai développé des cartes avec un 6809 dans un FPGA
et ce 6809 adressait 64 Mo de mémoire ! Il y a trente ans, le Goupil
G3 avec un 6809 pouvait embarquer plus d'un mégaoctet de mémoire.
Pour un processeur 8/16 bits, c'était bien. Avec le raisonnement
actuel, le truc n'aurait pu adresser que 64 Ko de mémoire !

Je vais aussi tordre le cou à une autre idée. Un code 64 bits est
plus lent et plus gros qu'un code 32 bits. La _seule_ architecture où
ce n'est pas vrai est le x86 parce que l'ABI change. En 64 bits, on
a plus de registres qu'en 32 bits. Si tu prends un sparc, il existe
un mode V8+ (32 bits) qui possède autant de registres que le V9 (64
bits) et on peut mesurer que le même programme compilé en 32 bits
tourne entre 3 et 10% plus vite que celui en 64 bits. Sans compter
que le binaire est plus gros (sauf toujours sur le x86) parce que la
mémoire est alignée et les instructions de format fixe.


Et des rustines façon openmp ne sont pas là pour
arranger les choses quand on voit les aberrations générées.



OpenMP fonctionne très bien quand on l'utilise correctement et à ce
pour quoi il est fait.



ouai le genre de fonction des processeurs dont les publications sont
discrètes au point que personne ne les utilisent parce que personne ne
sait comment ça marche sauf son copain Microsoft !



OpenMP est une bibliothèque qui est capable de paralléliser des
calculs. Elle est utilisable si on sait exactement ce qu'elle fait
et comment elle le fait. Tant qu'on fait des choses simples, cela ne
marche pas si mal que ça, mais lorsqu'on commence à attaquer le
calcul parallèle, ce n'est pas bon parce qu'on arrive à des dérives
numériques très facilement.

Comme je disais sur un autre forum, le brevet ne doit pas être dans
l'instruction, mais dans la façon de la cabler !
C'est trop facile de dire, telle instruction, se code comme cela, pour
faire cela, et surtout faut payer pour la cabler !



JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
JKB
Le Sat, 02 Oct 2010 09:08:27 +0200,
Richard écrivait :
Le 30/09/2010 09:11, JKB a écrit :

Maintenant tout ça a un coût en consommation, c'est
certain, mais ce coût on le réduit en améliorant les processeurs.



Permets-moi d'en douter. L'évolution du x86 ne se fait pas en
optimisant la circuiterie, mais en rajoutant des tas de rustines
pour contourner les problèmes de l'architecture. Au final, tu as un
processeur qui consomme de plus en plus et qui doit être le pire en
terme de rapport entre la puissance consommée et le puissance de
calcul. La seule chose qui le sauve encore, c'est la finesse de
gravure qui le rend moins consommateur, mais cette course à une
limite : non seulement les circuits rajoutés atteindront très
rapidement leur limites, mais les autres fondeur qui font du vrai
RISC vont aussi atteindre ses performances avec des consommations
largement moindres.



Je crois comme Michel Talon que l'avantage du RISC sur le CISC est
aujourd'hui nul. Le gros des transistors d'un CPU actuel, ce sont les
mémoires caches. Le surplus de circuiterie pour traduire les
instructions CISC en micro-instruction RISC est complétement négligeable.



C'est là que je ne suis pas, mais alors pas du tout d'accord.
Si tu prends un RISC, tu n'as pas besoin de cette circuiterie et en
dehors de problèmes de synchronisation des unités d'exécution, tes
instructions sont exécutées dans l'ordre.

Si tu prends un CISC. Il faut que ton interprète CISC qui te
transforme ton CISC en RISC commence par voir quelles sont les
unités disponibles, réorganise les instructions, calcule les modes
d'adressages (dans un RISC, les modes d'adressages sont immédiat,
direct, les autres, tu les fais à la main). C'est cette circuiterie
qui fait qu'un CISC consomme à puissance équivalente plus qu'un
RISC. Et c'est cette circuiterie qui permet à un CISC de faire des
progrès.

Par ailleurs, je ne vois pas ce que vient faire le problème de la
mémoire cache. Un RISC a généralement plus de mémoire cache qu'un
CISC de même fréquence et beaucoup plus de registres. L'HyperSPARC
de 1992 avait déjà 136 registres internes et 1 Mo de cache synchrone
alors qu'il ne tournait qu'à 90 MHz ! Sans compter le nombre de
contextes câblés...

J'ai même ouï dire que, les instructions CISC étant plus courtes que les
RISC, leur lecture en mémoire est plus efficace que sur un processeur RISC.



Ça, permets-moi d'en douter. Les instructions (avec leurs opérandes)
font 32 ou 64 bits selon les modes sur un UltraSparc (soit un mot
mémoire). Sur Alpha, c'est 64 bits. Rien ne dépasse.

Le débat RISC contre CISC est même sans doute dépassé. Aujourd'hui c'est
plus la comparaison GPU/CPU qui est en vogue.



Objection : le débat est aujourd'hui entre RISC et VLIW. Le CISC
est encore utilisé parce qu'il est bien implanté. Le CISC pose tout
un tas de problèmes d'utilisation des ressources du processeur.
Le débat GPU/CPU, c'est juste un effet de mode pour gratter de la
puissance de calcul parce qu'on ne l'a pas ailleurs.

Le point de vu de la série T* Sparc est très intéressante. C'est
exactement le contraire de l'IA64. Tu as un processeur multicoeur et
multithread. Seul le RISC te permet de créer un processeur
multithreadé efficace (les instructions sont tellement élémentaires
que tu sais à l'avance comment les organiser et éviter les temps
morts dans les traitements par le processeur). Exemple : le P4 HT (à
deux threads) te permet de gagner entre 5 et 30% selon les programmes.
Sur un T1 (et par coeur à quatre threads), tu fais tourner par
_coeur_ quatre threads presque aussi vite que si tu avais quatre
systèmes indépendants.

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
Tonton Th
On 10/01/2010 11:41 PM, PP wrote:
Enfin, bon, je garde espoir, le Toshiba AC100 ferait tourner enfin une
Ubuntu 10.10, ce qui est je pense un évenement majeur!

imaginez la logithèque linux, accessible à un netbook de ce genre ...



Il ne manque plus que des vrais Linux, quoi.

ET même si ARM tegra2 c'est 32bits c'est pas bien, au moins c'est
différent et certainement mieux en terme d'héritage technologique !



Tu aurais un lien vers la fiche technique de ce CPU ?

--
Ma coiffeuse est formidable - http://sonia.buvette.org/
Avatar
Nicolas George
JKB , dans le message , a
écrit :
Si
là-dedans, ton bout de code utilise des signaux et que tu dois
utiliser des mutexes dans des gestionnaires de signaux (donc de
manière asunchrones), je te souhaite bien du plaisir.



Utiliser des signaux dans une application moderne non triviale, 'faut être
un peu taré. Si en plus elle est multithreadée, ce n'est plus un peu, c'est
complètement.

S'il y a des informations qui ne parviennent _que_ comme signaux au
processus, la seule manière saine de gérer ça, c'est de les transformer
immédiatement en une information synchrone manipulable normalement (paquet
sur une socket ou dans un pipe, à la rigueur message dans une file de
messages synchronisée). Pour ça, Linux a le bon goût de proposer signalfd ;
pour les Unix moins modernes, on aura recours à un thread dédié à la capture
de signaux.

Pourquoi un processeur 32 bits, ce ne serait pas bien ? Parce qu'on
ne peut pas adresser plus de 4 Go de mémoire ? Encore une légende
urbaine. On ne peut pas adresser plus de 4 Go de mémoire parce qu'on
mélange la taille de l'unité arithmétique et celle des registres. Il
y a quinze ans, j'ai développé des cartes avec un 6809 dans un FPGA
et ce 6809 adressait 64 Mo de mémoire ! Il y a trente ans, le Goupil
G3 avec un 6809 pouvait embarquer plus d'un mégaoctet de mémoire.
Pour un processeur 8/16 bits, c'était bien. Avec le raisonnement
actuel, le truc n'aurait pu adresser que 64 Ko de mémoire !



Conneries. Tout le monde sait qu'on n'a pas attendu les processeurs 32 bits
pour avoir plus de 64 ko de RAM. N'empêche que pour manipuler des données de
plus de 64 ko pour sur un processeur 16 bits, c'est abominablement pénible,
parce qu'il faut faire des contorsions pour saucissonner ses données en
blocs qui rentrent dans 64 ko. Toute l'arithmétique correspondant a un coût
considérable aussi bien en termes de vitesse qu'en termes de complexité du
code, donc de bugs.


Je vais aussi tordre le cou à une autre idée. Un code 64 bits est
plus lent et plus gros qu'un code 32 bits.



Pas qu'un code capable de faire la même chose : ton code 32 bits, il devra
faire à la main toutes les opérations 64 bits indispensables pour manipuler
de grosses quantités de données : code plus gros et plus lent.
Avatar
pehache-youplaboum
"PP" a écrit dans le message de news:
4ca655a0$0$690$
Le 01/10/2010 16:54, pehache-tolai a écrit :
On 1 oct, 14:25, JKB wrote:

Comme tu l'écris, si le truc est bien programmé !
Est-ce les programmeurs sous x86, savent bien programmer en
multicœur ?



La réponse est clairement non pour l'immense majorité des
développeurs.



Autrement dit, tous des cons, sauf JKB...



je ne vois pas pourquoi tu dis cela.



La réponse est quelques lignes plus haut.

JKB a un point vu plutôt interessant je trouve.
Il ne se contente pas de regarder l'amélioration des performances des
processeurs, mais de voir comment ils y arrivent.
Je suis assez convaincu par JKB, même si je suis de plus en plus
désappointé par le réactivité de Intel et de son x86.



Tu es désappointé par le fait qu'Intel fasse beaucoup d'efforts de
développement sur les x86 ??


Enfin, bon, je garde espoir, le Toshiba AC100 ferait tourner enfin une
Ubuntu 10.10, ce qui est je pense un évenement majeur!

imaginez la logithèque linux, accessible à un netbook de ce genre ...



La logithèque Linux accessible sur les netbooks, ce n'est pas franchement
nouveau...


Et des rustines façon openmp ne sont pas là pour
arranger les choses quand on voit les aberrations générées.



OpenMP fonctionne très bien quand on l'utilise correctement et à ce
pour quoi il est fait.



ouai le genre de fonction des processeurs dont les publications sont
discrètes au point que personne ne les utilisent parce que personne ne
sait comment ça marche sauf son copain Microsoft !
Comme je disais sur un autre forum, le brevet ne doit pas être dans
l'instruction, mais dans la façon de la cabler !
C'est trop facile de dire, telle instruction, se code comme cela, pour
faire cela, et surtout faut payer pour la cabler !



Mais qu'est-ce que tu racontes ???

OpenMP est une spécification décrivant des directives et des appels de
routines pour faire de la programmation parallèle en C ou en Fortran. Rien à
voir avec Microsoft, et ces spécifications sont publiques.

--
pehache
http://pehache.free.fr
Avatar
JKB
Le 02 Oct 2010 09:15:06 GMT,
Nicolas George <nicolas$ écrivait :
JKB , dans le message , a
écrit :
Si
là-dedans, ton bout de code utilise des signaux et que tu dois
utiliser des mutexes dans des gestionnaires de signaux (donc de
manière asunchrones), je te souhaite bien du plaisir.



Utiliser des signaux dans une application moderne non triviale, 'faut être
un peu taré. Si en plus elle est multithreadée, ce n'est plus un peu, c'est
complètement.

S'il y a des informations qui ne parviennent _que_ comme signaux au
processus, la seule manière saine de gérer ça, c'est de les transformer
immédiatement en une information synchrone manipulable normalement (paquet
sur une socket ou dans un pipe, à la rigueur message dans une file de
messages synchronisée). Pour ça, Linux a le bon goût de proposer signalfd ;
pour les Unix moins modernes, on aura recours à un thread dédié à la capture
de signaux.



Tu n'as pas forcément le _choix_, surtout lorsque la chose doit être
_portable_. Par ailleurs, un thread dédié, ce n'est pas forcément
optimal du point de vue du CPU. Là encore, c'est toi qui vois.
Et tu peux aussi être contraint d'utiliser des signaux par thread.
Il y a d'ailleurs tout un tas de mécanismes dans POSIX 2001 pour
faire ça.

Quant à signalfd, c'est une hérésie linuxienne qui devrait tomber
dans les oubliettes de l'histoire informatique !

Pourquoi un processeur 32 bits, ce ne serait pas bien ? Parce qu'on
ne peut pas adresser plus de 4 Go de mémoire ? Encore une légende
urbaine. On ne peut pas adresser plus de 4 Go de mémoire parce qu'on
mélange la taille de l'unité arithmétique et celle des registres. Il
y a quinze ans, j'ai développé des cartes avec un 6809 dans un FPGA
et ce 6809 adressait 64 Mo de mémoire ! Il y a trente ans, le Goupil
G3 avec un 6809 pouvait embarquer plus d'un mégaoctet de mémoire.
Pour un processeur 8/16 bits, c'était bien. Avec le raisonnement
actuel, le truc n'aurait pu adresser que 64 Ko de mémoire !



Conneries. Tout le monde sait qu'on n'a pas attendu les processeurs 32 bits
pour avoir plus de 64 ko de RAM. N'empêche que pour manipuler des données de
plus de 64 ko pour sur un processeur 16 bits, c'est abominablement pénible,
parce qu'il faut faire des contorsions pour saucissonner ses données en
blocs qui rentrent dans 64 ko. Toute l'arithmétique correspondant a un coût
considérable aussi bien en termes de vitesse qu'en termes de complexité du
code, donc de bugs.



Là encore, tu ne retiens que ce que tu veux bien retenir. J'ai pris
un _exemple_, mais tu ne dois pas savoir ce que c'est. La plupart
des ALU des processeurs 32 bits tournent sur plus de 32 bits (réels
ou émulés). Pour le i386, le bus d'adresse interne est de 48 bits,
ce qui permet de sortir le fameux PAE. Les calculs internes
d'adresses se font sur 48 bits même si le bus externe s'arrête à 4
Go de mémoire adressable. Toute la circuiterie est là
et le coût comme tu dis n'est pas _considérable_. C'est un peu plus
long qu'un adressage direct en mémoire, c'est tout. Quant aux bugs,
c'est aux concepteurs des OS de se torturer les méninges, pas à toi.
Lorsque je bossais sur du 6809, j'utilisais de manière
_transparente_ la mémoire comme une mémoire plate sur 32 bits. C'est
à l'OS de se démerder et ça s'appelle la mémoire virtuelle.

Même Flex9 sur Goupil G3 était capable de faire ça. Alors ne viens
surtout pas me dire que 30 ans plus tard, on est incapable de le
faire !

Je vais aussi tordre le cou à une autre idée. Un code 64 bits est
plus lent et plus gros qu'un code 32 bits.



Pas qu'un code capable de faire la même chose : ton code 32 bits, il devra
faire à la main toutes les opérations 64 bits indispensables pour manipuler
de grosses quantités de données : code plus gros et plus lent.



Là encore, commence par me relire. Qu'on compile en 64 bits des
codes manipulant beaucoup de mémoire est une chose. Qu'on compile en
64 tout un userland de système d'exploitation est une aberration
(sauf sur x86, pour les raisons que j'expliquais plus haut).

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
pehache-youplaboum
"JKB" a écrit dans le message de news:

Le Fri, 01 Oct 2010 23:41:51 +0200,
PP écrivait :
Le 01/10/2010 16:54, pehache-tolai a écrit :
On 1 oct, 14:25, JKB wrote:

Comme tu l'écris, si le truc est bien programmé !
Est-ce les programmeurs sous x86, savent bien programmer en
multicœur ?



La réponse est clairement non pour l'immense majorité des
développeurs.



Autrement dit, tous des cons, sauf JKB...





Je n'ai jamais dit ça et je ne prétends pas être meilleur que les
autres. Sauf que programmer une application multithreadée, ça ne
s'improvise pas et ça se fait à la main. Tous les outils qui
prétendent faire ça automatiquement le font _mal_. Il suffit de
regarder un code généré par OpenMP pour s'en convaincre (une
multiplication de matrice par exemple).



J'utilise OpenMp depuis des années, au début sur des SGI Origin 2000 et
autres machines de calcul multiproc de l'époque (Sun...), aujourd'hui sur
des PC x86 multicoeurs, et ça marche parfaitement bien quand on sait ce
qu'on fait.

Evidemment, si on parallélise des bouts de code qui font trop peu de calculs
par rapport à l'overhead de parallélisation, ça ne sert à rien.

La programmation
multithreadée, ça se fait pour être efficace à grands coups de
pthread_*() ou équivalent. Des codes vraiment efficaces sur des
processeurs multicoeurs, je n'en connais pas beaucoup parce que
c'est chiant à écrire.



J'en fait régulièrement. Je n'ai aucun mérite, OpenMP est d'une simplicité
biblique. Encore une fois quand on sait ce qu'on fait, car évidemment OpenMP
ne répond pas à tous les besoins et ne résout pas tous les problèmes, il
faut quand même réfléchir un peu. Mais il faut toujours réfléchir, quand on
programme, non ?




ouai le genre de fonction des processeurs dont les publications sont
discrètes au point que personne ne les utilisent parce que personne
ne sait comment ça marche sauf son copain Microsoft !



OpenMP est une bibliothèque qui est capable de paralléliser des
calculs. Elle est utilisable si on sait exactement ce qu'elle fait
et comment elle le fait. Tant qu'on fait des choses simples, cela ne
marche pas si mal que ça, mais lorsqu'on commence à attaquer le
calcul parallèle, ce n'est pas bon



OpenMP a au départ été conçue principalement pour les besoins du calcul
lourd parallèle. Mais c'est un détail...

parce qu'on arrive à des dérives
numériques très facilement.



Pardon ??? Mais que viennent foutre les dérives numériques dans cette
histoire ???

Un code parallélisé, que ce soit avec OpenMP, MPI, ou à la main, n'a pas
plus de raison d'avoir des "dérives numériques" que son équivalent
séquentiel.

--
pehache
http://pehache.free.fr
Avatar
Nicolas George
JKB , dans le message , a
écrit :
Tu n'as pas forcément le _choix_, surtout lorsque la chose doit être
_portable_.



Ben si.

Par ailleurs, un thread dédié, ce n'est pas forcément
optimal du point de vue du CPU.



D'où l'intérêt de signalfd.

Et tu peux aussi être contraint d'utiliser des signaux par thread.



Non, on n'est jamais contraint d'utiliser des signaux par thread, c'est un
choix de design. Un choix mauvais.

Il y a d'ailleurs tout un tas de mécanismes dans POSIX 2001 pour
faire ça.



Ça prouve quoi ? gets aussi est POSIX.

Quant à signalfd, c'est une hérésie linuxienne qui devrait tomber
dans les oubliettes de l'histoire informatique !



Ce sont les signaux qui devraient tomber dans les oubliettes de l'histoire
d'Unix. Le principe d'Unix, c'est : tout est fichier.

Là encore, tu ne retiens que ce que tu veux bien retenir. J'ai pris
un _exemple_, mais tu ne dois pas savoir ce que c'est. La plupart
des ALU des processeurs 32 bits tournent sur plus de 32 bits (réels
ou émulés). Pour le i386, le bus d'adresse interne est de 48 bits,
ce qui permet de sortir le fameux PAE. Les calculs internes
d'adresses se font sur 48 bits même si le bus externe s'arrête à 4
Go de mémoire adressable. Toute la circuiterie est là



On s'en fout : les registres généraux font 32 bits, pour manipuler des
données plus grosses, il faut jongler.
Avatar
pehache-youplaboum
"ST" a écrit dans le message de news:

On 10/1/10 10:54 PM, pehache-tolai wrote:

Autrement dit, tous des cons, sauf JKB...



Ben comment ! tu savais pas ?



Ah non...


OpenMP fonctionne très bien quand on l'utilise correctement et à ce
pour quoi il est fait.



Alors OpenMP aurait été écrit par JKB !



Certainement. Il y a 20 ans il avait bricolé une bibliothèque qui
ressemblait déjà vachement à OpenMP pour pouvoir exploiter la machine qu'il
avait construite en reliant 16 Commodore 64 grâce à des cartes réseau de son
invention qui préfiguraient Infiniband (mais en mieux).

--
pehache
http://pehache.free.fr
Avatar
Tonton Th
On 10/02/2010 09:08 AM, Richard wrote:

J'ai même ouï dire que, les instructions CISC étant plus courtes que les
RISC, leur lecture en mémoire est plus efficace que sur un processeur RISC.



Oui, et non. Il me semble que les instructions à longueur variable
complexifient grandement le séquenceur d'accès et la gestion du
cache.

--
Ma coiffeuse est formidable - http://sonia.buvette.org/