URL: https://linuxfr.org/news/altairx-le-processeur-du-futur Title: AltairX : le processeur du futur ? Authors: devnewton đŸș orfenor, Kannagichan, L'intendant zonard, Yves Bourguignon, jseb, palm123, Nicolas Boulay, Ysabeau đŸ§¶, vincent LECOQ, Arkem, Nils Ratusznik, volts, bobble bubble et SpaceFox Date: 2023ćčŽ05月30æ—„T10:07:50+02:00 License: CC By-SA Tags: processeur, open_hardware, risc-v et openpower Score: 82 [Kannagi](https://linuxfr.org/users/kannagichan), rĂ©cemment interrogĂ© sur son [SDK pour Neo Geo](https://linuxfr.org/news/entretien-avec-kannagi-a-propos-de-ngdk), travaille sur un nouveau concept de processeur : l’AltairX a pour but de concilier au maximum coĂ»t, facilitĂ© de conception et performance. C’est un processeur [VLIW](https://fr.wikipedia.org/wiki/Very_long_instruction_word), ce qui veut dire que c’est le compilateur qui a en charge une bonne partie de l’optimisation, ce qui permet une conception plus facile avec moins de transistors qu’un processeur classique. ---- [Le dĂ©pĂŽt de Kannagi](https://github.com/Kannagi/AltairX) ---- PrĂ©ambule ========= Cet article est complexe avec beaucoup de vocabulaire technique en anglais. Vous pouvez consulter la page [CPU](/wiki/cpu), nouvellement créée dans le wiki de Linuxfr pour bien comprendre le fonctionnement des processeurs et des architectures modernes. Si vous connaissez bien les processeurs, n’hĂ©sitez pas Ă  enrichir ce wiki ou Ă  commenter cette dĂ©pĂȘche pour donner des explications Ă  tout le monde. # PrĂ©sentation de l’AltairX ## Approche de ce CPU L’AltairX tente d’avoir de bonnes performances, tout en conciliant simplicitĂ© d’implĂ©mentation et Ă©conomie de transistors et d’énergie. Pour cela, il dĂ©charge la complexitĂ© vers le compilateur, qui gĂšre et indique les diverses optimisations Ă  effectuer. C’est aussi le compilateur qui indique le nombre d’instructions Ă  exĂ©cuter en parallĂšle de façon explicite : ici, deux instructions par cycle. L’AltairX pourrait trĂšs bien faire quatre instructions par cycle et ĂȘtre meilleur que les Ryzen Zen 5 ou Intel 13900, mais comme il est trĂšs compliquĂ© d’avoir autant d’instructions en parallĂšle de maniĂšre statique[^1] sur un processeur gĂ©nĂ©raliste, Kannagi a dĂ©cidĂ© de le faire Ă  deux instructions par cycle pour le moment, car une plus grande complexitĂ© n’amĂšne que des gains minimes : avec plus d’instructions par cycle, il faudrait trouver constamment des instructions Ă  exĂ©cuter pour exploiter au maximum le CPU. Sur un processeur gĂ©nĂ©raliste, le processeur a souvent tendance Ă  s’arrĂȘter sur un _if_ et surtout, c’est beaucoup moins parallĂ©lisable (on ne fait pas constamment du multimĂ©dia, mais on traite du code avec Ă©normĂ©ment de structure de contrĂŽle _if, else, switch_). On considĂšre gĂ©nĂ©ralement qu’un code binaire a 20% de branchement (une instruction sur cinq). C’est pour cela que, mĂȘme les processeurs rĂ©cents d’AMD ou Intel ne dĂ©passent pas trois ou quatre instructions par cycle en moyenne. Deux instructions par cycle restent trĂšs honorables, et donnent de bonnes performances. L’AltairX a 64 registres : 56 registres « rĂ©els » et 8 registres spĂ©ciaux qui servent pour le _bypass_. Le _bypass_ est une technique d’optimisation qui intervient dans la premiĂšre des quatre grandes tĂąches d’optimisation : 1. RĂ©soudre les dĂ©pendances de donnĂ©es 2. ParallĂ©liser les instructions 3. Optimiser les conditions 4. Optimiser les caches La rĂ©solution des dĂ©pendances s’optimise soit via le renommage de registre, soit via le _bypass_. Le renommage de registre sert quand on a les mĂȘmes registres utilisĂ©s dans deux opĂ©rations, mais pas rĂ©ellement de dĂ©pendance entre elles. Dans ce cas, on peut renommer les registres pour rĂ©soudre le problĂšme. Le principe du _bypass_ est qu’on ne passe pas par les registres, et qu’on lie deux unitĂ©s de calcul directement pour Ă©viter que le CPU se bloque le temps de lire/Ă©crire les registres entre les deux instructions. La difficultĂ© du _bypass_ est qu’il demande au processeur pas mal d’analyse pour qu’il le fasse de lui-mĂȘme, et que le dĂ©bogage peut ĂȘtre fastidieux. Donc, sur l’AltairX le _bypass_ est explicite ; c’est au compilateur de bien savoir l’utiliser, l’implĂ©mentation ne fait aucune vĂ©rification. Pour les conditions, l’AltairX n’a aucune prĂ©diction de branchement. La raison est que son pipeline est court ([six Ă©tapes, ou _stages_, dĂ©taillĂ©s ci-dessous](#toc-larchitecture-de-laltairx)), ce qui fait que les branchements ont un coĂ»t de un Ă  cinq cycles (tout dĂ©pend de comment le compilateur arrive Ă  optimiser). C’est relativement faible vu qu’une mauvaise prĂ©diction sur le x86 fait environ vingt cycles. Ce choix de ne pas faire de prĂ©diction de branchement est un compromis pour faciliter l’implĂ©mentation. À la place de la prĂ©diction de branchement, les conditions sont en [delay slot](https://en.wikipedia.org/wiki/Delay_slot), ce qui veut dire que tout le branchement s’exĂ©cute avec un cycle de retard. Pour optimiser un peu les branchements, deux instructions sont rajoutĂ©es : un **CMOVE** qui est un _move_ conditionnel, et l’instruction **LOOP**, qui permet d’exĂ©cuter un _for_ assez rapidement. [![Pipeline et Unit de l’AltairX](https://github.com/Kannagi/AltairX/blob/main/graph/Pipeline_AX.png?raw=true)](https://github.com/Kannagi/AltairX/blob/main/graph/Pipeline_AX.png?raw=true) ## GenĂšse Souvent déçu par x86 et son architecture qu’il trouve mal faite, mais aussi par la complexitĂ© de la programmation sur PS2 et PS3, Kannagi s’est inspirĂ© du [MIPS](https://fr.wikipedia.org/wiki/Architecture_MIPS), des [VU de la PS2](https://www.copetti.org/writings/consoles/playstation-2/), du [CELL de la PS3](https://www.copetti.org/writings/consoles/playstation-3/), d’une partie de l'[ARM](https://fr.wikipedia.org/wiki/Architecture_ARM) et du [M68000](https://fr.wikipedia.org/wiki/Motorola_68000) pour la syntaxe. Le nom combine une Ă©toile et un X pour se dĂ©marquer et faire rĂ©fĂ©rence systĂšme Unix ou la lettre X est souvent utilisĂ©e. ## L’ISA de l’AltairX L'[ISA](https://fr.wikipedia.org/wiki/Architecture_de_processeur), acronyme d’_Instruction Set Architecture_, c’est l’architecture du processeur. L’ISA de l’AltairX est assez simple : - il y a 1 bit de _pairing_ pour indiquer une ou deux instructions par cycle, - 7 bits pour l’_opcode_, cette taille permet 128 instructions, ce qui est un peu limite -- c’est un peu son « dĂ©faut » et Kannagi s’arrache les cheveux pour trouver des solutions avec cette contrainte ; - 2 bits pour indiquer la taille des opĂ©rations (8/16/32/64 bits) -- c’est l’équivalent de faire un `char` `short` `int` `long` en C ou un `u8` `u16` `u32` `u64` en Rust. - et 3 x 6 bits pour les registres. ![Decode de l’AltairX](https://github.com/Kannagi/AltairX/blob/main/graph/Altair_instruction.png?raw=true) ![ISA de l’AltairX](https://github.com/Kannagi/AltairX/blob/main/graph/ISA.png?raw=true) Les instructions sur le premier et le second [[Opcode]] peuvent ĂȘtre diffĂ©rentes, c’est un avantage ! Du coup l’AltairX tourne autour de 150-160 instructions diffĂ©rentes (instruction [[SIMD]] compris). Les VLIW fonctionnent avec des _bundles_ ([un groupe d’instructions](https://fr.wikipedia.org/wiki/Code_op%C3%A9ration)). L’AltairX a un groupe de deux instructions, donc on dispose de 64 bits. Mais l’avantage du _bundle_, c’est que l’on peut combiner les deux instructions soit pour en faire une plus Ă©voluĂ©e, [soit pour faire des immĂ©diates](https://stackoverflow.com/questions/39427092/risc-v-immediate-encoding-variants) plus grandes. Attention Ă  ne pas confondre la taille de l’instruction et celle des _opcodes_, par exemple sur le RISC-V les instructions font 32 bits, l’_opcode_ bien moins. ## Les caches de l’AltairX La plupart des architectures gĂšrent les caches de façon conventionnelle et ne sortent pas des sentiers battus. Pourtant les caches sont primordiaux et il est important d’inventer des façons plus originales, voire carrĂ©ment « exotiques » de les gĂ©rer. L’AltairX possĂšde ainsi trois « caches » ou pour ĂȘtre plus exact deux caches plus un [SPM ou _scratchpad memory_](https://en.wikipedia.org/wiki/Scratchpad_memory) : - Le CPU a un cache lecture et un cache Ă©criture. Pourquoi cela ? D’une part parce que ça permet d’avoir une lecture bien plus rapide, et d’autre part parce que ça Ă©vite de vider le cache inutilement en cas de lecture seule. Une chose dĂ©rangeait Kannagi avec les optimisations sur PC x86, c’est que lorsqu’on a une grosse quantitĂ© de donnĂ©es Ă  gĂ©rer (par exemple 32 Mo), on va « vider le cache » pour y mettre ces donnĂ©es et tout le reste sera ralenti. - Le SPM est une version trĂšs manuelle des caches. Un cache est gĂ©nĂ©ralement automatique et transparent, mĂȘme si vous codez en assembleur vous ne savez pas exactement ce qui est en cache ou pas. Le SPM permet de dire ce que vous voulez y mettre. L’avantage « ultime » c’est que le SPM n’a jamais de [dĂ©faut de cache](https://dept-info.labri.fr/~strandh/Teaching/Online/Algo/defaut-de-cache.html) ! Comme dans beaucoup de consoles, le SPM de l’AltairX fonctionne avec un [DMA](https://fr.wikipedia.org/wiki/Acc%C3%A8s_direct_%C3%A0_la_m%C3%A9moire), ce qui prĂ©sente beaucoup d’avantages : on peut en faire un double buffer pour gĂ©rer ses donnĂ©es, ne pas avoir de cache _miss_ et ne pas avoir Ă  vider le cache. Les CPU Intel et AMD utilisent du _8 way_ pour les caches L1, les caches L2 sont du _8_ ou _16 way_ et les caches L3 du _16 way_. Cela rend ces caches trĂšs performants avec peu de conflits d’adresses, mais ce sont aussi des caches relativement lents. Pour l’AltairX, Kannagi envisage idĂ©alement du _4 way_ (ou _2 way_ au pire). Sur les premiĂšres versions de l’AltairX, il n’y aura que des caches L1. Kannagi ne compte pas mettre de L3, car plus vous avez de niveaux de cache, plus cela ralentit les accĂšs Ă  la RAM. De la mĂȘme façon, Apple pour les M1 et M2 n’utilise pas non plus de cache L3. Il existe bien sĂ»r pas mal d’algorithmes de cache, celui de l’AltairX utilisera le [PLRUm](https://fr.wikipedia.org/wiki/Algorithmes_de_remplacement_des_lignes_de_cache#PLRUm). ![Cache et Bus de l’AltairX](https://github.com/Kannagi/AltairX/blob/main/graph/BUS_Diagram2.png?raw=true) ## L’architecture de l’AltairX L’architecture interne de l’AltairX se dĂ©compose en six Ă©tapes exĂ©cutĂ©es en parallĂšle ([voir l’exemple de la bouteille](/wiki/cpu#toc-d%C3%A9tails-de-fonctionnement-processeurs-et-architecture-modernes)) : 1. Fetch 2. Decode / Execute BRU 3. Read Register 4. Execute 5. Memory 6. Write Back La diffĂ©rence avec un MIPS (de cinq _stages_) c’est le _Read Register_ : celui de l’AltairX sera forcĂ©ment plus « long », parce qu’on a beaucoup de registres Ă  lire et Ă  Ă©crire. Mais aussi pour qu’il puisse monter facilement en frĂ©quence. Reprenons le _pipeline_ : 1. Le _Fetch_ est donc capable de fournir 64 bits (8 octets) par cycle pour fournir deux instructions. 1. Ensuite le _Decode_ relativement simple, mais le _Decode_ gĂšre aussi les branchements en lisant un _register flag_ interne et/ou des registres internes au BRU. 1. Le _Register_ fait donc six lectures et deux Ă©critures de registre par cycle. 1. _Execute_ exĂ©cute les instructions Ă  proprement parler donc ALU/LSU ici, sur le LSU il gĂ©nĂšre l’adresse. 1. _Memory_ lit le cache L1 (s’il n’y a pas de cache _miss_, sinon ça fait plus d’un cycle), sur l’ALU cette Ă©tape est vide. 1. _Write Back_ indique la fin du pipeline et l’envoi de l’écriture du registre. ![Pipeline de l’AltairX](https://github.com/Kannagi/AltairX/blob/main/graph/Pipeline.png?raw=true) Ensuite l’AltairX a deux ALU, deux LSU, deux FPU, un BRU (_Branch Unit_), un MDU (_MulDiv Unit_), un EFU (_Extent Float-point Unit_, pour les 'div', 'sqrt', 'sin', etc.), un FPU-D (FPU pour les doubles) et un DMA. À titre de comparaison un processeur AMD dispose de quatre ALU, quatre « LSU » (AppelĂ© AGU) et quatre FPU. Dans un premier temps, le FPU ne respectera pas Ă  100% le standard IEEE, parce que le respecter totalement prendrait trop de cycles. Plus tard, l’AltairX gĂšrera peut-ĂȘtre les _half float_ (_float_ de 16 bits). ## Quelques CPU remarquables qui ont inspirĂ© l’AltairX Trois processeurs ont tentĂ© des approches trĂšs diffĂ©rentes de ces problĂšmes : - l’Emotion engine de la [PS2](https://www.copetti.org/writings/consoles/playstation-2/) ; - le CELL de la [PS3](https://www.copetti.org/writings/consoles/playstation-3/) ; - l'[Itanium](https://fr.wikipedia.org/wiki/Itanium) d’Intel/HP. Beaucoup ne le savent pas mais l’Emotion engine et le CELL sont trĂšs ressemblants. Bien sĂ»r ce n’est pas la mĂȘme [ISA](https://fr.wikipedia.org/wiki/Architecture_de_processeur) : l’un est sur du MIPS avec des VU et l’autre sur du PowerPC avec des SPE. Mais le principe est le mĂȘme : un processeur « standard » superscalaire _in order_ et d’autres processeurs [VLIW](https://fr.wikipedia.org/wiki/Very_long_instruction_word). Ces processeurs [VLIW](https://fr.wikipedia.org/wiki/Very_long_instruction_word) tentaient de rĂ©soudre un problĂšme existant dĂ©jĂ  Ă  l’époque : « la latence de la RAM ». L’exploit qu’arrivent Ă  rĂ©aliser ces machines est qu’il est possible d’atteindre leur chiffre thĂ©orique, parce que la [SPM](https://en.wikipedia.org/wiki/Scratchpad_memory) (une mĂ©moire interne dont il sera question plus loin dans cette dĂ©pĂȘche) ne provoque aucun [dĂ©faut de cache](https://dept-info.labri.fr/~strandh/Teaching/Online/Algo/defaut-de-cache.html). De plus ces processeurs [VLIW](https://fr.wikipedia.org/wiki/Very_long_instruction_word) sont bien conçus pour permettre facilement deux instructions par cycle, y compris avec une division dessus. Le souci c’est qu’il Ă©tait compliquĂ© de coder dessus ; et surtout ils n’avaient pas vocation Ă  ĂȘtre des processeurs gĂ©nĂ©ralistes. L’Itanium est vraiment unique : il a créé un type de micro architecture Ă  lui tout seul. Il avait des _bundles_ (un groupe d'[opcode](https://fr.wikipedia.org/wiki/Code_op%C3%A9ration)) de 128 bits pouvant exĂ©cuter trois instructions par cycle, voire plus (Ă©tant en partie superscalaire, il pouvait exĂ©cuter deux _bundles_ par cycle, soit six instructions par cycle). Le CELL et L’Itanium ont deux visions diffĂ©rentes, le CELL voulait Ă©viter les cache _miss_, et l’Itanium exploser le compteur d’instructions par cycle. Mais les deux avaient le mĂȘme souci, un compilateur beaucoup trop complexe qui n’arrivait pas Ă  gĂ©rer leur architecture exotique. Pourtant, ce sont ces processeurs qui ont donnĂ© Ă  Kannagi l’idĂ©e de son processeur AltairX, suivant deux axes : - s’inspirer des processeurs dĂ©diĂ©s aux consoles et en faire des processeurs gĂ©nĂ©ralistes ; - faire une [ISA](https://fr.wikipedia.org/wiki/Architecture_de_processeur) pas trop complexe mais qui permet nĂ©anmoins d’avoir des informations du compilateur pour optimiser au mieux. # Interview de Kannagi ## Pourquoi un nouveau CPU et pas le RISC-V ? Alors de base on pourrait souvent me dire « pourquoi tu n’utilises pas du [RISC-V](https://riscv.org/) ? » Je ne suis pas un fan inconditionnel du [RISC](https://fr.wikipedia.org/wiki/Processeur_%C3%A0_jeu_d%27instructions_r%C3%A9duit), pour la simple raison que pour moi l’[ISA](https://fr.wikipedia.org/wiki/Architecture_de_processeur) doit reprĂ©senter en partie le fonctionnement interne du processeur. De plus, j’ai toujours une prĂ©fĂ©rence pour MIPS et je trouve qu’on fonde peut-ĂȘtre trop d’espoirs pour « rien » sur le RISC-V qui est un MIPS mis au goĂ»t du jour. En second point, RISC-V se veut trop « simpliste ». Vous avez surement entendu dire que le RISC ne fait que des trucs simplistes, et le CISC non. Oui et non, mais ceux qui conçoivent RISC-V (qui sont aussi les gĂ©niteurs du RISC) restent attachĂ©s Ă  cette idĂ©e. C’est une critique rĂ©currente que reçoit RISC-V : il se veut trop simpliste, il veut toucher Ă  la fois les microcontrĂŽleurs et les ordinateurs haute performance, tout en Ă©tant facile Ă  Ă©muler et pĂ©dagogique. Alors il rĂ©ussit pas mal de ces choses, mais bien sĂ»r au prix de beaucoup de compromis. Si vous voulez mon avis, je pense que ARM restera un RISC bien plus performant que le RISC-V, il est bien plus pragmatique dans sa conception. L'[ISA](https://fr.wikipedia.org/wiki/Architecture_de_processeur) du RISC-V est loin d’ĂȘtre parfaite. Je vais Ă©viter les diffĂ©rents points que beaucoup trouvent « problĂ©matiques », mais ceux qui conçoivent RISC-V rĂ©pondent : « pas de souci, en _Out of Order_ on rĂ©soudra ces dĂ©fauts ». Alors oui c’est vrai, ils n’ont pas tort, le x86 y arrive trĂšs bien ! Mais du coup quel intĂ©rĂȘt de faire du RISC-V en se disant « pas grave en y allant au bazooka on y arrivera !» ? L’autre point est que le RISC-V se dit open-source, ce qui est exact pour l'[ISA](https://fr.wikipedia.org/wiki/Architecture_de_processeur), mais pas pour son implĂ©mentation. [Comme je l’avais dit](/news/entretien-avec-kannagi-a-propos-de-ngdk#toc-vous-avez-des-projets-en-cours), c’est un peu comme dire que l’API Linux est open source, mais que son code source ne l’est pas. C’est un peu ça le souci du RISC-V vendu « open source » pour le hardware. Et donc que l’[ISA](https://fr.wikipedia.org/wiki/Architecture_de_processeur) soit « ouverte » de mon point de vue n’est pas trĂšs important ? Il existe de nombreuses ISA ouvertes maintenant (Open RISC, openPower, openSparc, mĂȘme le MIPS rĂ©cemment !). Et le point forcĂ©ment qui me gĂȘne le plus, le RISC-V n’est pas forcĂ©ment un bon processeur _in-order_. Et sa seule proposition alternative est donc de faire du superscalaire _out of order_, technologie relativement complexe et coĂ»teuse Ă  faire. J’ai pu lire ici entre autres que SiFive sera le futur Intel ? Alors je ne le pense pas. C’est lĂ  tout le souci, si demain Intel ou AMD veulent faire du RISC-V, ils pourront le faire, et bien mieux que n’importe quelle entreprise actuelle. Cela fait 30 ans qu’ils font du Superscalaire _Out of Order_ pour les hautes performances, ils ont créé un gros fossĂ© pour le ticket d’entrĂ©e dans ce genre de technologie. ## Quelles sont les Ă©volutions possibles ? Mon processeur est loin d’ĂȘtre parfait, le souci du [VLIW](https://fr.wikipedia.org/wiki/Very_long_instruction_word) c’est qu’on atteint vite ses limites thĂ©oriques. Dans mon cas, deux instructions par cycle, et ensuite ? On pourrait faire quatre ou huit instructions par cycle, mais comme dit plus haut ça ne servirait pas Ă  grand-chose. Comme expliquĂ© avant, de façon statique pour un CPU gĂ©nĂ©raliste, quatre instructions serait « correct », mais resterait limitĂ©. On aurait des gains ici et lĂ , mais probablement pas satisfaisants Ă  mon avis. A huit ça augmenterait encore plus la complexitĂ© du processeur, pour des gains trĂšs minimes. L’expĂ©rience de l’Itanium est pour moi intĂ©ressante, c’était un VLIW « Ă©voluĂ© » qui pouvait fournir six instructions par cycle. Et pourtant, mĂȘme comparĂ© aux Intel 3xxx, par exemple, qui ne fournissaient pas un IPC trĂšs Ă©levĂ© en moyenne (autour de une ou deux instructions/cycle), l’Itanium ne faisait pas beaucoup mieux. Alors, certes il Ă©tait trĂšs dĂ©pendant du compilateur, mais il montre que cette approche, de façon statique Ă  six instructions par cycle, n’est pas satisfaisante parce que les gains ne sont pas « proportionnels » au nombre d’instructions par cycle. C’est pour cela que je n’ai pas envie d’avoir la mĂȘme approche (faire un VLIW 4/8 ou plus) et faire les mĂȘmes erreurs. Une autre idĂ©e est de gĂ©rer deux instructions de façon statique et les deux autres de façon dynamique. Il y a des cas (une boucle/condition) oĂč il est un peu plus compliquĂ© de gĂ©rer les instructions statiquement. Sauf si vous dĂ©pliez la boucle, mais lĂ  vous vous trouvez avec un gros dĂ©pliage. Alors la version que je veux faire Ă©voluer est ce qu’on peut appeler de l’[EPIC](https://fr.wikipedia.org/wiki/Explicitly_parallel_instruction_computing). L’EPIC est un mĂ©lange entre VLIW et superscalaire. Je veux intĂ©grer aussi un « _window_ » pour fenĂȘtre d’exĂ©cution. Cela me permettrait de connaĂźtre Ă  l’avance le code, et donc de le traiter plus facilement (et aussi que les boucles inconditionnelles soient gĂ©rĂ©es bien avant). Cela me permet plusieurs gains : une meilleure optimisation des boucles, monter plus facilement Ă  trois ou quatre instructions par cycle, des caches _miss_ et des blocages du processeur moins pĂ©nalisants, etc. Bien sĂ»r pour ce genre d’architecture tout est Ă  « inventer », on ne peut pas trop s’inspirer d’un processeur existant vu le peu d’existant justement. ## L’AltairX pourrait-il devenir un GPU ? Alors j’avais prĂ©vu de faire un [GPU](https://fr.wikipedia.org/wiki/Processeur_graphique) aussi. Faute de temps, je n’ai pas eu le temps de m’en occuper. Disons que je privilĂ©gie un GPU relativement spĂ©cifique, un GPU qui ne serait qu’en lecture seule, et ne permettrait d’écrire que via le [SPM](https://en.wikipedia.org/wiki/Scratchpad_memory) ou un PPU (pour Pixel Process Unit). Le but Ă©tant que le _fillrate_ (donc le remplissage de pixels) et le calcul soient en parallĂšle. Le souci d’un GPU, c’est que c’est forcĂ©ment « gros », du coup je rĂ©flĂ©chis Ă  faire une version plus « petite ». Une rĂ©flexion est de tout faire en float 16 bits, ça serait Ă  tester ! Mais comme j’aimerais un GPU par dĂ©faut sur mon CPU, il faudrait un GPU petit mais assez puissant quand mĂȘme. Un autre point, je ne compte pas forcĂ©ment le rendre « compatible » [OpenGL](https://www.opengl.org/). Le seul point que je tenterai de faire, c’est de le rendre compatible OpenGL 2 ES et [Vulkan](https://www.vulkan.org/). ![GPU de l’AltairX](https://github.com/Kannagi/AltairX/blob/main/graph/Pipeline_Graphics_Diagram.png?raw=true) ## Quid du hardware autour ? Un autre point qui me tient Ă  cƓur est aussi l’architecture autour du processeur sur laquelle je travaille, je trouve que cela est presque aussi important. J’ai toujours trouvĂ© cela dommage qu’il n’y ait pas de machine Ă  la fois « simple et efficace », en termes de hardware. Cela est rarement mis en avant vu que, en gĂ©nĂ©ral, la programmation de driver est seulement faite par une poignĂ©e de personnes, et au pire on laisse cela Ă  l’OS. C’est aussi le gros souci Ă  mon sens du PC x86 : si vous voulez faire un OS maison, en gĂ©nĂ©ral tout est full CPU, pas possible d’utiliser un DMA, faire du son, utiliser le GPU... Personnellement, je trouve cela frustrant, moi qui code sur des vielles consoles oĂč j’ai accĂšs Ă  tout cela. Aller sur une plateforme oĂč rien de tout cela n’existe est aberrant... (Enfin si, ça existe, mais de façon trop complexe et peu documentĂ©e). D’ailleurs c’est un point rarement mis en avant, il manque une spĂ©cification de l’ensemble d’un ordinateur « normalisĂ© » (et idĂ©alement ouvert). Pour moi ce serait le top, c’est aussi pourquoi je crĂ©e ce processeur : pour avoir aussi une machine avec tout ce qui va « autour » au top et bien fichu. Selon moi, les ordinateurs auraient dĂ» suivre un peu les consoles : une nouvelle gĂ©nĂ©ration tous les 5-7 ans, en prenant compte des nouvelles avancĂ©es. Cela permettait que les devs puissent optimiser l’existant. Une chose que je me suis toujours demandĂ©e : vu que les specs sont rarement ouvertes, exploite-t-on correctement le matĂ©riel ? Sur console, toutes les specs sont disponibles actuellement. Plus les gens Ă©changent entre eux pour exploiter le matĂ©riel concernĂ©, plus la machine rĂ©vĂšle son plein potentiel. Et je pense qu’avoir trop de matĂ©riels diffĂ©rents (comme sur PC) pousse beaucoup moins Ă  l’optimisation (et je parle aussi des drivers, ça me semble Ă©vident que certaines cartes doivent ĂȘtre moins poussĂ©es que d’autres). [![Architecture de l’AltairX](https://github.com/Kannagi/AltairX/blob/main/graph/Architecture.png?raw=true)](https://github.com/Kannagi/AltairX/blob/main/graph/Architecture.png?raw=true) ## Est-ce que l’AltairX demande aussi de revoir la conception des couches plus hautes (compilateur, langage, OS) ? Oui sur plusieurs niveaux : Le compilateur forcĂ©ment, parce qu’il a en charge une grosse partie de l’optimisation. Par dĂ©faut, le CPU n’en fait pas, il fait entiĂšrement confiance au compilateur pour ça. De plus le compilateur devra aussi utiliser le SPM pour faire du Spilling (considĂ©rer de la mĂ©moire comme des registres). D’un point de vue programmation, si on veut optimiser le processeur il faudra utiliser le SPM : il existait une technique sur la PS2 et la PS3, qui Ă©tait de faire un double buffering des donnĂ©es, le but est de prĂ©charger les donnĂ©es avant de les utiliser, cette technique ne marche forcĂ©ment que sur des tableaux qu’on lit linĂ©airement (ou d’un bloc dont on sait Ă  l’avance qu’on va le lire). Et c’est tout, j’ai tentĂ© de coller au mieux mon ISA sur les contraintes des langages actuels. Et puis les compilateurs actuels sont assez intelligents pour dĂ©tecter des instructions SIMD, donc le besoin de faire de l’assembleur est un peu plus rĂ©duit. Pour l’OS, il devra faire un gros taf sur le rĂ©ordonnanceur, parce que je ne compte pas faire de cohĂ©rence de cache ! Donc les processus resteront sur leur core respectif. Si l’OS veut le changer il faudra vider le cache de ce core (c’est un peu long, mais s’il ne le fait qu’une fois par seconde, ça ira). L’OS a une partie du SPM Ă  gĂ©rer, qui lui est dĂ©diĂ©e pour ses propres optimisations ou communications entre les diffĂ©rents cores. ## Comment pensez-vous fabriquer l’AltairX ? Est-ce vous travaillez avec des constructeurs ? Alors tout d’abord il faut le faire fonctionner ! Il existe pour cela des cartes reprogrammables qu’on appelle [FPGA](https://fr.wikipedia.org/wiki/Circuit_logique_programmable). Vous pouvez concevoir n’importe quelle puce avec, c’est excellent pour du prototypage, pour dĂ©boguer, etc. Et, bien sĂ»r pour le faire fonctionner en « vrai ». ![Die de l’AltairX](https://github.com/Kannagi/AltairX/blob/main/graph/APUsky_Diagram2.drawio.png?raw=true) ## Mais fonctionner Ă  quelle vitesse ? Est-ce que « l’imitation est parfaite », ou alors y a-t-il tout de mĂȘme des choses qu’on ne voit pas ? Alors je n’ai pas terminĂ© l’implĂ©mentation, donc je ne pourrai pas dire Ă  quelle vitesse exactement. On peut viser raisonnablement du 100-200 MHz, mais tout dĂ©pend de la carte, et de l’implĂ©mentation qu’on y fait. Pour les choses qu’on ne voit pas, malheureusement je ne pourrai pas dire, je n’ai jamais conçu de processeur avant. Il faut savoir que mĂȘme AMD utilise les FPGA pour prototyper. Mais ce qui est sĂ»r, c’est que la gravure est bien plus complexe, surtout qu’il faut un PDK (Process Design Kit) pour pouvoir concevoir sa puce, sachant que chaque fondeur et chaque techno aura des diffĂ©rences. Ce travail n’est pas Ă  faire sur FPGA. J’utilise un Spartan 7, plus exactement le XC7S50. Je programme le FPGA avec [VHDL](https://www.vhdl.org/). Il existe des outils open-source pour cela, comme GHDL ([voir la dĂ©pĂȘche de sortie en 2021](/news/sortie-de-ghdl-version-1-0-0)) et GTKWave, qui permettent de voir vos signaux. Ensuite quand tout cela est fait, on peut Ă©ventuellement penser Ă  le graver. Chez [efabless](https://efabless.com/), vous pouvez le faire pour 10 000 $ avec une techno en 130 nm (soit un Pentium 4 !). C’est plus avancĂ© que la PS2 ou la GameCube (180 nm). Si on arrive aussi loin, je ferai sĂ»rement une campagne de financement participatif avec [kickstarter](https://www.kickstarter.com/?lang=fr). Pour la suite, c’est une bonne question. La fabrication de processeur coĂ»te cher, est ce qu’une sociĂ©tĂ© serait prĂȘte Ă  mettre de l’argent dessus ? Je ne crois pas. Si on essaye d’ĂȘtre plus « pragmatique », il faudrait qu’une entreprise existante en Europe le dĂ©veloppe, donc [STMicroelectronics](https://www.st.com/), [Infineon](https://www.infineon.com/) ou [Imagination Technologies](https://www.imaginationtech.com/) (voir [NXP Semiconductors](https://www.nxp.com/)). Le mieux ça serait qu’il soit en France donc STM, mais on est champion dans la prise de risque donc... Pourtant je pense que c’est primordial qu’il existe un processeur europĂ©en. ## Mais se pose la question de l’usage, non ? Car le processeur sans carte mĂšre ne sert Ă  rien. N’est-ce pas tout un Ă©cosystĂšme Ă  bĂątir, ou pourrait-on commencer avec des petites cartes simples ? IdĂ©alement son usage serait un [Raspberry Pi](https://www.raspberrypi.com/)-like, mais je le verrais plus comme un mini-ordinateur, peu cher et accessible facilement. On est donc obligĂ© de passer par des petites cartes dans un premier temps, pour que les dĂ©veloppeurs se fassent la main dessus, et surtout parce que c’est le moins risquĂ© financiĂšrement. Mais oui, il y a tout un Ă©cosystĂšme Ă  bĂątir avec, ce qui veut dire que les outils de dĂ©v' doivent ĂȘtre faciles et accessibles Ă  la fois. ![PCB de l'AltairX](https://github.com/Kannagi/AltairX/blob/main/graph/PCB.png?raw=true) ## Est-ce qu’il est prĂ©vu de mettre en place une association ou une fondation Ă  terme pour piloter le projet, comme c’est dĂ©jĂ  le cas pour RISC-V ou OpenPower ? Non, je n’avais rien prĂ©vu de tel. Pas que je sois fermĂ© Ă  la question, mais une fondation suppose d’avoir des investissements privĂ©s, et je ne vois pas comment je pourrais les avoir. Une association est plus que possible. Pour le moment c’est un peu trop tĂŽt, mais ensuite pour pouvoir payer du matĂ©riel, ou pouvoir faire des petites cartes de dĂ©v', pourquoi pas, c’est une alternative plus « probable ». ## Que souhaitez-vous dire aux lecteurs de LinuxFR en conclusion ? DĂ©jĂ  merci d’avoir tout lu ! Je n’ai pas forcĂ©ment tout expliquĂ© en dĂ©tail pour certaines choses, mais en tout cas je suis ravi de le faire dĂ©couvrir au plus grand nombre. Ce processeur m’a beaucoup apportĂ© en termes de connaissances, mais j’ai aussi appris, Ă©trangement, qu’un tel processeur pourrait se dĂ©marquer sur le paysage actuel. J’avais des connaissances de programmeur assembleur depuis dix ans ! Donc j’avais des connaissances assez avancĂ©es sur la micro-architecture. Mais lire des articles et concevoir un processeur, ce n’est plus trop la mĂȘme chose. Il y a des trucs auxquels on ne s’intĂ©resse pas forcĂ©ment, comme les dĂ©tails d’implĂ©mentation des caches, du fonctionnement de la RAM en interne, etc., mais aussi la fabrication d’un ISA, comment on implĂ©mente toutes les Ă©tapes d’une instruction. Mais par exemple, j’avais une idĂ©e assez vague des processeurs _Out of order_. Et puis ça permet au final de sortir de la « boite », de penser diffĂ©remment quand on comprend « tout ». Au final ce processeur, c’est la confirmation d’une intuition de dĂ©part. Je pensais qu’il apporterait quelque chose. Mais, vu l’utilisation actuelle de l’informatique, la plupart des personnes (moi y compris) souhaitent des machines de plus en plus petites, moins Ă©nergivores tout en gardant des performances acceptables. AltairX se prĂȘte bien Ă  ce genre d’équilibre. L’autre point est qu’on est dans un petit rebond des architectures CPU, ARM et RISC-V qui viennent en force, alors que le x86 Ă©tait seul depuis trop longtemps ! Ce qui m’a convaincu de me lancer sur ce processeur et qu’il ne reste pas une idĂ©e vague, c’est que je voulais avoir les mĂȘmes optimisations sur PC que sur ma PS2 (principalement, celle pour Ă©viter les _caches miss_ et le contrĂŽle total du nombre de cycles). L’autre point, ce sont les failles [meltdown et spectre](https://linuxfr.org/news/meltdown-et-spectre-comment-savoir-si-votre-noyau-est-vulnerable-ou-pas) qui m’ont fait penser qu’il faudrait vraiment un processeur avec une technologie diffĂ©rente qui Ă©viterait ce genre de faille (l’exĂ©cution spĂ©culative), tout en apportant un vrai plus technologique. Mon premier jet Ă©tait donc presque une copie conforme de l’Emotion Engine avec des briques du CELL dessus. Pour finir je voudrais dire que c’est un projet [open source](https://github.com/Kannagi/AltairX), donc si vous avez des compĂ©tences et pas forcĂ©ment calĂ© en hardware, il y a du travail Ă  faire sur le compilateur, sur un portage Linux et d’autres choses trĂšs amusantes ! 🙂 [^1]: _de maniĂšre statique_ il ne s’agit pas ici de poser un terme technique, mais d’indiquer un processeur _in order_, contrairement au processeur _out of order_ considerĂ© comme dynamique.

AltStyle ă«ă‚ˆăŁăŠć€‰æ›ă•ă‚ŒăŸăƒšăƒŒă‚ž (->ă‚ȘăƒȘă‚žăƒŠăƒ«) /