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. [](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.   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).  ## 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.  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/).  ## 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). [](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 ».  ## 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.  ## 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.