Wikilivres frwikibooks https://fr.wikibooks.org/wiki/Accueil MediaWiki 1.45.0-wmf.8 first-letter Média Spécial Discussion Utilisateur Discussion utilisateur Wikilivres Discussion Wikilivres Fichier Discussion fichier MediaWiki Discussion MediaWiki Modèle Discussion modèle Aide Discussion aide Catégorie Discussion catégorie Transwiki Discussion Transwiki Wikijunior Discussion Wikijunior TimedText TimedText talk Module Discussion module Programmation/Langages de programmation 0 3623 745902 668774 2025-07-04T07:39:30Z TealComet 121121 /* Génération 3 */ Ajout d'hyperliens. 745902 wikitext text/x-wiki <noinclude>{{Programmation informatique}}</noinclude> On distingue six générations de langages de programmation. Les langages des générations 1 et 2 sont appelés langages de bas niveau (orienté machine) alors que les langages des générations 3 à 6 sont appelés langages de haut niveau (orienté problème). Les langages de haut niveau sont indépendants du processeur ce qui n’est pas le cas des langages de bas niveau. == Bas niveau == === Génération 1 === * Langage machine dépendant du processeur * Suite d’instructions binaires directement introduites (programmation directe) dans la mémoire du processeur * Les instructions du processeur sont appelées code opérationnel Code opérationnel- Intel pentium- Motorola 6800 Exemple pour un processeur 8086 : BD 41 00 BE 65 41 01 D8 38 47 03 La programmation de la machine par un humain à ce niveau nécessite d'avoir le manuel du processeur. Les erreurs de frappe arrivent facilement. === Génération 2 === * Même jeu d’instructions que le langage machine, mais sous forme symbolique (mnémoniques) plus compréhensible pour l’homme * Les instructions sont converties (programmation indirecte) en langage machine par un programme (assembleur) Exemple pour un processeur 8086 : <syntaxhighlight lang="asm"> MOV BP,41h MOV SI,4165h ADD AX,BX CMP [BX+3],AL </syntaxhighlight> Les langages assembleurs plus évolués permettent d'utiliser des commentaires et possèdent des fonctionnalités facilitant la vie du développeur, lui évitant des calculs manuels et des erreurs potentielles. Par exemple, il est possible de définir un symbole/nom/label représentant l'adresse où se trouve la déclaration puis l'utiliser directement comme opérande (adresse de saut ou adresse de l'emplacement d'une donnée) dans les instructions à la place d'une adresse calculée manuellement. == Haut niveau == === Génération 3 === * Langages indépendants du processeur * Proches des langues parlées (anglais) * Langages procéduraux, descriptions des opérations à effectuer pour résoudre un problème. Les premiers langages de programmation étaient écrits sur des cartes perforées. Celles-ci ne permettaient pas de coder les lettres en minuscules, ce qui explique que les mots-clés des premiers langages de programmation soient en capitales (Fortran, COBOL, Basic, Pascal). Langages : [[Programmation C|C]], [[Programmation Pascal|Pascal]], [[Programmation Fortran|Fortran]] ('''For'''mula '''Tran'''slation), [[Cobol ANS 74|Cobol]] ('''Co'''mmon '''B'''usiness '''O'''riented '''L'''anguage), [[Programmation Basic|Basic]], Wlangage === Génération 4 === * Langages descriptifs * Description de ce que l’on désire faire mais pas de la manière de le faire * Très fortement lié à un domaine (base de données, tables de calcul) Langages : [[Programmation_Uniface|Uniface]], Informix, Oracle, Lotus === Génération 5 === * Langages descriptifs pour la programmation de systèmes experts Langages : Prolog === Génération 6 === * [[../Programmation orientée objet|Orienté objet]] * Toutes les informations nécessaires à la résolution d’un problème sont réunies dans un objet Langages : [[programmation Ada|Ada]], [[Programmation C++|C++]], [[Programmation C sharp|C#]], [[Programmation Delphi|Delphi]], [[Programmation Eiffel|Eiffel]], [[programmation Java|Java]], [[Programmation Object Pascal|Object Pascal]], [[PHP]], [[Programmation Python|Python]], [[Programmation Smalltalk|Smalltalk]] == Références == {{Références}} [[pt:Linguagens de programação]] s8i79qidsv5a014q3rc8wpqcis822mu 745903 745902 2025-07-04T07:42:58Z TealComet 121121 /* Génération 4 */ Ajout d'un hyperlien. 745903 wikitext text/x-wiki <noinclude>{{Programmation informatique}}</noinclude> On distingue six générations de langages de programmation. Les langages des générations 1 et 2 sont appelés langages de bas niveau (orienté machine) alors que les langages des générations 3 à 6 sont appelés langages de haut niveau (orienté problème). Les langages de haut niveau sont indépendants du processeur ce qui n’est pas le cas des langages de bas niveau. == Bas niveau == === Génération 1 === * Langage machine dépendant du processeur * Suite d’instructions binaires directement introduites (programmation directe) dans la mémoire du processeur * Les instructions du processeur sont appelées code opérationnel Code opérationnel- Intel pentium- Motorola 6800 Exemple pour un processeur 8086 : BD 41 00 BE 65 41 01 D8 38 47 03 La programmation de la machine par un humain à ce niveau nécessite d'avoir le manuel du processeur. Les erreurs de frappe arrivent facilement. === Génération 2 === * Même jeu d’instructions que le langage machine, mais sous forme symbolique (mnémoniques) plus compréhensible pour l’homme * Les instructions sont converties (programmation indirecte) en langage machine par un programme (assembleur) Exemple pour un processeur 8086 : <syntaxhighlight lang="asm"> MOV BP,41h MOV SI,4165h ADD AX,BX CMP [BX+3],AL </syntaxhighlight> Les langages assembleurs plus évolués permettent d'utiliser des commentaires et possèdent des fonctionnalités facilitant la vie du développeur, lui évitant des calculs manuels et des erreurs potentielles. Par exemple, il est possible de définir un symbole/nom/label représentant l'adresse où se trouve la déclaration puis l'utiliser directement comme opérande (adresse de saut ou adresse de l'emplacement d'une donnée) dans les instructions à la place d'une adresse calculée manuellement. == Haut niveau == === Génération 3 === * Langages indépendants du processeur * Proches des langues parlées (anglais) * Langages procéduraux, descriptions des opérations à effectuer pour résoudre un problème. Les premiers langages de programmation étaient écrits sur des cartes perforées. Celles-ci ne permettaient pas de coder les lettres en minuscules, ce qui explique que les mots-clés des premiers langages de programmation soient en capitales (Fortran, COBOL, Basic, Pascal). Langages : [[Programmation C|C]], [[Programmation Pascal|Pascal]], [[Programmation Fortran|Fortran]] ('''For'''mula '''Tran'''slation), [[Cobol ANS 74|Cobol]] ('''Co'''mmon '''B'''usiness '''O'''riented '''L'''anguage), [[Programmation Basic|Basic]], Wlangage === Génération 4 === * Langages descriptifs * Description de ce que l’on désire faire mais pas de la manière de le faire * Très fortement lié à un domaine (base de données, tables de calcul) Langages : [[Programmation_Uniface|Uniface]], Informix, [[Oracle Database|Oracle]], Lotus === Génération 5 === * Langages descriptifs pour la programmation de systèmes experts Langages : Prolog === Génération 6 === * [[../Programmation orientée objet|Orienté objet]] * Toutes les informations nécessaires à la résolution d’un problème sont réunies dans un objet Langages : [[programmation Ada|Ada]], [[Programmation C++|C++]], [[Programmation C sharp|C#]], [[Programmation Delphi|Delphi]], [[Programmation Eiffel|Eiffel]], [[programmation Java|Java]], [[Programmation Object Pascal|Object Pascal]], [[PHP]], [[Programmation Python|Python]], [[Programmation Smalltalk|Smalltalk]] == Références == {{Références}} [[pt:Linguagens de programação]] l5pvzkxoko2rh7zqs753ckt3xwd6ant Fonctionnement d'un ordinateur/Les processeurs superscalaires 0 65956 745869 745840 2025-07-03T14:47:02Z Mewtow 31375 /* L'émission multiple des accès mémoire */ 745869 wikitext text/x-wiki Les processeurs vus auparavant ne peuvent émettre au maximum qu'une instruction par cycle d'horloge : ce sont des processeurs à émission unique. Ils peuvent avoir plusieurs instructions qui s'exécutent en même temps, dans des unités de calcul séparées. C'est le cas dès qu'une instruction multicycle s'exécute. Par contre, ils ne peuvent démarrer qu'une seule instruction par cycle. Et quand on court après la performance, ce n'est pas assez ! Les concepteurs de processeurs ont inventés des processeurs qui émettent plusieurs instructions par cycle : les '''processeurs à émissions multiples'''. Un processeur à émission multiple charge plusieurs instructions en même temps, les décode en parallèle, puis les émet en même temps sur des unités de calculs séparées. Pour cela, il faut gérer les dépendances entre instructions, répartir les instructions sur différentes unités de calcul, et cela n'est pas une mince affaire. [[File:Superscalarpipeline.svg|centre|vignette|upright=1.5|Pipeline RISC classique à cinq étages sur un processeur superscalaire. On voit bien que plusieurs instructions sont chargées en même temps.]] Les processeurs à émission multiple sont de deux types : les processeurs VLIW et les '''processeurs superscalaires'''. Nous mettons les processeurs VLIW de côté en attendant le prochain chapitre. La raison est qu'ils ont un jeu d'instruction spécialisé qui expose le parallélisme d'instruction directement au niveau du jeu d'instructions, là où les processeurs superscalaires restent des processeurs au jeu d'instruction normal. La différence principale entre processeur VLIW et superscalaire est qu'un processeur superscalaire répartit les instructions sur les unités de calcul à l’exécution, là où un processeur VLIW délègue cette tâche au compilateur. ==L'implémentation d'un processeur superscalaire== Sur un processeur à émission multiple, plusieurs micro-opérations sont émises en même temps, le nombre varie d'un processeur à l'autre. Les processeurs superscalaires les plus simples ne permettent que d'émettre deux micro-opérations à la fois, d'où leur nom de processeur ''dual issue'', ce qui se traduit en '''processeur à double émission'''. Les processeurs modernes peuvent émettre 3, 4, 6, voire 8 micro-opérations simultanément. Aller au-delà ne sert pas à grand-chose. ===Les circuits hors-ALU sont soit dupliqués, soit adaptés=== Un processeur superscalaire doit être capable de : lire plusieurs instructions depuis la mémoire, les décoder, renommer leurs registres, et les envoyer à l'unité d'émission. Intuitivement, on se fit qu'on doit dupliquer tous les circuits : les décodeurs, l'unité de renommage, les unités de calcul, le ROB, etc. Dans les faits, l'implémentation d'un processeur superscalaire demande de dupliquer plusieurs circuits et d'en adapter d'autres. Voici ce que cela donne dans les grandes lignes. {|class="wikitable" |- ! rowspan="2" | Processeur sans émission multiple | rowspan="2" | Chargement | rowspan="2" | Décodage | rowspan="2" | Renommage | rowspan="2" | Émission | Exécution / ALU | rowspan="2" | ''Commit''/ROB |- | Exécution / ALU |- ! rowspan="4" | Processeur superscalaire | rowspan="4" | Chargement | rowspan="2" | Décodage | rowspan="4" | Renommage | rowspan="4" | Émission | Exécution / ALU | rowspan="4" | ''Commit''/ROB |- | Exécution / ALU |- | rowspan="2" | Décodage | Exécution / ALU |- | Exécution / ALU |} Un processeur superscalaire doit pouvoir charger plusieurs instructions en même temps. Deux solutions pour cela. La première est de doubler la taille du bus connecté au cache d'instruction. Si les instructions sont de longueur fixe, cela charge deux instructions à la fois. Pour un processeur à triple émission, il faut tripler la taille du bus, quadrupler pour un processeur quadruple émission, etc. Mais tout n'est pas si simple, quelques subtilités font qu'on doit ajouter des circuits en plus pour corriger les défauts peu intuitifs de cette implémentation naïve. Une autre solution est d'utiliser un cache d'instruction multiport. Mais dans ce cas, le ''program counter'' doit générer deux adresses, au mieux consécutives, au pire prédites par l'unité de prédiction de branchement. L'implémentation est alors encore plus complexe, comme on le verra plus bas. Il doit ensuite décoder plusieurs instructions en même temps. Il se trouve que les dépendances entre instruction ne posent pas de problème pour le décodeur. Rien ne s'oppose à ce qu'on utilise plusieurs décodeurs séparés. Il faut dire que les décodeurs sont de purs circuits combinatoires, du moins sur les processeurs avec une file de micro-opérations, ou avec une fenêtre d'instruction, ou des stations de réservation. Par contre, l'unité de renommage de registre n'est pas dupliquée, mais adaptées, pour gérer le cas où des instructions consécutives ont des dépendances de registre. Par exemple, prenons un processeur à double émission, qui renomme deux instructions consécutives. Si elles ont une dépendance, le renommage de la seconde instruction dépend du renommage de la première. La première doit être renommée et le résultat du renommage est utilisé pour renommer la seconde, ce qui empêche d'utiliser deux unités de renommage séparées. L'unité d'émission, la file de micro-opération et tous les circuits liés aux dépendances d'instruction ne sont pas dupliqués, car il peut y avoir des dépendances entre instruction chargées simultanément. L'unité d'émission est modifiée de manière à émettre plusieurs instructions à la fois. Si c'est un ''scoreboard'', il doit être modifié pour détecter les dépendances entre les instructions à émettre. Si c'est une fenêtre d'instruction ou une station de réservation, les choses sont plus simples, il faut basiquement rajouter des ports de lecture et écriture pour insérer et émettre plusieurs instructions à la fois, et modifier la logique de sélection en conséquence. Le ROB et les autres structures doivent aussi être modifiées pour pouvoir émettre et terminer plusieurs instructions en même temps. ===La duplication des unités de calcul et les contraintes d’appariement=== Pour émettre plusieurs instructions en même temps, encore faut-il avoir de quoi les exécuter. En clair : un processeur superscalaire doit avoir plusieurs unités de calcul séparées. Les processeurs avec un pipeline dynamique incorporent plusieurs unités pour les instructions entières, une unité pour les instructions flottantes, une unité pour les accès mémoire et éventuellement une unité pour les tests/branchements. Au lieu de parler d'unités de calcul, un terme plus correct serait le terme d''''avals''', que nous avions introduit dans le chapitre sur les pipelines dynamiques, mais n'avons pas eu l'occasion d'utiliser par la suite. Les processeurs avec un pipeline dynamique incorporent déjà plusieurs avals, mais chaque aval ne peut accepter qu'une nouvelle instruction par cycle. Et cela ne change pas sur les processeurs superscalaire, une unité de calcul reste une unité de calcul. Il y a plusieurs manières de gérer les avals sur un processeur superscalaire. La première duplique tous les avals : toutes les unités de calcul sont dupliquées. Par exemple, prenons un processeur simple-émission et transformons-le en processeur à double émission. Intuitivement, on se dit qu'il faut dupliquer toutes les unités de calcul. Si le processeur de base a une ALU entière, une FPU et un circuit multiplieur, ils sont tous dupliqués. L'avantage de faire ainsi est que le processeur n'a pas de contrainte quand il veut émettre deux instructions. Tant que les deux instructions n'ont pas de dépendances de données, il peut les émettre. Pour le dire autrement, toutes les paires d'instructions possibles sont compatibles avec la double émission. Si le processeur veut émettre deux multiplications consécutives, il le peut. S'il veut émettre deux instructions flottantes, il le peut. Le problème, c'est que le cout en circuit est conséquent ! Dupliquer la FPU ou les circuits multiplieurs bouffe du transistor. Pour économiser des transistors, il est possible de ne pas dupliquer tous les circuits. Typiquement, les ALU simples sont dupliquées, de même que les unités de calcul d'adresse, mais la FPU et les circuits multiplieurs ne sont pas dupliqués. En faisant ainsi, le cout en transistors est grandement réduire. Par contre, cela entraine l'apparition de dépendances structurelles. Par exemple, le CPU ne peut pas émettre deux multiplications consécutives sur un seul multiplieur, idem avec deux additions flottantes si l'additionneur flottant n'est pas dupliqué. La conséquence est que les processeurs superscalaires ont des contraintes sur les instructions à émettre en même temps. Si on prend un processeur ''dual-issue'', il y a donc des paires d'instructions autorisées et des paires interdites. Par exemple, l'exécution simultanée de deux branchements est interdite. Les branchements sont sérialisés, exécutés l'un après l'autre. Il est possible d'émettre un branchement en même temps qu'une autre instruction, en espérant que la prédiction de branchement ait fait une bonne prédiction. Mais il n'est souvent pas possible d'émettre deux branchements en même temps. La raison est qu'il n'y a qu'une seule unité de calcul pour les branchements dans un processeur. ==L'étape de chargement superscalaire== Pour charger plusieurs instructions, il suffit de doubler, tripler ou quadrupler le bus mémoire. Précisément, c'est le port de lecture du cache d’instruction qui est élargit, pour lire 2/3/4/... instructions. Un bloc de 8, 16, 32 octets est dnc lu depuis le cache et est ensuite découpé en instructions, envoyées chacun à un décodeur. Découper un bloc en instructions est trivial avec des instructions de longueur fixe, mais plus compliqué avec des instructions de taille variable. Il est cependant possible de s'en sortir avec deux solutions distinctes. La première solution utilise les techniques de prédécodage vues dans le chapitre sur les caches, à savoir que le découpage d'une ligne de cache est réalisé lors du chargement dans le cache d’instruction. Une autre solution améliore le circuit de détection des tailles d'instruction vu dans le chapitre sur l'unité de chargement. Avec la seconde solution, cela prend parfois un étage de pipeline entier, comme c'est le cas sur les processeurs Intel de microarchitecture P6. Mais laissons de côté cette difficulté et passons au vrai problème. Charger un gros bloc de mémoire permet de charger plusieurs instructions, mais il y a potentiellement des branchements dans le bloc. Et on doit gérer le cas où ils sont pris, le cas où les instructions suivantes dans le bloc doivent être annulées. En clair, il faut détecter les branchements dans le bloc chargé et gérer le cas où ils sont pris. : Dans ce qui va suivre, un morceau de code sans branchement est appelé un bloc de base (''basic block''). ===Le circuit de fusion de blocs=== Les processeurs superscalaires simples ne se préoccupent pas des branchements lors du chargement. Les instructions chargées en même temps sont toutes décodées et exécutées en même temps, même s'il y a un branchement dans le tas. Les branchements sont donc prédits comme étant non-pris systématiquement. Mais d'autres sont plus malins et utilisent la prédiction de branchement pour savoir si un branchement est pris ou non. Partons du principe que le branchement est pris : le processeur doit charger toutes les instructions d'un bloc, sauf celles qui suivent le branchement pris. L'unité de chargement coupe le bloc chargé au niveau du premier branchement non-pris, remplit les vides avec des NOP, avant d'envoyer le tout à l'unité de décodage. [[File:Fetch sur un processeur superscalaire avec prediction de branchements.png|centre|vignette|upright=2|Fetch sur un processeur superscalaire avec prédiction de branchements.]] Une solution plus performante charge les instructions de destination du branchement et les placent à sa suite. Ils chargent deux blocs à la fois et les fusionnent en un seul qui ne contient que les instructions présumées utiles. [[File:Cache d'instructions autoaligné.png|centre|vignette|upright=2|Cache d'instructions autoaligné.]] Mais cela demande de charger deux blocs de mémoire en une fois, ce qui demande un cache d'instruction multiports. Il faut aussi ajouter un circuit pour assembler plusieurs morceaux de blocs en un seul : le fusionneur (''merger''). Le résultat en sortie du fusionneur est ce qu'on appelle une '''trace'''. [[File:Implémentation d'un cache d'instructions autoaligné.png|centre|vignette|upright=2|Implémentation d'un cache d'instructions autoaligné.]] Le principe peut se généraliser si un bloc contient plusieurs branchements pris, avec un nombre de blocs supérieur à deux. Mais cela demande une unité de prédiction de branchement capable de prédire plusieurs branchements par cycle. ===Le cache de traces=== Si jamais un bloc est rechargé et que ses branchements sont pris à l'identique, le résultat du fusionneur sera le même. Il est intéressant de conserver cette trace dans un '''cache de traces''' pour la réutiliser ultérieurement. Le cache de trace n'a été utilisé que sur un seul processeur commercial : le Pentium 4 d'Intel. Fait intéressant, son cache de trace ne mémorisait pas des suites d'instructions, mais des suites de micro-opérations. En clair, il mémorisait des traces décodées, ce qui fait qu'un succès de cache de trace contournait non seulement le cache d'instruction, mais aussi les décodeurs. Ce qui explique que le temps d'accès au cache de trace n'était pas un problème, même s'il était comparable au temps d'accès du cache d'instruction. Il a depuis été remplacé par une alternative bien plus intéressante, le cache de micro-opérations, plus flexible et plus performant. Une trace est réutilisable quand le premier bloc de base est identique et que les prédictions de branchement restent identiques. Pour vérifier cela, le tag du cache de traces contient l'adresse du premier bloc de base, la position des branchements dans la trace et le résultat des prédictions utilisées pour construire la trace. Le résultat des prédictions de branchement de la trace est stocké sous la forme d'une suite de bits : si la trace contient n branchements, le n-ième bit vaut 1 si ce branchement a été pris, et 0 sinon. Même chose pour la position des branchements dans la trace : le bit numéro n indique si la n-ième instruction de la trace est un branchement : si c'est le cas, il vaut 1, et 0 sinon. Pour savoir si une trace est réutilisable, l'unité de chargement envoie le ''program counter'' au cache de traces, l'unité de prédiction de branchement fournit le reste des informations. Si on a un succès de cache de traces, et la trace est envoyée directement au décodeur. Sinon, la trace est chargée depuis le cache d'instructions et assemblée. [[File:TraceCache.png|centre|vignette|upright=2|Cache de traces.]] [[File:BasicBlocks.png|vignette|Blocs de base.]] Pour comprendre ce qu'est une trace, regardez le code illustré ci-contre. Il est composé d'un bloc de base A, suivi par un bloc de base B, qui peut faire appel soit au bloc C, soit un bloc D. Un tel code peut donner deux traces : ABC ou ABD. La trace exécutée dépend du résultat du branchement qui choisit entre C et D. Un cache de trace idéal mémorise les deux traces ABC et ABD dans deux lignes de cache séparées. Il peut mémoriser des traces différentes, même si leur début est le même. Un cache de trace peut supporter des '''succès de cache de trace partiels'''. Prenez le cas où le processeur veut lire la trace ABC mais que le cache de trace ne contient que la trace ABD : c'est un succès partiel. Dans ce cas, le processeur peut lire les blocs de base A et B depuis le cache de trace, et lit D depuis le cache d'instruction. Et cela vaut dans le cas général : si le cache a mémorisé une trace similaire à celle demandée, dont seuls les premiers blocs de base correspondent, il peut lire les premiers blocs de base dans le cache de trace et lire le reste dans le cache d'instruction. Il y a une certaine redondance dans le contenu du cache de trace, car certaines traces partagent des blocs de base. Pour éviter cela, il est possible de mémoriser les blocs de base dans des caches séparés et les assembler avec un fusionneur. Par exemple, au lieu d'utiliser un cache de traces unique, on va utiliser quatre '''caches de blocs de base''', suivi par un fusionneur qui reconstitue la trace. On économise du cache, au dépend d'un temps d'accès plus long vu qu'il faut reconstituer la trace. ==Le séquenceur d'un processeur superscalaire== Le séquenceur d'un processeur superscalaire est modifié, afin de pouvoir décoder plusieurs instructions à la fois. Ce n'est pas le cas général, mais la présence de plusieurs décodeurs est très fréquent sur les processeur superscalaires. De plus, les unités de renommage et d'émission doivent être modifiées. ===Les décodeurs d'instructions superscalaires=== Un processeur superscalaire contient généralement plusieurs décodeurs, chacun pouvant décoder une instruction en parallèle des autres. Prenons par exemple un processeur RISC dont toutes les instructions font 32 bits. Un processeur superscalaire de ce type peut charger des blocs de 128 bits, ce qui permet de charger 4 instructions d'un seul coup. Et pour les décoder, le décodage se fera dans quatre décodeurs séparés, qui fonctionneront en parallèle. Ou alors, il se fera dans un seul décodeur qui pourra décoder plusieurs instructions par cycles. Les processeurs CISC utilisent des décodeurs hybrides, avec un microcode qui complémente un décodeur câblés. Dupliquer le microcode aurait un cout en transistors trop important, ce qui fait que seuls les décodeurs câblés sont dupliqués. Les CPU CISC superscalaires disposent donc de plusieurs décodeurs simples, capables de décoder les instructions les plus courantes, avec un seul microcode. La conséquence est qu'il n'est pas possible de décoder deux instructions microcodées en même temps. Par contre, il reste possible de décoder plusieurs instructions non-microcodées ou une instruction microcodée couplée à une instruction non-microcodée. Vu qu'il est rare que deux instructions microcodées se suivent dans un programme, le cout en performance est extrêmement mineur. Les processeurs superscalaires supportent la technique dite de '''macro-fusion''', qui permet de fusionner deux-trois instructions consécutives en une seule micro-opération. Par exemple, il est possible fusionner une instruction de test et une instruction de saut en une seule micro-opération de branchement. Il s'agit là de l'utilisation la plus importante de la macro-fusion sur les processeurs x86 modernes. En théorie, d'autres utilisations de la macro-fusion sont possibles, certaines ont même été [https://www2.eecs.berkeley.edu/Pubs/TechRpts/2016/EECS-2016-130.pdf proposées pour le jeu d'instruction RISC-V], mais rien n'est encore implémenté (à ma connaissance). La fusion des instructions se fait lors du décodage des instructions, grâce à la coopération des décodeurs. ===L'unité de renommage superscalaire=== Sur un processeur à émission multiple, l'unité de renommage de registres doit renommer plusieurs instructions à la fois, mais aussi gérer les dépendances entre instructions. Pour cela, elle renomme les registres sans tenir compte des dépendances, pour ensuite corriger le résultat. [[File:Unité de renommage superscalaire.png|centre|vignette|upright=2|Unité de renommage superscalaire.]] Seules les dépendances lecture-après-écriture doivent être détectées, les autres étant supprimées par le renommage de registres. Repérer ce genre de dépendances se fait assez simplement : il suffit de regarder si un registre de destination d'une instruction est un opérande d'une instruction suivante. [[File:Détection des dépendances sur un processeur superscalaire.png|centre|vignette|upright=2|Détection des dépendances sur un processeur superscalaire.]] Ensuite, il faut corriger le résultat du renommage en fonction des dépendances. Si une instruction n'a pas de dépendance avec une autre, on la laisse telle quelle. Dans le cas contraire, un registre opérande sera identique avec le registre de destination d'une instruction précédente. Dans ce cas, le registre opérande n'est pas le bon après renommage : on doit le remplacer par le registre de destination de l'instruction avec laquelle il y a dépendance. Cela se fait simplement en utilisant un multiplexeur dont les entrées sont reliées à l'unité de détection des dépendances. On doit faire ce replacement pour chaque registre opérande. [[File:Correction des dépendances sur un processeur superscalaire.png|centre|vignette|upright=2|Correction des dépendances sur un processeur superscalaire.]] ===L'unité d'émission superscalaire=== Pour émettre plusieurs instructions en même temps, l'unité d'émission doit être capable d'émettre plusieurs instructions par cycle. Et Pour cela, elle doit détecter les dépendances entre instructions. Il faut noter que la plupart des processeurs superscalaires utilisent le renommage de registre pour éliminer un maximum de dépendances inter-instructions. Les seules dépendances à détecter sont alors les dépendances RAW, qu'on peut détecter en comparant les registres de deux instructions consécutives. Sur les processeurs superscalaires à exécution dans l’ordre, il faut aussi gérer l'alignement des instructions dans la fenêtre d'instruction. Dans le cas le plus simple, les instructions sont chargées par blocs et on doit attendre que toutes les instructions du bloc soient émises pour charger un nouveau bloc. Avec la seconde méthode, La fenêtre d'instruction fonctionne comme une fenêtre glissante, qui se déplace de plusieurs crans à chaque cycle d'horloge. Mais au-delà de ça, le design de l'unité d'émission change. Avant, elle recevait une micro-opération sur son entrée, et fournissait une micro-opération émise sur une sortie. Et cela vaut aussi bien pour une unité d'émission simple, un ''scoreboard'', une fenêtre d'instruction ou des stations de réservation. Mais avec l'émission multiple, les sorties et entrées sont dupliquées. Pour la double émission, il y a deux entrées vu qu'elle doit recevoir deux micro-opération décodées/renommées, et deux sorties pour émettre deux micro-opérations. Formellement, il est possible de faire une analogie avec une mémoire : l'unité d'émission dispose de ports d'écriture et de lecture. On envoie des micro-opérations décodées/renommées sur des ports d'écriture, et elle renvoie des micro-opérations émises sur le port de lecture. Dans ce qui suit, nous parlerons de '''ports de décodage''' et de '''ports d'émission'''. Si l'unité d'émission est un vulgaire ''scoreboard'', il doit détecter les dépendances entre instructions émises simultanément. De plus, il doit détecter les paires d'instructions interdites et les sérialiser. Autant dire que ce n'est pas très pratique. La détection des dépendances entre instructions consécutives est simplifiée avec une fenêtre d'instruction, il n'y a pour ainsi dire pas grand chose à faire, vu que les dépendances sont éliminées par le renommage de registre et que les signaux de réveil s'occupent de gérer les dépendances RAW. C'est la raison pour laquelle les processeurs superscalaires utilisent tous une fenêtre d'instruction centralisée ou décentralisée, et non des ''scoreboard''. Les processeurs superscalaires privilégient souvent des stations de réservations aux fenêtres d'instruction. Rappelons la terminologie utilisée dans ce cours. Les fenêtres d'instruction se contentent de mémoriser la micro-opération à émettre et quelques bits pour la disponibilité des opérandes. Par contre, les stations de réservations mémorisent aussi les opérandes des instructions. Les registres sont lus après émission avec une fenêtre d'instruction, avant avec des stations de réservation. Et cette différence a une influence sur le pipeline du processeur, le banc de registres et tout ce qui s'en suit. La différence principale est liée au banc de registre, et précisément au nombre de ports de lecture. Supposons que toutes les instructions sont dyadiques, ou du moins qu'il n'existe pas de micro-opération à trois opérandes. Avec une fenêtre d'instruction, le nombre d'opérandes à lire simultanément est proportionnel à la quantité d'instructions qu'on peut émettre en même temps. Sur un processeur ''dual issue'', qui peut émettre deux micro-opérations, cela fait deux micro-opérations à deux opérandes chacune, soit 4 opérandes. Le nombre de ports de lecture est donc de quatre. Avec une station de réservation, la lecture des opérandes a lieu avant l'émission, juste après le décodage/renommage. Le nombre d'opérande est le double du nombre de micro-opérations décodées/renommées, pas émises. Si le décodeur peut décoder/renommer 4 instructions par cycle, cela veut dire 4 micro-opérations émises par cycle. Et il se trouve que les deux situations ne sont pas évidentes. Avec une fenêtre d'instruction centralisée, cela ne change rien. Le nombre d'instructions décodées et émises en même temps sont identiques. Mais dès qu'on utilise des fenêtres d'instruction décentralisées, les choses changent. Si le décodeur peut décoder/renommer 4 instructions par cycle, alors l'idéal est d'avoir 4 micro-opérations émises par cycle, ''par fenêtre d'instruction''. Imaginez que le décodeur décode 4 instructions entières : la fenêtre d'instruction entière doit pouvoir émettre 4 micro-opérations entières en même temps. Idem pour des instructions flottantes avec la fenêtre d'instruction flottantes. Vu qu'il y a deux fenêtres d'instruction, cela fait 4 micro-opérations entières + 4 micro-opérations flottantes = 8 ports de lecture. Non pas qu'ils soient tous simultanément utiles, mais il faut les câbler. Les fenêtres d'instruction impliquent plus de lectures d'opérandes, ce qui implique plus de ports de lecture. Les stations de réservation sont plus économes, elles vont bien avec un nombre modéré de ports de lecture. ===Les conséquences sur le banc de registre=== Émettre plusieurs instructions en même temps signifie lire ou écrire plusieurs opérandes à la fois : le nombre de ports du banc de registres doit être augmenté. De plus, le banc de registre doit être relié à toutes les unités de calcul en même temps, ce qui fait 2 ports de lecture par unité de calcul. Et avec plusieurs dizaines d'unités de calcul différentes, le câblage est tout simplement ignoble. Et plus un banc de registres a de ports, plus il utilise de circuits, est compliqué à concevoir, consomme de courant et chauffe. Mais diverses optimisations permettent de réduire le nombre de ports assez simplement. Un autre solution utilise un banc de registre unique, mais n'utilise pas autant de ports que le pire des cas le demanderait. Pour cela, le processeur doit détecter quand il n'y a pas assez de ports pour servir toutes les instructions : l'unité d'émission devra alors mettre en attente certaines instructions, le temps que les ports se libèrent. Cette détection est réalisée par un circuit d'arbitrage spécialisé, intégré à l'unité d'émission, l’arbitre du banc de registres (''register file arbiter''). ==Les unités de calcul des processeurs superscalaires== Un processeur superscalaire émet/exécute plusieurs instructions simultanément dans plusieurs unités de calcul séparées. Intuitivement, on se dit qu'il faut dupliquer les unités de calcul à l'identique. Un processeur superscalaire contient alors N unités de calcul identiques, précédées par une fenêtre d'instruction avec N ports d'émission. Un tel processeur peut émettre N micro-opérations, tant qu'elles n'ont pas de dépendances. Manque de chance, ce cas est l'exception. La raison est que les processeurs superscalaires usuels sont conçus à partir d'un processeur à pipeline dynamique normal, qu'ils améliorent pour le rendre superscalaire. Les processeurs avec un pipeline dynamique incorporent plusieurs unités de calcul distinctes, avec une ALU pour les instructions entières, une FPU pour les instructions flottantes, une unité pour les accès mémoire (calcul d'adresse) et éventuellement une unité pour les tests/branchements. Sans superscalarité, ces unités sont toutes reliées au même port d'émission. Avec superscalarité, les unités de calcul existantes sont connectées à des ports d'émission différents. ===La double émission entière-flottante=== En théorie, il est possible d'imaginer un CPU superscalaire sans dupliquer les ALU, en se contenant d'exploiter au mieux les unités de calcul existantes. Prenons le cas d'un processeur avec une ALU entière et une ALU flottante, qu'on veut transformer en processeur superscalaire. L'idée est alors de permettre d'émettre une micro-opération entière en même temps qu'une micro-opération flottante. La micro-opération entière s'exécute dans l'ALU entière, la micro-opération flottante dans la FPU. Il suffit juste d'ajouter un port d'émission dédié sur la FPU. Le processeur a donc deux pipelines séparés : un pour les micro-opérations entières, un autre pour les micro-opérations flottantes. On parle alors de '''double émission entière-flottante'''. L'idée est simple, la mise en œuvre utilise assez peu de circuits pour un gain en performance qui est faible, mais en vaut la peine. La plupart des premiers processeurs superscalaires étaient de ce type. Les exemples les plus notables sont les processeurs POWER 1 et ses dérivés comme le ''RISC Single Chip''. Ils sont assez anciens et avaient un budget en transistors limité, ce qui fait qu'ils devaient se débrouiller avec peu de circuits dont ils disposaient. L'usage d'une double émission entière-flottante était assez naturelle. [[File:Double émission entière-flottante.png|centre|vignette|upright=2|Double émission entière-flottante]] Cependant, la méthode a un léger défaut. Une instruction flottante peut parfois lever une exception, par exemple en cas de division par zéro, ou pour certains calculs précis. Si une exception est levée, alors l'instruction flottante est annulée, de même que toutes les instructions qui suivent. Ce n'est pas un problème si le processeur gère nativement les exceptions précises, par exemple avec un tampon de ré-ordonnancement. Et c'est le cas pour la totalité des processeurs à exécution dans le désordre. Mais sur les processeurs à exécution dans l'ordre, si le budget en transistors est limité, les techniques de ce genre sont absentes. En théorie, sans tampon de ré-ordonnancement ou équivalent, on ne peut pas émettre d'instruction flottante en même temps qu'une instruction entière à cause de ce problème d'exceptions flottantes. Le problème s'est manifesté sur les processeurs Atom d'Intel, et les concepteurs du processeur ont trouvé une parade. L'idée est de tester les opérandes flottantes, pour détecter les combinaisons d'opérandes à problème, dont l'addition/multiplication peut lever une exception. Si des opérandes à problème sont détectées, on stoppe l'émission de nouvelles instructions en parallèle de l'instruction flottante et l'unité d'émission émet des bulles de pipeline tant que l'instruction flottante est en cours. Sinon, l'émission multiple fonctionne normalement. La technique, appelée ''Safe Instruction Recognition'' par Intel, est décrite dans le brevet US00525721.6A. Il faut noter que la double émission entière-flottante peut aussi être adaptée aux accès mémoire. En théorie, les accès mémoire sont pris en charge par le pipeline pour les opérations entières. L'avantage est que l'on peut alors utiliser l'unité de calcul pour calculer des adresses. Mais il est aussi possible de relier l'unité mémoire à son propre port d'émission. Le processeur devient alors capable d’émettre une micro-opération entière, une micro-opération flottante, et une micro-opération mémoire. On parle alors de '''triple émission entière-flottante-mémoire'''. La seule contrainte est que l'unité mémoire incorpore une unité de calcul d'adresse dédiée. ===L'émission multiple des micro-opérations flottantes=== La double émission entière-flottante ajoute un port d'émission pour la FPU, ce qui a un cout en circuits modeste, pour un gain en performance intéressant. Mais il faut savoir que les FPU regroupent un additionneur-soustracteur flottant et un multiplieur flottant, qui sont reliés au même port d'émission. Et il est possible d'ajouter des ports d'émission séparés pour l'additionneur flottant et le multiplieur flottant. Le processeur peut alors émettre une addition flottante en même temps qu'une multiplication flottante. Les autres circuits de calcul flottant sont répartis sur ces deux ports d'émission flottants. L'avantage est que cela se marie bien avec l'usage d'une fenêtre d'instruction séparée pour les opérations flottantes. La fenêtre d'instruction a alors deux ports séparés, au lieu d'un seul. Rajouter un second port d'émission flottant n'est pas trop un problème, car le cout lié à l'ajout d'un port n'est pas linéaire. Passer de un port à deux a un cout tolérable, bien plus que de passer de 3 ports à 4 ou de 4 à 5. Il est même possible de dupliquer l'additionneur et le multiplieur flottant, ce qui permet d'émettre deux additions et multiplications flottantes en même temps. C'est ce qui est fait sur les processeur AMD de architecture Zen 1 et 2. Ils ont deux additionneurs flottants par cœur, deux multiplieurs flottants, chacun avec leur propre port d'émission. Les performances en calcul flottant sont assez impressionnantes pour un processeur de l'époque. [[File:ZEN - émission multiple flottante.png|centre|vignette|upright=2.5|Microarchitecture Zen 1 d'AMD.]] ===L'émission multiple des micro-opérations entières=== Nous avons vu plus haut qu'il est possible d'ajouter plusieurs ports d'émission pour la FPU. Intuitivement, on se dit que la méthode peut aussi être appliquée pour émettre plusieurs micro-opérations entières en même temps. En effet, un processeur contient généralement plusieurs unités de calcul entières séparées, avec typiquement une ALU entière simple, un circuit multiplieur/diviseur, un ''barrel shifter'', une unité de manipulation de bit. Les 5 unités permettent d'émettre 4 micro-opérations entières en même temps, à condition qu'on ajoute assez de ports d'émission. [[File:Emission multiple des opérations entières, implémentation naive.png|centre|vignette|upright=2|Émission multiple des opérations entières, implémentation naïve.]] Maintenant, posons-nous la question : est-ce que faire ainsi en vaut la peine ? Le processeur peut en théorie émettre une addition, une multiplication, un décalage et une opération de manipulation de bits en même temps. Mais une telle situation est rare. En conséquence, les ports d'émission seront sous-utilisés, sous celui pour l'ALU entière. Pour réduire le nombre de ports d'émission sous-utilisés, il est possible de regrouper plusieurs unités de calcul sur le même port d'émission. Typiquement, il y a un port d'émission pour le multiplieur et un autre port d'émission pour le reste. L'avantage est que cela permet d'exécuter des micro-opérations entières en parallèle d'une multiplication. Mais on ne peut pas émettre/exécuter en parallèle des instructions simples. Il n'est pas exemple pas possible de faire un décalage en même temps qu'une addition. Le cout en performance est le prix à payer pour la réduction du nombre de ports d'émission, et il est assez faible. : Je dis exécuter/émettre, car ces instructions s'exécutent en un cycle. Si elles ne sont pas émises en même temps, elles ne s'exécutent pas en même temps. [[File:Emission multiple des opérations entières, double émission.png|centre|vignette|upright=2|Émission multiple des opérations entières, double émission]] Typiquement, la plupart des programmes sont majoritairement remplis d'additions, avec des multiplications assez rares et des décalages qui le sont encore plus. En pratique, il n'est pas rare d'avoir une multiplication pour 4/5 additions. Si on veut profiter au maximum de l'émission multiple, il faut pouvoir émettre plusieurs additions/soustractions en même temps, ce qui demande de dupliquer les ALU simples et leur donner chacune son propre port d'émission. : Le multiplieur n'est presque jamais dupliqué, car il est rare d'avoir plusieurs multiplications consécutives. Disposer de plusieurs circuits multiplieurs serait donc un cout en circuits qui ne servirait que rarement et n'en vaut pas la chandelle. Pour économiser des ports d'émission, les ALU entières dupliquées sont reliées à des ports d'émission existants. Par exemple, on peut ajouter la seconde ALU entière au port d'émission du multiplieur, la troisième ALU entière au port dédié au ''barrel shifter'', etc. Ainsi, les ports d'émission sont mieux utilisés : il est rare qu'on n'ait pas d'instruction à émettre sur un port. Le résultat est un gain en performance bien plus important qu'avec les techniques précédentes, pour un cout en transistor mineur. [[File:Emission multiple des opérations entières, implémentation courante.png|centre|vignette|upright=2|Emission multiple des opérations entières, implémentation courante]] ===L'émission multiple des accès mémoire=== Après avoir vu l'émission multiple pour les opérations flottantes et etnières, il est temps de voir l''''émission multiple des accès mémoire'''. ! Il est en effet possible d'émettre plusieurs micro-opérations mémoire en même temps. Les processeurs superscalaires modernes sont capables d'émettre plusieurs lectures/écritures simultanément. Par exemple, ils peuvent émettre une lecture en même temps qu'une écriture, ou plusieurs lectures, ou plusieurs écritures. Il faut noter que selon le processeur, il peut y avoir des restrictions quant aux accès mémoire émis en même temps. Par exemple, certains processeurs peuvent émettre une lecture avec une écriture en même temps, mais pas deux lectures ni deux écritures. A l'inverse, d'autres processeurs peuvent émettre plusieurs accès mémoire, avec toutes les combinaisons de lecture/écriture possibles. L'émission multiple des accès mémoire demande évidemment de dupliquer des circuits, mais pas l'unité mémoirecomplète. Pour rappel, l'unité mémoire s'interpose entre le cache et le reste du pipeline. Elle est composée d'une unité de calcul d'adresse, des ports de lecture/écriture du cache de données, et éventuellement d'une structure qui remet en ordre les accès mémoire (une ''Load-store queue''). Émettre plusieurs micro-opérations mémoire demande d'avoir plusieurs unités de calcul, une par micro-opération mémoire émise par cycle. Si le processeur peut émettre trois micro-opérations mémoire à la fois, il y aura besoin de trois unités de calcul d'adresse. Chaque unité de calcul d'adresse est reliée à un port d'émission mémoire. Par contre, la structure qui remet les accès mémoire en ordre n'est pas dupliquée. Les processeurs avec une ''Load-store queue'' ne la dupliquent pas. Par contre, elle est rendue multi-ports afin de gérer plusieurs micro-opérations mémoire simultanés. Les processeurs avec juste une ''Store Queue' et une ''Load Queue'' font différemment. : Dans ce qui suit, nous parlerons d'AGU (''Adress Generation Unit'')poour désigner les unités de calcul d'adresse. Un exemple est celui des processeurs Intel de microarchitecture Nehalem, qui pouvaient seulement émettre une lecture en même temps qu'une écriture. Ils avaient trois ports d'émission reliés à l'unité mémoire. Un port pour les lectures, deux pour les écritures. Le premier port d'écriture recevait la donnée à écrire dans le cache, le second s'occupait des calculs d'adresse, Le port de lecture faisait uniquement des calculs d'adresse. Comme autre exemple, les processeurs skylake ont une LSQ avec deux ports de lecture et d'un port d'écriture, ce qui permet de faire deux lectures en même temps qu'une écriture. Les processeurs AMD K6 sont similaires, avec un port d'émission pour les lectures et un autre pour les écritures. Le port de lecture alimente une unité de calcul d'adresse dédiée, directement reliée au cache. Le port d'écriture du cache alimente une unité de calcul, qui est suivie par une ''Store Queue'', une version simplifiée de la LSQ dédiée aux écritures. Le processeur exécutait les lectures dès qu'elles avaient leurs opérandes de disponibles, seules les écritures étaient mises en attente. D'autres processeurs ont plusieurs ports d'émission pour les unités mémoire, mais qui peuvent faire indifféremment lecture comme écritures. Un exemple est celui du processeur Athlon 64, un processeur AMD sorti dans les années 2000. Il disposait d'une LSQ unique, reliée à un cache L1 de donnée double port. La LSQ était reliée à trois unités de calcul séparées de la LSQ. La LSQ avait des connexions avec les registres, pour gérer les lectures/écritures. [[File:Athlon.png|centre|vignette|upright=2.5|Athlon]] ===L'interaction avec les fenêtres d'instruction=== Nous venons de voir qu'un processeur superscalaire peut avoir des ports d'émission reliés à plusieurs ALU. Pour le moment, nous avons vu le cas où le processeur dispose de fenêtres d'instruction séparées pour les opérations entières et flottantes. Un port d'émission est donc relié soit à des ALU entières, soit à des FPU. Mais il existe des processeurs où un même port d'émission alimente à la fois une ALU entière et une FPU. Par exemple, on peut relier un additionneur flottant sur le même port qu'une ALU entière. Il faut noter que cela implique une fenêtre d'instruction centralisée, capable de mettre en attente micro-opérations entières et flottantes. Un exemple est celui des processeurs Core 2 Duo. Ils disposent de 6 ports d'émission, dont 3 ports dédiés à l'unité mémoire. Les 3 ports restants alimentent chacun une ALU entière, un circuit de calcul flottant et une unité de calcul SSE (une unité de calcul SIMD, qu'on abordera dans quelques chapitres). Le premier port alimente une ALU entière simple et un multiplieur/diviseur flottant. Le second alimente une ALU entière, un multiplieur entier et un additionneur flottant. Le troisième alimente une ALU entière, sans circuit flottant dédié. [[File:Intel Core2 arch.svg|centre|vignette|upright=2.5|Intel Core 2 Duo - microarchitecture.]] Une conséquence de partager les ports d'émission est l'apparition de dépendances structurelles. Par exemple, imaginez qu'on connecte un multiplieur entier et la FPU, sur le même port d'émission. Il est alors impossible d'émettre une multiplication et une opération flottante en même temps. Mais la situation ne se présente que pour certaines combinaisons de micro-opérations bien précises, qui sont idéalement assez rares. De telles dépendances structurelles n'apparaissent que sur des programmes qui entremêlent instructions flottantes et entières, ce qui est assez rare. Les dépendances structurelles doivent cependant être prises en compte par les unités d'émission. Dans le même genre, il est possible de partager un port d'émission entre l'unité mémoire et une ALU entière. Cela permet d'utiliser l'ALU entière pour les calculs d'adresse, ce qui évite d'avoir à utiliser une unité de calcul d'adresse distincte. Un exemple est celui du processeur superscalaire double émission Power PC 440. Il dispose de deux ports d'émission. Le premier est connecté à une ALU entière et un circuit multiplieur, le second est relié à l'unité mémoire et une seconde ALU entière. L'organisation en question permet soit d'émettre un accès mémoire en même temps qu'une opération entière, soit d'émettre deux opérations entières simples, soit d’émettre une multiplication et une addition/soustraction/comparaison. Une organisation simple, mais très efficace ! [[File:PowerPC 440.png|centre|vignette|upright=2|Microarchitecture du PowerPC 440.]] ===Résumé=== Faisons un résumé rapide de cette section. Nous venons de voir que les différentes unités de calcul sont reliés à des ports d'émission, la répartition des ALU sur les ports d'émission étant très variable d'un processeur à l'autre. Entre les processeurs qui séparent les ports d'émission entier et flottant, ceux qui les mélangent, ceux qui séparent les ports d'émission mémoire des ports entiers et ceux qui les fusionnent, ceux qui autorisent l'émission multiple des micro-opérations mémoire ou flottante, il y a beaucoup de choix. Les divers choix possibles sont tous des compromis entre deux forces : réduire le nombre de ports d'émission d'un côté, garder de bonnes performances en limitant les dépendances structurelles de l'autre. Réduire le nombre de ports d'émission permet de garder des fenêtres d'instruction relativement simples. Plus elles ont de ports, plus elles consomment d'énergie, chauffent, sont lentes, et j'en passe. De plus, plus on émet de micro-opérations en même temps, plus la logique de détection des dépendances bouffe du circuit. Et cela a des conséquences sur la fréquence du processeur : à quoi bon augmenter le nombre de ports d'émission si c'est pour que ce soit compensé par une fréquence plus faible ? Par contre, regrouper plusieurs ALU sur un même port d'émission est à l'origine de dépendances structurelles. Impossible d'émettre deux micro-opérations sur deux ALU si elles sont sur le même port. Le nombre de ports peut être un facteur limitant pour la performance dans certaines situations de '''''port contention''''' où on a assez d'ALU pour exécuter N micro-opérations, mais où la répartition des ALUs sur les ports l’empêche. Suivant la répartition des ALU sur les ports, la perte de performance peut être légère ou importante, tout dépend des choix réalisés. Et les choix en question dépendent fortement de la répartition des instructions dans le programme exécuté. Le fait que certaines instructions sont plus fréquentes que d'autres, que certaines instructions sont rarement consécutives : tout cela guide ce choix de répartition des ALu sur les ports. ==Le contournement sur les processeurs superscalaires== Pour rappel, la technique du contournement (''register bypass'') permet au résultat d'une instruction d'être immédiatement utilisable en sortie de l'ALU, avant même d'être enregistré dans les registres. Implémenter la technique du contournement demande d'utiliser des multiplexeurs pour relier la sortie de l'unité de calcul sur son entrée si besoin. il faut aussi des comparateurs pour détecter des dépendances de données. [[File:Pipeline Bypass.png|centre|vignette|upright=1|Pipeline Bypass]] ===Les problèmes du contournement sur les CPU avec beaucoup d'ALUs=== Avec plusieurs unités de calcul, la sortie de chaque ALU doit être reliée aux entrées de toutes les autres, avec les comparateurs qui vont avec ! Sur les processeurs ayant plusieurs d'unités de calculs, cela demande beaucoup de circuits. Pour N unités de calcul, cela demande 2 * N² interconnexions, implémentées avec 2N multiplexeurs de N entrées chacun. Si c'est faisable pour 2 ou 3 ALUs, la solution est impraticable sur les processeurs modernes, qui ont facilement une dizaine d'unité de calcul. De plus, la complexité du réseau de contournement (l'ensemble des interconnexions entre ALU) a un cout en terme de rapidité du processeur. Plus il est complexe, plus les données contournées traversent de longs fils, plus leur temps de trajet est long, plus la fréquence du processeur en prend un coup. Diverses techniques permettent de limiter la casse, comme l'usage d'un bus de contournement, mais elle est assez impraticable avec beaucoup d'unités de calcul. Notez que cela vaut pour les processeurs superscalaires, mais aussi pour tout processeur avec beaucoup d'unités de calcul. Un simple CPU à exécution dans le désordre, non-superscalaire, a souvent pas mal d'unités de calcul et fait face au même problème. En théorie, un processeur sans exécution dans le désordre ou superscalarité pourrait avoir le problème. Mais en pratique, avoir une dizaine d'ALU implique processeur superscalaire à exécution dans le désordre. D'où le fait qu'on parle du problème maintenant. La seule solution praticable est de ne pas relier toutes les unités de calcul ensemble. À la place, on préfère regrouper les unités de calcul dans différents '''agglomérats''' ('''cluster'''). Le contournement est alors possible entre les unités d'un même agglomérat, mais pas entre agglomérats différents. Généralement, cela arrive pour les unités de calcul entières, mais pas pour les unités flottantes. La raison est que les CPU ont souvent beaucoup d'unités de calcul entières, car les instructions entières sont légion, alors que les instructions flottantes sont plus rares et demandent au mieux une FPU simple. Évidemment, l'usage d'agglomérats fait que certaines possibilités de contournement sont perdues, avec la perte de performance qui va avec. Mais la perte en possibilités de contournement vaut bien le gain en fréquence et le cout en circuit/fils réduit. C'est un bon compromis, ce qui explique que presque tous les processeurs modernes l'utilisent. Les rares exceptions sont les processeurs POWER 4 et POWER 5, qui ont préféré se passer de contournement pour garder un processeur très simple et une fréquence élevée. ===Les bancs de registre sont aussi adaptés pour le contournement=== L'usage d'agglomérats peut aussi prendre en compte les interconnections entre unités de calcul et registres. C'est-à-dire que les registres peuvent être agglomérés. Et cela peut se faire de plusieurs façons différentes. Une première solution, déjà vue dans les chapitres sur la micro-architecture d'un processeur, consiste à découper le banc de registres en plusieurs bancs de registres plus petits. Il faut juste prévoir un réseau d'interconnexions pour échanger des données entre bancs de registres. Dans la plupart des cas, cette séparation est invisible du point de vue de l'assembleur et du langage machine. Le processeur se charge de transférer les données entre bancs de registres suivant les besoins. Sur d'autres processeurs, les transferts de données se font via une instruction spéciale, souvent appelée ''COPY''. [[File:Banc de registres distribué.png|centre|vignette|upright=2|Banc de registres distribué.]] Sur de certains processeurs, un branchement est exécuté par une unité de calcul spécialisée. Or les registres à lire pour déterminer l'adresse de destination du branchement ne sont pas forcément dans le même agglomérat que cette unité de calcul. Pour éviter cela, certains processeurs disposent d'une unité de calcul des branchements dans chaque agglomérat. Dans les cas où plusieurs unités veulent modifier le ''program counter'' en même temps, un système de contrôle général décide quelle unité a la priorité sur les autres. Mais d'autres processeurs fonctionnent autrement : seul un agglomérat possède une unité de branchement, qui peut recevoir des résultats de tests de toutes les autres unités de calcul, quel que soit l’agglomérat. Une autre solution duplique le banc de registres en plusieurs exemplaires qui contiennent exactement les mêmes données, mais avec moins de ports de lecture/écriture. Un exemple est celui des processeurs POWER, Alpha 21264 et Alpha 21464. Sur ces processeurs, le banc de registre est dupliqué en plusieurs exemplaires, qui contiennent exactement les mêmes données. Les lectures en RAM et les résultats des opérations sont envoyées à tous les bancs de registres, afin de garantir que leur contenu est identique. Le banc de registre est dupliqué en autant d'exemplaires qu'il y a d'agglomérats. Chaque exemplaire a exactement deux ports de lecture, une par opérande, au lieu de plusieurs dizaines. La conception du processeur est simplifiée, que ce soit au niveau du câblage, que de la conception des bancs de registres. ==Les optimisations de la pile d'appel : le ''stack engine''== Les processeurs modernes intègrent une optimisation liée au pointeur de pile. Pour rappel, sur les architectures modernes, le pointeur de pile est un registre utilisé pour gérer la pile d'appel, précisément pour savoir où se trouve le sommet de la pile. Il est manipulé par les instructions CALL, RET, PUSH et POP, mais aussi par les instructions d'addition/soustraction pour gérer des cadres de pile de taille variable. De plus, il peut servir d'opérande pour des instructions LOAD/STORE, afin de lire/écrire des variables locales, les arguments d'une fonction, et autres. C'est donc un registre général adressable, intégré au banc de registre, altéré par l'unité de calcul entière. L'incrémentation/décrémentation du pointeur de pile passe donc par l'unité de calcul, lors des instructions CALL, RET, PUSH et POP. Mais, l'optimisation que nous allons voir permet d'incrémenter/décrémenter le pointeur de pile sans passer par l'ALU, ou presque. L'idée est de s'inspirer des architectures avec une pile d'adresse de retour, qui intègrent le pointeur de pile dans le séquenceur et l'incrémentent avec un incrémenteur dédié. ===Le ''stack engine''=== L'optimisation que nous allons voir utilise un '''''stack engine''''' intégré à l'unité de contrôle, au séquenceur. Le processeur contient toujours un pointeur de pile dans le banc de registre, cela ne change pas. Par contre, il n'est pas incrémenté/décrémenté à chaque instruction CALL, RET, PUSH, POP. Un compteur intégré au séquenceur est incrémenté à la place, nous l’appellerons le '''compteur delta'''. La vraie valeur du pointeur de pile s'obtient en additionnant le compteur delta avec le registre dans le banc de registre. Précisons que si le compteur delta vaut zéro, la vraie valeur est dans le banc de registre et peut s'utiliser telle quelle. Lorsqu'une instruction ADD/SUB/LOAD/STORE utilise le pointeur de pile comme opérande, elle a besoin de la vraie valeur. Si elle n'est pas dans le banc de registre, le séquenceur déclenche l'addition compteur-registre pour calculer la vraie valeur. Finalement, le banc de registre contient alors la bonne valeur et l'instruction peut s'exécuter sans encombre. L'idée est que le pointeur de pile est généralement altéré par une série d'instruction PUSH/POP consécutives, puis des instructions LOAD/STORE/ADD/SUB utilisent le pointeur de pile final comme opérande. En clair, une bonne partie des incrémentations/décrémentation est accumulée dans le compteur delta, puis la vraie valeur est calculée une fois pour toutes et est utilisée comme opérande. On accumule un delta dans le compteur delta, et ce compteur delta est additionné quand nécessaire. Précisons que le compteur delta est placé juste après le décodeur d'instruction, avant même le cache de micro-opération, l'unité de renommage et l'unité d'émission. Ainsi, les incrémentations/décrémentations du pointeur de pile disparaissent dès l'unité de décodage. Elles ne prennent pas de place dans le cache de micro-opération, ni dans la fenêtre d'instruction, ni dans la suite du pipeline. De nombreuses ressources sont économisées dans le ''front-end''. Mais utiliser un ''stack engine'' a aussi de nombreux avantages au niveau du chemin de données/''back-end''. Déjà, sur les processeurs à exécution dans le désordre, cela libère une unité de calcul qui peut être utilisée pour faire d'autres calculs. Ensuite, le compteur delta mémorise un delta assez court, de 8 bits sur le processeur Pentium M, un peu plus pour les suivants. L'incrémentation se fait donc via un incrémenteur 8 bits, pas une grosse ALU 32/64 bits. Il y a un gain en termes de consommation d'énergie, un incrémenteur 8 bits étant moins gourmand qu'une grosse ALU 32/64 bits. ===Les points de synchronisation du delta=== La technique ne fonctionne que si la vraie valeur du pointeur de pile est calculée au bon moment, avant chaque utilisation pertinente. Il y a donc des '''points de synchronisation''' qui forcent le calcul de la vraie valeur. Plus haut, nous avions dit que c'était à chaque fois qu'une instruction adresse le pointeur de pile explicitement, qui l'utilise comme opérande. Les instructions CALL, RET, PUSH et POP ne sont pas concernées par elles utilisent le pointeur de pile de manière implicite et ne font que l'incrémenter/décrémenter. Mais dans les faits, c'est plus compliqué. D'autres situations peuvent forcer une synchronisation, notamment un débordement du compteur delta. Le compteur delta est généralement un compteur de 8 bits, ce qui fait qu'il peut déborder. En cas de débordement du compteur, le séquenceur déclenche le calcul de la vraie valeur, puis réinitialise le compteur delta. La vraie valeur est donc calculée en avance dans ce cas précis. Précisons qu'un compteur delta de 8 bits permet de gérer environ 30 instructions PUSH/POP consécutives, ce qui rend les débordements de compteur delta assez peu fréquent. A noter que si le compteur delta vaut zéro, il n'y a pas besoin de calculer la vraie valeur, le séquenceur prend cette situation en compte. Un autre point de synchronisation est celui des interruptions et exceptions matérielles. Il faut que le compteur delta soit sauvegardé lors d'une interruption et restauré quand elle se termine. Idem lors d'une commutation de contexte, quand on passe d'un programme à un autre. Pour cela, le processeur peut déclencher le calcul de la vraie valeur lors d'une interruption, avant de sauvegarder les registres. Pour cela, le processeur intègre un mécanisme de sauvegarde automatique, qui mémorise la valeur de ce compteur dans le tampon de réordonnancement, pour forcer le calcul de la vraie valeur en cas de problème. La technique du ''stack engine'' est apparue sur les processeurs Pentium M d'Intel et les processeurs K10 d'AMD, et a été conservée sur tous les modèles ultérieurs. L'implémentation est cependant différente selon les processeurs, bien qu'on n'en connaisse pas les détails et que l'on doive se contenter des résultats de micro-benchmarks et des détails fournit par Intel et AMD. Selon certaines sources, dont les manuels d'optimisation d'Agner Fog, les processeurs AMD auraient moins de points de synchronisation que les processeurs Intel. De plus, leur ''stack engine'' serait placé plus loin que prévu dans le pipeline, après la file de micro-opération. ==Un étude des microarchitectures superscalaires x86 d'Intel== Après avoir vu beaucoup de théorie, voyons maintenant comment les microarchitectures Intel et AMD ont implémenté l'exécution superscalaire. Nous allons nous concentrer sur les processeurs Intel pour une raison simple : il y a plus de schémas disponibles sur wikicommons, ce qui me facilite le travail. ===Les processeurs Atom d'Intel, de microarchitecture Bonnell=== Les processeurs Atom sont des processeurs basse consommation produits et conçus par Intel. Il regroupent des processeurs de microarchitecture très différentes. La toute première microarchitecture ATOM était la microarchitecture Bonnell, qui est de loin la plus simple à étudier. Il s'agissait de processeurs sans exécution dans le désordre, sans renommage de registres. De nos jours, de tels processeurs ont disparus, même pour les processeurs basse consommation, mais les premiers processeurs Atom étaient dans ce cas. Mais le processeur était superscalaire et pouvait émettre deux instructions simultanées. Son pipeline faisait 16 étages, ce qui est beaucoup. L'architecture est assez simple. Premièrement, le cache d'instruction permet de lire 8 octets par cycle, qui sont placés dans une file d'instruction. La file d'instruction est alors reliée à deux décodeurs, ce qui permet de décoder deux instructions en même temps. Le fait que les décodeurs lisent les instructions depuis une file d'instruction fait que les deux instructions décodées ne sont pas forcément consécutives en mémoire RAM. Par exemple, l'Atom peut décoder un branchement prédit comme pris, suivi par l'instruction de destination du branchement. Les deux instructions ont été chargées dans la file d'instruction et sont consécutifs dedans, alors qu'elles ne sont pas consécutives en mémoire RAM. Les deux décodeurs alimentent une file de micro-opérations de petite taille : 32 µops maximum, 16 par ''thread'' si le ''multithreading'' matériel est activé. La majorité des instructions x86 sont décodées en une seule micro-opération, y compris les instructions ''load-up''. Le chemin de données est conçu pour exécuter les instruction ''load-up'' nativement, en une seule micro-opération. Le microcode n'est utilisé que pour une extrême minorité d'instructions et est à part des deux décodeurs précédents. L'avantage est que cela permet d'utiliser au mieux la file de micro-opération, qui est de petite taille. La file de micro-opérations est suivie par deux ports d'exécution, avec chacun leur logique d'émission. Les deux ports peuvent émettre au maximum 2 µops par cycle. Le résultat est que deux instructions consécutives peuvent s'exécuter, chacune dans deux avals séparés, dans deux pipelines différents. Les conditions pour cela sont cependant drastiques. Les deux instructions ne doivent pas avoir de dépendances de registres, à quelques exceptions près liées au registre d'état. Le multithreading matériel doit aussi être désactivé. Les deux instructions doivent aller chacun dans un port différent, et cela tient en compte du fait que les deux ports sont reliés à des unités de calcul fort différentes. Le tout est illustré ci-dessous. [[File:Intel Atom Microarchitecture.png|centre|vignette|upright=2.5|Intel Atom Microarchitecture]] Les deux ports sont capables de faire des additions/soustractions, des opérations bit à bit et des copies entre registres. Pour cela, ils ont chacun une ALU simple dédiée. Mais cela s'arrête là. Le second port est optimisé pour les opérations de type ''load-up''. Il contient toute la machinerie pour faire les accès mémoire, notamment des unités de calcul d'adresse et un cache L1 de données. A la suite du cache, se trouvent une ALU entière simple, un ''barrel shifter'', et un circuit multiplieur/diviseur. Le circuit multiplieur/diviseur est utilisé à la fois pour les opérations flottantes et entières. Le premier port permet d’exécuter des opérations entières simples, une addition flottante, des comparaisons/branchements, ou une instruction de calcul d'adresse LEA. Comme on le voit, la séparation entre les deux pipelines est assez complexe. Il ne s'agit pas du cas simple avec un pipeline entier et un pipeline flottant séparés. En réalité, il y a deux pipelines, chacun capables de faire des opérations entières et flottantes, mais pas les mêmes opérations. Et cette organisation difficile à comprendre est en réalité très efficace, très économe en circuit, tout en gardant une performance intéressante. Les instructions simples, ADD/SUB/bitwise sont supportées dans les deux pipelines. Il faut dire que ce sont des opérations courantes qu'il vaut mieux optimiser au mieux. Les opérations plus complexes, à savoir les multiplications/divisions/décalages/rotations/manipulations de bit sont supportées dans un seul pipeline. La raison est qu'il est rare que de telles opérations soient consécutives, et qu'il n'est donc pas utile d'optimiser pour cette situation. Si les deux pipelines devaient supporter ces opérations, cela demanderait de dupliquer les circuits multiplieurs/diviseur, ce qui aurait un cout en circuit important pour un gain en performance assez faible. ===Le Pentium 1/MMX et les pipelines U/V=== Le processeur Pentium d'Intel avait un pipeline de 5 étages : un étage de chargement/prédiction de branchement, deux étages de décodage, un étage d'exécution et un dernier étage pour l'écriture dans les registres. Chose étonnante pour un processeur superscalaire, il n'utilisait pas de renommage de registre ni d’exécution dans le désordre. Vous avez bien lu : la superscalarité est apparue dans les processeurs commerciaux avant l'exécution dans le désordre. Le Pentium 1 était un processeur à double émission, qui disposait de deux pipelines nommés U et V. On pouvait en tirer parti lorsque deux instructions consécutives pouvaient être exécutées en parallèles, si elles n'avaient pas de dépendances. Chose peu courante, les deux pipelines n'étaient pas identiques. Le pipeline U pouvait exécuter toutes les instructions, mais le pipeline V était beaucoup plus limité. Par exemple, seul le pipeline U peut faire des calculs flottants, le pipeline V ne fait que des calculs entiers et des branchements. L'unité flottante était sur le port d'émission du pipeline U, idem pour l'unité de calcul vectoriel MMX sur le Pentium MMX. Les deux pipelines disposaient d'une unité de calcul entière identiques dans les deux pipelines. Le pipeline U incorporait un circuit multiplieur/diviseur et un ''barrel shifter'' pour les décalages/rotations. Les deux pipelines avaient chacun uen unité de calcul d'adresse, mais elle n'étaient pas identique : celle du pipeline V ne gérait que l’instruction LEA, celle du pipeline U gérait tous les calculs d'adresse. La FPU était dans le pipeline U, de même que l'unité MMX. {|class="wikitable" |- ! Pipeline U ! Pipeline V |- | colspan="2" | ALU simple (une par pipeline) |- | Multiplieur/diviseur | |- | ''Barrel Shifter'' | |- | AGU complexe | AGU simple (opération LEA) |- | FPU | |- | Unité SIMD | |} Les deux ALU géraient les opérations bit à bit, les additions et soustractions, et les comparaisons (qui sont des soustractions déguisées). En conséquence, les instructions suivantes étaient exécutables dans les deux pipelines, ce qui fait qu'on pouvait en faire deux en même temps : * l'instruction MOV, dépend du mode d'adressage ; * les instructions de gestion de la pile PUSH et POP, dépend du mode d'adressage ; * Les instructions arithmétiques INC, DEC, ADD, SUB ; * l'instruction de comparaison CMP ; * les instructions bit à bit AND, OR, XOR ; * l'instruction de calcul d'adresse LEA ; * l'instruction NOP, qui ne fait rien. Les instructions suivantes sont exécutables seulement dans le pipeline U : les calculs d'adresse autres que LEA, les décalages et rotations, la multiplication et la division, les opérations flottantes. Il faut noter qu'il y a cependant quelques restrictions. Par exemple, si le pipeline U exécute une multiplication ou une division, le processeur ne peut pas exécuter une opération dans le pipeline V en parallèle. Dans le même genre, les branchements sont exécutables dans les deux pipelines, mais on ne peut exécuter une autre opération en parallèle qu'à la condition que le branchement soit exécuté dans le pipeline V. [[File:Intel Pentium arch.svg|centre|vignette|upright=2.5|Microarchitecture de l'Intel Pentium MMX. On voit que certaines unités de calcul sont dupliquées.]] ===La microarchitecture P6 du Pentium 2/3=== La microachitecture suivante, nommée P6, était une microarchitecture plus élaborée. Le pipeline faisait 12 étages, dont seuls les trois derniers correspondent au chemin de données. Il s'agissait du premier processeur à exécution dans le désordre de la marque, avec une implémentation basée sur des stations de réservation. Il gérait aussi le renommage de registre, avec un renommage de registre dans le ROB, commandé par une table d'alias. [[File:Intel Pentium Pro Microarchitecture Block Diagram.svg|centre|vignette|upright=2|Intel Pentium Pro Microarchitecture Block Diagram]] Le décodage des instructions x86 était géré par plusieurs décodeurs. Il y avait trois décodeurs : deux décodeurs simples, et un décodeur complexe. Les décodeurs simples décodaient les instructions les plus fréquentes, mais aussi les plus simples. Les instructions CISC complexes étaient gérées uniquement par le décodeur complexe, basé sur un microcode. Le processeur était à doubvle émission, du fait que les deux décodeurs simples faisaient le gros du travail, et passaient la main au décodeur microcodé quand aucune instruction ne leur était attribué. Les stations de réservations étaient regroupées dans une structure centralisée, en sortie de l'unité de renommage. Elles avaient 5 ports d'émission, qui étaient sous-utilisés en pratique. Niveau ALU, on trouve deux ALUs entières, une flottante, une unité pour les instructions SSE et autres, et trois unités pour les accès mémoire (regroupées en une seule unité dans le schéma ci-dessous). Les unités mémoire regroupent une unité de calcul d'adresse pour les lectures, une autre pour les écritures, et une unité pour la gestion des données à écrire. Les unités de calcul d'adresse sont des additionneurs à 4 opérandes, complétement différents des ALU entières. Les ALU entières sont deux unités asymétriques : une ALU simple, et une ALU complexe incorporant un multiplieur. Les deux peuvent exécuter des opérations d'addition, soustraction, comparaison, etc. [[File:P6 func diag.png|centre|vignette|upright=2|P6 func diag]] ===La microarchitecture Netburst du Pentium 4=== La microarchitecture Netburst, utilisée sur le Pentium 4, utilisait un pipeline à 20 étage, augmenté à 32 sur une révision ultérieure. Il a existé quatre révisions de l'architecture : Willamette (180 nm), Northwood (130 nm), Prescott (90 nm) et Cedar Mill (65 nm). Les deux premières avaient un pipeline de 20 étages, les deux suivants avaient 32 étages ! Le grand nombre d'étages permettait d'avoir une fréquence très élevée, mais posait de nombreux problèmes. Vider le pipeline était très long et il fallait une prédiction de branchement au top pour réduire l'impact des mauvaises prédictions. L'unité de prédiction de branchement était une des plus élvoluées pour l'époque. Pour l'époque. Il dispose d'un cache de trace et a été le seul processeur commercial à en utiliser un. Niveau décodeurs, on retrouve le décodeur lent à base de microcode présent sur les anciennes versions, couplé à un décodeur simple. L'unité de renomage utilise une table d'alias. Le renommage de registres se fait avec un banc de registres physiques. Vous pouvez remarquer dans le schéma suivant la présence de deux files de micro-opérations : une pour les accès mémoire, l'autre pour les autres opérations. Il s'agit bel et bien de deux files d'instructions, pas de fenêtres d'instruction ni de stations de réservation. Niveau ports d'émission, il y a quatre ports. Un pour les lectures mémoire, un pour les écriture mémoire, et deux autres qui mélangent FPU et ALUs. Le premier port est relié à une ALU complexe et une FPU spécialisée dans les MOV flottants. Le second port est relié à tout le reste : ALU basique ''barrel shifter'', FPU. Fait amusant, les ALU entières étaient cadencées à une fréquence double de celle du processeur, ce qui fait que les files d'émissionsont aussi censées l'être, de même que les ''scoreboard''. Sauf qu'en réalité, les circuits étaient dupliqués : l'un allait à une fréquence double, l'autre allait à la fréquence normale. [[File:Architettura Pentium 4.png|centre|vignette|upright=3|Microarchitecture du Pentium 4.]] ==Un étude des microarchitectures superscalaires x86 d'AMD== Les architectures AMD ont beaucoup évoluées avec le temps. Dans ce qui va suivre, nous allons les voir dans l'ordre chronologique, en partant de l'architecture K5, pour arriver aux dernières architectures Zen. Nous allons voir que les architectures AMD ont évoluées progressivement, chacune améliorant la précédente en faisant des rajouts ou modifications mineures, à l'exception de quelques grandes cassures dans la continuité où AMD a revu sa copie de fond en comble. L'architecture Bulldozer a été une première cassure, suivie par l'introduction des architectures Zen. Étudier ces architectures demande de voir trois choses séparément : le ''front-end'' qui regroupe l'unité de chargement et les décodeurs, le ''back-end'' qui gère l'exécution dans le désordre et les unités de calcul, et le sous-système mémoire avec les caches et la ''Load Store Queue''. Leur étude sera plus ou moins séparée dans ce qui suit, pour chaque classe d'architecture. ===La première génération de CPU AMD : les architectures K5, K6, K7, K8 et K10=== La première génération de processeurs AMD est celle des architectures K5, K6, K7, K8 et K10. Il n'y a pas de K9, qui a été abandonné en cours de développement. Les processeurs K5 et K6 portent ce nom au niveau commercial. Par contre, les processeurs d'architecture K7 sont aussi connus sous le nom d''''AMD Athlon''', les AMD K8 sont connus sous le nom d''''AMD Athlon 64''', et les architecture K10 sont appelées les '''AMD Phenom'''. Comme le nom l'indique, l'architecture K8 a introduit le 64 bits chez les processeurs AMD. Elles ont une architecture assez similaire pour ce qui est du chargement et des caches. Toutes disposent d'au minimum un cache L1 d'instruction et d'un cache L1 de données. Le K5 n'avait que ces caches, mais un cache L2 a été ajouté avec le K7, puis un L3 avec le K10. L'AMD K5 avait une TLB unique, mais les processeurs suivants avaient une TLB pour le L1 d'instruction et une autre pour le L1 de données. Idem pour le cache L2, avec deux TLB : une pour les données, une pour les instructions. Les caches L1/L2 sont de type exclusifs, à savoir que les données dans le L1 ne sont pas recopiées dans le L2. Le cache L2 est précisément un cache de victime, qui mémorise les données/instructions, évincées des caches L1 lors du remplacement des lignes de cache. L'introduction du cache L2 a entrainé l'ajout de deux TLB de second niveau : une L2 TLB pour les données et une autre pour les instructions. Les architectures K8 et K10 ont ajouté un cache L3, avec un accès indirect à travers l'interface avec le bus. : L'AMD K7 originel, aussi appelée Athlon classique, n'avait pas de cache L2, mais celui-ci était placé sur la carte mère et fonctionnait à une fréquence moitié moindre de celle du CPU. L'Athlon Thunderbird, puis l'Athlon XP, ont intégré le cache L2 dans le processeur. {|class="wikitable" |- ! Architecture AMD ! colspan="5" | Caches |- | rowspan="2" | K5 | L1 instruction || L1 données || colspan="3" | |- | colspan="2" | TLB unique || colspan="3" | |- | colspan="4" | |- | rowspan="2" | K6 | L1 instruction || L1 données || colspan="3" | L2 unifié |- | TLB L1 instruction || TLB L1 données || colspan="3" | |- | colspan="6" | |- | rowspan="2" | K7, K8 | L1 instruction || L1 données || colspan="2" | L2 unifié || |- | TLB L1 instruction || TLB L1 données || TLB L2 instruction || TLB L2 données || |- | colspan="6" | |- | rowspan="2" | K10 | L1 instruction || L1 données || colspan="2" | L2 unifié || L3 |- | TLB L1 instruction || TLB L1 données || TLB L2 instruction || TLB L2 données || |} Fait important, les architectures K5 à K10 utilisent la technique du '''prédécodage''', où les instructions sont partiellement décodées avant d'entrer dans le cache d'instruction. Le prédécodage facilite grandement le travail des décodeurs d'instruction proprement dit. Par contre, le prédécodage prend de la place dans le cache L1 d'instruction, une partie de sa capacité est utilisé pour mémoriser les informations prédécodées. C'est donc un compromis entre taille du cache et taille/rapidité des décodeurs d'instruction. Sur les architectures K5 et K6, le prédécodage précise, pour chaque octet, si c'est le début ou la fin d'une instruction, si c'est un octet d'opcode, en combien de micro-opérations sera décodée l'instruction, etc. A partir de l'AMD K7, le prédécodage reconnait les branchements inconditionnels. Lorsqu'un branchement inconditionnel est pré-décodé, le pré-décodage tient compte du branchement et continue le pré-décodage des instructions à partir de la destination du branchement. Le système de prédécodage est abandonnée à partir de l'architecture Bulldozer, qui suit l'architecture K10. La prédiction de branchement de ces CPU tire partie de ce système de pré-décodage, à savoir que les prédictions de branchement sont partiellement mémorisées dans les lignes de cache du L1 d'instruction. Par exemple, l'AMD K5 se passe de ''Branch Target Buffer'' grâce à cela. Si une ligne de cache contient un branchement, elle mémorise l'adresse de destination de ce branchement, en plus des bits de pré-décodage. Si il y a plusieurs branchements dans une ligne de cache, c'est l'adresse de destination du premier branchement pris dans cette ligne de cache qui est mémoirsée. Un défaut de cette approche est que si le branchement n'est pas dans le L1 d'instruction, aucune prédiction de branchement ne peut être faite et le préchargement ne peut pas fonctionner. C'est une limitation que n'ont pas les BTB découplées du cache L1 : elles peuvent prédire un branchement qui a été évincé dans le L2 ou le L3, tant que l'entrée associée est dans le BTB. Les prédictions peuvent même servir à précharger les instructions utiles. [[File:Comparaison du chargement de l'AMD K5 et K6.png|centre|vignette|upright=2|Comparaison du chargement de l'AMD K5 et K6]] Au niveau du décodage, on trouve de nombreuses différences entre les premières architectures AMD. L'AMD K5 contient 4 décodeurs hybrides, afin de décoder 4 instructions par cycles. Le K5 a quatre décodeurs simples couplés à 4 décodeurs complexes avec chacun un accès au micro-code. Une instruction peut donc passer par a donc deux voies de décodage : un décodage rapide et simple pour les instructions simples, un décodage lent et passant par le microcode pour les instructions complexes. Pour décoder 4 instructions, les deux voies sont dupliquées en 4 exemplaires, ce qui a un cout en circuits non-négligeable. L'AMD K6 utilise moins de décodeurs et ne peut que décoder deux instructions à la fois maximum. Par contre, il fournit en sortie 4 micro-opérations. Il intègre pour cela deux décodeurs simples, un décodeur complexe et un décodeur micro-codé. Un décodeur simple transforme une instruction simple en une ou deux micro-opérations. Il est possible d'utiliser les deux décodeurs simples en même temps, afin de fournir 4 micro-opérations en sortie du décodeur. Les deux autres décodent une instruction complexe en 1 à 4 micro-opérations. Si jamais la ou les deux instructions sont décodées en 1, 2 ou 3 micro-opérations, les micro-opérations manquantes pour atteindre 4 sont remplies par des NOPs. Pour le K7 et au-delà, le processeur dispose de décodeurs séparées pour les instructions micro-codées de celles qui ne le sont pas. Le processeur peut décoder jusqu’à 3 instructions par cycle. Le décodage d'une instruction microcodée ne peut pas se faire en parallèle du décodage non-microcodé. C'est soit le décodeur microcodé qui est utilisé, soit les décodeurs câblés, pas les deux en même temps. Le décodage d'une instruction prend 4 cycles. Les instructions non-microcodées sont décodées en une seule micro-opération, à un détail près : le CPU optimise la prise en charge des instructions ''load-up''. La différence entre le K6 et le K7 s'explique par des optimisations des instructions ''load-up''. Sur le K6, les instructions ''load-up'' sont décodées en deux micro-opération : la lecture en RAM, l'opération proprement dite. Mais sur le K7, une instruction ''load-up'' est décodée en une seule micro-opération. En conséquence, les décodeurs simples sont fortement simplifiés et le décodeur complexe disparait au profit d'un microcode unique. [[File:Décodage sur le K5 et le K5.png|centre|vignette|upright=3|Décodage sur le K5 et le K5]] ====Les microarchitectures K5 et K6 d'AMD==== Les deux premières architectures étaient les architectures K5 et K6, l'architecture K6 ayant été déclinée en quatre versions, nommées K6-1, K6-2, et K-3, avec une version K6-3 bis. Elles sont regroupées ensemble car elles ont beaucoup de points communs. Par exemple, tout ce qui a trait au chargement et au cache était similaire, de même que les unités de calcul. Les deux architectures avaient n'avaient pas de cache L2 et devaient se contenter d'un cache L1 d'instruction et d'un cache L1 de données. L'AMD K5 incorpore une TLB unique, alors que le K6 utilise des TLB séparées pour le cache d'instruction et le cache de données. Une différence entre l'architecture K5 et K6 est que la première utilise des caches normaux, alors que la seconde utilise des ''sector caches''. Les deux architectures disposaient des unités de calcul suivantes : deux ALU entières, une FPU, deux unités LOAD/STORE pour les accès mémoire, une unité de branchement et une ou plusieurs unités SIMD. Une organisation classique, donc. Pour les unités entières, il y avait deux ALU simples, un ''barrel shifter'' et un diviseur. Il n'y a pas d'erreur, le processeur incorpore un circuit diviseur, mais pas de circuit multiplieur. La raison est que la multiplication est réalisée par la FPU ! En effet, le multiplieur flottant de la FPU intègre un multiplieur entier pour multiplier les mantisses, qui est utilisé pour les multiplications entières. La même technique a été utilisée sur l'Atom, comme vu plus haut. Le tout était alimenté par deux ports d'émission, appelés ports X et Y. Sur l'architecture K5, le ''barrel shifter'' et le diviseur sont des ports différents. {|class="wikitable" |+ AMD K5 |- ! Port X ! Port Y |- | ALU simple | ALU simple |- | ''Barrel Shifter'' | Diviseur |} Sur l'architecture K6, le ''barrel shifter'' et le diviseur sont sur le même port. {|class="wikitable" |+ AMD K6 |- ! Port X ! Port Y |- | ALU simple | ALU simple |- | | ''Barrel Shifter'' |- | | Diviseur |} Niveau unités mémoire, le K5 avait deux unités LOAD/STORE, chacune capable de faire lecture et écriture. Par contre, la ''store queue'' n'a qu'un seul port d'entrée, ce qui fait que le processeur peut seulement accepter une écriture par cycle. Le processeur peut donc émettre soit deux lectures simultanées, soit une lecture accompagnée d'une écriture. Impossible d'émettre deux écritures simultanées, ce qui est de toute façon très rare. L'architecture K6 utilise quant à elle une unité LOAD pour les lectures et une unité STORE pour les écritures. Ce qui permet de faire une lecture et une écriture par cycle, pas autre chose. Niveau unités SIMD, l'architecture K7 n'avait qu'une seule unité SIMD, placée sur le port d'émission X. L'architecture K8 ajouta une seconde unité SIMD, sur l'autre port d'émission entier. De plus, trois ALU SIMD ont été ajoutées : un décaleur MMX, une unité 3DNow!, une unité mixte MMX/3DNow. Elles sont reliées aux deux ports d'émission entier X et Y ! Elles ne sont pas représentées ci-dessous, par souci de simplicité. [[File:Unité de calcul des processeurs AMD K5 et K6.png|centre|vignette|upright=2|Unité de calcul des processeurs AMD K5 et K6. les unités sur la même colonnes sont reliées au même port d'émission.]] Si les unités de calcul et le chargement sont globalement les mêmes, les deux architectures se différencient sur l'exécution dans le désordre. L'AMD K5 utilise du renommage de registre dans le ROB avec des stations de réservation. Par contre, l'AMD K6 utilise une fenêtre d'instruction centralisée. De plus, son renommage de registre se fait avec un banc de registre physique. L'architecture AMD K5 utilisait de deux stations de réservation par unité de calcul, sauf pour les deux unités mémoire partageaient une station de réservation unique (deux fois plus grande). Les stations de réservation sont cependant mal nommées, vu que ce sont en réalité des mémoire FIFO. Une micro-opération n'est émise que si elle est la plus ancienne dans la FIFO/station de réservation. Le renommage de registres se faisait dans le tampon de ré-ordonnancement, il n'y avait pas encore de banc de registre physique. Le tampon de ré-ordonnancement faisait seulement 16 instructions. [[File:AMD K5.jpg|centre|vignette|upright=3|AMDK5 Diagramme.]] L'architecture K6 remplace les stations de réservations par une fenêtre d'instruction centralisée. Les 4 micro-opérations renommées sont écrites dans la fenêtre d'instruction par groupe de 4, NOP de ''padding'' inclus. La fenêtre d'instruction centralisé contient 24 micro-opérations, groupées en 6 groupes de 4 micro-opérations, avec potentiellement des NOP dedans suivant le résultat du décodage. L'avantage est que l'implémentation de la fenêtre d'instruction est simple. La fenêtre d'instruction centralisée permettait d'émettre 6 micro-opérations en même temps (une par unité de calcul/mémoire). Le renommage de registres se faisait dans le tampon de ré-ordonnancement, il n'y avait pas encore de banc de registre physique. Le processeur utilisait un renommage avec un banc de registre physique. Le banc de registre physique pour les entiers contenait 48 registres, dont 24 étaient des registres architecturaux et 24 étaient des registres renommés. Sur les 24 registres architecturaux, 16 avaient une fonction de ''scratchpad'' que les ''datasheets'' d'AMD ne détaillent pas, les 8 restants étaient les registres généraux EAX, EBX, etc. [[File:AMD K6 Little foot & Modl 6.png|centre|vignette|upright=3|AMD K6 original.]] ====Les microarchitectures K7, K8 et K10 d'AMD==== Les microarchitectures suivantes sont les architectures K7, K8 et K10. Les architectures K7, K8 et K10 sont assez similaires. La différence principale entre le K7 et le K8 est le support du 64 bits. Les apports du K10 sont la présence d'un cache L3, d'une unité de calcul supplémentaire et d'améliorations de la prédiction de branchement. La taille de certains caches a été augmentée, de même que la largeur de certaines interconnexions/bus. A partir du K7, le CPU optimise la prise en charge des instructions ''load-up''. Les instructions ''load-op'' sont appelées des macro-opérations dans la terminologie d'AMD, et aussi d'Intel. L'idée est que les instructions ''load-up'' sont décodées en micro-opérations intermédiaires. Elles sont propagées dans le pipeline comme étant une seule micro-opération, jusqu'à l'étage d'émission. Lors de l'émission, les instructions ''load-up'' sont scindées en deux micro-opérations : la lecture de l'opérande, puis l'opération proprement dite. Faire ainsi économise des ressources et optimise le remplissage du tampon de ré-ordonnancement, des fenêtres d'instructions, des stations de réservation, etc. Le tampon de réordonnancement est combiné avec divers circuits en charge de l'exécution dans le désordre, dans ce qui s'appelle l'''instruction control unit''. Il contient de 72 à, 84 instructions, qui sont regroupées en groupes de 3. Là encore, comme pour le K5 et le K6, le tampon de réordonnancement tient compte de la sortie des décodeurs. Les décodeurs fournissent toujours trois micro-opérations par cycle, quitte à remplir les vides par des NOP. Le tampon de réordonnancement reçoit les micro-opérations, NOP inclus, par groupes de 3, et est structuré autour de ces triplets de micro-opération, y compris en interne. Les architectures K7, K8 et K10 ont des unités de calcul très similaires. Concrètement, il y a trois ALU entières, trois unités de calcul d'adresse, et une FPU. Le processeur incorpore, aussi un multiplieur entier, relié sur le port d'émission de la première ALU. La FPU regroupe un additionneur flottant, un multiplieur flottant, et une troisième unité LOAD/STORE pour les lectures/écritures pour les nombres flottants. L'architecture K8 ajoute une unité de manipulation de bit, la K10 un diviseur entier. [[File:Unité de calcul des processeurs AMD K7, K8 et K10.png|centre|vignette|upright=2|Unité de calcul des processeurs AMD K7, K8 et K10]] Par contre, la manière d'alimenter ces ALU en micro-opérations varie un petit peu entre les architectures K7, K8 et K10. Il y a cependant quelques constantes entre les trois. La première est qu'il y a une fenêtre d'instruction séparée pour les flottants, de 36 à 42 entrées, avec renommage de registre. La fenêtre d'instruction flottante a trois ports d'émission : un pour l'additionneur flottant, un autre pour le multiplieur, et un troisième pour la troisième unité flottante qui s'occupe du reste. La seconde est que chaque ALU entière est couplée avec une unité de calcul d'adresse. Par contre, la méthode de couplage varie d'un processeur à l'autre. L'architecture K7 des processeurs Athlon utilisait le renommage de registre, mais seulement pour les registres flottants, pas pour les registres entiers. Elle avait deux fenêtres d'instruction : une pour les opérations flottantes, une autre pour les instructions entières et les accès mémoire. La fenêtre d'instruction entière pouvait émettre trois micro-opérations en même temps : trois micro-opérations entières, trois micro-opération mémoire. La fenêtre d'instruction entière contenait 5 à 6 groupes de 3 macro-opérations. Vous noterez que j'ai parlé de macro-opérations et pas de micro-opérations, car les instructions ''load-up'' sont considérées comme une seule "micro-opération" dans la fenêtre d'instruction entière. Et cela se marie bien avec une fenêtre d'instruction unique partagée entre pipeline entier et pipeline mémoire. Une macro-opération était scindée en deux micro-opérations : une micro-opération mémoire et une micro-opération entière. Il est donc avantageux de regrouper unités mémoire et unités entières à la même fenêtre d'instruction pour ce faire. La ''Load-Store Queue'' peut mémoriser 44 lectures/écritures, avec cependant une petite nuance. Parmi les 44 lectures/écritures, 12 sont réservées au cache L1 et 32 le sont pour le cache L2. En réalité, il y a deux ''LSQ'', une pour le cache L1 qui fait 12 entrées, une seconde pour le L2 qui fait 32 entrées. [[File:Athlon arch.png|centre|vignette|upright=3|Microarchitecture K7 d'AMD.]] Les architectures K8 et K10 utilisent le renommage de registres pour tous les registres, entiers comme flottants. Par contre, le renommage de registre n'est pas réalisé de la même manière pour les registres entiers et flottants. Les registres entiers sont renommés dans le tampon de ré-ordonnancement, comme c'était le cas sur les architectures Intel avant le Pentium 4. Par contre, les registres flottants sont renommés grâce à un banc de registre physique. Le K8 est donc un processeur au renommage hybride, qui utilise les deux solutions de renommage principales. Niveau micro-opérations entières, la station de réservation unique de 15 micro-opérations est remplacée par trois stations de réservations, une par ALU entière, de 8 micro-opérations chacune. Chaque station de réservation entière alimente une unité de calcul entière et une unité de calcul d'adresse. Le multiplieur est relié à la première station de réservation, sur le même port d'émission que l'ALU. Les stations de réservation sont nommées des ''schedulers'' dans les schémas qui suivent. [[File:AMD Grayhound microarchitecture.png|centre|vignette|upright=3|Microarchitecture K8 et K10 d'AMD.]] La microarchitecture K10 a été déclinée en plusieurs versions, nommées Grayhound, Grayhound+ et Husky, Husky étant une architecture gravée en 32 nm dédiée aux processeurs A-3000. L'architecture Grayhound a plus de cache et un ROB plus grand, la Husky est quand à elle un peu plus différente. Elle n'a pas de cache L3, contrairement aux autres architectures K10, ce qui simplifie fortement son sous-système mémoire. Par contre, les fenêtres d'instructions/stations de réservation et le ROB sont plus grands, pareil pour les files dans l'unité mémoire. Une ALU pour les divisions entières a aussi été ajoutée. [[File:AMD Husky microarchitecture.png|centre|vignette|upright=3|AMD Husky microarchitecture]] Pour résumer, les architectures K7, K8 et K10 séparent les pipelines entiers et flottants : trois pipelines entiers avec chacun son unité de calcul, et un pipeline flottant avec plusieurs unités de calcul. Les raisons à cela sont assez diverses. Disons que dupliquer des ALU entières simples prend peu de transistors, là où les gros circuits comme le multiplieur ou la FPU ne sont pas dupliqués. Et cela a un autre avantage : le renommage, ''dispatch'' et l'émission sont plus simples. Les pipelines entiers ont une exécution dans le désordre peu complexe, grâce au grand nombre d'unités de calcul, ce qui fait que le pipeline entier est de seulement 15 cycles au total (chargement et décodage inclus). A l'opposé, la FPU est alimentée par une exécution dans le désordre très complexe, avec banc de registre physique et beaucoup de ressources, mais au prix d'un pipeline flottant plus long de 3 cycles, soit 18 cycles au total. ===Les microarchitectures ZEN d'AMD=== Viennent ensuite les '''microarchitectures Bulldozer''', avec trois révisions ultérieures nommées Piledriver, Steamroller et Excavator. Mais du fait de l'utilisation de techniques de multithreading matériel que nous n'avons pas encore abordé, nous ne pouvons pas en parler ici. Les microarchitectures suivantes sont les '''architectures ZEN 1/2/3/4/5'''. Elles se ressemblent beaucoup, chacune accumulant les améliorations des précédentes. Mais le cœur de l'architecture reste plus ou moins le même. En passant à la suivante, le nombre de registre virtuel augmente, le ''branch target buffer'' augmente en taille, le ROB et les files d'attente grossissent, les caches de micro-opération aussi, les caches grossissent, etc. La microarchitecture Zen 1 est illustrée ci-dessous. Le passage à Zen 2 a ajouté une unité de calcul d'adresse (4 ALU / 3 AGU), le Zen 5 a ajouté deux autres ALU entières et une unité de calcul d'adresse (6 ALU / 4 AGU) [[File:Zen microarchitecture.svg|centre|vignette|upright=3|Microarchitecture Zen 1 d'AMD.]] <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Le parallélisme mémoire au niveau du cache | prevText=Le parallélisme mémoire au niveau du cache | next=Les processeurs VLIW et EPIC | nextText=Les processeurs VLIW et EPIC }} </noinclude> neyp9pw3d9we7h8w0efdki0deh6e0h8 745870 745869 2025-07-03T14:54:09Z Mewtow 31375 /* L'émission multiple des accès mémoire */ 745870 wikitext text/x-wiki Les processeurs vus auparavant ne peuvent émettre au maximum qu'une instruction par cycle d'horloge : ce sont des processeurs à émission unique. Ils peuvent avoir plusieurs instructions qui s'exécutent en même temps, dans des unités de calcul séparées. C'est le cas dès qu'une instruction multicycle s'exécute. Par contre, ils ne peuvent démarrer qu'une seule instruction par cycle. Et quand on court après la performance, ce n'est pas assez ! Les concepteurs de processeurs ont inventés des processeurs qui émettent plusieurs instructions par cycle : les '''processeurs à émissions multiples'''. Un processeur à émission multiple charge plusieurs instructions en même temps, les décode en parallèle, puis les émet en même temps sur des unités de calculs séparées. Pour cela, il faut gérer les dépendances entre instructions, répartir les instructions sur différentes unités de calcul, et cela n'est pas une mince affaire. [[File:Superscalarpipeline.svg|centre|vignette|upright=1.5|Pipeline RISC classique à cinq étages sur un processeur superscalaire. On voit bien que plusieurs instructions sont chargées en même temps.]] Les processeurs à émission multiple sont de deux types : les processeurs VLIW et les '''processeurs superscalaires'''. Nous mettons les processeurs VLIW de côté en attendant le prochain chapitre. La raison est qu'ils ont un jeu d'instruction spécialisé qui expose le parallélisme d'instruction directement au niveau du jeu d'instructions, là où les processeurs superscalaires restent des processeurs au jeu d'instruction normal. La différence principale entre processeur VLIW et superscalaire est qu'un processeur superscalaire répartit les instructions sur les unités de calcul à l’exécution, là où un processeur VLIW délègue cette tâche au compilateur. ==L'implémentation d'un processeur superscalaire== Sur un processeur à émission multiple, plusieurs micro-opérations sont émises en même temps, le nombre varie d'un processeur à l'autre. Les processeurs superscalaires les plus simples ne permettent que d'émettre deux micro-opérations à la fois, d'où leur nom de processeur ''dual issue'', ce qui se traduit en '''processeur à double émission'''. Les processeurs modernes peuvent émettre 3, 4, 6, voire 8 micro-opérations simultanément. Aller au-delà ne sert pas à grand-chose. ===Les circuits hors-ALU sont soit dupliqués, soit adaptés=== Un processeur superscalaire doit être capable de : lire plusieurs instructions depuis la mémoire, les décoder, renommer leurs registres, et les envoyer à l'unité d'émission. Intuitivement, on se fit qu'on doit dupliquer tous les circuits : les décodeurs, l'unité de renommage, les unités de calcul, le ROB, etc. Dans les faits, l'implémentation d'un processeur superscalaire demande de dupliquer plusieurs circuits et d'en adapter d'autres. Voici ce que cela donne dans les grandes lignes. {|class="wikitable" |- ! rowspan="2" | Processeur sans émission multiple | rowspan="2" | Chargement | rowspan="2" | Décodage | rowspan="2" | Renommage | rowspan="2" | Émission | Exécution / ALU | rowspan="2" | ''Commit''/ROB |- | Exécution / ALU |- ! rowspan="4" | Processeur superscalaire | rowspan="4" | Chargement | rowspan="2" | Décodage | rowspan="4" | Renommage | rowspan="4" | Émission | Exécution / ALU | rowspan="4" | ''Commit''/ROB |- | Exécution / ALU |- | rowspan="2" | Décodage | Exécution / ALU |- | Exécution / ALU |} Un processeur superscalaire doit pouvoir charger plusieurs instructions en même temps. Deux solutions pour cela. La première est de doubler la taille du bus connecté au cache d'instruction. Si les instructions sont de longueur fixe, cela charge deux instructions à la fois. Pour un processeur à triple émission, il faut tripler la taille du bus, quadrupler pour un processeur quadruple émission, etc. Mais tout n'est pas si simple, quelques subtilités font qu'on doit ajouter des circuits en plus pour corriger les défauts peu intuitifs de cette implémentation naïve. Une autre solution est d'utiliser un cache d'instruction multiport. Mais dans ce cas, le ''program counter'' doit générer deux adresses, au mieux consécutives, au pire prédites par l'unité de prédiction de branchement. L'implémentation est alors encore plus complexe, comme on le verra plus bas. Il doit ensuite décoder plusieurs instructions en même temps. Il se trouve que les dépendances entre instruction ne posent pas de problème pour le décodeur. Rien ne s'oppose à ce qu'on utilise plusieurs décodeurs séparés. Il faut dire que les décodeurs sont de purs circuits combinatoires, du moins sur les processeurs avec une file de micro-opérations, ou avec une fenêtre d'instruction, ou des stations de réservation. Par contre, l'unité de renommage de registre n'est pas dupliquée, mais adaptées, pour gérer le cas où des instructions consécutives ont des dépendances de registre. Par exemple, prenons un processeur à double émission, qui renomme deux instructions consécutives. Si elles ont une dépendance, le renommage de la seconde instruction dépend du renommage de la première. La première doit être renommée et le résultat du renommage est utilisé pour renommer la seconde, ce qui empêche d'utiliser deux unités de renommage séparées. L'unité d'émission, la file de micro-opération et tous les circuits liés aux dépendances d'instruction ne sont pas dupliqués, car il peut y avoir des dépendances entre instruction chargées simultanément. L'unité d'émission est modifiée de manière à émettre plusieurs instructions à la fois. Si c'est un ''scoreboard'', il doit être modifié pour détecter les dépendances entre les instructions à émettre. Si c'est une fenêtre d'instruction ou une station de réservation, les choses sont plus simples, il faut basiquement rajouter des ports de lecture et écriture pour insérer et émettre plusieurs instructions à la fois, et modifier la logique de sélection en conséquence. Le ROB et les autres structures doivent aussi être modifiées pour pouvoir émettre et terminer plusieurs instructions en même temps. ===La duplication des unités de calcul et les contraintes d’appariement=== Pour émettre plusieurs instructions en même temps, encore faut-il avoir de quoi les exécuter. En clair : un processeur superscalaire doit avoir plusieurs unités de calcul séparées. Les processeurs avec un pipeline dynamique incorporent plusieurs unités pour les instructions entières, une unité pour les instructions flottantes, une unité pour les accès mémoire et éventuellement une unité pour les tests/branchements. Au lieu de parler d'unités de calcul, un terme plus correct serait le terme d''''avals''', que nous avions introduit dans le chapitre sur les pipelines dynamiques, mais n'avons pas eu l'occasion d'utiliser par la suite. Les processeurs avec un pipeline dynamique incorporent déjà plusieurs avals, mais chaque aval ne peut accepter qu'une nouvelle instruction par cycle. Et cela ne change pas sur les processeurs superscalaire, une unité de calcul reste une unité de calcul. Il y a plusieurs manières de gérer les avals sur un processeur superscalaire. La première duplique tous les avals : toutes les unités de calcul sont dupliquées. Par exemple, prenons un processeur simple-émission et transformons-le en processeur à double émission. Intuitivement, on se dit qu'il faut dupliquer toutes les unités de calcul. Si le processeur de base a une ALU entière, une FPU et un circuit multiplieur, ils sont tous dupliqués. L'avantage de faire ainsi est que le processeur n'a pas de contrainte quand il veut émettre deux instructions. Tant que les deux instructions n'ont pas de dépendances de données, il peut les émettre. Pour le dire autrement, toutes les paires d'instructions possibles sont compatibles avec la double émission. Si le processeur veut émettre deux multiplications consécutives, il le peut. S'il veut émettre deux instructions flottantes, il le peut. Le problème, c'est que le cout en circuit est conséquent ! Dupliquer la FPU ou les circuits multiplieurs bouffe du transistor. Pour économiser des transistors, il est possible de ne pas dupliquer tous les circuits. Typiquement, les ALU simples sont dupliquées, de même que les unités de calcul d'adresse, mais la FPU et les circuits multiplieurs ne sont pas dupliqués. En faisant ainsi, le cout en transistors est grandement réduire. Par contre, cela entraine l'apparition de dépendances structurelles. Par exemple, le CPU ne peut pas émettre deux multiplications consécutives sur un seul multiplieur, idem avec deux additions flottantes si l'additionneur flottant n'est pas dupliqué. La conséquence est que les processeurs superscalaires ont des contraintes sur les instructions à émettre en même temps. Si on prend un processeur ''dual-issue'', il y a donc des paires d'instructions autorisées et des paires interdites. Par exemple, l'exécution simultanée de deux branchements est interdite. Les branchements sont sérialisés, exécutés l'un après l'autre. Il est possible d'émettre un branchement en même temps qu'une autre instruction, en espérant que la prédiction de branchement ait fait une bonne prédiction. Mais il n'est souvent pas possible d'émettre deux branchements en même temps. La raison est qu'il n'y a qu'une seule unité de calcul pour les branchements dans un processeur. ==L'étape de chargement superscalaire== Pour charger plusieurs instructions, il suffit de doubler, tripler ou quadrupler le bus mémoire. Précisément, c'est le port de lecture du cache d’instruction qui est élargit, pour lire 2/3/4/... instructions. Un bloc de 8, 16, 32 octets est dnc lu depuis le cache et est ensuite découpé en instructions, envoyées chacun à un décodeur. Découper un bloc en instructions est trivial avec des instructions de longueur fixe, mais plus compliqué avec des instructions de taille variable. Il est cependant possible de s'en sortir avec deux solutions distinctes. La première solution utilise les techniques de prédécodage vues dans le chapitre sur les caches, à savoir que le découpage d'une ligne de cache est réalisé lors du chargement dans le cache d’instruction. Une autre solution améliore le circuit de détection des tailles d'instruction vu dans le chapitre sur l'unité de chargement. Avec la seconde solution, cela prend parfois un étage de pipeline entier, comme c'est le cas sur les processeurs Intel de microarchitecture P6. Mais laissons de côté cette difficulté et passons au vrai problème. Charger un gros bloc de mémoire permet de charger plusieurs instructions, mais il y a potentiellement des branchements dans le bloc. Et on doit gérer le cas où ils sont pris, le cas où les instructions suivantes dans le bloc doivent être annulées. En clair, il faut détecter les branchements dans le bloc chargé et gérer le cas où ils sont pris. : Dans ce qui va suivre, un morceau de code sans branchement est appelé un bloc de base (''basic block''). ===Le circuit de fusion de blocs=== Les processeurs superscalaires simples ne se préoccupent pas des branchements lors du chargement. Les instructions chargées en même temps sont toutes décodées et exécutées en même temps, même s'il y a un branchement dans le tas. Les branchements sont donc prédits comme étant non-pris systématiquement. Mais d'autres sont plus malins et utilisent la prédiction de branchement pour savoir si un branchement est pris ou non. Partons du principe que le branchement est pris : le processeur doit charger toutes les instructions d'un bloc, sauf celles qui suivent le branchement pris. L'unité de chargement coupe le bloc chargé au niveau du premier branchement non-pris, remplit les vides avec des NOP, avant d'envoyer le tout à l'unité de décodage. [[File:Fetch sur un processeur superscalaire avec prediction de branchements.png|centre|vignette|upright=2|Fetch sur un processeur superscalaire avec prédiction de branchements.]] Une solution plus performante charge les instructions de destination du branchement et les placent à sa suite. Ils chargent deux blocs à la fois et les fusionnent en un seul qui ne contient que les instructions présumées utiles. [[File:Cache d'instructions autoaligné.png|centre|vignette|upright=2|Cache d'instructions autoaligné.]] Mais cela demande de charger deux blocs de mémoire en une fois, ce qui demande un cache d'instruction multiports. Il faut aussi ajouter un circuit pour assembler plusieurs morceaux de blocs en un seul : le fusionneur (''merger''). Le résultat en sortie du fusionneur est ce qu'on appelle une '''trace'''. [[File:Implémentation d'un cache d'instructions autoaligné.png|centre|vignette|upright=2|Implémentation d'un cache d'instructions autoaligné.]] Le principe peut se généraliser si un bloc contient plusieurs branchements pris, avec un nombre de blocs supérieur à deux. Mais cela demande une unité de prédiction de branchement capable de prédire plusieurs branchements par cycle. ===Le cache de traces=== Si jamais un bloc est rechargé et que ses branchements sont pris à l'identique, le résultat du fusionneur sera le même. Il est intéressant de conserver cette trace dans un '''cache de traces''' pour la réutiliser ultérieurement. Le cache de trace n'a été utilisé que sur un seul processeur commercial : le Pentium 4 d'Intel. Fait intéressant, son cache de trace ne mémorisait pas des suites d'instructions, mais des suites de micro-opérations. En clair, il mémorisait des traces décodées, ce qui fait qu'un succès de cache de trace contournait non seulement le cache d'instruction, mais aussi les décodeurs. Ce qui explique que le temps d'accès au cache de trace n'était pas un problème, même s'il était comparable au temps d'accès du cache d'instruction. Il a depuis été remplacé par une alternative bien plus intéressante, le cache de micro-opérations, plus flexible et plus performant. Une trace est réutilisable quand le premier bloc de base est identique et que les prédictions de branchement restent identiques. Pour vérifier cela, le tag du cache de traces contient l'adresse du premier bloc de base, la position des branchements dans la trace et le résultat des prédictions utilisées pour construire la trace. Le résultat des prédictions de branchement de la trace est stocké sous la forme d'une suite de bits : si la trace contient n branchements, le n-ième bit vaut 1 si ce branchement a été pris, et 0 sinon. Même chose pour la position des branchements dans la trace : le bit numéro n indique si la n-ième instruction de la trace est un branchement : si c'est le cas, il vaut 1, et 0 sinon. Pour savoir si une trace est réutilisable, l'unité de chargement envoie le ''program counter'' au cache de traces, l'unité de prédiction de branchement fournit le reste des informations. Si on a un succès de cache de traces, et la trace est envoyée directement au décodeur. Sinon, la trace est chargée depuis le cache d'instructions et assemblée. [[File:TraceCache.png|centre|vignette|upright=2|Cache de traces.]] [[File:BasicBlocks.png|vignette|Blocs de base.]] Pour comprendre ce qu'est une trace, regardez le code illustré ci-contre. Il est composé d'un bloc de base A, suivi par un bloc de base B, qui peut faire appel soit au bloc C, soit un bloc D. Un tel code peut donner deux traces : ABC ou ABD. La trace exécutée dépend du résultat du branchement qui choisit entre C et D. Un cache de trace idéal mémorise les deux traces ABC et ABD dans deux lignes de cache séparées. Il peut mémoriser des traces différentes, même si leur début est le même. Un cache de trace peut supporter des '''succès de cache de trace partiels'''. Prenez le cas où le processeur veut lire la trace ABC mais que le cache de trace ne contient que la trace ABD : c'est un succès partiel. Dans ce cas, le processeur peut lire les blocs de base A et B depuis le cache de trace, et lit D depuis le cache d'instruction. Et cela vaut dans le cas général : si le cache a mémorisé une trace similaire à celle demandée, dont seuls les premiers blocs de base correspondent, il peut lire les premiers blocs de base dans le cache de trace et lire le reste dans le cache d'instruction. Il y a une certaine redondance dans le contenu du cache de trace, car certaines traces partagent des blocs de base. Pour éviter cela, il est possible de mémoriser les blocs de base dans des caches séparés et les assembler avec un fusionneur. Par exemple, au lieu d'utiliser un cache de traces unique, on va utiliser quatre '''caches de blocs de base''', suivi par un fusionneur qui reconstitue la trace. On économise du cache, au dépend d'un temps d'accès plus long vu qu'il faut reconstituer la trace. ==Le séquenceur d'un processeur superscalaire== Le séquenceur d'un processeur superscalaire est modifié, afin de pouvoir décoder plusieurs instructions à la fois. Ce n'est pas le cas général, mais la présence de plusieurs décodeurs est très fréquent sur les processeur superscalaires. De plus, les unités de renommage et d'émission doivent être modifiées. ===Les décodeurs d'instructions superscalaires=== Un processeur superscalaire contient généralement plusieurs décodeurs, chacun pouvant décoder une instruction en parallèle des autres. Prenons par exemple un processeur RISC dont toutes les instructions font 32 bits. Un processeur superscalaire de ce type peut charger des blocs de 128 bits, ce qui permet de charger 4 instructions d'un seul coup. Et pour les décoder, le décodage se fera dans quatre décodeurs séparés, qui fonctionneront en parallèle. Ou alors, il se fera dans un seul décodeur qui pourra décoder plusieurs instructions par cycles. Les processeurs CISC utilisent des décodeurs hybrides, avec un microcode qui complémente un décodeur câblés. Dupliquer le microcode aurait un cout en transistors trop important, ce qui fait que seuls les décodeurs câblés sont dupliqués. Les CPU CISC superscalaires disposent donc de plusieurs décodeurs simples, capables de décoder les instructions les plus courantes, avec un seul microcode. La conséquence est qu'il n'est pas possible de décoder deux instructions microcodées en même temps. Par contre, il reste possible de décoder plusieurs instructions non-microcodées ou une instruction microcodée couplée à une instruction non-microcodée. Vu qu'il est rare que deux instructions microcodées se suivent dans un programme, le cout en performance est extrêmement mineur. Les processeurs superscalaires supportent la technique dite de '''macro-fusion''', qui permet de fusionner deux-trois instructions consécutives en une seule micro-opération. Par exemple, il est possible fusionner une instruction de test et une instruction de saut en une seule micro-opération de branchement. Il s'agit là de l'utilisation la plus importante de la macro-fusion sur les processeurs x86 modernes. En théorie, d'autres utilisations de la macro-fusion sont possibles, certaines ont même été [https://www2.eecs.berkeley.edu/Pubs/TechRpts/2016/EECS-2016-130.pdf proposées pour le jeu d'instruction RISC-V], mais rien n'est encore implémenté (à ma connaissance). La fusion des instructions se fait lors du décodage des instructions, grâce à la coopération des décodeurs. ===L'unité de renommage superscalaire=== Sur un processeur à émission multiple, l'unité de renommage de registres doit renommer plusieurs instructions à la fois, mais aussi gérer les dépendances entre instructions. Pour cela, elle renomme les registres sans tenir compte des dépendances, pour ensuite corriger le résultat. [[File:Unité de renommage superscalaire.png|centre|vignette|upright=2|Unité de renommage superscalaire.]] Seules les dépendances lecture-après-écriture doivent être détectées, les autres étant supprimées par le renommage de registres. Repérer ce genre de dépendances se fait assez simplement : il suffit de regarder si un registre de destination d'une instruction est un opérande d'une instruction suivante. [[File:Détection des dépendances sur un processeur superscalaire.png|centre|vignette|upright=2|Détection des dépendances sur un processeur superscalaire.]] Ensuite, il faut corriger le résultat du renommage en fonction des dépendances. Si une instruction n'a pas de dépendance avec une autre, on la laisse telle quelle. Dans le cas contraire, un registre opérande sera identique avec le registre de destination d'une instruction précédente. Dans ce cas, le registre opérande n'est pas le bon après renommage : on doit le remplacer par le registre de destination de l'instruction avec laquelle il y a dépendance. Cela se fait simplement en utilisant un multiplexeur dont les entrées sont reliées à l'unité de détection des dépendances. On doit faire ce replacement pour chaque registre opérande. [[File:Correction des dépendances sur un processeur superscalaire.png|centre|vignette|upright=2|Correction des dépendances sur un processeur superscalaire.]] ===L'unité d'émission superscalaire=== Pour émettre plusieurs instructions en même temps, l'unité d'émission doit être capable d'émettre plusieurs instructions par cycle. Et Pour cela, elle doit détecter les dépendances entre instructions. Il faut noter que la plupart des processeurs superscalaires utilisent le renommage de registre pour éliminer un maximum de dépendances inter-instructions. Les seules dépendances à détecter sont alors les dépendances RAW, qu'on peut détecter en comparant les registres de deux instructions consécutives. Sur les processeurs superscalaires à exécution dans l’ordre, il faut aussi gérer l'alignement des instructions dans la fenêtre d'instruction. Dans le cas le plus simple, les instructions sont chargées par blocs et on doit attendre que toutes les instructions du bloc soient émises pour charger un nouveau bloc. Avec la seconde méthode, La fenêtre d'instruction fonctionne comme une fenêtre glissante, qui se déplace de plusieurs crans à chaque cycle d'horloge. Mais au-delà de ça, le design de l'unité d'émission change. Avant, elle recevait une micro-opération sur son entrée, et fournissait une micro-opération émise sur une sortie. Et cela vaut aussi bien pour une unité d'émission simple, un ''scoreboard'', une fenêtre d'instruction ou des stations de réservation. Mais avec l'émission multiple, les sorties et entrées sont dupliquées. Pour la double émission, il y a deux entrées vu qu'elle doit recevoir deux micro-opération décodées/renommées, et deux sorties pour émettre deux micro-opérations. Formellement, il est possible de faire une analogie avec une mémoire : l'unité d'émission dispose de ports d'écriture et de lecture. On envoie des micro-opérations décodées/renommées sur des ports d'écriture, et elle renvoie des micro-opérations émises sur le port de lecture. Dans ce qui suit, nous parlerons de '''ports de décodage''' et de '''ports d'émission'''. Si l'unité d'émission est un vulgaire ''scoreboard'', il doit détecter les dépendances entre instructions émises simultanément. De plus, il doit détecter les paires d'instructions interdites et les sérialiser. Autant dire que ce n'est pas très pratique. La détection des dépendances entre instructions consécutives est simplifiée avec une fenêtre d'instruction, il n'y a pour ainsi dire pas grand chose à faire, vu que les dépendances sont éliminées par le renommage de registre et que les signaux de réveil s'occupent de gérer les dépendances RAW. C'est la raison pour laquelle les processeurs superscalaires utilisent tous une fenêtre d'instruction centralisée ou décentralisée, et non des ''scoreboard''. Les processeurs superscalaires privilégient souvent des stations de réservations aux fenêtres d'instruction. Rappelons la terminologie utilisée dans ce cours. Les fenêtres d'instruction se contentent de mémoriser la micro-opération à émettre et quelques bits pour la disponibilité des opérandes. Par contre, les stations de réservations mémorisent aussi les opérandes des instructions. Les registres sont lus après émission avec une fenêtre d'instruction, avant avec des stations de réservation. Et cette différence a une influence sur le pipeline du processeur, le banc de registres et tout ce qui s'en suit. La différence principale est liée au banc de registre, et précisément au nombre de ports de lecture. Supposons que toutes les instructions sont dyadiques, ou du moins qu'il n'existe pas de micro-opération à trois opérandes. Avec une fenêtre d'instruction, le nombre d'opérandes à lire simultanément est proportionnel à la quantité d'instructions qu'on peut émettre en même temps. Sur un processeur ''dual issue'', qui peut émettre deux micro-opérations, cela fait deux micro-opérations à deux opérandes chacune, soit 4 opérandes. Le nombre de ports de lecture est donc de quatre. Avec une station de réservation, la lecture des opérandes a lieu avant l'émission, juste après le décodage/renommage. Le nombre d'opérande est le double du nombre de micro-opérations décodées/renommées, pas émises. Si le décodeur peut décoder/renommer 4 instructions par cycle, cela veut dire 4 micro-opérations émises par cycle. Et il se trouve que les deux situations ne sont pas évidentes. Avec une fenêtre d'instruction centralisée, cela ne change rien. Le nombre d'instructions décodées et émises en même temps sont identiques. Mais dès qu'on utilise des fenêtres d'instruction décentralisées, les choses changent. Si le décodeur peut décoder/renommer 4 instructions par cycle, alors l'idéal est d'avoir 4 micro-opérations émises par cycle, ''par fenêtre d'instruction''. Imaginez que le décodeur décode 4 instructions entières : la fenêtre d'instruction entière doit pouvoir émettre 4 micro-opérations entières en même temps. Idem pour des instructions flottantes avec la fenêtre d'instruction flottantes. Vu qu'il y a deux fenêtres d'instruction, cela fait 4 micro-opérations entières + 4 micro-opérations flottantes = 8 ports de lecture. Non pas qu'ils soient tous simultanément utiles, mais il faut les câbler. Les fenêtres d'instruction impliquent plus de lectures d'opérandes, ce qui implique plus de ports de lecture. Les stations de réservation sont plus économes, elles vont bien avec un nombre modéré de ports de lecture. ===Les conséquences sur le banc de registre=== Émettre plusieurs instructions en même temps signifie lire ou écrire plusieurs opérandes à la fois : le nombre de ports du banc de registres doit être augmenté. De plus, le banc de registre doit être relié à toutes les unités de calcul en même temps, ce qui fait 2 ports de lecture par unité de calcul. Et avec plusieurs dizaines d'unités de calcul différentes, le câblage est tout simplement ignoble. Et plus un banc de registres a de ports, plus il utilise de circuits, est compliqué à concevoir, consomme de courant et chauffe. Mais diverses optimisations permettent de réduire le nombre de ports assez simplement. Un autre solution utilise un banc de registre unique, mais n'utilise pas autant de ports que le pire des cas le demanderait. Pour cela, le processeur doit détecter quand il n'y a pas assez de ports pour servir toutes les instructions : l'unité d'émission devra alors mettre en attente certaines instructions, le temps que les ports se libèrent. Cette détection est réalisée par un circuit d'arbitrage spécialisé, intégré à l'unité d'émission, l’arbitre du banc de registres (''register file arbiter''). ==Les unités de calcul des processeurs superscalaires== Un processeur superscalaire émet/exécute plusieurs instructions simultanément dans plusieurs unités de calcul séparées. Intuitivement, on se dit qu'il faut dupliquer les unités de calcul à l'identique. Un processeur superscalaire contient alors N unités de calcul identiques, précédées par une fenêtre d'instruction avec N ports d'émission. Un tel processeur peut émettre N micro-opérations, tant qu'elles n'ont pas de dépendances. Manque de chance, ce cas est l'exception. La raison est que les processeurs superscalaires usuels sont conçus à partir d'un processeur à pipeline dynamique normal, qu'ils améliorent pour le rendre superscalaire. Les processeurs avec un pipeline dynamique incorporent plusieurs unités de calcul distinctes, avec une ALU pour les instructions entières, une FPU pour les instructions flottantes, une unité pour les accès mémoire (calcul d'adresse) et éventuellement une unité pour les tests/branchements. Sans superscalarité, ces unités sont toutes reliées au même port d'émission. Avec superscalarité, les unités de calcul existantes sont connectées à des ports d'émission différents. ===La double émission entière-flottante=== En théorie, il est possible d'imaginer un CPU superscalaire sans dupliquer les ALU, en se contenant d'exploiter au mieux les unités de calcul existantes. Prenons le cas d'un processeur avec une ALU entière et une ALU flottante, qu'on veut transformer en processeur superscalaire. L'idée est alors de permettre d'émettre une micro-opération entière en même temps qu'une micro-opération flottante. La micro-opération entière s'exécute dans l'ALU entière, la micro-opération flottante dans la FPU. Il suffit juste d'ajouter un port d'émission dédié sur la FPU. Le processeur a donc deux pipelines séparés : un pour les micro-opérations entières, un autre pour les micro-opérations flottantes. On parle alors de '''double émission entière-flottante'''. L'idée est simple, la mise en œuvre utilise assez peu de circuits pour un gain en performance qui est faible, mais en vaut la peine. La plupart des premiers processeurs superscalaires étaient de ce type. Les exemples les plus notables sont les processeurs POWER 1 et ses dérivés comme le ''RISC Single Chip''. Ils sont assez anciens et avaient un budget en transistors limité, ce qui fait qu'ils devaient se débrouiller avec peu de circuits dont ils disposaient. L'usage d'une double émission entière-flottante était assez naturelle. [[File:Double émission entière-flottante.png|centre|vignette|upright=2|Double émission entière-flottante]] Cependant, la méthode a un léger défaut. Une instruction flottante peut parfois lever une exception, par exemple en cas de division par zéro, ou pour certains calculs précis. Si une exception est levée, alors l'instruction flottante est annulée, de même que toutes les instructions qui suivent. Ce n'est pas un problème si le processeur gère nativement les exceptions précises, par exemple avec un tampon de ré-ordonnancement. Et c'est le cas pour la totalité des processeurs à exécution dans le désordre. Mais sur les processeurs à exécution dans l'ordre, si le budget en transistors est limité, les techniques de ce genre sont absentes. En théorie, sans tampon de ré-ordonnancement ou équivalent, on ne peut pas émettre d'instruction flottante en même temps qu'une instruction entière à cause de ce problème d'exceptions flottantes. Le problème s'est manifesté sur les processeurs Atom d'Intel, et les concepteurs du processeur ont trouvé une parade. L'idée est de tester les opérandes flottantes, pour détecter les combinaisons d'opérandes à problème, dont l'addition/multiplication peut lever une exception. Si des opérandes à problème sont détectées, on stoppe l'émission de nouvelles instructions en parallèle de l'instruction flottante et l'unité d'émission émet des bulles de pipeline tant que l'instruction flottante est en cours. Sinon, l'émission multiple fonctionne normalement. La technique, appelée ''Safe Instruction Recognition'' par Intel, est décrite dans le brevet US00525721.6A. Il faut noter que la double émission entière-flottante peut aussi être adaptée aux accès mémoire. En théorie, les accès mémoire sont pris en charge par le pipeline pour les opérations entières. L'avantage est que l'on peut alors utiliser l'unité de calcul pour calculer des adresses. Mais il est aussi possible de relier l'unité mémoire à son propre port d'émission. Le processeur devient alors capable d’émettre une micro-opération entière, une micro-opération flottante, et une micro-opération mémoire. On parle alors de '''triple émission entière-flottante-mémoire'''. La seule contrainte est que l'unité mémoire incorpore une unité de calcul d'adresse dédiée. ===L'émission multiple des micro-opérations flottantes=== La double émission entière-flottante ajoute un port d'émission pour la FPU, ce qui a un cout en circuits modeste, pour un gain en performance intéressant. Mais il faut savoir que les FPU regroupent un additionneur-soustracteur flottant et un multiplieur flottant, qui sont reliés au même port d'émission. Et il est possible d'ajouter des ports d'émission séparés pour l'additionneur flottant et le multiplieur flottant. Le processeur peut alors émettre une addition flottante en même temps qu'une multiplication flottante. Les autres circuits de calcul flottant sont répartis sur ces deux ports d'émission flottants. L'avantage est que cela se marie bien avec l'usage d'une fenêtre d'instruction séparée pour les opérations flottantes. La fenêtre d'instruction a alors deux ports séparés, au lieu d'un seul. Rajouter un second port d'émission flottant n'est pas trop un problème, car le cout lié à l'ajout d'un port n'est pas linéaire. Passer de un port à deux a un cout tolérable, bien plus que de passer de 3 ports à 4 ou de 4 à 5. Il est même possible de dupliquer l'additionneur et le multiplieur flottant, ce qui permet d'émettre deux additions et multiplications flottantes en même temps. C'est ce qui est fait sur les processeur AMD de architecture Zen 1 et 2. Ils ont deux additionneurs flottants par cœur, deux multiplieurs flottants, chacun avec leur propre port d'émission. Les performances en calcul flottant sont assez impressionnantes pour un processeur de l'époque. [[File:ZEN - émission multiple flottante.png|centre|vignette|upright=2.5|Microarchitecture Zen 1 d'AMD.]] ===L'émission multiple des micro-opérations entières=== Nous avons vu plus haut qu'il est possible d'ajouter plusieurs ports d'émission pour la FPU. Intuitivement, on se dit que la méthode peut aussi être appliquée pour émettre plusieurs micro-opérations entières en même temps. En effet, un processeur contient généralement plusieurs unités de calcul entières séparées, avec typiquement une ALU entière simple, un circuit multiplieur/diviseur, un ''barrel shifter'', une unité de manipulation de bit. Les 5 unités permettent d'émettre 4 micro-opérations entières en même temps, à condition qu'on ajoute assez de ports d'émission. [[File:Emission multiple des opérations entières, implémentation naive.png|centre|vignette|upright=2|Émission multiple des opérations entières, implémentation naïve.]] Maintenant, posons-nous la question : est-ce que faire ainsi en vaut la peine ? Le processeur peut en théorie émettre une addition, une multiplication, un décalage et une opération de manipulation de bits en même temps. Mais une telle situation est rare. En conséquence, les ports d'émission seront sous-utilisés, sous celui pour l'ALU entière. Pour réduire le nombre de ports d'émission sous-utilisés, il est possible de regrouper plusieurs unités de calcul sur le même port d'émission. Typiquement, il y a un port d'émission pour le multiplieur et un autre port d'émission pour le reste. L'avantage est que cela permet d'exécuter des micro-opérations entières en parallèle d'une multiplication. Mais on ne peut pas émettre/exécuter en parallèle des instructions simples. Il n'est pas exemple pas possible de faire un décalage en même temps qu'une addition. Le cout en performance est le prix à payer pour la réduction du nombre de ports d'émission, et il est assez faible. : Je dis exécuter/émettre, car ces instructions s'exécutent en un cycle. Si elles ne sont pas émises en même temps, elles ne s'exécutent pas en même temps. [[File:Emission multiple des opérations entières, double émission.png|centre|vignette|upright=2|Émission multiple des opérations entières, double émission]] Typiquement, la plupart des programmes sont majoritairement remplis d'additions, avec des multiplications assez rares et des décalages qui le sont encore plus. En pratique, il n'est pas rare d'avoir une multiplication pour 4/5 additions. Si on veut profiter au maximum de l'émission multiple, il faut pouvoir émettre plusieurs additions/soustractions en même temps, ce qui demande de dupliquer les ALU simples et leur donner chacune son propre port d'émission. : Le multiplieur n'est presque jamais dupliqué, car il est rare d'avoir plusieurs multiplications consécutives. Disposer de plusieurs circuits multiplieurs serait donc un cout en circuits qui ne servirait que rarement et n'en vaut pas la chandelle. Pour économiser des ports d'émission, les ALU entières dupliquées sont reliées à des ports d'émission existants. Par exemple, on peut ajouter la seconde ALU entière au port d'émission du multiplieur, la troisième ALU entière au port dédié au ''barrel shifter'', etc. Ainsi, les ports d'émission sont mieux utilisés : il est rare qu'on n'ait pas d'instruction à émettre sur un port. Le résultat est un gain en performance bien plus important qu'avec les techniques précédentes, pour un cout en transistor mineur. [[File:Emission multiple des opérations entières, implémentation courante.png|centre|vignette|upright=2|Emission multiple des opérations entières, implémentation courante]] ===L'émission multiple des accès mémoire=== Après avoir vu l'émission multiple pour les opérations flottantes et etnières, il est temps de voir l''''émission multiple des accès mémoire'''. ! Il est en effet possible d'émettre plusieurs micro-opérations mémoire en même temps. Les processeurs superscalaires modernes sont capables d'émettre plusieurs lectures/écritures simultanément. Par exemple, ils peuvent émettre une lecture en même temps qu'une écriture, ou plusieurs lectures, ou plusieurs écritures. Il faut noter que selon le processeur, il peut y avoir des restrictions quant aux accès mémoire émis en même temps. Par exemple, certains processeurs peuvent émettre une lecture avec une écriture en même temps, mais pas deux lectures ni deux écritures. Ou encore, ils peuvent émettre deux lectures, une lecture et une écriture, mais pas deux écritures en même temps. Dans la majorité des cas, les processeurs ne permettent pas d'émettre deux écritures en même temps, alors qu'ils supportent plusieurs lectures. Il faut dire que les lectures sont plus fréquentes que les écritures. Les processeurs qui autorisent toutes les combinaisons de lecture/écriture possibles, sont rares. L'émission multiple des accès mémoire demande évidemment de dupliquer des circuits, mais pas l'unité mémoirecomplète. Pour rappel, l'unité mémoire s'interpose entre le cache et le reste du pipeline. Elle est composée d'une unité de calcul d'adresse, des ports de lecture/écriture du cache de données, et éventuellement d'une structure qui remet en ordre les accès mémoire (une ''Load-store queue''). Émettre plusieurs micro-opérations mémoire demande d'avoir plusieurs unités de calcul, une par micro-opération mémoire émise par cycle. Si le processeur peut émettre trois micro-opérations mémoire à la fois, il y aura besoin de trois unités de calcul d'adresse. Chaque unité de calcul d'adresse est reliée à un port d'émission mémoire. Par contre, la structure qui remet les accès mémoire en ordre n'est pas dupliquée. Les processeurs avec une ''Load-store queue'' ne la dupliquent pas. Par contre, elle est rendue multi-ports afin de gérer plusieurs micro-opérations mémoire simultanés. Les processeurs avec juste une ''Store Queue' et une ''Load Queue'' font différemment. : Dans ce qui suit, nous parlerons d'AGU (''Adress Generation Unit'')poour désigner les unités de calcul d'adresse. Un exemple est celui des processeurs Intel de microarchitecture Nehalem, qui pouvaient seulement émettre une lecture en même temps qu'une écriture. Ils avaient trois ports d'émission reliés à l'unité mémoire. Un port pour les lectures, deux pour les écritures. Le premier port d'écriture recevait la donnée à écrire dans le cache, le second s'occupait des calculs d'adresse, Le port de lecture faisait uniquement des calculs d'adresse. Comme autre exemple, les processeurs skylake ont une LSQ avec deux ports de lecture et d'un port d'écriture, ce qui permet de faire deux lectures en même temps qu'une écriture. Les processeurs AMD K6 sont similaires, avec un port d'émission pour les lectures et un autre pour les écritures. Le port de lecture alimente une unité de calcul d'adresse dédiée, directement reliée au cache. Le port d'écriture du cache alimente une unité de calcul, qui est suivie par une ''Store Queue'', une version simplifiée de la LSQ dédiée aux écritures. Le processeur exécutait les lectures dès qu'elles avaient leurs opérandes de disponibles, seules les écritures étaient mises en attente. D'autres processeurs ont plusieurs ports d'émission pour les unités mémoire, mais qui peuvent faire indifféremment lecture comme écritures. Un exemple est celui du processeur Athlon 64, un processeur AMD sorti dans les années 2000. Il disposait d'une LSQ unique, reliée à un cache L1 de donnée double port. La LSQ était reliée à trois unités de calcul séparées de la LSQ. La LSQ avait des connexions avec les registres, pour gérer les lectures/écritures. [[File:Athlon.png|centre|vignette|upright=2.5|Athlon]] ===L'interaction avec les fenêtres d'instruction=== Nous venons de voir qu'un processeur superscalaire peut avoir des ports d'émission reliés à plusieurs ALU. Pour le moment, nous avons vu le cas où le processeur dispose de fenêtres d'instruction séparées pour les opérations entières et flottantes. Un port d'émission est donc relié soit à des ALU entières, soit à des FPU. Mais il existe des processeurs où un même port d'émission alimente à la fois une ALU entière et une FPU. Par exemple, on peut relier un additionneur flottant sur le même port qu'une ALU entière. Il faut noter que cela implique une fenêtre d'instruction centralisée, capable de mettre en attente micro-opérations entières et flottantes. Un exemple est celui des processeurs Core 2 Duo. Ils disposent de 6 ports d'émission, dont 3 ports dédiés à l'unité mémoire. Les 3 ports restants alimentent chacun une ALU entière, un circuit de calcul flottant et une unité de calcul SSE (une unité de calcul SIMD, qu'on abordera dans quelques chapitres). Le premier port alimente une ALU entière simple et un multiplieur/diviseur flottant. Le second alimente une ALU entière, un multiplieur entier et un additionneur flottant. Le troisième alimente une ALU entière, sans circuit flottant dédié. [[File:Intel Core2 arch.svg|centre|vignette|upright=2.5|Intel Core 2 Duo - microarchitecture.]] Une conséquence de partager les ports d'émission est l'apparition de dépendances structurelles. Par exemple, imaginez qu'on connecte un multiplieur entier et la FPU, sur le même port d'émission. Il est alors impossible d'émettre une multiplication et une opération flottante en même temps. Mais la situation ne se présente que pour certaines combinaisons de micro-opérations bien précises, qui sont idéalement assez rares. De telles dépendances structurelles n'apparaissent que sur des programmes qui entremêlent instructions flottantes et entières, ce qui est assez rare. Les dépendances structurelles doivent cependant être prises en compte par les unités d'émission. Dans le même genre, il est possible de partager un port d'émission entre l'unité mémoire et une ALU entière. Cela permet d'utiliser l'ALU entière pour les calculs d'adresse, ce qui évite d'avoir à utiliser une unité de calcul d'adresse distincte. Un exemple est celui du processeur superscalaire double émission Power PC 440. Il dispose de deux ports d'émission. Le premier est connecté à une ALU entière et un circuit multiplieur, le second est relié à l'unité mémoire et une seconde ALU entière. L'organisation en question permet soit d'émettre un accès mémoire en même temps qu'une opération entière, soit d'émettre deux opérations entières simples, soit d’émettre une multiplication et une addition/soustraction/comparaison. Une organisation simple, mais très efficace ! [[File:PowerPC 440.png|centre|vignette|upright=2|Microarchitecture du PowerPC 440.]] ===Résumé=== Faisons un résumé rapide de cette section. Nous venons de voir que les différentes unités de calcul sont reliés à des ports d'émission, la répartition des ALU sur les ports d'émission étant très variable d'un processeur à l'autre. Entre les processeurs qui séparent les ports d'émission entier et flottant, ceux qui les mélangent, ceux qui séparent les ports d'émission mémoire des ports entiers et ceux qui les fusionnent, ceux qui autorisent l'émission multiple des micro-opérations mémoire ou flottante, il y a beaucoup de choix. Les divers choix possibles sont tous des compromis entre deux forces : réduire le nombre de ports d'émission d'un côté, garder de bonnes performances en limitant les dépendances structurelles de l'autre. Réduire le nombre de ports d'émission permet de garder des fenêtres d'instruction relativement simples. Plus elles ont de ports, plus elles consomment d'énergie, chauffent, sont lentes, et j'en passe. De plus, plus on émet de micro-opérations en même temps, plus la logique de détection des dépendances bouffe du circuit. Et cela a des conséquences sur la fréquence du processeur : à quoi bon augmenter le nombre de ports d'émission si c'est pour que ce soit compensé par une fréquence plus faible ? Par contre, regrouper plusieurs ALU sur un même port d'émission est à l'origine de dépendances structurelles. Impossible d'émettre deux micro-opérations sur deux ALU si elles sont sur le même port. Le nombre de ports peut être un facteur limitant pour la performance dans certaines situations de '''''port contention''''' où on a assez d'ALU pour exécuter N micro-opérations, mais où la répartition des ALUs sur les ports l’empêche. Suivant la répartition des ALU sur les ports, la perte de performance peut être légère ou importante, tout dépend des choix réalisés. Et les choix en question dépendent fortement de la répartition des instructions dans le programme exécuté. Le fait que certaines instructions sont plus fréquentes que d'autres, que certaines instructions sont rarement consécutives : tout cela guide ce choix de répartition des ALu sur les ports. ==Le contournement sur les processeurs superscalaires== Pour rappel, la technique du contournement (''register bypass'') permet au résultat d'une instruction d'être immédiatement utilisable en sortie de l'ALU, avant même d'être enregistré dans les registres. Implémenter la technique du contournement demande d'utiliser des multiplexeurs pour relier la sortie de l'unité de calcul sur son entrée si besoin. il faut aussi des comparateurs pour détecter des dépendances de données. [[File:Pipeline Bypass.png|centre|vignette|upright=1|Pipeline Bypass]] ===Les problèmes du contournement sur les CPU avec beaucoup d'ALUs=== Avec plusieurs unités de calcul, la sortie de chaque ALU doit être reliée aux entrées de toutes les autres, avec les comparateurs qui vont avec ! Sur les processeurs ayant plusieurs d'unités de calculs, cela demande beaucoup de circuits. Pour N unités de calcul, cela demande 2 * N² interconnexions, implémentées avec 2N multiplexeurs de N entrées chacun. Si c'est faisable pour 2 ou 3 ALUs, la solution est impraticable sur les processeurs modernes, qui ont facilement une dizaine d'unité de calcul. De plus, la complexité du réseau de contournement (l'ensemble des interconnexions entre ALU) a un cout en terme de rapidité du processeur. Plus il est complexe, plus les données contournées traversent de longs fils, plus leur temps de trajet est long, plus la fréquence du processeur en prend un coup. Diverses techniques permettent de limiter la casse, comme l'usage d'un bus de contournement, mais elle est assez impraticable avec beaucoup d'unités de calcul. Notez que cela vaut pour les processeurs superscalaires, mais aussi pour tout processeur avec beaucoup d'unités de calcul. Un simple CPU à exécution dans le désordre, non-superscalaire, a souvent pas mal d'unités de calcul et fait face au même problème. En théorie, un processeur sans exécution dans le désordre ou superscalarité pourrait avoir le problème. Mais en pratique, avoir une dizaine d'ALU implique processeur superscalaire à exécution dans le désordre. D'où le fait qu'on parle du problème maintenant. La seule solution praticable est de ne pas relier toutes les unités de calcul ensemble. À la place, on préfère regrouper les unités de calcul dans différents '''agglomérats''' ('''cluster'''). Le contournement est alors possible entre les unités d'un même agglomérat, mais pas entre agglomérats différents. Généralement, cela arrive pour les unités de calcul entières, mais pas pour les unités flottantes. La raison est que les CPU ont souvent beaucoup d'unités de calcul entières, car les instructions entières sont légion, alors que les instructions flottantes sont plus rares et demandent au mieux une FPU simple. Évidemment, l'usage d'agglomérats fait que certaines possibilités de contournement sont perdues, avec la perte de performance qui va avec. Mais la perte en possibilités de contournement vaut bien le gain en fréquence et le cout en circuit/fils réduit. C'est un bon compromis, ce qui explique que presque tous les processeurs modernes l'utilisent. Les rares exceptions sont les processeurs POWER 4 et POWER 5, qui ont préféré se passer de contournement pour garder un processeur très simple et une fréquence élevée. ===Les bancs de registre sont aussi adaptés pour le contournement=== L'usage d'agglomérats peut aussi prendre en compte les interconnections entre unités de calcul et registres. C'est-à-dire que les registres peuvent être agglomérés. Et cela peut se faire de plusieurs façons différentes. Une première solution, déjà vue dans les chapitres sur la micro-architecture d'un processeur, consiste à découper le banc de registres en plusieurs bancs de registres plus petits. Il faut juste prévoir un réseau d'interconnexions pour échanger des données entre bancs de registres. Dans la plupart des cas, cette séparation est invisible du point de vue de l'assembleur et du langage machine. Le processeur se charge de transférer les données entre bancs de registres suivant les besoins. Sur d'autres processeurs, les transferts de données se font via une instruction spéciale, souvent appelée ''COPY''. [[File:Banc de registres distribué.png|centre|vignette|upright=2|Banc de registres distribué.]] Sur de certains processeurs, un branchement est exécuté par une unité de calcul spécialisée. Or les registres à lire pour déterminer l'adresse de destination du branchement ne sont pas forcément dans le même agglomérat que cette unité de calcul. Pour éviter cela, certains processeurs disposent d'une unité de calcul des branchements dans chaque agglomérat. Dans les cas où plusieurs unités veulent modifier le ''program counter'' en même temps, un système de contrôle général décide quelle unité a la priorité sur les autres. Mais d'autres processeurs fonctionnent autrement : seul un agglomérat possède une unité de branchement, qui peut recevoir des résultats de tests de toutes les autres unités de calcul, quel que soit l’agglomérat. Une autre solution duplique le banc de registres en plusieurs exemplaires qui contiennent exactement les mêmes données, mais avec moins de ports de lecture/écriture. Un exemple est celui des processeurs POWER, Alpha 21264 et Alpha 21464. Sur ces processeurs, le banc de registre est dupliqué en plusieurs exemplaires, qui contiennent exactement les mêmes données. Les lectures en RAM et les résultats des opérations sont envoyées à tous les bancs de registres, afin de garantir que leur contenu est identique. Le banc de registre est dupliqué en autant d'exemplaires qu'il y a d'agglomérats. Chaque exemplaire a exactement deux ports de lecture, une par opérande, au lieu de plusieurs dizaines. La conception du processeur est simplifiée, que ce soit au niveau du câblage, que de la conception des bancs de registres. ==Les optimisations de la pile d'appel : le ''stack engine''== Les processeurs modernes intègrent une optimisation liée au pointeur de pile. Pour rappel, sur les architectures modernes, le pointeur de pile est un registre utilisé pour gérer la pile d'appel, précisément pour savoir où se trouve le sommet de la pile. Il est manipulé par les instructions CALL, RET, PUSH et POP, mais aussi par les instructions d'addition/soustraction pour gérer des cadres de pile de taille variable. De plus, il peut servir d'opérande pour des instructions LOAD/STORE, afin de lire/écrire des variables locales, les arguments d'une fonction, et autres. C'est donc un registre général adressable, intégré au banc de registre, altéré par l'unité de calcul entière. L'incrémentation/décrémentation du pointeur de pile passe donc par l'unité de calcul, lors des instructions CALL, RET, PUSH et POP. Mais, l'optimisation que nous allons voir permet d'incrémenter/décrémenter le pointeur de pile sans passer par l'ALU, ou presque. L'idée est de s'inspirer des architectures avec une pile d'adresse de retour, qui intègrent le pointeur de pile dans le séquenceur et l'incrémentent avec un incrémenteur dédié. ===Le ''stack engine''=== L'optimisation que nous allons voir utilise un '''''stack engine''''' intégré à l'unité de contrôle, au séquenceur. Le processeur contient toujours un pointeur de pile dans le banc de registre, cela ne change pas. Par contre, il n'est pas incrémenté/décrémenté à chaque instruction CALL, RET, PUSH, POP. Un compteur intégré au séquenceur est incrémenté à la place, nous l’appellerons le '''compteur delta'''. La vraie valeur du pointeur de pile s'obtient en additionnant le compteur delta avec le registre dans le banc de registre. Précisons que si le compteur delta vaut zéro, la vraie valeur est dans le banc de registre et peut s'utiliser telle quelle. Lorsqu'une instruction ADD/SUB/LOAD/STORE utilise le pointeur de pile comme opérande, elle a besoin de la vraie valeur. Si elle n'est pas dans le banc de registre, le séquenceur déclenche l'addition compteur-registre pour calculer la vraie valeur. Finalement, le banc de registre contient alors la bonne valeur et l'instruction peut s'exécuter sans encombre. L'idée est que le pointeur de pile est généralement altéré par une série d'instruction PUSH/POP consécutives, puis des instructions LOAD/STORE/ADD/SUB utilisent le pointeur de pile final comme opérande. En clair, une bonne partie des incrémentations/décrémentation est accumulée dans le compteur delta, puis la vraie valeur est calculée une fois pour toutes et est utilisée comme opérande. On accumule un delta dans le compteur delta, et ce compteur delta est additionné quand nécessaire. Précisons que le compteur delta est placé juste après le décodeur d'instruction, avant même le cache de micro-opération, l'unité de renommage et l'unité d'émission. Ainsi, les incrémentations/décrémentations du pointeur de pile disparaissent dès l'unité de décodage. Elles ne prennent pas de place dans le cache de micro-opération, ni dans la fenêtre d'instruction, ni dans la suite du pipeline. De nombreuses ressources sont économisées dans le ''front-end''. Mais utiliser un ''stack engine'' a aussi de nombreux avantages au niveau du chemin de données/''back-end''. Déjà, sur les processeurs à exécution dans le désordre, cela libère une unité de calcul qui peut être utilisée pour faire d'autres calculs. Ensuite, le compteur delta mémorise un delta assez court, de 8 bits sur le processeur Pentium M, un peu plus pour les suivants. L'incrémentation se fait donc via un incrémenteur 8 bits, pas une grosse ALU 32/64 bits. Il y a un gain en termes de consommation d'énergie, un incrémenteur 8 bits étant moins gourmand qu'une grosse ALU 32/64 bits. ===Les points de synchronisation du delta=== La technique ne fonctionne que si la vraie valeur du pointeur de pile est calculée au bon moment, avant chaque utilisation pertinente. Il y a donc des '''points de synchronisation''' qui forcent le calcul de la vraie valeur. Plus haut, nous avions dit que c'était à chaque fois qu'une instruction adresse le pointeur de pile explicitement, qui l'utilise comme opérande. Les instructions CALL, RET, PUSH et POP ne sont pas concernées par elles utilisent le pointeur de pile de manière implicite et ne font que l'incrémenter/décrémenter. Mais dans les faits, c'est plus compliqué. D'autres situations peuvent forcer une synchronisation, notamment un débordement du compteur delta. Le compteur delta est généralement un compteur de 8 bits, ce qui fait qu'il peut déborder. En cas de débordement du compteur, le séquenceur déclenche le calcul de la vraie valeur, puis réinitialise le compteur delta. La vraie valeur est donc calculée en avance dans ce cas précis. Précisons qu'un compteur delta de 8 bits permet de gérer environ 30 instructions PUSH/POP consécutives, ce qui rend les débordements de compteur delta assez peu fréquent. A noter que si le compteur delta vaut zéro, il n'y a pas besoin de calculer la vraie valeur, le séquenceur prend cette situation en compte. Un autre point de synchronisation est celui des interruptions et exceptions matérielles. Il faut que le compteur delta soit sauvegardé lors d'une interruption et restauré quand elle se termine. Idem lors d'une commutation de contexte, quand on passe d'un programme à un autre. Pour cela, le processeur peut déclencher le calcul de la vraie valeur lors d'une interruption, avant de sauvegarder les registres. Pour cela, le processeur intègre un mécanisme de sauvegarde automatique, qui mémorise la valeur de ce compteur dans le tampon de réordonnancement, pour forcer le calcul de la vraie valeur en cas de problème. La technique du ''stack engine'' est apparue sur les processeurs Pentium M d'Intel et les processeurs K10 d'AMD, et a été conservée sur tous les modèles ultérieurs. L'implémentation est cependant différente selon les processeurs, bien qu'on n'en connaisse pas les détails et que l'on doive se contenter des résultats de micro-benchmarks et des détails fournit par Intel et AMD. Selon certaines sources, dont les manuels d'optimisation d'Agner Fog, les processeurs AMD auraient moins de points de synchronisation que les processeurs Intel. De plus, leur ''stack engine'' serait placé plus loin que prévu dans le pipeline, après la file de micro-opération. ==Un étude des microarchitectures superscalaires x86 d'Intel== Après avoir vu beaucoup de théorie, voyons maintenant comment les microarchitectures Intel et AMD ont implémenté l'exécution superscalaire. Nous allons nous concentrer sur les processeurs Intel pour une raison simple : il y a plus de schémas disponibles sur wikicommons, ce qui me facilite le travail. ===Les processeurs Atom d'Intel, de microarchitecture Bonnell=== Les processeurs Atom sont des processeurs basse consommation produits et conçus par Intel. Il regroupent des processeurs de microarchitecture très différentes. La toute première microarchitecture ATOM était la microarchitecture Bonnell, qui est de loin la plus simple à étudier. Il s'agissait de processeurs sans exécution dans le désordre, sans renommage de registres. De nos jours, de tels processeurs ont disparus, même pour les processeurs basse consommation, mais les premiers processeurs Atom étaient dans ce cas. Mais le processeur était superscalaire et pouvait émettre deux instructions simultanées. Son pipeline faisait 16 étages, ce qui est beaucoup. L'architecture est assez simple. Premièrement, le cache d'instruction permet de lire 8 octets par cycle, qui sont placés dans une file d'instruction. La file d'instruction est alors reliée à deux décodeurs, ce qui permet de décoder deux instructions en même temps. Le fait que les décodeurs lisent les instructions depuis une file d'instruction fait que les deux instructions décodées ne sont pas forcément consécutives en mémoire RAM. Par exemple, l'Atom peut décoder un branchement prédit comme pris, suivi par l'instruction de destination du branchement. Les deux instructions ont été chargées dans la file d'instruction et sont consécutifs dedans, alors qu'elles ne sont pas consécutives en mémoire RAM. Les deux décodeurs alimentent une file de micro-opérations de petite taille : 32 µops maximum, 16 par ''thread'' si le ''multithreading'' matériel est activé. La majorité des instructions x86 sont décodées en une seule micro-opération, y compris les instructions ''load-up''. Le chemin de données est conçu pour exécuter les instruction ''load-up'' nativement, en une seule micro-opération. Le microcode n'est utilisé que pour une extrême minorité d'instructions et est à part des deux décodeurs précédents. L'avantage est que cela permet d'utiliser au mieux la file de micro-opération, qui est de petite taille. La file de micro-opérations est suivie par deux ports d'exécution, avec chacun leur logique d'émission. Les deux ports peuvent émettre au maximum 2 µops par cycle. Le résultat est que deux instructions consécutives peuvent s'exécuter, chacune dans deux avals séparés, dans deux pipelines différents. Les conditions pour cela sont cependant drastiques. Les deux instructions ne doivent pas avoir de dépendances de registres, à quelques exceptions près liées au registre d'état. Le multithreading matériel doit aussi être désactivé. Les deux instructions doivent aller chacun dans un port différent, et cela tient en compte du fait que les deux ports sont reliés à des unités de calcul fort différentes. Le tout est illustré ci-dessous. [[File:Intel Atom Microarchitecture.png|centre|vignette|upright=2.5|Intel Atom Microarchitecture]] Les deux ports sont capables de faire des additions/soustractions, des opérations bit à bit et des copies entre registres. Pour cela, ils ont chacun une ALU simple dédiée. Mais cela s'arrête là. Le second port est optimisé pour les opérations de type ''load-up''. Il contient toute la machinerie pour faire les accès mémoire, notamment des unités de calcul d'adresse et un cache L1 de données. A la suite du cache, se trouvent une ALU entière simple, un ''barrel shifter'', et un circuit multiplieur/diviseur. Le circuit multiplieur/diviseur est utilisé à la fois pour les opérations flottantes et entières. Le premier port permet d’exécuter des opérations entières simples, une addition flottante, des comparaisons/branchements, ou une instruction de calcul d'adresse LEA. Comme on le voit, la séparation entre les deux pipelines est assez complexe. Il ne s'agit pas du cas simple avec un pipeline entier et un pipeline flottant séparés. En réalité, il y a deux pipelines, chacun capables de faire des opérations entières et flottantes, mais pas les mêmes opérations. Et cette organisation difficile à comprendre est en réalité très efficace, très économe en circuit, tout en gardant une performance intéressante. Les instructions simples, ADD/SUB/bitwise sont supportées dans les deux pipelines. Il faut dire que ce sont des opérations courantes qu'il vaut mieux optimiser au mieux. Les opérations plus complexes, à savoir les multiplications/divisions/décalages/rotations/manipulations de bit sont supportées dans un seul pipeline. La raison est qu'il est rare que de telles opérations soient consécutives, et qu'il n'est donc pas utile d'optimiser pour cette situation. Si les deux pipelines devaient supporter ces opérations, cela demanderait de dupliquer les circuits multiplieurs/diviseur, ce qui aurait un cout en circuit important pour un gain en performance assez faible. ===Le Pentium 1/MMX et les pipelines U/V=== Le processeur Pentium d'Intel avait un pipeline de 5 étages : un étage de chargement/prédiction de branchement, deux étages de décodage, un étage d'exécution et un dernier étage pour l'écriture dans les registres. Chose étonnante pour un processeur superscalaire, il n'utilisait pas de renommage de registre ni d’exécution dans le désordre. Vous avez bien lu : la superscalarité est apparue dans les processeurs commerciaux avant l'exécution dans le désordre. Le Pentium 1 était un processeur à double émission, qui disposait de deux pipelines nommés U et V. On pouvait en tirer parti lorsque deux instructions consécutives pouvaient être exécutées en parallèles, si elles n'avaient pas de dépendances. Chose peu courante, les deux pipelines n'étaient pas identiques. Le pipeline U pouvait exécuter toutes les instructions, mais le pipeline V était beaucoup plus limité. Par exemple, seul le pipeline U peut faire des calculs flottants, le pipeline V ne fait que des calculs entiers et des branchements. L'unité flottante était sur le port d'émission du pipeline U, idem pour l'unité de calcul vectoriel MMX sur le Pentium MMX. Les deux pipelines disposaient d'une unité de calcul entière identiques dans les deux pipelines. Le pipeline U incorporait un circuit multiplieur/diviseur et un ''barrel shifter'' pour les décalages/rotations. Les deux pipelines avaient chacun uen unité de calcul d'adresse, mais elle n'étaient pas identique : celle du pipeline V ne gérait que l’instruction LEA, celle du pipeline U gérait tous les calculs d'adresse. La FPU était dans le pipeline U, de même que l'unité MMX. {|class="wikitable" |- ! Pipeline U ! Pipeline V |- | colspan="2" | ALU simple (une par pipeline) |- | Multiplieur/diviseur | |- | ''Barrel Shifter'' | |- | AGU complexe | AGU simple (opération LEA) |- | FPU | |- | Unité SIMD | |} Les deux ALU géraient les opérations bit à bit, les additions et soustractions, et les comparaisons (qui sont des soustractions déguisées). En conséquence, les instructions suivantes étaient exécutables dans les deux pipelines, ce qui fait qu'on pouvait en faire deux en même temps : * l'instruction MOV, dépend du mode d'adressage ; * les instructions de gestion de la pile PUSH et POP, dépend du mode d'adressage ; * Les instructions arithmétiques INC, DEC, ADD, SUB ; * l'instruction de comparaison CMP ; * les instructions bit à bit AND, OR, XOR ; * l'instruction de calcul d'adresse LEA ; * l'instruction NOP, qui ne fait rien. Les instructions suivantes sont exécutables seulement dans le pipeline U : les calculs d'adresse autres que LEA, les décalages et rotations, la multiplication et la division, les opérations flottantes. Il faut noter qu'il y a cependant quelques restrictions. Par exemple, si le pipeline U exécute une multiplication ou une division, le processeur ne peut pas exécuter une opération dans le pipeline V en parallèle. Dans le même genre, les branchements sont exécutables dans les deux pipelines, mais on ne peut exécuter une autre opération en parallèle qu'à la condition que le branchement soit exécuté dans le pipeline V. [[File:Intel Pentium arch.svg|centre|vignette|upright=2.5|Microarchitecture de l'Intel Pentium MMX. On voit que certaines unités de calcul sont dupliquées.]] ===La microarchitecture P6 du Pentium 2/3=== La microachitecture suivante, nommée P6, était une microarchitecture plus élaborée. Le pipeline faisait 12 étages, dont seuls les trois derniers correspondent au chemin de données. Il s'agissait du premier processeur à exécution dans le désordre de la marque, avec une implémentation basée sur des stations de réservation. Il gérait aussi le renommage de registre, avec un renommage de registre dans le ROB, commandé par une table d'alias. [[File:Intel Pentium Pro Microarchitecture Block Diagram.svg|centre|vignette|upright=2|Intel Pentium Pro Microarchitecture Block Diagram]] Le décodage des instructions x86 était géré par plusieurs décodeurs. Il y avait trois décodeurs : deux décodeurs simples, et un décodeur complexe. Les décodeurs simples décodaient les instructions les plus fréquentes, mais aussi les plus simples. Les instructions CISC complexes étaient gérées uniquement par le décodeur complexe, basé sur un microcode. Le processeur était à doubvle émission, du fait que les deux décodeurs simples faisaient le gros du travail, et passaient la main au décodeur microcodé quand aucune instruction ne leur était attribué. Les stations de réservations étaient regroupées dans une structure centralisée, en sortie de l'unité de renommage. Elles avaient 5 ports d'émission, qui étaient sous-utilisés en pratique. Niveau ALU, on trouve deux ALUs entières, une flottante, une unité pour les instructions SSE et autres, et trois unités pour les accès mémoire (regroupées en une seule unité dans le schéma ci-dessous). Les unités mémoire regroupent une unité de calcul d'adresse pour les lectures, une autre pour les écritures, et une unité pour la gestion des données à écrire. Les unités de calcul d'adresse sont des additionneurs à 4 opérandes, complétement différents des ALU entières. Les ALU entières sont deux unités asymétriques : une ALU simple, et une ALU complexe incorporant un multiplieur. Les deux peuvent exécuter des opérations d'addition, soustraction, comparaison, etc. [[File:P6 func diag.png|centre|vignette|upright=2|P6 func diag]] ===La microarchitecture Netburst du Pentium 4=== La microarchitecture Netburst, utilisée sur le Pentium 4, utilisait un pipeline à 20 étage, augmenté à 32 sur une révision ultérieure. Il a existé quatre révisions de l'architecture : Willamette (180 nm), Northwood (130 nm), Prescott (90 nm) et Cedar Mill (65 nm). Les deux premières avaient un pipeline de 20 étages, les deux suivants avaient 32 étages ! Le grand nombre d'étages permettait d'avoir une fréquence très élevée, mais posait de nombreux problèmes. Vider le pipeline était très long et il fallait une prédiction de branchement au top pour réduire l'impact des mauvaises prédictions. L'unité de prédiction de branchement était une des plus élvoluées pour l'époque. Pour l'époque. Il dispose d'un cache de trace et a été le seul processeur commercial à en utiliser un. Niveau décodeurs, on retrouve le décodeur lent à base de microcode présent sur les anciennes versions, couplé à un décodeur simple. L'unité de renomage utilise une table d'alias. Le renommage de registres se fait avec un banc de registres physiques. Vous pouvez remarquer dans le schéma suivant la présence de deux files de micro-opérations : une pour les accès mémoire, l'autre pour les autres opérations. Il s'agit bel et bien de deux files d'instructions, pas de fenêtres d'instruction ni de stations de réservation. Niveau ports d'émission, il y a quatre ports. Un pour les lectures mémoire, un pour les écriture mémoire, et deux autres qui mélangent FPU et ALUs. Le premier port est relié à une ALU complexe et une FPU spécialisée dans les MOV flottants. Le second port est relié à tout le reste : ALU basique ''barrel shifter'', FPU. Fait amusant, les ALU entières étaient cadencées à une fréquence double de celle du processeur, ce qui fait que les files d'émissionsont aussi censées l'être, de même que les ''scoreboard''. Sauf qu'en réalité, les circuits étaient dupliqués : l'un allait à une fréquence double, l'autre allait à la fréquence normale. [[File:Architettura Pentium 4.png|centre|vignette|upright=3|Microarchitecture du Pentium 4.]] ==Un étude des microarchitectures superscalaires x86 d'AMD== Les architectures AMD ont beaucoup évoluées avec le temps. Dans ce qui va suivre, nous allons les voir dans l'ordre chronologique, en partant de l'architecture K5, pour arriver aux dernières architectures Zen. Nous allons voir que les architectures AMD ont évoluées progressivement, chacune améliorant la précédente en faisant des rajouts ou modifications mineures, à l'exception de quelques grandes cassures dans la continuité où AMD a revu sa copie de fond en comble. L'architecture Bulldozer a été une première cassure, suivie par l'introduction des architectures Zen. Étudier ces architectures demande de voir trois choses séparément : le ''front-end'' qui regroupe l'unité de chargement et les décodeurs, le ''back-end'' qui gère l'exécution dans le désordre et les unités de calcul, et le sous-système mémoire avec les caches et la ''Load Store Queue''. Leur étude sera plus ou moins séparée dans ce qui suit, pour chaque classe d'architecture. ===La première génération de CPU AMD : les architectures K5, K6, K7, K8 et K10=== La première génération de processeurs AMD est celle des architectures K5, K6, K7, K8 et K10. Il n'y a pas de K9, qui a été abandonné en cours de développement. Les processeurs K5 et K6 portent ce nom au niveau commercial. Par contre, les processeurs d'architecture K7 sont aussi connus sous le nom d''''AMD Athlon''', les AMD K8 sont connus sous le nom d''''AMD Athlon 64''', et les architecture K10 sont appelées les '''AMD Phenom'''. Comme le nom l'indique, l'architecture K8 a introduit le 64 bits chez les processeurs AMD. Elles ont une architecture assez similaire pour ce qui est du chargement et des caches. Toutes disposent d'au minimum un cache L1 d'instruction et d'un cache L1 de données. Le K5 n'avait que ces caches, mais un cache L2 a été ajouté avec le K7, puis un L3 avec le K10. L'AMD K5 avait une TLB unique, mais les processeurs suivants avaient une TLB pour le L1 d'instruction et une autre pour le L1 de données. Idem pour le cache L2, avec deux TLB : une pour les données, une pour les instructions. Les caches L1/L2 sont de type exclusifs, à savoir que les données dans le L1 ne sont pas recopiées dans le L2. Le cache L2 est précisément un cache de victime, qui mémorise les données/instructions, évincées des caches L1 lors du remplacement des lignes de cache. L'introduction du cache L2 a entrainé l'ajout de deux TLB de second niveau : une L2 TLB pour les données et une autre pour les instructions. Les architectures K8 et K10 ont ajouté un cache L3, avec un accès indirect à travers l'interface avec le bus. : L'AMD K7 originel, aussi appelée Athlon classique, n'avait pas de cache L2, mais celui-ci était placé sur la carte mère et fonctionnait à une fréquence moitié moindre de celle du CPU. L'Athlon Thunderbird, puis l'Athlon XP, ont intégré le cache L2 dans le processeur. {|class="wikitable" |- ! Architecture AMD ! colspan="5" | Caches |- | rowspan="2" | K5 | L1 instruction || L1 données || colspan="3" | |- | colspan="2" | TLB unique || colspan="3" | |- | colspan="4" | |- | rowspan="2" | K6 | L1 instruction || L1 données || colspan="3" | L2 unifié |- | TLB L1 instruction || TLB L1 données || colspan="3" | |- | colspan="6" | |- | rowspan="2" | K7, K8 | L1 instruction || L1 données || colspan="2" | L2 unifié || |- | TLB L1 instruction || TLB L1 données || TLB L2 instruction || TLB L2 données || |- | colspan="6" | |- | rowspan="2" | K10 | L1 instruction || L1 données || colspan="2" | L2 unifié || L3 |- | TLB L1 instruction || TLB L1 données || TLB L2 instruction || TLB L2 données || |} Fait important, les architectures K5 à K10 utilisent la technique du '''prédécodage''', où les instructions sont partiellement décodées avant d'entrer dans le cache d'instruction. Le prédécodage facilite grandement le travail des décodeurs d'instruction proprement dit. Par contre, le prédécodage prend de la place dans le cache L1 d'instruction, une partie de sa capacité est utilisé pour mémoriser les informations prédécodées. C'est donc un compromis entre taille du cache et taille/rapidité des décodeurs d'instruction. Sur les architectures K5 et K6, le prédécodage précise, pour chaque octet, si c'est le début ou la fin d'une instruction, si c'est un octet d'opcode, en combien de micro-opérations sera décodée l'instruction, etc. A partir de l'AMD K7, le prédécodage reconnait les branchements inconditionnels. Lorsqu'un branchement inconditionnel est pré-décodé, le pré-décodage tient compte du branchement et continue le pré-décodage des instructions à partir de la destination du branchement. Le système de prédécodage est abandonnée à partir de l'architecture Bulldozer, qui suit l'architecture K10. La prédiction de branchement de ces CPU tire partie de ce système de pré-décodage, à savoir que les prédictions de branchement sont partiellement mémorisées dans les lignes de cache du L1 d'instruction. Par exemple, l'AMD K5 se passe de ''Branch Target Buffer'' grâce à cela. Si une ligne de cache contient un branchement, elle mémorise l'adresse de destination de ce branchement, en plus des bits de pré-décodage. Si il y a plusieurs branchements dans une ligne de cache, c'est l'adresse de destination du premier branchement pris dans cette ligne de cache qui est mémoirsée. Un défaut de cette approche est que si le branchement n'est pas dans le L1 d'instruction, aucune prédiction de branchement ne peut être faite et le préchargement ne peut pas fonctionner. C'est une limitation que n'ont pas les BTB découplées du cache L1 : elles peuvent prédire un branchement qui a été évincé dans le L2 ou le L3, tant que l'entrée associée est dans le BTB. Les prédictions peuvent même servir à précharger les instructions utiles. [[File:Comparaison du chargement de l'AMD K5 et K6.png|centre|vignette|upright=2|Comparaison du chargement de l'AMD K5 et K6]] Au niveau du décodage, on trouve de nombreuses différences entre les premières architectures AMD. L'AMD K5 contient 4 décodeurs hybrides, afin de décoder 4 instructions par cycles. Le K5 a quatre décodeurs simples couplés à 4 décodeurs complexes avec chacun un accès au micro-code. Une instruction peut donc passer par a donc deux voies de décodage : un décodage rapide et simple pour les instructions simples, un décodage lent et passant par le microcode pour les instructions complexes. Pour décoder 4 instructions, les deux voies sont dupliquées en 4 exemplaires, ce qui a un cout en circuits non-négligeable. L'AMD K6 utilise moins de décodeurs et ne peut que décoder deux instructions à la fois maximum. Par contre, il fournit en sortie 4 micro-opérations. Il intègre pour cela deux décodeurs simples, un décodeur complexe et un décodeur micro-codé. Un décodeur simple transforme une instruction simple en une ou deux micro-opérations. Il est possible d'utiliser les deux décodeurs simples en même temps, afin de fournir 4 micro-opérations en sortie du décodeur. Les deux autres décodent une instruction complexe en 1 à 4 micro-opérations. Si jamais la ou les deux instructions sont décodées en 1, 2 ou 3 micro-opérations, les micro-opérations manquantes pour atteindre 4 sont remplies par des NOPs. Pour le K7 et au-delà, le processeur dispose de décodeurs séparées pour les instructions micro-codées de celles qui ne le sont pas. Le processeur peut décoder jusqu’à 3 instructions par cycle. Le décodage d'une instruction microcodée ne peut pas se faire en parallèle du décodage non-microcodé. C'est soit le décodeur microcodé qui est utilisé, soit les décodeurs câblés, pas les deux en même temps. Le décodage d'une instruction prend 4 cycles. Les instructions non-microcodées sont décodées en une seule micro-opération, à un détail près : le CPU optimise la prise en charge des instructions ''load-up''. La différence entre le K6 et le K7 s'explique par des optimisations des instructions ''load-up''. Sur le K6, les instructions ''load-up'' sont décodées en deux micro-opération : la lecture en RAM, l'opération proprement dite. Mais sur le K7, une instruction ''load-up'' est décodée en une seule micro-opération. En conséquence, les décodeurs simples sont fortement simplifiés et le décodeur complexe disparait au profit d'un microcode unique. [[File:Décodage sur le K5 et le K5.png|centre|vignette|upright=3|Décodage sur le K5 et le K5]] ====Les microarchitectures K5 et K6 d'AMD==== Les deux premières architectures étaient les architectures K5 et K6, l'architecture K6 ayant été déclinée en quatre versions, nommées K6-1, K6-2, et K-3, avec une version K6-3 bis. Elles sont regroupées ensemble car elles ont beaucoup de points communs. Par exemple, tout ce qui a trait au chargement et au cache était similaire, de même que les unités de calcul. Les deux architectures avaient n'avaient pas de cache L2 et devaient se contenter d'un cache L1 d'instruction et d'un cache L1 de données. L'AMD K5 incorpore une TLB unique, alors que le K6 utilise des TLB séparées pour le cache d'instruction et le cache de données. Une différence entre l'architecture K5 et K6 est que la première utilise des caches normaux, alors que la seconde utilise des ''sector caches''. Les deux architectures disposaient des unités de calcul suivantes : deux ALU entières, une FPU, deux unités LOAD/STORE pour les accès mémoire, une unité de branchement et une ou plusieurs unités SIMD. Une organisation classique, donc. Pour les unités entières, il y avait deux ALU simples, un ''barrel shifter'' et un diviseur. Il n'y a pas d'erreur, le processeur incorpore un circuit diviseur, mais pas de circuit multiplieur. La raison est que la multiplication est réalisée par la FPU ! En effet, le multiplieur flottant de la FPU intègre un multiplieur entier pour multiplier les mantisses, qui est utilisé pour les multiplications entières. La même technique a été utilisée sur l'Atom, comme vu plus haut. Le tout était alimenté par deux ports d'émission, appelés ports X et Y. Sur l'architecture K5, le ''barrel shifter'' et le diviseur sont des ports différents. {|class="wikitable" |+ AMD K5 |- ! Port X ! Port Y |- | ALU simple | ALU simple |- | ''Barrel Shifter'' | Diviseur |} Sur l'architecture K6, le ''barrel shifter'' et le diviseur sont sur le même port. {|class="wikitable" |+ AMD K6 |- ! Port X ! Port Y |- | ALU simple | ALU simple |- | | ''Barrel Shifter'' |- | | Diviseur |} Niveau unités mémoire, le K5 avait deux unités LOAD/STORE, chacune capable de faire lecture et écriture. Par contre, la ''store queue'' n'a qu'un seul port d'entrée, ce qui fait que le processeur peut seulement accepter une écriture par cycle. Le processeur peut donc émettre soit deux lectures simultanées, soit une lecture accompagnée d'une écriture. Impossible d'émettre deux écritures simultanées, ce qui est de toute façon très rare. L'architecture K6 utilise quant à elle une unité LOAD pour les lectures et une unité STORE pour les écritures. Ce qui permet de faire une lecture et une écriture par cycle, pas autre chose. Niveau unités SIMD, l'architecture K7 n'avait qu'une seule unité SIMD, placée sur le port d'émission X. L'architecture K8 ajouta une seconde unité SIMD, sur l'autre port d'émission entier. De plus, trois ALU SIMD ont été ajoutées : un décaleur MMX, une unité 3DNow!, une unité mixte MMX/3DNow. Elles sont reliées aux deux ports d'émission entier X et Y ! Elles ne sont pas représentées ci-dessous, par souci de simplicité. [[File:Unité de calcul des processeurs AMD K5 et K6.png|centre|vignette|upright=2|Unité de calcul des processeurs AMD K5 et K6. les unités sur la même colonnes sont reliées au même port d'émission.]] Si les unités de calcul et le chargement sont globalement les mêmes, les deux architectures se différencient sur l'exécution dans le désordre. L'AMD K5 utilise du renommage de registre dans le ROB avec des stations de réservation. Par contre, l'AMD K6 utilise une fenêtre d'instruction centralisée. De plus, son renommage de registre se fait avec un banc de registre physique. L'architecture AMD K5 utilisait de deux stations de réservation par unité de calcul, sauf pour les deux unités mémoire partageaient une station de réservation unique (deux fois plus grande). Les stations de réservation sont cependant mal nommées, vu que ce sont en réalité des mémoire FIFO. Une micro-opération n'est émise que si elle est la plus ancienne dans la FIFO/station de réservation. Le renommage de registres se faisait dans le tampon de ré-ordonnancement, il n'y avait pas encore de banc de registre physique. Le tampon de ré-ordonnancement faisait seulement 16 instructions. [[File:AMD K5.jpg|centre|vignette|upright=3|AMDK5 Diagramme.]] L'architecture K6 remplace les stations de réservations par une fenêtre d'instruction centralisée. Les 4 micro-opérations renommées sont écrites dans la fenêtre d'instruction par groupe de 4, NOP de ''padding'' inclus. La fenêtre d'instruction centralisé contient 24 micro-opérations, groupées en 6 groupes de 4 micro-opérations, avec potentiellement des NOP dedans suivant le résultat du décodage. L'avantage est que l'implémentation de la fenêtre d'instruction est simple. La fenêtre d'instruction centralisée permettait d'émettre 6 micro-opérations en même temps (une par unité de calcul/mémoire). Le renommage de registres se faisait dans le tampon de ré-ordonnancement, il n'y avait pas encore de banc de registre physique. Le processeur utilisait un renommage avec un banc de registre physique. Le banc de registre physique pour les entiers contenait 48 registres, dont 24 étaient des registres architecturaux et 24 étaient des registres renommés. Sur les 24 registres architecturaux, 16 avaient une fonction de ''scratchpad'' que les ''datasheets'' d'AMD ne détaillent pas, les 8 restants étaient les registres généraux EAX, EBX, etc. [[File:AMD K6 Little foot & Modl 6.png|centre|vignette|upright=3|AMD K6 original.]] ====Les microarchitectures K7, K8 et K10 d'AMD==== Les microarchitectures suivantes sont les architectures K7, K8 et K10. Les architectures K7, K8 et K10 sont assez similaires. La différence principale entre le K7 et le K8 est le support du 64 bits. Les apports du K10 sont la présence d'un cache L3, d'une unité de calcul supplémentaire et d'améliorations de la prédiction de branchement. La taille de certains caches a été augmentée, de même que la largeur de certaines interconnexions/bus. A partir du K7, le CPU optimise la prise en charge des instructions ''load-up''. Les instructions ''load-op'' sont appelées des macro-opérations dans la terminologie d'AMD, et aussi d'Intel. L'idée est que les instructions ''load-up'' sont décodées en micro-opérations intermédiaires. Elles sont propagées dans le pipeline comme étant une seule micro-opération, jusqu'à l'étage d'émission. Lors de l'émission, les instructions ''load-up'' sont scindées en deux micro-opérations : la lecture de l'opérande, puis l'opération proprement dite. Faire ainsi économise des ressources et optimise le remplissage du tampon de ré-ordonnancement, des fenêtres d'instructions, des stations de réservation, etc. Le tampon de réordonnancement est combiné avec divers circuits en charge de l'exécution dans le désordre, dans ce qui s'appelle l'''instruction control unit''. Il contient de 72 à, 84 instructions, qui sont regroupées en groupes de 3. Là encore, comme pour le K5 et le K6, le tampon de réordonnancement tient compte de la sortie des décodeurs. Les décodeurs fournissent toujours trois micro-opérations par cycle, quitte à remplir les vides par des NOP. Le tampon de réordonnancement reçoit les micro-opérations, NOP inclus, par groupes de 3, et est structuré autour de ces triplets de micro-opération, y compris en interne. Les architectures K7, K8 et K10 ont des unités de calcul très similaires. Concrètement, il y a trois ALU entières, trois unités de calcul d'adresse, et une FPU. Le processeur incorpore, aussi un multiplieur entier, relié sur le port d'émission de la première ALU. La FPU regroupe un additionneur flottant, un multiplieur flottant, et une troisième unité LOAD/STORE pour les lectures/écritures pour les nombres flottants. L'architecture K8 ajoute une unité de manipulation de bit, la K10 un diviseur entier. [[File:Unité de calcul des processeurs AMD K7, K8 et K10.png|centre|vignette|upright=2|Unité de calcul des processeurs AMD K7, K8 et K10]] Par contre, la manière d'alimenter ces ALU en micro-opérations varie un petit peu entre les architectures K7, K8 et K10. Il y a cependant quelques constantes entre les trois. La première est qu'il y a une fenêtre d'instruction séparée pour les flottants, de 36 à 42 entrées, avec renommage de registre. La fenêtre d'instruction flottante a trois ports d'émission : un pour l'additionneur flottant, un autre pour le multiplieur, et un troisième pour la troisième unité flottante qui s'occupe du reste. La seconde est que chaque ALU entière est couplée avec une unité de calcul d'adresse. Par contre, la méthode de couplage varie d'un processeur à l'autre. L'architecture K7 des processeurs Athlon utilisait le renommage de registre, mais seulement pour les registres flottants, pas pour les registres entiers. Elle avait deux fenêtres d'instruction : une pour les opérations flottantes, une autre pour les instructions entières et les accès mémoire. La fenêtre d'instruction entière pouvait émettre trois micro-opérations en même temps : trois micro-opérations entières, trois micro-opération mémoire. La fenêtre d'instruction entière contenait 5 à 6 groupes de 3 macro-opérations. Vous noterez que j'ai parlé de macro-opérations et pas de micro-opérations, car les instructions ''load-up'' sont considérées comme une seule "micro-opération" dans la fenêtre d'instruction entière. Et cela se marie bien avec une fenêtre d'instruction unique partagée entre pipeline entier et pipeline mémoire. Une macro-opération était scindée en deux micro-opérations : une micro-opération mémoire et une micro-opération entière. Il est donc avantageux de regrouper unités mémoire et unités entières à la même fenêtre d'instruction pour ce faire. La ''Load-Store Queue'' peut mémoriser 44 lectures/écritures, avec cependant une petite nuance. Parmi les 44 lectures/écritures, 12 sont réservées au cache L1 et 32 le sont pour le cache L2. En réalité, il y a deux ''LSQ'', une pour le cache L1 qui fait 12 entrées, une seconde pour le L2 qui fait 32 entrées. [[File:Athlon arch.png|centre|vignette|upright=3|Microarchitecture K7 d'AMD.]] Les architectures K8 et K10 utilisent le renommage de registres pour tous les registres, entiers comme flottants. Par contre, le renommage de registre n'est pas réalisé de la même manière pour les registres entiers et flottants. Les registres entiers sont renommés dans le tampon de ré-ordonnancement, comme c'était le cas sur les architectures Intel avant le Pentium 4. Par contre, les registres flottants sont renommés grâce à un banc de registre physique. Le K8 est donc un processeur au renommage hybride, qui utilise les deux solutions de renommage principales. Niveau micro-opérations entières, la station de réservation unique de 15 micro-opérations est remplacée par trois stations de réservations, une par ALU entière, de 8 micro-opérations chacune. Chaque station de réservation entière alimente une unité de calcul entière et une unité de calcul d'adresse. Le multiplieur est relié à la première station de réservation, sur le même port d'émission que l'ALU. Les stations de réservation sont nommées des ''schedulers'' dans les schémas qui suivent. [[File:AMD Grayhound microarchitecture.png|centre|vignette|upright=3|Microarchitecture K8 et K10 d'AMD.]] La microarchitecture K10 a été déclinée en plusieurs versions, nommées Grayhound, Grayhound+ et Husky, Husky étant une architecture gravée en 32 nm dédiée aux processeurs A-3000. L'architecture Grayhound a plus de cache et un ROB plus grand, la Husky est quand à elle un peu plus différente. Elle n'a pas de cache L3, contrairement aux autres architectures K10, ce qui simplifie fortement son sous-système mémoire. Par contre, les fenêtres d'instructions/stations de réservation et le ROB sont plus grands, pareil pour les files dans l'unité mémoire. Une ALU pour les divisions entières a aussi été ajoutée. [[File:AMD Husky microarchitecture.png|centre|vignette|upright=3|AMD Husky microarchitecture]] Pour résumer, les architectures K7, K8 et K10 séparent les pipelines entiers et flottants : trois pipelines entiers avec chacun son unité de calcul, et un pipeline flottant avec plusieurs unités de calcul. Les raisons à cela sont assez diverses. Disons que dupliquer des ALU entières simples prend peu de transistors, là où les gros circuits comme le multiplieur ou la FPU ne sont pas dupliqués. Et cela a un autre avantage : le renommage, ''dispatch'' et l'émission sont plus simples. Les pipelines entiers ont une exécution dans le désordre peu complexe, grâce au grand nombre d'unités de calcul, ce qui fait que le pipeline entier est de seulement 15 cycles au total (chargement et décodage inclus). A l'opposé, la FPU est alimentée par une exécution dans le désordre très complexe, avec banc de registre physique et beaucoup de ressources, mais au prix d'un pipeline flottant plus long de 3 cycles, soit 18 cycles au total. ===Les microarchitectures ZEN d'AMD=== Viennent ensuite les '''microarchitectures Bulldozer''', avec trois révisions ultérieures nommées Piledriver, Steamroller et Excavator. Mais du fait de l'utilisation de techniques de multithreading matériel que nous n'avons pas encore abordé, nous ne pouvons pas en parler ici. Les microarchitectures suivantes sont les '''architectures ZEN 1/2/3/4/5'''. Elles se ressemblent beaucoup, chacune accumulant les améliorations des précédentes. Mais le cœur de l'architecture reste plus ou moins le même. En passant à la suivante, le nombre de registre virtuel augmente, le ''branch target buffer'' augmente en taille, le ROB et les files d'attente grossissent, les caches de micro-opération aussi, les caches grossissent, etc. La microarchitecture Zen 1 est illustrée ci-dessous. Le passage à Zen 2 a ajouté une unité de calcul d'adresse (4 ALU / 3 AGU), le Zen 5 a ajouté deux autres ALU entières et une unité de calcul d'adresse (6 ALU / 4 AGU) [[File:Zen microarchitecture.svg|centre|vignette|upright=3|Microarchitecture Zen 1 d'AMD.]] <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Le parallélisme mémoire au niveau du cache | prevText=Le parallélisme mémoire au niveau du cache | next=Les processeurs VLIW et EPIC | nextText=Les processeurs VLIW et EPIC }} </noinclude> 74mgx3ey163sov3tg1nh2sryhc5as2g 745871 745870 2025-07-03T15:00:12Z Mewtow 31375 /* L'émission multiple des accès mémoire */ 745871 wikitext text/x-wiki Les processeurs vus auparavant ne peuvent émettre au maximum qu'une instruction par cycle d'horloge : ce sont des processeurs à émission unique. Ils peuvent avoir plusieurs instructions qui s'exécutent en même temps, dans des unités de calcul séparées. C'est le cas dès qu'une instruction multicycle s'exécute. Par contre, ils ne peuvent démarrer qu'une seule instruction par cycle. Et quand on court après la performance, ce n'est pas assez ! Les concepteurs de processeurs ont inventés des processeurs qui émettent plusieurs instructions par cycle : les '''processeurs à émissions multiples'''. Un processeur à émission multiple charge plusieurs instructions en même temps, les décode en parallèle, puis les émet en même temps sur des unités de calculs séparées. Pour cela, il faut gérer les dépendances entre instructions, répartir les instructions sur différentes unités de calcul, et cela n'est pas une mince affaire. [[File:Superscalarpipeline.svg|centre|vignette|upright=1.5|Pipeline RISC classique à cinq étages sur un processeur superscalaire. On voit bien que plusieurs instructions sont chargées en même temps.]] Les processeurs à émission multiple sont de deux types : les processeurs VLIW et les '''processeurs superscalaires'''. Nous mettons les processeurs VLIW de côté en attendant le prochain chapitre. La raison est qu'ils ont un jeu d'instruction spécialisé qui expose le parallélisme d'instruction directement au niveau du jeu d'instructions, là où les processeurs superscalaires restent des processeurs au jeu d'instruction normal. La différence principale entre processeur VLIW et superscalaire est qu'un processeur superscalaire répartit les instructions sur les unités de calcul à l’exécution, là où un processeur VLIW délègue cette tâche au compilateur. ==L'implémentation d'un processeur superscalaire== Sur un processeur à émission multiple, plusieurs micro-opérations sont émises en même temps, le nombre varie d'un processeur à l'autre. Les processeurs superscalaires les plus simples ne permettent que d'émettre deux micro-opérations à la fois, d'où leur nom de processeur ''dual issue'', ce qui se traduit en '''processeur à double émission'''. Les processeurs modernes peuvent émettre 3, 4, 6, voire 8 micro-opérations simultanément. Aller au-delà ne sert pas à grand-chose. ===Les circuits hors-ALU sont soit dupliqués, soit adaptés=== Un processeur superscalaire doit être capable de : lire plusieurs instructions depuis la mémoire, les décoder, renommer leurs registres, et les envoyer à l'unité d'émission. Intuitivement, on se fit qu'on doit dupliquer tous les circuits : les décodeurs, l'unité de renommage, les unités de calcul, le ROB, etc. Dans les faits, l'implémentation d'un processeur superscalaire demande de dupliquer plusieurs circuits et d'en adapter d'autres. Voici ce que cela donne dans les grandes lignes. {|class="wikitable" |- ! rowspan="2" | Processeur sans émission multiple | rowspan="2" | Chargement | rowspan="2" | Décodage | rowspan="2" | Renommage | rowspan="2" | Émission | Exécution / ALU | rowspan="2" | ''Commit''/ROB |- | Exécution / ALU |- ! rowspan="4" | Processeur superscalaire | rowspan="4" | Chargement | rowspan="2" | Décodage | rowspan="4" | Renommage | rowspan="4" | Émission | Exécution / ALU | rowspan="4" | ''Commit''/ROB |- | Exécution / ALU |- | rowspan="2" | Décodage | Exécution / ALU |- | Exécution / ALU |} Un processeur superscalaire doit pouvoir charger plusieurs instructions en même temps. Deux solutions pour cela. La première est de doubler la taille du bus connecté au cache d'instruction. Si les instructions sont de longueur fixe, cela charge deux instructions à la fois. Pour un processeur à triple émission, il faut tripler la taille du bus, quadrupler pour un processeur quadruple émission, etc. Mais tout n'est pas si simple, quelques subtilités font qu'on doit ajouter des circuits en plus pour corriger les défauts peu intuitifs de cette implémentation naïve. Une autre solution est d'utiliser un cache d'instruction multiport. Mais dans ce cas, le ''program counter'' doit générer deux adresses, au mieux consécutives, au pire prédites par l'unité de prédiction de branchement. L'implémentation est alors encore plus complexe, comme on le verra plus bas. Il doit ensuite décoder plusieurs instructions en même temps. Il se trouve que les dépendances entre instruction ne posent pas de problème pour le décodeur. Rien ne s'oppose à ce qu'on utilise plusieurs décodeurs séparés. Il faut dire que les décodeurs sont de purs circuits combinatoires, du moins sur les processeurs avec une file de micro-opérations, ou avec une fenêtre d'instruction, ou des stations de réservation. Par contre, l'unité de renommage de registre n'est pas dupliquée, mais adaptées, pour gérer le cas où des instructions consécutives ont des dépendances de registre. Par exemple, prenons un processeur à double émission, qui renomme deux instructions consécutives. Si elles ont une dépendance, le renommage de la seconde instruction dépend du renommage de la première. La première doit être renommée et le résultat du renommage est utilisé pour renommer la seconde, ce qui empêche d'utiliser deux unités de renommage séparées. L'unité d'émission, la file de micro-opération et tous les circuits liés aux dépendances d'instruction ne sont pas dupliqués, car il peut y avoir des dépendances entre instruction chargées simultanément. L'unité d'émission est modifiée de manière à émettre plusieurs instructions à la fois. Si c'est un ''scoreboard'', il doit être modifié pour détecter les dépendances entre les instructions à émettre. Si c'est une fenêtre d'instruction ou une station de réservation, les choses sont plus simples, il faut basiquement rajouter des ports de lecture et écriture pour insérer et émettre plusieurs instructions à la fois, et modifier la logique de sélection en conséquence. Le ROB et les autres structures doivent aussi être modifiées pour pouvoir émettre et terminer plusieurs instructions en même temps. ===La duplication des unités de calcul et les contraintes d’appariement=== Pour émettre plusieurs instructions en même temps, encore faut-il avoir de quoi les exécuter. En clair : un processeur superscalaire doit avoir plusieurs unités de calcul séparées. Les processeurs avec un pipeline dynamique incorporent plusieurs unités pour les instructions entières, une unité pour les instructions flottantes, une unité pour les accès mémoire et éventuellement une unité pour les tests/branchements. Au lieu de parler d'unités de calcul, un terme plus correct serait le terme d''''avals''', que nous avions introduit dans le chapitre sur les pipelines dynamiques, mais n'avons pas eu l'occasion d'utiliser par la suite. Les processeurs avec un pipeline dynamique incorporent déjà plusieurs avals, mais chaque aval ne peut accepter qu'une nouvelle instruction par cycle. Et cela ne change pas sur les processeurs superscalaire, une unité de calcul reste une unité de calcul. Il y a plusieurs manières de gérer les avals sur un processeur superscalaire. La première duplique tous les avals : toutes les unités de calcul sont dupliquées. Par exemple, prenons un processeur simple-émission et transformons-le en processeur à double émission. Intuitivement, on se dit qu'il faut dupliquer toutes les unités de calcul. Si le processeur de base a une ALU entière, une FPU et un circuit multiplieur, ils sont tous dupliqués. L'avantage de faire ainsi est que le processeur n'a pas de contrainte quand il veut émettre deux instructions. Tant que les deux instructions n'ont pas de dépendances de données, il peut les émettre. Pour le dire autrement, toutes les paires d'instructions possibles sont compatibles avec la double émission. Si le processeur veut émettre deux multiplications consécutives, il le peut. S'il veut émettre deux instructions flottantes, il le peut. Le problème, c'est que le cout en circuit est conséquent ! Dupliquer la FPU ou les circuits multiplieurs bouffe du transistor. Pour économiser des transistors, il est possible de ne pas dupliquer tous les circuits. Typiquement, les ALU simples sont dupliquées, de même que les unités de calcul d'adresse, mais la FPU et les circuits multiplieurs ne sont pas dupliqués. En faisant ainsi, le cout en transistors est grandement réduire. Par contre, cela entraine l'apparition de dépendances structurelles. Par exemple, le CPU ne peut pas émettre deux multiplications consécutives sur un seul multiplieur, idem avec deux additions flottantes si l'additionneur flottant n'est pas dupliqué. La conséquence est que les processeurs superscalaires ont des contraintes sur les instructions à émettre en même temps. Si on prend un processeur ''dual-issue'', il y a donc des paires d'instructions autorisées et des paires interdites. Par exemple, l'exécution simultanée de deux branchements est interdite. Les branchements sont sérialisés, exécutés l'un après l'autre. Il est possible d'émettre un branchement en même temps qu'une autre instruction, en espérant que la prédiction de branchement ait fait une bonne prédiction. Mais il n'est souvent pas possible d'émettre deux branchements en même temps. La raison est qu'il n'y a qu'une seule unité de calcul pour les branchements dans un processeur. ==L'étape de chargement superscalaire== Pour charger plusieurs instructions, il suffit de doubler, tripler ou quadrupler le bus mémoire. Précisément, c'est le port de lecture du cache d’instruction qui est élargit, pour lire 2/3/4/... instructions. Un bloc de 8, 16, 32 octets est dnc lu depuis le cache et est ensuite découpé en instructions, envoyées chacun à un décodeur. Découper un bloc en instructions est trivial avec des instructions de longueur fixe, mais plus compliqué avec des instructions de taille variable. Il est cependant possible de s'en sortir avec deux solutions distinctes. La première solution utilise les techniques de prédécodage vues dans le chapitre sur les caches, à savoir que le découpage d'une ligne de cache est réalisé lors du chargement dans le cache d’instruction. Une autre solution améliore le circuit de détection des tailles d'instruction vu dans le chapitre sur l'unité de chargement. Avec la seconde solution, cela prend parfois un étage de pipeline entier, comme c'est le cas sur les processeurs Intel de microarchitecture P6. Mais laissons de côté cette difficulté et passons au vrai problème. Charger un gros bloc de mémoire permet de charger plusieurs instructions, mais il y a potentiellement des branchements dans le bloc. Et on doit gérer le cas où ils sont pris, le cas où les instructions suivantes dans le bloc doivent être annulées. En clair, il faut détecter les branchements dans le bloc chargé et gérer le cas où ils sont pris. : Dans ce qui va suivre, un morceau de code sans branchement est appelé un bloc de base (''basic block''). ===Le circuit de fusion de blocs=== Les processeurs superscalaires simples ne se préoccupent pas des branchements lors du chargement. Les instructions chargées en même temps sont toutes décodées et exécutées en même temps, même s'il y a un branchement dans le tas. Les branchements sont donc prédits comme étant non-pris systématiquement. Mais d'autres sont plus malins et utilisent la prédiction de branchement pour savoir si un branchement est pris ou non. Partons du principe que le branchement est pris : le processeur doit charger toutes les instructions d'un bloc, sauf celles qui suivent le branchement pris. L'unité de chargement coupe le bloc chargé au niveau du premier branchement non-pris, remplit les vides avec des NOP, avant d'envoyer le tout à l'unité de décodage. [[File:Fetch sur un processeur superscalaire avec prediction de branchements.png|centre|vignette|upright=2|Fetch sur un processeur superscalaire avec prédiction de branchements.]] Une solution plus performante charge les instructions de destination du branchement et les placent à sa suite. Ils chargent deux blocs à la fois et les fusionnent en un seul qui ne contient que les instructions présumées utiles. [[File:Cache d'instructions autoaligné.png|centre|vignette|upright=2|Cache d'instructions autoaligné.]] Mais cela demande de charger deux blocs de mémoire en une fois, ce qui demande un cache d'instruction multiports. Il faut aussi ajouter un circuit pour assembler plusieurs morceaux de blocs en un seul : le fusionneur (''merger''). Le résultat en sortie du fusionneur est ce qu'on appelle une '''trace'''. [[File:Implémentation d'un cache d'instructions autoaligné.png|centre|vignette|upright=2|Implémentation d'un cache d'instructions autoaligné.]] Le principe peut se généraliser si un bloc contient plusieurs branchements pris, avec un nombre de blocs supérieur à deux. Mais cela demande une unité de prédiction de branchement capable de prédire plusieurs branchements par cycle. ===Le cache de traces=== Si jamais un bloc est rechargé et que ses branchements sont pris à l'identique, le résultat du fusionneur sera le même. Il est intéressant de conserver cette trace dans un '''cache de traces''' pour la réutiliser ultérieurement. Le cache de trace n'a été utilisé que sur un seul processeur commercial : le Pentium 4 d'Intel. Fait intéressant, son cache de trace ne mémorisait pas des suites d'instructions, mais des suites de micro-opérations. En clair, il mémorisait des traces décodées, ce qui fait qu'un succès de cache de trace contournait non seulement le cache d'instruction, mais aussi les décodeurs. Ce qui explique que le temps d'accès au cache de trace n'était pas un problème, même s'il était comparable au temps d'accès du cache d'instruction. Il a depuis été remplacé par une alternative bien plus intéressante, le cache de micro-opérations, plus flexible et plus performant. Une trace est réutilisable quand le premier bloc de base est identique et que les prédictions de branchement restent identiques. Pour vérifier cela, le tag du cache de traces contient l'adresse du premier bloc de base, la position des branchements dans la trace et le résultat des prédictions utilisées pour construire la trace. Le résultat des prédictions de branchement de la trace est stocké sous la forme d'une suite de bits : si la trace contient n branchements, le n-ième bit vaut 1 si ce branchement a été pris, et 0 sinon. Même chose pour la position des branchements dans la trace : le bit numéro n indique si la n-ième instruction de la trace est un branchement : si c'est le cas, il vaut 1, et 0 sinon. Pour savoir si une trace est réutilisable, l'unité de chargement envoie le ''program counter'' au cache de traces, l'unité de prédiction de branchement fournit le reste des informations. Si on a un succès de cache de traces, et la trace est envoyée directement au décodeur. Sinon, la trace est chargée depuis le cache d'instructions et assemblée. [[File:TraceCache.png|centre|vignette|upright=2|Cache de traces.]] [[File:BasicBlocks.png|vignette|Blocs de base.]] Pour comprendre ce qu'est une trace, regardez le code illustré ci-contre. Il est composé d'un bloc de base A, suivi par un bloc de base B, qui peut faire appel soit au bloc C, soit un bloc D. Un tel code peut donner deux traces : ABC ou ABD. La trace exécutée dépend du résultat du branchement qui choisit entre C et D. Un cache de trace idéal mémorise les deux traces ABC et ABD dans deux lignes de cache séparées. Il peut mémoriser des traces différentes, même si leur début est le même. Un cache de trace peut supporter des '''succès de cache de trace partiels'''. Prenez le cas où le processeur veut lire la trace ABC mais que le cache de trace ne contient que la trace ABD : c'est un succès partiel. Dans ce cas, le processeur peut lire les blocs de base A et B depuis le cache de trace, et lit D depuis le cache d'instruction. Et cela vaut dans le cas général : si le cache a mémorisé une trace similaire à celle demandée, dont seuls les premiers blocs de base correspondent, il peut lire les premiers blocs de base dans le cache de trace et lire le reste dans le cache d'instruction. Il y a une certaine redondance dans le contenu du cache de trace, car certaines traces partagent des blocs de base. Pour éviter cela, il est possible de mémoriser les blocs de base dans des caches séparés et les assembler avec un fusionneur. Par exemple, au lieu d'utiliser un cache de traces unique, on va utiliser quatre '''caches de blocs de base''', suivi par un fusionneur qui reconstitue la trace. On économise du cache, au dépend d'un temps d'accès plus long vu qu'il faut reconstituer la trace. ==Le séquenceur d'un processeur superscalaire== Le séquenceur d'un processeur superscalaire est modifié, afin de pouvoir décoder plusieurs instructions à la fois. Ce n'est pas le cas général, mais la présence de plusieurs décodeurs est très fréquent sur les processeur superscalaires. De plus, les unités de renommage et d'émission doivent être modifiées. ===Les décodeurs d'instructions superscalaires=== Un processeur superscalaire contient généralement plusieurs décodeurs, chacun pouvant décoder une instruction en parallèle des autres. Prenons par exemple un processeur RISC dont toutes les instructions font 32 bits. Un processeur superscalaire de ce type peut charger des blocs de 128 bits, ce qui permet de charger 4 instructions d'un seul coup. Et pour les décoder, le décodage se fera dans quatre décodeurs séparés, qui fonctionneront en parallèle. Ou alors, il se fera dans un seul décodeur qui pourra décoder plusieurs instructions par cycles. Les processeurs CISC utilisent des décodeurs hybrides, avec un microcode qui complémente un décodeur câblés. Dupliquer le microcode aurait un cout en transistors trop important, ce qui fait que seuls les décodeurs câblés sont dupliqués. Les CPU CISC superscalaires disposent donc de plusieurs décodeurs simples, capables de décoder les instructions les plus courantes, avec un seul microcode. La conséquence est qu'il n'est pas possible de décoder deux instructions microcodées en même temps. Par contre, il reste possible de décoder plusieurs instructions non-microcodées ou une instruction microcodée couplée à une instruction non-microcodée. Vu qu'il est rare que deux instructions microcodées se suivent dans un programme, le cout en performance est extrêmement mineur. Les processeurs superscalaires supportent la technique dite de '''macro-fusion''', qui permet de fusionner deux-trois instructions consécutives en une seule micro-opération. Par exemple, il est possible fusionner une instruction de test et une instruction de saut en une seule micro-opération de branchement. Il s'agit là de l'utilisation la plus importante de la macro-fusion sur les processeurs x86 modernes. En théorie, d'autres utilisations de la macro-fusion sont possibles, certaines ont même été [https://www2.eecs.berkeley.edu/Pubs/TechRpts/2016/EECS-2016-130.pdf proposées pour le jeu d'instruction RISC-V], mais rien n'est encore implémenté (à ma connaissance). La fusion des instructions se fait lors du décodage des instructions, grâce à la coopération des décodeurs. ===L'unité de renommage superscalaire=== Sur un processeur à émission multiple, l'unité de renommage de registres doit renommer plusieurs instructions à la fois, mais aussi gérer les dépendances entre instructions. Pour cela, elle renomme les registres sans tenir compte des dépendances, pour ensuite corriger le résultat. [[File:Unité de renommage superscalaire.png|centre|vignette|upright=2|Unité de renommage superscalaire.]] Seules les dépendances lecture-après-écriture doivent être détectées, les autres étant supprimées par le renommage de registres. Repérer ce genre de dépendances se fait assez simplement : il suffit de regarder si un registre de destination d'une instruction est un opérande d'une instruction suivante. [[File:Détection des dépendances sur un processeur superscalaire.png|centre|vignette|upright=2|Détection des dépendances sur un processeur superscalaire.]] Ensuite, il faut corriger le résultat du renommage en fonction des dépendances. Si une instruction n'a pas de dépendance avec une autre, on la laisse telle quelle. Dans le cas contraire, un registre opérande sera identique avec le registre de destination d'une instruction précédente. Dans ce cas, le registre opérande n'est pas le bon après renommage : on doit le remplacer par le registre de destination de l'instruction avec laquelle il y a dépendance. Cela se fait simplement en utilisant un multiplexeur dont les entrées sont reliées à l'unité de détection des dépendances. On doit faire ce replacement pour chaque registre opérande. [[File:Correction des dépendances sur un processeur superscalaire.png|centre|vignette|upright=2|Correction des dépendances sur un processeur superscalaire.]] ===L'unité d'émission superscalaire=== Pour émettre plusieurs instructions en même temps, l'unité d'émission doit être capable d'émettre plusieurs instructions par cycle. Et Pour cela, elle doit détecter les dépendances entre instructions. Il faut noter que la plupart des processeurs superscalaires utilisent le renommage de registre pour éliminer un maximum de dépendances inter-instructions. Les seules dépendances à détecter sont alors les dépendances RAW, qu'on peut détecter en comparant les registres de deux instructions consécutives. Sur les processeurs superscalaires à exécution dans l’ordre, il faut aussi gérer l'alignement des instructions dans la fenêtre d'instruction. Dans le cas le plus simple, les instructions sont chargées par blocs et on doit attendre que toutes les instructions du bloc soient émises pour charger un nouveau bloc. Avec la seconde méthode, La fenêtre d'instruction fonctionne comme une fenêtre glissante, qui se déplace de plusieurs crans à chaque cycle d'horloge. Mais au-delà de ça, le design de l'unité d'émission change. Avant, elle recevait une micro-opération sur son entrée, et fournissait une micro-opération émise sur une sortie. Et cela vaut aussi bien pour une unité d'émission simple, un ''scoreboard'', une fenêtre d'instruction ou des stations de réservation. Mais avec l'émission multiple, les sorties et entrées sont dupliquées. Pour la double émission, il y a deux entrées vu qu'elle doit recevoir deux micro-opération décodées/renommées, et deux sorties pour émettre deux micro-opérations. Formellement, il est possible de faire une analogie avec une mémoire : l'unité d'émission dispose de ports d'écriture et de lecture. On envoie des micro-opérations décodées/renommées sur des ports d'écriture, et elle renvoie des micro-opérations émises sur le port de lecture. Dans ce qui suit, nous parlerons de '''ports de décodage''' et de '''ports d'émission'''. Si l'unité d'émission est un vulgaire ''scoreboard'', il doit détecter les dépendances entre instructions émises simultanément. De plus, il doit détecter les paires d'instructions interdites et les sérialiser. Autant dire que ce n'est pas très pratique. La détection des dépendances entre instructions consécutives est simplifiée avec une fenêtre d'instruction, il n'y a pour ainsi dire pas grand chose à faire, vu que les dépendances sont éliminées par le renommage de registre et que les signaux de réveil s'occupent de gérer les dépendances RAW. C'est la raison pour laquelle les processeurs superscalaires utilisent tous une fenêtre d'instruction centralisée ou décentralisée, et non des ''scoreboard''. Les processeurs superscalaires privilégient souvent des stations de réservations aux fenêtres d'instruction. Rappelons la terminologie utilisée dans ce cours. Les fenêtres d'instruction se contentent de mémoriser la micro-opération à émettre et quelques bits pour la disponibilité des opérandes. Par contre, les stations de réservations mémorisent aussi les opérandes des instructions. Les registres sont lus après émission avec une fenêtre d'instruction, avant avec des stations de réservation. Et cette différence a une influence sur le pipeline du processeur, le banc de registres et tout ce qui s'en suit. La différence principale est liée au banc de registre, et précisément au nombre de ports de lecture. Supposons que toutes les instructions sont dyadiques, ou du moins qu'il n'existe pas de micro-opération à trois opérandes. Avec une fenêtre d'instruction, le nombre d'opérandes à lire simultanément est proportionnel à la quantité d'instructions qu'on peut émettre en même temps. Sur un processeur ''dual issue'', qui peut émettre deux micro-opérations, cela fait deux micro-opérations à deux opérandes chacune, soit 4 opérandes. Le nombre de ports de lecture est donc de quatre. Avec une station de réservation, la lecture des opérandes a lieu avant l'émission, juste après le décodage/renommage. Le nombre d'opérande est le double du nombre de micro-opérations décodées/renommées, pas émises. Si le décodeur peut décoder/renommer 4 instructions par cycle, cela veut dire 4 micro-opérations émises par cycle. Et il se trouve que les deux situations ne sont pas évidentes. Avec une fenêtre d'instruction centralisée, cela ne change rien. Le nombre d'instructions décodées et émises en même temps sont identiques. Mais dès qu'on utilise des fenêtres d'instruction décentralisées, les choses changent. Si le décodeur peut décoder/renommer 4 instructions par cycle, alors l'idéal est d'avoir 4 micro-opérations émises par cycle, ''par fenêtre d'instruction''. Imaginez que le décodeur décode 4 instructions entières : la fenêtre d'instruction entière doit pouvoir émettre 4 micro-opérations entières en même temps. Idem pour des instructions flottantes avec la fenêtre d'instruction flottantes. Vu qu'il y a deux fenêtres d'instruction, cela fait 4 micro-opérations entières + 4 micro-opérations flottantes = 8 ports de lecture. Non pas qu'ils soient tous simultanément utiles, mais il faut les câbler. Les fenêtres d'instruction impliquent plus de lectures d'opérandes, ce qui implique plus de ports de lecture. Les stations de réservation sont plus économes, elles vont bien avec un nombre modéré de ports de lecture. ===Les conséquences sur le banc de registre=== Émettre plusieurs instructions en même temps signifie lire ou écrire plusieurs opérandes à la fois : le nombre de ports du banc de registres doit être augmenté. De plus, le banc de registre doit être relié à toutes les unités de calcul en même temps, ce qui fait 2 ports de lecture par unité de calcul. Et avec plusieurs dizaines d'unités de calcul différentes, le câblage est tout simplement ignoble. Et plus un banc de registres a de ports, plus il utilise de circuits, est compliqué à concevoir, consomme de courant et chauffe. Mais diverses optimisations permettent de réduire le nombre de ports assez simplement. Un autre solution utilise un banc de registre unique, mais n'utilise pas autant de ports que le pire des cas le demanderait. Pour cela, le processeur doit détecter quand il n'y a pas assez de ports pour servir toutes les instructions : l'unité d'émission devra alors mettre en attente certaines instructions, le temps que les ports se libèrent. Cette détection est réalisée par un circuit d'arbitrage spécialisé, intégré à l'unité d'émission, l’arbitre du banc de registres (''register file arbiter''). ==Les unités de calcul des processeurs superscalaires== Un processeur superscalaire émet/exécute plusieurs instructions simultanément dans plusieurs unités de calcul séparées. Intuitivement, on se dit qu'il faut dupliquer les unités de calcul à l'identique. Un processeur superscalaire contient alors N unités de calcul identiques, précédées par une fenêtre d'instruction avec N ports d'émission. Un tel processeur peut émettre N micro-opérations, tant qu'elles n'ont pas de dépendances. Manque de chance, ce cas est l'exception. La raison est que les processeurs superscalaires usuels sont conçus à partir d'un processeur à pipeline dynamique normal, qu'ils améliorent pour le rendre superscalaire. Les processeurs avec un pipeline dynamique incorporent plusieurs unités de calcul distinctes, avec une ALU pour les instructions entières, une FPU pour les instructions flottantes, une unité pour les accès mémoire (calcul d'adresse) et éventuellement une unité pour les tests/branchements. Sans superscalarité, ces unités sont toutes reliées au même port d'émission. Avec superscalarité, les unités de calcul existantes sont connectées à des ports d'émission différents. ===La double émission entière-flottante=== En théorie, il est possible d'imaginer un CPU superscalaire sans dupliquer les ALU, en se contenant d'exploiter au mieux les unités de calcul existantes. Prenons le cas d'un processeur avec une ALU entière et une ALU flottante, qu'on veut transformer en processeur superscalaire. L'idée est alors de permettre d'émettre une micro-opération entière en même temps qu'une micro-opération flottante. La micro-opération entière s'exécute dans l'ALU entière, la micro-opération flottante dans la FPU. Il suffit juste d'ajouter un port d'émission dédié sur la FPU. Le processeur a donc deux pipelines séparés : un pour les micro-opérations entières, un autre pour les micro-opérations flottantes. On parle alors de '''double émission entière-flottante'''. L'idée est simple, la mise en œuvre utilise assez peu de circuits pour un gain en performance qui est faible, mais en vaut la peine. La plupart des premiers processeurs superscalaires étaient de ce type. Les exemples les plus notables sont les processeurs POWER 1 et ses dérivés comme le ''RISC Single Chip''. Ils sont assez anciens et avaient un budget en transistors limité, ce qui fait qu'ils devaient se débrouiller avec peu de circuits dont ils disposaient. L'usage d'une double émission entière-flottante était assez naturelle. [[File:Double émission entière-flottante.png|centre|vignette|upright=2|Double émission entière-flottante]] Cependant, la méthode a un léger défaut. Une instruction flottante peut parfois lever une exception, par exemple en cas de division par zéro, ou pour certains calculs précis. Si une exception est levée, alors l'instruction flottante est annulée, de même que toutes les instructions qui suivent. Ce n'est pas un problème si le processeur gère nativement les exceptions précises, par exemple avec un tampon de ré-ordonnancement. Et c'est le cas pour la totalité des processeurs à exécution dans le désordre. Mais sur les processeurs à exécution dans l'ordre, si le budget en transistors est limité, les techniques de ce genre sont absentes. En théorie, sans tampon de ré-ordonnancement ou équivalent, on ne peut pas émettre d'instruction flottante en même temps qu'une instruction entière à cause de ce problème d'exceptions flottantes. Le problème s'est manifesté sur les processeurs Atom d'Intel, et les concepteurs du processeur ont trouvé une parade. L'idée est de tester les opérandes flottantes, pour détecter les combinaisons d'opérandes à problème, dont l'addition/multiplication peut lever une exception. Si des opérandes à problème sont détectées, on stoppe l'émission de nouvelles instructions en parallèle de l'instruction flottante et l'unité d'émission émet des bulles de pipeline tant que l'instruction flottante est en cours. Sinon, l'émission multiple fonctionne normalement. La technique, appelée ''Safe Instruction Recognition'' par Intel, est décrite dans le brevet US00525721.6A. Il faut noter que la double émission entière-flottante peut aussi être adaptée aux accès mémoire. En théorie, les accès mémoire sont pris en charge par le pipeline pour les opérations entières. L'avantage est que l'on peut alors utiliser l'unité de calcul pour calculer des adresses. Mais il est aussi possible de relier l'unité mémoire à son propre port d'émission. Le processeur devient alors capable d’émettre une micro-opération entière, une micro-opération flottante, et une micro-opération mémoire. On parle alors de '''triple émission entière-flottante-mémoire'''. La seule contrainte est que l'unité mémoire incorpore une unité de calcul d'adresse dédiée. ===L'émission multiple des micro-opérations flottantes=== La double émission entière-flottante ajoute un port d'émission pour la FPU, ce qui a un cout en circuits modeste, pour un gain en performance intéressant. Mais il faut savoir que les FPU regroupent un additionneur-soustracteur flottant et un multiplieur flottant, qui sont reliés au même port d'émission. Et il est possible d'ajouter des ports d'émission séparés pour l'additionneur flottant et le multiplieur flottant. Le processeur peut alors émettre une addition flottante en même temps qu'une multiplication flottante. Les autres circuits de calcul flottant sont répartis sur ces deux ports d'émission flottants. L'avantage est que cela se marie bien avec l'usage d'une fenêtre d'instruction séparée pour les opérations flottantes. La fenêtre d'instruction a alors deux ports séparés, au lieu d'un seul. Rajouter un second port d'émission flottant n'est pas trop un problème, car le cout lié à l'ajout d'un port n'est pas linéaire. Passer de un port à deux a un cout tolérable, bien plus que de passer de 3 ports à 4 ou de 4 à 5. Il est même possible de dupliquer l'additionneur et le multiplieur flottant, ce qui permet d'émettre deux additions et multiplications flottantes en même temps. C'est ce qui est fait sur les processeur AMD de architecture Zen 1 et 2. Ils ont deux additionneurs flottants par cœur, deux multiplieurs flottants, chacun avec leur propre port d'émission. Les performances en calcul flottant sont assez impressionnantes pour un processeur de l'époque. [[File:ZEN - émission multiple flottante.png|centre|vignette|upright=2.5|Microarchitecture Zen 1 d'AMD.]] ===L'émission multiple des micro-opérations entières=== Nous avons vu plus haut qu'il est possible d'ajouter plusieurs ports d'émission pour la FPU. Intuitivement, on se dit que la méthode peut aussi être appliquée pour émettre plusieurs micro-opérations entières en même temps. En effet, un processeur contient généralement plusieurs unités de calcul entières séparées, avec typiquement une ALU entière simple, un circuit multiplieur/diviseur, un ''barrel shifter'', une unité de manipulation de bit. Les 5 unités permettent d'émettre 4 micro-opérations entières en même temps, à condition qu'on ajoute assez de ports d'émission. [[File:Emission multiple des opérations entières, implémentation naive.png|centre|vignette|upright=2|Émission multiple des opérations entières, implémentation naïve.]] Maintenant, posons-nous la question : est-ce que faire ainsi en vaut la peine ? Le processeur peut en théorie émettre une addition, une multiplication, un décalage et une opération de manipulation de bits en même temps. Mais une telle situation est rare. En conséquence, les ports d'émission seront sous-utilisés, sous celui pour l'ALU entière. Pour réduire le nombre de ports d'émission sous-utilisés, il est possible de regrouper plusieurs unités de calcul sur le même port d'émission. Typiquement, il y a un port d'émission pour le multiplieur et un autre port d'émission pour le reste. L'avantage est que cela permet d'exécuter des micro-opérations entières en parallèle d'une multiplication. Mais on ne peut pas émettre/exécuter en parallèle des instructions simples. Il n'est pas exemple pas possible de faire un décalage en même temps qu'une addition. Le cout en performance est le prix à payer pour la réduction du nombre de ports d'émission, et il est assez faible. : Je dis exécuter/émettre, car ces instructions s'exécutent en un cycle. Si elles ne sont pas émises en même temps, elles ne s'exécutent pas en même temps. [[File:Emission multiple des opérations entières, double émission.png|centre|vignette|upright=2|Émission multiple des opérations entières, double émission]] Typiquement, la plupart des programmes sont majoritairement remplis d'additions, avec des multiplications assez rares et des décalages qui le sont encore plus. En pratique, il n'est pas rare d'avoir une multiplication pour 4/5 additions. Si on veut profiter au maximum de l'émission multiple, il faut pouvoir émettre plusieurs additions/soustractions en même temps, ce qui demande de dupliquer les ALU simples et leur donner chacune son propre port d'émission. : Le multiplieur n'est presque jamais dupliqué, car il est rare d'avoir plusieurs multiplications consécutives. Disposer de plusieurs circuits multiplieurs serait donc un cout en circuits qui ne servirait que rarement et n'en vaut pas la chandelle. Pour économiser des ports d'émission, les ALU entières dupliquées sont reliées à des ports d'émission existants. Par exemple, on peut ajouter la seconde ALU entière au port d'émission du multiplieur, la troisième ALU entière au port dédié au ''barrel shifter'', etc. Ainsi, les ports d'émission sont mieux utilisés : il est rare qu'on n'ait pas d'instruction à émettre sur un port. Le résultat est un gain en performance bien plus important qu'avec les techniques précédentes, pour un cout en transistor mineur. [[File:Emission multiple des opérations entières, implémentation courante.png|centre|vignette|upright=2|Emission multiple des opérations entières, implémentation courante]] ===L'émission multiple des accès mémoire=== Après avoir vu l'émission multiple pour les opérations flottantes et etnières, il est temps de voir l''''émission multiple des accès mémoire'''. ! Il est en effet possible d'émettre plusieurs micro-opérations mémoire en même temps. Les processeurs superscalaires modernes sont capables d'émettre plusieurs lectures/écritures simultanément. Par exemple, ils peuvent émettre une lecture en même temps qu'une écriture, ou plusieurs lectures, ou plusieurs écritures. Il faut noter que selon le processeur, il peut y avoir des restrictions quant aux accès mémoire émis en même temps. Par exemple, certains processeurs peuvent émettre une lecture avec une écriture en même temps, mais pas deux lectures ni deux écritures. Ou encore, ils peuvent émettre deux lectures, une lecture et une écriture, mais pas deux écritures en même temps. Dans la majorité des cas, les processeurs ne permettent pas d'émettre deux écritures en même temps, alors qu'ils supportent plusieurs lectures. Il faut dire que les lectures sont plus fréquentes que les écritures. Les processeurs qui autorisent toutes les combinaisons de lecture/écriture possibles, sont rares. L'émission multiple des accès mémoire demande évidemment de dupliquer des circuits, mais pas l'unité mémoire complète. Pour rappel, l'unité mémoire s'interpose entre le cache et le reste du pipeline. Elle est composée d'une unité de calcul d'adresse, des ports de lecture/écriture du cache de données, et éventuellement d'une structure qui remet en ordre les accès mémoire (une ''Load-store queue''). Émettre plusieurs micro-opérations mémoire demande d'avoir plusieurs unités de calcul, une par micro-opération mémoire émise par cycle. Si le processeur peut émettre trois micro-opérations mémoire à la fois, il y aura besoin de trois unités de calcul d'adresse. Chaque unité de calcul d'adresse est directement reliée à un port d'émission mémoire. Les ports de lecture/écriture du cache sont aussi dupliqués, afin de gérer plusieurs accès mémoire simultanés au cache de données. Par contre, la structure qui remet les accès mémoire en ordre n'est pas dupliquée. Les processeurs avec une ''Load-store queue'' ne la dupliquent pas. Par contre, elle est rendue multi-ports afin de gérer plusieurs micro-opérations mémoire simultanés. Par exemple, les processeurs skylake ont une LSQ avec deux ports de lecture et un port d'écriture, ce qui permet de faire deux lectures en même temps qu'une écriture. C'est la même chose avec les processeurs avec juste une ''Store Queue' et une ''Load Queue''. Prenons un processeur qui peut émettre une lecture et une écriture en même temps. Dans ce cas, la lecture va dans la ''Load Queue'', l'écriture dans la ''Store Queue''. Il y a bien des modifications à faire sur les deux files, afin de gérer deux accès simultanés, mais les structures ne sont pas dupliqués. Si on veut gérer plusieurs lectures ou plusieurs écritures, il suffit d'ajouter des ports à la ''Load Queue' ou à la ''Store Queue''. : Dans ce qui suit, nous parlerons d'AGU (''Adress Generation Unit'') pour désigner les unités de calcul d'adresse. Un exemple est celui des processeurs Intel de microarchitecture Nehalem, qui pouvaient seulement émettre une lecture en même temps qu'une écriture. Ils avaient deux ports d'émission reliés à l'unité mémoire. Un port pour les lectures, un autre pour les écritures. Le premier port d'écriture recevait la donnée à écrire et s'occupait des calculs d'adresse, Le port de lecture faisait uniquement des calculs d'adresse. Les processeurs AMD K6 sont similaires, avec un port d'émission pour les lectures et un autre pour les écritures. Le port de lecture alimente une unité de calcul d'adresse dédiée, directement reliée au cache. Le port d'écriture du cache alimente une unité de calcul, qui est suivie par une ''Store Queue'', une version simplifiée de la LSQ dédiée aux écritures. Le processeur exécutait les lectures dès qu'elles avaient leurs opérandes de disponibles, seules les écritures étaient mises en attente. D'autres processeurs ont plusieurs ports d'émission pour les unités mémoire, mais qui peuvent faire indifféremment lecture comme écritures. Un exemple est celui du processeur Athlon 64, un processeur AMD sorti dans les années 2000. Il disposait d'une LSQ unique, reliée à un cache L1 de donnée double port. La LSQ était reliée à trois unités de calcul séparées de la LSQ. La LSQ avait des connexions avec les registres, pour gérer les lectures/écritures. [[File:Athlon.png|centre|vignette|upright=2.5|Athlon]] ===L'interaction avec les fenêtres d'instruction=== Nous venons de voir qu'un processeur superscalaire peut avoir des ports d'émission reliés à plusieurs ALU. Pour le moment, nous avons vu le cas où le processeur dispose de fenêtres d'instruction séparées pour les opérations entières et flottantes. Un port d'émission est donc relié soit à des ALU entières, soit à des FPU. Mais il existe des processeurs où un même port d'émission alimente à la fois une ALU entière et une FPU. Par exemple, on peut relier un additionneur flottant sur le même port qu'une ALU entière. Il faut noter que cela implique une fenêtre d'instruction centralisée, capable de mettre en attente micro-opérations entières et flottantes. Un exemple est celui des processeurs Core 2 Duo. Ils disposent de 6 ports d'émission, dont 3 ports dédiés à l'unité mémoire. Les 3 ports restants alimentent chacun une ALU entière, un circuit de calcul flottant et une unité de calcul SSE (une unité de calcul SIMD, qu'on abordera dans quelques chapitres). Le premier port alimente une ALU entière simple et un multiplieur/diviseur flottant. Le second alimente une ALU entière, un multiplieur entier et un additionneur flottant. Le troisième alimente une ALU entière, sans circuit flottant dédié. [[File:Intel Core2 arch.svg|centre|vignette|upright=2.5|Intel Core 2 Duo - microarchitecture.]] Une conséquence de partager les ports d'émission est l'apparition de dépendances structurelles. Par exemple, imaginez qu'on connecte un multiplieur entier et la FPU, sur le même port d'émission. Il est alors impossible d'émettre une multiplication et une opération flottante en même temps. Mais la situation ne se présente que pour certaines combinaisons de micro-opérations bien précises, qui sont idéalement assez rares. De telles dépendances structurelles n'apparaissent que sur des programmes qui entremêlent instructions flottantes et entières, ce qui est assez rare. Les dépendances structurelles doivent cependant être prises en compte par les unités d'émission. Dans le même genre, il est possible de partager un port d'émission entre l'unité mémoire et une ALU entière. Cela permet d'utiliser l'ALU entière pour les calculs d'adresse, ce qui évite d'avoir à utiliser une unité de calcul d'adresse distincte. Un exemple est celui du processeur superscalaire double émission Power PC 440. Il dispose de deux ports d'émission. Le premier est connecté à une ALU entière et un circuit multiplieur, le second est relié à l'unité mémoire et une seconde ALU entière. L'organisation en question permet soit d'émettre un accès mémoire en même temps qu'une opération entière, soit d'émettre deux opérations entières simples, soit d’émettre une multiplication et une addition/soustraction/comparaison. Une organisation simple, mais très efficace ! [[File:PowerPC 440.png|centre|vignette|upright=2|Microarchitecture du PowerPC 440.]] ===Résumé=== Faisons un résumé rapide de cette section. Nous venons de voir que les différentes unités de calcul sont reliés à des ports d'émission, la répartition des ALU sur les ports d'émission étant très variable d'un processeur à l'autre. Entre les processeurs qui séparent les ports d'émission entier et flottant, ceux qui les mélangent, ceux qui séparent les ports d'émission mémoire des ports entiers et ceux qui les fusionnent, ceux qui autorisent l'émission multiple des micro-opérations mémoire ou flottante, il y a beaucoup de choix. Les divers choix possibles sont tous des compromis entre deux forces : réduire le nombre de ports d'émission d'un côté, garder de bonnes performances en limitant les dépendances structurelles de l'autre. Réduire le nombre de ports d'émission permet de garder des fenêtres d'instruction relativement simples. Plus elles ont de ports, plus elles consomment d'énergie, chauffent, sont lentes, et j'en passe. De plus, plus on émet de micro-opérations en même temps, plus la logique de détection des dépendances bouffe du circuit. Et cela a des conséquences sur la fréquence du processeur : à quoi bon augmenter le nombre de ports d'émission si c'est pour que ce soit compensé par une fréquence plus faible ? Par contre, regrouper plusieurs ALU sur un même port d'émission est à l'origine de dépendances structurelles. Impossible d'émettre deux micro-opérations sur deux ALU si elles sont sur le même port. Le nombre de ports peut être un facteur limitant pour la performance dans certaines situations de '''''port contention''''' où on a assez d'ALU pour exécuter N micro-opérations, mais où la répartition des ALUs sur les ports l’empêche. Suivant la répartition des ALU sur les ports, la perte de performance peut être légère ou importante, tout dépend des choix réalisés. Et les choix en question dépendent fortement de la répartition des instructions dans le programme exécuté. Le fait que certaines instructions sont plus fréquentes que d'autres, que certaines instructions sont rarement consécutives : tout cela guide ce choix de répartition des ALu sur les ports. ==Le contournement sur les processeurs superscalaires== Pour rappel, la technique du contournement (''register bypass'') permet au résultat d'une instruction d'être immédiatement utilisable en sortie de l'ALU, avant même d'être enregistré dans les registres. Implémenter la technique du contournement demande d'utiliser des multiplexeurs pour relier la sortie de l'unité de calcul sur son entrée si besoin. il faut aussi des comparateurs pour détecter des dépendances de données. [[File:Pipeline Bypass.png|centre|vignette|upright=1|Pipeline Bypass]] ===Les problèmes du contournement sur les CPU avec beaucoup d'ALUs=== Avec plusieurs unités de calcul, la sortie de chaque ALU doit être reliée aux entrées de toutes les autres, avec les comparateurs qui vont avec ! Sur les processeurs ayant plusieurs d'unités de calculs, cela demande beaucoup de circuits. Pour N unités de calcul, cela demande 2 * N² interconnexions, implémentées avec 2N multiplexeurs de N entrées chacun. Si c'est faisable pour 2 ou 3 ALUs, la solution est impraticable sur les processeurs modernes, qui ont facilement une dizaine d'unité de calcul. De plus, la complexité du réseau de contournement (l'ensemble des interconnexions entre ALU) a un cout en terme de rapidité du processeur. Plus il est complexe, plus les données contournées traversent de longs fils, plus leur temps de trajet est long, plus la fréquence du processeur en prend un coup. Diverses techniques permettent de limiter la casse, comme l'usage d'un bus de contournement, mais elle est assez impraticable avec beaucoup d'unités de calcul. Notez que cela vaut pour les processeurs superscalaires, mais aussi pour tout processeur avec beaucoup d'unités de calcul. Un simple CPU à exécution dans le désordre, non-superscalaire, a souvent pas mal d'unités de calcul et fait face au même problème. En théorie, un processeur sans exécution dans le désordre ou superscalarité pourrait avoir le problème. Mais en pratique, avoir une dizaine d'ALU implique processeur superscalaire à exécution dans le désordre. D'où le fait qu'on parle du problème maintenant. La seule solution praticable est de ne pas relier toutes les unités de calcul ensemble. À la place, on préfère regrouper les unités de calcul dans différents '''agglomérats''' ('''cluster'''). Le contournement est alors possible entre les unités d'un même agglomérat, mais pas entre agglomérats différents. Généralement, cela arrive pour les unités de calcul entières, mais pas pour les unités flottantes. La raison est que les CPU ont souvent beaucoup d'unités de calcul entières, car les instructions entières sont légion, alors que les instructions flottantes sont plus rares et demandent au mieux une FPU simple. Évidemment, l'usage d'agglomérats fait que certaines possibilités de contournement sont perdues, avec la perte de performance qui va avec. Mais la perte en possibilités de contournement vaut bien le gain en fréquence et le cout en circuit/fils réduit. C'est un bon compromis, ce qui explique que presque tous les processeurs modernes l'utilisent. Les rares exceptions sont les processeurs POWER 4 et POWER 5, qui ont préféré se passer de contournement pour garder un processeur très simple et une fréquence élevée. ===Les bancs de registre sont aussi adaptés pour le contournement=== L'usage d'agglomérats peut aussi prendre en compte les interconnections entre unités de calcul et registres. C'est-à-dire que les registres peuvent être agglomérés. Et cela peut se faire de plusieurs façons différentes. Une première solution, déjà vue dans les chapitres sur la micro-architecture d'un processeur, consiste à découper le banc de registres en plusieurs bancs de registres plus petits. Il faut juste prévoir un réseau d'interconnexions pour échanger des données entre bancs de registres. Dans la plupart des cas, cette séparation est invisible du point de vue de l'assembleur et du langage machine. Le processeur se charge de transférer les données entre bancs de registres suivant les besoins. Sur d'autres processeurs, les transferts de données se font via une instruction spéciale, souvent appelée ''COPY''. [[File:Banc de registres distribué.png|centre|vignette|upright=2|Banc de registres distribué.]] Sur de certains processeurs, un branchement est exécuté par une unité de calcul spécialisée. Or les registres à lire pour déterminer l'adresse de destination du branchement ne sont pas forcément dans le même agglomérat que cette unité de calcul. Pour éviter cela, certains processeurs disposent d'une unité de calcul des branchements dans chaque agglomérat. Dans les cas où plusieurs unités veulent modifier le ''program counter'' en même temps, un système de contrôle général décide quelle unité a la priorité sur les autres. Mais d'autres processeurs fonctionnent autrement : seul un agglomérat possède une unité de branchement, qui peut recevoir des résultats de tests de toutes les autres unités de calcul, quel que soit l’agglomérat. Une autre solution duplique le banc de registres en plusieurs exemplaires qui contiennent exactement les mêmes données, mais avec moins de ports de lecture/écriture. Un exemple est celui des processeurs POWER, Alpha 21264 et Alpha 21464. Sur ces processeurs, le banc de registre est dupliqué en plusieurs exemplaires, qui contiennent exactement les mêmes données. Les lectures en RAM et les résultats des opérations sont envoyées à tous les bancs de registres, afin de garantir que leur contenu est identique. Le banc de registre est dupliqué en autant d'exemplaires qu'il y a d'agglomérats. Chaque exemplaire a exactement deux ports de lecture, une par opérande, au lieu de plusieurs dizaines. La conception du processeur est simplifiée, que ce soit au niveau du câblage, que de la conception des bancs de registres. ==Les optimisations de la pile d'appel : le ''stack engine''== Les processeurs modernes intègrent une optimisation liée au pointeur de pile. Pour rappel, sur les architectures modernes, le pointeur de pile est un registre utilisé pour gérer la pile d'appel, précisément pour savoir où se trouve le sommet de la pile. Il est manipulé par les instructions CALL, RET, PUSH et POP, mais aussi par les instructions d'addition/soustraction pour gérer des cadres de pile de taille variable. De plus, il peut servir d'opérande pour des instructions LOAD/STORE, afin de lire/écrire des variables locales, les arguments d'une fonction, et autres. C'est donc un registre général adressable, intégré au banc de registre, altéré par l'unité de calcul entière. L'incrémentation/décrémentation du pointeur de pile passe donc par l'unité de calcul, lors des instructions CALL, RET, PUSH et POP. Mais, l'optimisation que nous allons voir permet d'incrémenter/décrémenter le pointeur de pile sans passer par l'ALU, ou presque. L'idée est de s'inspirer des architectures avec une pile d'adresse de retour, qui intègrent le pointeur de pile dans le séquenceur et l'incrémentent avec un incrémenteur dédié. ===Le ''stack engine''=== L'optimisation que nous allons voir utilise un '''''stack engine''''' intégré à l'unité de contrôle, au séquenceur. Le processeur contient toujours un pointeur de pile dans le banc de registre, cela ne change pas. Par contre, il n'est pas incrémenté/décrémenté à chaque instruction CALL, RET, PUSH, POP. Un compteur intégré au séquenceur est incrémenté à la place, nous l’appellerons le '''compteur delta'''. La vraie valeur du pointeur de pile s'obtient en additionnant le compteur delta avec le registre dans le banc de registre. Précisons que si le compteur delta vaut zéro, la vraie valeur est dans le banc de registre et peut s'utiliser telle quelle. Lorsqu'une instruction ADD/SUB/LOAD/STORE utilise le pointeur de pile comme opérande, elle a besoin de la vraie valeur. Si elle n'est pas dans le banc de registre, le séquenceur déclenche l'addition compteur-registre pour calculer la vraie valeur. Finalement, le banc de registre contient alors la bonne valeur et l'instruction peut s'exécuter sans encombre. L'idée est que le pointeur de pile est généralement altéré par une série d'instruction PUSH/POP consécutives, puis des instructions LOAD/STORE/ADD/SUB utilisent le pointeur de pile final comme opérande. En clair, une bonne partie des incrémentations/décrémentation est accumulée dans le compteur delta, puis la vraie valeur est calculée une fois pour toutes et est utilisée comme opérande. On accumule un delta dans le compteur delta, et ce compteur delta est additionné quand nécessaire. Précisons que le compteur delta est placé juste après le décodeur d'instruction, avant même le cache de micro-opération, l'unité de renommage et l'unité d'émission. Ainsi, les incrémentations/décrémentations du pointeur de pile disparaissent dès l'unité de décodage. Elles ne prennent pas de place dans le cache de micro-opération, ni dans la fenêtre d'instruction, ni dans la suite du pipeline. De nombreuses ressources sont économisées dans le ''front-end''. Mais utiliser un ''stack engine'' a aussi de nombreux avantages au niveau du chemin de données/''back-end''. Déjà, sur les processeurs à exécution dans le désordre, cela libère une unité de calcul qui peut être utilisée pour faire d'autres calculs. Ensuite, le compteur delta mémorise un delta assez court, de 8 bits sur le processeur Pentium M, un peu plus pour les suivants. L'incrémentation se fait donc via un incrémenteur 8 bits, pas une grosse ALU 32/64 bits. Il y a un gain en termes de consommation d'énergie, un incrémenteur 8 bits étant moins gourmand qu'une grosse ALU 32/64 bits. ===Les points de synchronisation du delta=== La technique ne fonctionne que si la vraie valeur du pointeur de pile est calculée au bon moment, avant chaque utilisation pertinente. Il y a donc des '''points de synchronisation''' qui forcent le calcul de la vraie valeur. Plus haut, nous avions dit que c'était à chaque fois qu'une instruction adresse le pointeur de pile explicitement, qui l'utilise comme opérande. Les instructions CALL, RET, PUSH et POP ne sont pas concernées par elles utilisent le pointeur de pile de manière implicite et ne font que l'incrémenter/décrémenter. Mais dans les faits, c'est plus compliqué. D'autres situations peuvent forcer une synchronisation, notamment un débordement du compteur delta. Le compteur delta est généralement un compteur de 8 bits, ce qui fait qu'il peut déborder. En cas de débordement du compteur, le séquenceur déclenche le calcul de la vraie valeur, puis réinitialise le compteur delta. La vraie valeur est donc calculée en avance dans ce cas précis. Précisons qu'un compteur delta de 8 bits permet de gérer environ 30 instructions PUSH/POP consécutives, ce qui rend les débordements de compteur delta assez peu fréquent. A noter que si le compteur delta vaut zéro, il n'y a pas besoin de calculer la vraie valeur, le séquenceur prend cette situation en compte. Un autre point de synchronisation est celui des interruptions et exceptions matérielles. Il faut que le compteur delta soit sauvegardé lors d'une interruption et restauré quand elle se termine. Idem lors d'une commutation de contexte, quand on passe d'un programme à un autre. Pour cela, le processeur peut déclencher le calcul de la vraie valeur lors d'une interruption, avant de sauvegarder les registres. Pour cela, le processeur intègre un mécanisme de sauvegarde automatique, qui mémorise la valeur de ce compteur dans le tampon de réordonnancement, pour forcer le calcul de la vraie valeur en cas de problème. La technique du ''stack engine'' est apparue sur les processeurs Pentium M d'Intel et les processeurs K10 d'AMD, et a été conservée sur tous les modèles ultérieurs. L'implémentation est cependant différente selon les processeurs, bien qu'on n'en connaisse pas les détails et que l'on doive se contenter des résultats de micro-benchmarks et des détails fournit par Intel et AMD. Selon certaines sources, dont les manuels d'optimisation d'Agner Fog, les processeurs AMD auraient moins de points de synchronisation que les processeurs Intel. De plus, leur ''stack engine'' serait placé plus loin que prévu dans le pipeline, après la file de micro-opération. ==Un étude des microarchitectures superscalaires x86 d'Intel== Après avoir vu beaucoup de théorie, voyons maintenant comment les microarchitectures Intel et AMD ont implémenté l'exécution superscalaire. Nous allons nous concentrer sur les processeurs Intel pour une raison simple : il y a plus de schémas disponibles sur wikicommons, ce qui me facilite le travail. ===Les processeurs Atom d'Intel, de microarchitecture Bonnell=== Les processeurs Atom sont des processeurs basse consommation produits et conçus par Intel. Il regroupent des processeurs de microarchitecture très différentes. La toute première microarchitecture ATOM était la microarchitecture Bonnell, qui est de loin la plus simple à étudier. Il s'agissait de processeurs sans exécution dans le désordre, sans renommage de registres. De nos jours, de tels processeurs ont disparus, même pour les processeurs basse consommation, mais les premiers processeurs Atom étaient dans ce cas. Mais le processeur était superscalaire et pouvait émettre deux instructions simultanées. Son pipeline faisait 16 étages, ce qui est beaucoup. L'architecture est assez simple. Premièrement, le cache d'instruction permet de lire 8 octets par cycle, qui sont placés dans une file d'instruction. La file d'instruction est alors reliée à deux décodeurs, ce qui permet de décoder deux instructions en même temps. Le fait que les décodeurs lisent les instructions depuis une file d'instruction fait que les deux instructions décodées ne sont pas forcément consécutives en mémoire RAM. Par exemple, l'Atom peut décoder un branchement prédit comme pris, suivi par l'instruction de destination du branchement. Les deux instructions ont été chargées dans la file d'instruction et sont consécutifs dedans, alors qu'elles ne sont pas consécutives en mémoire RAM. Les deux décodeurs alimentent une file de micro-opérations de petite taille : 32 µops maximum, 16 par ''thread'' si le ''multithreading'' matériel est activé. La majorité des instructions x86 sont décodées en une seule micro-opération, y compris les instructions ''load-up''. Le chemin de données est conçu pour exécuter les instruction ''load-up'' nativement, en une seule micro-opération. Le microcode n'est utilisé que pour une extrême minorité d'instructions et est à part des deux décodeurs précédents. L'avantage est que cela permet d'utiliser au mieux la file de micro-opération, qui est de petite taille. La file de micro-opérations est suivie par deux ports d'exécution, avec chacun leur logique d'émission. Les deux ports peuvent émettre au maximum 2 µops par cycle. Le résultat est que deux instructions consécutives peuvent s'exécuter, chacune dans deux avals séparés, dans deux pipelines différents. Les conditions pour cela sont cependant drastiques. Les deux instructions ne doivent pas avoir de dépendances de registres, à quelques exceptions près liées au registre d'état. Le multithreading matériel doit aussi être désactivé. Les deux instructions doivent aller chacun dans un port différent, et cela tient en compte du fait que les deux ports sont reliés à des unités de calcul fort différentes. Le tout est illustré ci-dessous. [[File:Intel Atom Microarchitecture.png|centre|vignette|upright=2.5|Intel Atom Microarchitecture]] Les deux ports sont capables de faire des additions/soustractions, des opérations bit à bit et des copies entre registres. Pour cela, ils ont chacun une ALU simple dédiée. Mais cela s'arrête là. Le second port est optimisé pour les opérations de type ''load-up''. Il contient toute la machinerie pour faire les accès mémoire, notamment des unités de calcul d'adresse et un cache L1 de données. A la suite du cache, se trouvent une ALU entière simple, un ''barrel shifter'', et un circuit multiplieur/diviseur. Le circuit multiplieur/diviseur est utilisé à la fois pour les opérations flottantes et entières. Le premier port permet d’exécuter des opérations entières simples, une addition flottante, des comparaisons/branchements, ou une instruction de calcul d'adresse LEA. Comme on le voit, la séparation entre les deux pipelines est assez complexe. Il ne s'agit pas du cas simple avec un pipeline entier et un pipeline flottant séparés. En réalité, il y a deux pipelines, chacun capables de faire des opérations entières et flottantes, mais pas les mêmes opérations. Et cette organisation difficile à comprendre est en réalité très efficace, très économe en circuit, tout en gardant une performance intéressante. Les instructions simples, ADD/SUB/bitwise sont supportées dans les deux pipelines. Il faut dire que ce sont des opérations courantes qu'il vaut mieux optimiser au mieux. Les opérations plus complexes, à savoir les multiplications/divisions/décalages/rotations/manipulations de bit sont supportées dans un seul pipeline. La raison est qu'il est rare que de telles opérations soient consécutives, et qu'il n'est donc pas utile d'optimiser pour cette situation. Si les deux pipelines devaient supporter ces opérations, cela demanderait de dupliquer les circuits multiplieurs/diviseur, ce qui aurait un cout en circuit important pour un gain en performance assez faible. ===Le Pentium 1/MMX et les pipelines U/V=== Le processeur Pentium d'Intel avait un pipeline de 5 étages : un étage de chargement/prédiction de branchement, deux étages de décodage, un étage d'exécution et un dernier étage pour l'écriture dans les registres. Chose étonnante pour un processeur superscalaire, il n'utilisait pas de renommage de registre ni d’exécution dans le désordre. Vous avez bien lu : la superscalarité est apparue dans les processeurs commerciaux avant l'exécution dans le désordre. Le Pentium 1 était un processeur à double émission, qui disposait de deux pipelines nommés U et V. On pouvait en tirer parti lorsque deux instructions consécutives pouvaient être exécutées en parallèles, si elles n'avaient pas de dépendances. Chose peu courante, les deux pipelines n'étaient pas identiques. Le pipeline U pouvait exécuter toutes les instructions, mais le pipeline V était beaucoup plus limité. Par exemple, seul le pipeline U peut faire des calculs flottants, le pipeline V ne fait que des calculs entiers et des branchements. L'unité flottante était sur le port d'émission du pipeline U, idem pour l'unité de calcul vectoriel MMX sur le Pentium MMX. Les deux pipelines disposaient d'une unité de calcul entière identiques dans les deux pipelines. Le pipeline U incorporait un circuit multiplieur/diviseur et un ''barrel shifter'' pour les décalages/rotations. Les deux pipelines avaient chacun uen unité de calcul d'adresse, mais elle n'étaient pas identique : celle du pipeline V ne gérait que l’instruction LEA, celle du pipeline U gérait tous les calculs d'adresse. La FPU était dans le pipeline U, de même que l'unité MMX. {|class="wikitable" |- ! Pipeline U ! Pipeline V |- | colspan="2" | ALU simple (une par pipeline) |- | Multiplieur/diviseur | |- | ''Barrel Shifter'' | |- | AGU complexe | AGU simple (opération LEA) |- | FPU | |- | Unité SIMD | |} Les deux ALU géraient les opérations bit à bit, les additions et soustractions, et les comparaisons (qui sont des soustractions déguisées). En conséquence, les instructions suivantes étaient exécutables dans les deux pipelines, ce qui fait qu'on pouvait en faire deux en même temps : * l'instruction MOV, dépend du mode d'adressage ; * les instructions de gestion de la pile PUSH et POP, dépend du mode d'adressage ; * Les instructions arithmétiques INC, DEC, ADD, SUB ; * l'instruction de comparaison CMP ; * les instructions bit à bit AND, OR, XOR ; * l'instruction de calcul d'adresse LEA ; * l'instruction NOP, qui ne fait rien. Les instructions suivantes sont exécutables seulement dans le pipeline U : les calculs d'adresse autres que LEA, les décalages et rotations, la multiplication et la division, les opérations flottantes. Il faut noter qu'il y a cependant quelques restrictions. Par exemple, si le pipeline U exécute une multiplication ou une division, le processeur ne peut pas exécuter une opération dans le pipeline V en parallèle. Dans le même genre, les branchements sont exécutables dans les deux pipelines, mais on ne peut exécuter une autre opération en parallèle qu'à la condition que le branchement soit exécuté dans le pipeline V. [[File:Intel Pentium arch.svg|centre|vignette|upright=2.5|Microarchitecture de l'Intel Pentium MMX. On voit que certaines unités de calcul sont dupliquées.]] ===La microarchitecture P6 du Pentium 2/3=== La microachitecture suivante, nommée P6, était une microarchitecture plus élaborée. Le pipeline faisait 12 étages, dont seuls les trois derniers correspondent au chemin de données. Il s'agissait du premier processeur à exécution dans le désordre de la marque, avec une implémentation basée sur des stations de réservation. Il gérait aussi le renommage de registre, avec un renommage de registre dans le ROB, commandé par une table d'alias. [[File:Intel Pentium Pro Microarchitecture Block Diagram.svg|centre|vignette|upright=2|Intel Pentium Pro Microarchitecture Block Diagram]] Le décodage des instructions x86 était géré par plusieurs décodeurs. Il y avait trois décodeurs : deux décodeurs simples, et un décodeur complexe. Les décodeurs simples décodaient les instructions les plus fréquentes, mais aussi les plus simples. Les instructions CISC complexes étaient gérées uniquement par le décodeur complexe, basé sur un microcode. Le processeur était à doubvle émission, du fait que les deux décodeurs simples faisaient le gros du travail, et passaient la main au décodeur microcodé quand aucune instruction ne leur était attribué. Les stations de réservations étaient regroupées dans une structure centralisée, en sortie de l'unité de renommage. Elles avaient 5 ports d'émission, qui étaient sous-utilisés en pratique. Niveau ALU, on trouve deux ALUs entières, une flottante, une unité pour les instructions SSE et autres, et trois unités pour les accès mémoire (regroupées en une seule unité dans le schéma ci-dessous). Les unités mémoire regroupent une unité de calcul d'adresse pour les lectures, une autre pour les écritures, et une unité pour la gestion des données à écrire. Les unités de calcul d'adresse sont des additionneurs à 4 opérandes, complétement différents des ALU entières. Les ALU entières sont deux unités asymétriques : une ALU simple, et une ALU complexe incorporant un multiplieur. Les deux peuvent exécuter des opérations d'addition, soustraction, comparaison, etc. [[File:P6 func diag.png|centre|vignette|upright=2|P6 func diag]] ===La microarchitecture Netburst du Pentium 4=== La microarchitecture Netburst, utilisée sur le Pentium 4, utilisait un pipeline à 20 étage, augmenté à 32 sur une révision ultérieure. Il a existé quatre révisions de l'architecture : Willamette (180 nm), Northwood (130 nm), Prescott (90 nm) et Cedar Mill (65 nm). Les deux premières avaient un pipeline de 20 étages, les deux suivants avaient 32 étages ! Le grand nombre d'étages permettait d'avoir une fréquence très élevée, mais posait de nombreux problèmes. Vider le pipeline était très long et il fallait une prédiction de branchement au top pour réduire l'impact des mauvaises prédictions. L'unité de prédiction de branchement était une des plus élvoluées pour l'époque. Pour l'époque. Il dispose d'un cache de trace et a été le seul processeur commercial à en utiliser un. Niveau décodeurs, on retrouve le décodeur lent à base de microcode présent sur les anciennes versions, couplé à un décodeur simple. L'unité de renomage utilise une table d'alias. Le renommage de registres se fait avec un banc de registres physiques. Vous pouvez remarquer dans le schéma suivant la présence de deux files de micro-opérations : une pour les accès mémoire, l'autre pour les autres opérations. Il s'agit bel et bien de deux files d'instructions, pas de fenêtres d'instruction ni de stations de réservation. Niveau ports d'émission, il y a quatre ports. Un pour les lectures mémoire, un pour les écriture mémoire, et deux autres qui mélangent FPU et ALUs. Le premier port est relié à une ALU complexe et une FPU spécialisée dans les MOV flottants. Le second port est relié à tout le reste : ALU basique ''barrel shifter'', FPU. Fait amusant, les ALU entières étaient cadencées à une fréquence double de celle du processeur, ce qui fait que les files d'émissionsont aussi censées l'être, de même que les ''scoreboard''. Sauf qu'en réalité, les circuits étaient dupliqués : l'un allait à une fréquence double, l'autre allait à la fréquence normale. [[File:Architettura Pentium 4.png|centre|vignette|upright=3|Microarchitecture du Pentium 4.]] ==Un étude des microarchitectures superscalaires x86 d'AMD== Les architectures AMD ont beaucoup évoluées avec le temps. Dans ce qui va suivre, nous allons les voir dans l'ordre chronologique, en partant de l'architecture K5, pour arriver aux dernières architectures Zen. Nous allons voir que les architectures AMD ont évoluées progressivement, chacune améliorant la précédente en faisant des rajouts ou modifications mineures, à l'exception de quelques grandes cassures dans la continuité où AMD a revu sa copie de fond en comble. L'architecture Bulldozer a été une première cassure, suivie par l'introduction des architectures Zen. Étudier ces architectures demande de voir trois choses séparément : le ''front-end'' qui regroupe l'unité de chargement et les décodeurs, le ''back-end'' qui gère l'exécution dans le désordre et les unités de calcul, et le sous-système mémoire avec les caches et la ''Load Store Queue''. Leur étude sera plus ou moins séparée dans ce qui suit, pour chaque classe d'architecture. ===La première génération de CPU AMD : les architectures K5, K6, K7, K8 et K10=== La première génération de processeurs AMD est celle des architectures K5, K6, K7, K8 et K10. Il n'y a pas de K9, qui a été abandonné en cours de développement. Les processeurs K5 et K6 portent ce nom au niveau commercial. Par contre, les processeurs d'architecture K7 sont aussi connus sous le nom d''''AMD Athlon''', les AMD K8 sont connus sous le nom d''''AMD Athlon 64''', et les architecture K10 sont appelées les '''AMD Phenom'''. Comme le nom l'indique, l'architecture K8 a introduit le 64 bits chez les processeurs AMD. Elles ont une architecture assez similaire pour ce qui est du chargement et des caches. Toutes disposent d'au minimum un cache L1 d'instruction et d'un cache L1 de données. Le K5 n'avait que ces caches, mais un cache L2 a été ajouté avec le K7, puis un L3 avec le K10. L'AMD K5 avait une TLB unique, mais les processeurs suivants avaient une TLB pour le L1 d'instruction et une autre pour le L1 de données. Idem pour le cache L2, avec deux TLB : une pour les données, une pour les instructions. Les caches L1/L2 sont de type exclusifs, à savoir que les données dans le L1 ne sont pas recopiées dans le L2. Le cache L2 est précisément un cache de victime, qui mémorise les données/instructions, évincées des caches L1 lors du remplacement des lignes de cache. L'introduction du cache L2 a entrainé l'ajout de deux TLB de second niveau : une L2 TLB pour les données et une autre pour les instructions. Les architectures K8 et K10 ont ajouté un cache L3, avec un accès indirect à travers l'interface avec le bus. : L'AMD K7 originel, aussi appelée Athlon classique, n'avait pas de cache L2, mais celui-ci était placé sur la carte mère et fonctionnait à une fréquence moitié moindre de celle du CPU. L'Athlon Thunderbird, puis l'Athlon XP, ont intégré le cache L2 dans le processeur. {|class="wikitable" |- ! Architecture AMD ! colspan="5" | Caches |- | rowspan="2" | K5 | L1 instruction || L1 données || colspan="3" | |- | colspan="2" | TLB unique || colspan="3" | |- | colspan="4" | |- | rowspan="2" | K6 | L1 instruction || L1 données || colspan="3" | L2 unifié |- | TLB L1 instruction || TLB L1 données || colspan="3" | |- | colspan="6" | |- | rowspan="2" | K7, K8 | L1 instruction || L1 données || colspan="2" | L2 unifié || |- | TLB L1 instruction || TLB L1 données || TLB L2 instruction || TLB L2 données || |- | colspan="6" | |- | rowspan="2" | K10 | L1 instruction || L1 données || colspan="2" | L2 unifié || L3 |- | TLB L1 instruction || TLB L1 données || TLB L2 instruction || TLB L2 données || |} Fait important, les architectures K5 à K10 utilisent la technique du '''prédécodage''', où les instructions sont partiellement décodées avant d'entrer dans le cache d'instruction. Le prédécodage facilite grandement le travail des décodeurs d'instruction proprement dit. Par contre, le prédécodage prend de la place dans le cache L1 d'instruction, une partie de sa capacité est utilisé pour mémoriser les informations prédécodées. C'est donc un compromis entre taille du cache et taille/rapidité des décodeurs d'instruction. Sur les architectures K5 et K6, le prédécodage précise, pour chaque octet, si c'est le début ou la fin d'une instruction, si c'est un octet d'opcode, en combien de micro-opérations sera décodée l'instruction, etc. A partir de l'AMD K7, le prédécodage reconnait les branchements inconditionnels. Lorsqu'un branchement inconditionnel est pré-décodé, le pré-décodage tient compte du branchement et continue le pré-décodage des instructions à partir de la destination du branchement. Le système de prédécodage est abandonnée à partir de l'architecture Bulldozer, qui suit l'architecture K10. La prédiction de branchement de ces CPU tire partie de ce système de pré-décodage, à savoir que les prédictions de branchement sont partiellement mémorisées dans les lignes de cache du L1 d'instruction. Par exemple, l'AMD K5 se passe de ''Branch Target Buffer'' grâce à cela. Si une ligne de cache contient un branchement, elle mémorise l'adresse de destination de ce branchement, en plus des bits de pré-décodage. Si il y a plusieurs branchements dans une ligne de cache, c'est l'adresse de destination du premier branchement pris dans cette ligne de cache qui est mémoirsée. Un défaut de cette approche est que si le branchement n'est pas dans le L1 d'instruction, aucune prédiction de branchement ne peut être faite et le préchargement ne peut pas fonctionner. C'est une limitation que n'ont pas les BTB découplées du cache L1 : elles peuvent prédire un branchement qui a été évincé dans le L2 ou le L3, tant que l'entrée associée est dans le BTB. Les prédictions peuvent même servir à précharger les instructions utiles. [[File:Comparaison du chargement de l'AMD K5 et K6.png|centre|vignette|upright=2|Comparaison du chargement de l'AMD K5 et K6]] Au niveau du décodage, on trouve de nombreuses différences entre les premières architectures AMD. L'AMD K5 contient 4 décodeurs hybrides, afin de décoder 4 instructions par cycles. Le K5 a quatre décodeurs simples couplés à 4 décodeurs complexes avec chacun un accès au micro-code. Une instruction peut donc passer par a donc deux voies de décodage : un décodage rapide et simple pour les instructions simples, un décodage lent et passant par le microcode pour les instructions complexes. Pour décoder 4 instructions, les deux voies sont dupliquées en 4 exemplaires, ce qui a un cout en circuits non-négligeable. L'AMD K6 utilise moins de décodeurs et ne peut que décoder deux instructions à la fois maximum. Par contre, il fournit en sortie 4 micro-opérations. Il intègre pour cela deux décodeurs simples, un décodeur complexe et un décodeur micro-codé. Un décodeur simple transforme une instruction simple en une ou deux micro-opérations. Il est possible d'utiliser les deux décodeurs simples en même temps, afin de fournir 4 micro-opérations en sortie du décodeur. Les deux autres décodent une instruction complexe en 1 à 4 micro-opérations. Si jamais la ou les deux instructions sont décodées en 1, 2 ou 3 micro-opérations, les micro-opérations manquantes pour atteindre 4 sont remplies par des NOPs. Pour le K7 et au-delà, le processeur dispose de décodeurs séparées pour les instructions micro-codées de celles qui ne le sont pas. Le processeur peut décoder jusqu’à 3 instructions par cycle. Le décodage d'une instruction microcodée ne peut pas se faire en parallèle du décodage non-microcodé. C'est soit le décodeur microcodé qui est utilisé, soit les décodeurs câblés, pas les deux en même temps. Le décodage d'une instruction prend 4 cycles. Les instructions non-microcodées sont décodées en une seule micro-opération, à un détail près : le CPU optimise la prise en charge des instructions ''load-up''. La différence entre le K6 et le K7 s'explique par des optimisations des instructions ''load-up''. Sur le K6, les instructions ''load-up'' sont décodées en deux micro-opération : la lecture en RAM, l'opération proprement dite. Mais sur le K7, une instruction ''load-up'' est décodée en une seule micro-opération. En conséquence, les décodeurs simples sont fortement simplifiés et le décodeur complexe disparait au profit d'un microcode unique. [[File:Décodage sur le K5 et le K5.png|centre|vignette|upright=3|Décodage sur le K5 et le K5]] ====Les microarchitectures K5 et K6 d'AMD==== Les deux premières architectures étaient les architectures K5 et K6, l'architecture K6 ayant été déclinée en quatre versions, nommées K6-1, K6-2, et K-3, avec une version K6-3 bis. Elles sont regroupées ensemble car elles ont beaucoup de points communs. Par exemple, tout ce qui a trait au chargement et au cache était similaire, de même que les unités de calcul. Les deux architectures avaient n'avaient pas de cache L2 et devaient se contenter d'un cache L1 d'instruction et d'un cache L1 de données. L'AMD K5 incorpore une TLB unique, alors que le K6 utilise des TLB séparées pour le cache d'instruction et le cache de données. Une différence entre l'architecture K5 et K6 est que la première utilise des caches normaux, alors que la seconde utilise des ''sector caches''. Les deux architectures disposaient des unités de calcul suivantes : deux ALU entières, une FPU, deux unités LOAD/STORE pour les accès mémoire, une unité de branchement et une ou plusieurs unités SIMD. Une organisation classique, donc. Pour les unités entières, il y avait deux ALU simples, un ''barrel shifter'' et un diviseur. Il n'y a pas d'erreur, le processeur incorpore un circuit diviseur, mais pas de circuit multiplieur. La raison est que la multiplication est réalisée par la FPU ! En effet, le multiplieur flottant de la FPU intègre un multiplieur entier pour multiplier les mantisses, qui est utilisé pour les multiplications entières. La même technique a été utilisée sur l'Atom, comme vu plus haut. Le tout était alimenté par deux ports d'émission, appelés ports X et Y. Sur l'architecture K5, le ''barrel shifter'' et le diviseur sont des ports différents. {|class="wikitable" |+ AMD K5 |- ! Port X ! Port Y |- | ALU simple | ALU simple |- | ''Barrel Shifter'' | Diviseur |} Sur l'architecture K6, le ''barrel shifter'' et le diviseur sont sur le même port. {|class="wikitable" |+ AMD K6 |- ! Port X ! Port Y |- | ALU simple | ALU simple |- | | ''Barrel Shifter'' |- | | Diviseur |} Niveau unités mémoire, le K5 avait deux unités LOAD/STORE, chacune capable de faire lecture et écriture. Par contre, la ''store queue'' n'a qu'un seul port d'entrée, ce qui fait que le processeur peut seulement accepter une écriture par cycle. Le processeur peut donc émettre soit deux lectures simultanées, soit une lecture accompagnée d'une écriture. Impossible d'émettre deux écritures simultanées, ce qui est de toute façon très rare. L'architecture K6 utilise quant à elle une unité LOAD pour les lectures et une unité STORE pour les écritures. Ce qui permet de faire une lecture et une écriture par cycle, pas autre chose. Niveau unités SIMD, l'architecture K7 n'avait qu'une seule unité SIMD, placée sur le port d'émission X. L'architecture K8 ajouta une seconde unité SIMD, sur l'autre port d'émission entier. De plus, trois ALU SIMD ont été ajoutées : un décaleur MMX, une unité 3DNow!, une unité mixte MMX/3DNow. Elles sont reliées aux deux ports d'émission entier X et Y ! Elles ne sont pas représentées ci-dessous, par souci de simplicité. [[File:Unité de calcul des processeurs AMD K5 et K6.png|centre|vignette|upright=2|Unité de calcul des processeurs AMD K5 et K6. les unités sur la même colonnes sont reliées au même port d'émission.]] Si les unités de calcul et le chargement sont globalement les mêmes, les deux architectures se différencient sur l'exécution dans le désordre. L'AMD K5 utilise du renommage de registre dans le ROB avec des stations de réservation. Par contre, l'AMD K6 utilise une fenêtre d'instruction centralisée. De plus, son renommage de registre se fait avec un banc de registre physique. L'architecture AMD K5 utilisait de deux stations de réservation par unité de calcul, sauf pour les deux unités mémoire partageaient une station de réservation unique (deux fois plus grande). Les stations de réservation sont cependant mal nommées, vu que ce sont en réalité des mémoire FIFO. Une micro-opération n'est émise que si elle est la plus ancienne dans la FIFO/station de réservation. Le renommage de registres se faisait dans le tampon de ré-ordonnancement, il n'y avait pas encore de banc de registre physique. Le tampon de ré-ordonnancement faisait seulement 16 instructions. [[File:AMD K5.jpg|centre|vignette|upright=3|AMDK5 Diagramme.]] L'architecture K6 remplace les stations de réservations par une fenêtre d'instruction centralisée. Les 4 micro-opérations renommées sont écrites dans la fenêtre d'instruction par groupe de 4, NOP de ''padding'' inclus. La fenêtre d'instruction centralisé contient 24 micro-opérations, groupées en 6 groupes de 4 micro-opérations, avec potentiellement des NOP dedans suivant le résultat du décodage. L'avantage est que l'implémentation de la fenêtre d'instruction est simple. La fenêtre d'instruction centralisée permettait d'émettre 6 micro-opérations en même temps (une par unité de calcul/mémoire). Le renommage de registres se faisait dans le tampon de ré-ordonnancement, il n'y avait pas encore de banc de registre physique. Le processeur utilisait un renommage avec un banc de registre physique. Le banc de registre physique pour les entiers contenait 48 registres, dont 24 étaient des registres architecturaux et 24 étaient des registres renommés. Sur les 24 registres architecturaux, 16 avaient une fonction de ''scratchpad'' que les ''datasheets'' d'AMD ne détaillent pas, les 8 restants étaient les registres généraux EAX, EBX, etc. [[File:AMD K6 Little foot & Modl 6.png|centre|vignette|upright=3|AMD K6 original.]] ====Les microarchitectures K7, K8 et K10 d'AMD==== Les microarchitectures suivantes sont les architectures K7, K8 et K10. Les architectures K7, K8 et K10 sont assez similaires. La différence principale entre le K7 et le K8 est le support du 64 bits. Les apports du K10 sont la présence d'un cache L3, d'une unité de calcul supplémentaire et d'améliorations de la prédiction de branchement. La taille de certains caches a été augmentée, de même que la largeur de certaines interconnexions/bus. A partir du K7, le CPU optimise la prise en charge des instructions ''load-up''. Les instructions ''load-op'' sont appelées des macro-opérations dans la terminologie d'AMD, et aussi d'Intel. L'idée est que les instructions ''load-up'' sont décodées en micro-opérations intermédiaires. Elles sont propagées dans le pipeline comme étant une seule micro-opération, jusqu'à l'étage d'émission. Lors de l'émission, les instructions ''load-up'' sont scindées en deux micro-opérations : la lecture de l'opérande, puis l'opération proprement dite. Faire ainsi économise des ressources et optimise le remplissage du tampon de ré-ordonnancement, des fenêtres d'instructions, des stations de réservation, etc. Le tampon de réordonnancement est combiné avec divers circuits en charge de l'exécution dans le désordre, dans ce qui s'appelle l'''instruction control unit''. Il contient de 72 à, 84 instructions, qui sont regroupées en groupes de 3. Là encore, comme pour le K5 et le K6, le tampon de réordonnancement tient compte de la sortie des décodeurs. Les décodeurs fournissent toujours trois micro-opérations par cycle, quitte à remplir les vides par des NOP. Le tampon de réordonnancement reçoit les micro-opérations, NOP inclus, par groupes de 3, et est structuré autour de ces triplets de micro-opération, y compris en interne. Les architectures K7, K8 et K10 ont des unités de calcul très similaires. Concrètement, il y a trois ALU entières, trois unités de calcul d'adresse, et une FPU. Le processeur incorpore, aussi un multiplieur entier, relié sur le port d'émission de la première ALU. La FPU regroupe un additionneur flottant, un multiplieur flottant, et une troisième unité LOAD/STORE pour les lectures/écritures pour les nombres flottants. L'architecture K8 ajoute une unité de manipulation de bit, la K10 un diviseur entier. [[File:Unité de calcul des processeurs AMD K7, K8 et K10.png|centre|vignette|upright=2|Unité de calcul des processeurs AMD K7, K8 et K10]] Par contre, la manière d'alimenter ces ALU en micro-opérations varie un petit peu entre les architectures K7, K8 et K10. Il y a cependant quelques constantes entre les trois. La première est qu'il y a une fenêtre d'instruction séparée pour les flottants, de 36 à 42 entrées, avec renommage de registre. La fenêtre d'instruction flottante a trois ports d'émission : un pour l'additionneur flottant, un autre pour le multiplieur, et un troisième pour la troisième unité flottante qui s'occupe du reste. La seconde est que chaque ALU entière est couplée avec une unité de calcul d'adresse. Par contre, la méthode de couplage varie d'un processeur à l'autre. L'architecture K7 des processeurs Athlon utilisait le renommage de registre, mais seulement pour les registres flottants, pas pour les registres entiers. Elle avait deux fenêtres d'instruction : une pour les opérations flottantes, une autre pour les instructions entières et les accès mémoire. La fenêtre d'instruction entière pouvait émettre trois micro-opérations en même temps : trois micro-opérations entières, trois micro-opération mémoire. La fenêtre d'instruction entière contenait 5 à 6 groupes de 3 macro-opérations. Vous noterez que j'ai parlé de macro-opérations et pas de micro-opérations, car les instructions ''load-up'' sont considérées comme une seule "micro-opération" dans la fenêtre d'instruction entière. Et cela se marie bien avec une fenêtre d'instruction unique partagée entre pipeline entier et pipeline mémoire. Une macro-opération était scindée en deux micro-opérations : une micro-opération mémoire et une micro-opération entière. Il est donc avantageux de regrouper unités mémoire et unités entières à la même fenêtre d'instruction pour ce faire. La ''Load-Store Queue'' peut mémoriser 44 lectures/écritures, avec cependant une petite nuance. Parmi les 44 lectures/écritures, 12 sont réservées au cache L1 et 32 le sont pour le cache L2. En réalité, il y a deux ''LSQ'', une pour le cache L1 qui fait 12 entrées, une seconde pour le L2 qui fait 32 entrées. [[File:Athlon arch.png|centre|vignette|upright=3|Microarchitecture K7 d'AMD.]] Les architectures K8 et K10 utilisent le renommage de registres pour tous les registres, entiers comme flottants. Par contre, le renommage de registre n'est pas réalisé de la même manière pour les registres entiers et flottants. Les registres entiers sont renommés dans le tampon de ré-ordonnancement, comme c'était le cas sur les architectures Intel avant le Pentium 4. Par contre, les registres flottants sont renommés grâce à un banc de registre physique. Le K8 est donc un processeur au renommage hybride, qui utilise les deux solutions de renommage principales. Niveau micro-opérations entières, la station de réservation unique de 15 micro-opérations est remplacée par trois stations de réservations, une par ALU entière, de 8 micro-opérations chacune. Chaque station de réservation entière alimente une unité de calcul entière et une unité de calcul d'adresse. Le multiplieur est relié à la première station de réservation, sur le même port d'émission que l'ALU. Les stations de réservation sont nommées des ''schedulers'' dans les schémas qui suivent. [[File:AMD Grayhound microarchitecture.png|centre|vignette|upright=3|Microarchitecture K8 et K10 d'AMD.]] La microarchitecture K10 a été déclinée en plusieurs versions, nommées Grayhound, Grayhound+ et Husky, Husky étant une architecture gravée en 32 nm dédiée aux processeurs A-3000. L'architecture Grayhound a plus de cache et un ROB plus grand, la Husky est quand à elle un peu plus différente. Elle n'a pas de cache L3, contrairement aux autres architectures K10, ce qui simplifie fortement son sous-système mémoire. Par contre, les fenêtres d'instructions/stations de réservation et le ROB sont plus grands, pareil pour les files dans l'unité mémoire. Une ALU pour les divisions entières a aussi été ajoutée. [[File:AMD Husky microarchitecture.png|centre|vignette|upright=3|AMD Husky microarchitecture]] Pour résumer, les architectures K7, K8 et K10 séparent les pipelines entiers et flottants : trois pipelines entiers avec chacun son unité de calcul, et un pipeline flottant avec plusieurs unités de calcul. Les raisons à cela sont assez diverses. Disons que dupliquer des ALU entières simples prend peu de transistors, là où les gros circuits comme le multiplieur ou la FPU ne sont pas dupliqués. Et cela a un autre avantage : le renommage, ''dispatch'' et l'émission sont plus simples. Les pipelines entiers ont une exécution dans le désordre peu complexe, grâce au grand nombre d'unités de calcul, ce qui fait que le pipeline entier est de seulement 15 cycles au total (chargement et décodage inclus). A l'opposé, la FPU est alimentée par une exécution dans le désordre très complexe, avec banc de registre physique et beaucoup de ressources, mais au prix d'un pipeline flottant plus long de 3 cycles, soit 18 cycles au total. ===Les microarchitectures ZEN d'AMD=== Viennent ensuite les '''microarchitectures Bulldozer''', avec trois révisions ultérieures nommées Piledriver, Steamroller et Excavator. Mais du fait de l'utilisation de techniques de multithreading matériel que nous n'avons pas encore abordé, nous ne pouvons pas en parler ici. Les microarchitectures suivantes sont les '''architectures ZEN 1/2/3/4/5'''. Elles se ressemblent beaucoup, chacune accumulant les améliorations des précédentes. Mais le cœur de l'architecture reste plus ou moins le même. En passant à la suivante, le nombre de registre virtuel augmente, le ''branch target buffer'' augmente en taille, le ROB et les files d'attente grossissent, les caches de micro-opération aussi, les caches grossissent, etc. La microarchitecture Zen 1 est illustrée ci-dessous. Le passage à Zen 2 a ajouté une unité de calcul d'adresse (4 ALU / 3 AGU), le Zen 5 a ajouté deux autres ALU entières et une unité de calcul d'adresse (6 ALU / 4 AGU) [[File:Zen microarchitecture.svg|centre|vignette|upright=3|Microarchitecture Zen 1 d'AMD.]] <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Le parallélisme mémoire au niveau du cache | prevText=Le parallélisme mémoire au niveau du cache | next=Les processeurs VLIW et EPIC | nextText=Les processeurs VLIW et EPIC }} </noinclude> c23xw9zdmy5l4jqa7f3vuns38o7womf 745872 745871 2025-07-03T16:03:55Z Mewtow 31375 /* L'émission multiple des accès mémoire */ 745872 wikitext text/x-wiki Les processeurs vus auparavant ne peuvent émettre au maximum qu'une instruction par cycle d'horloge : ce sont des processeurs à émission unique. Ils peuvent avoir plusieurs instructions qui s'exécutent en même temps, dans des unités de calcul séparées. C'est le cas dès qu'une instruction multicycle s'exécute. Par contre, ils ne peuvent démarrer qu'une seule instruction par cycle. Et quand on court après la performance, ce n'est pas assez ! Les concepteurs de processeurs ont inventés des processeurs qui émettent plusieurs instructions par cycle : les '''processeurs à émissions multiples'''. Un processeur à émission multiple charge plusieurs instructions en même temps, les décode en parallèle, puis les émet en même temps sur des unités de calculs séparées. Pour cela, il faut gérer les dépendances entre instructions, répartir les instructions sur différentes unités de calcul, et cela n'est pas une mince affaire. [[File:Superscalarpipeline.svg|centre|vignette|upright=1.5|Pipeline RISC classique à cinq étages sur un processeur superscalaire. On voit bien que plusieurs instructions sont chargées en même temps.]] Les processeurs à émission multiple sont de deux types : les processeurs VLIW et les '''processeurs superscalaires'''. Nous mettons les processeurs VLIW de côté en attendant le prochain chapitre. La raison est qu'ils ont un jeu d'instruction spécialisé qui expose le parallélisme d'instruction directement au niveau du jeu d'instructions, là où les processeurs superscalaires restent des processeurs au jeu d'instruction normal. La différence principale entre processeur VLIW et superscalaire est qu'un processeur superscalaire répartit les instructions sur les unités de calcul à l’exécution, là où un processeur VLIW délègue cette tâche au compilateur. ==L'implémentation d'un processeur superscalaire== Sur un processeur à émission multiple, plusieurs micro-opérations sont émises en même temps, le nombre varie d'un processeur à l'autre. Les processeurs superscalaires les plus simples ne permettent que d'émettre deux micro-opérations à la fois, d'où leur nom de processeur ''dual issue'', ce qui se traduit en '''processeur à double émission'''. Les processeurs modernes peuvent émettre 3, 4, 6, voire 8 micro-opérations simultanément. Aller au-delà ne sert pas à grand-chose. ===Les circuits hors-ALU sont soit dupliqués, soit adaptés=== Un processeur superscalaire doit être capable de : lire plusieurs instructions depuis la mémoire, les décoder, renommer leurs registres, et les envoyer à l'unité d'émission. Intuitivement, on se fit qu'on doit dupliquer tous les circuits : les décodeurs, l'unité de renommage, les unités de calcul, le ROB, etc. Dans les faits, l'implémentation d'un processeur superscalaire demande de dupliquer plusieurs circuits et d'en adapter d'autres. Voici ce que cela donne dans les grandes lignes. {|class="wikitable" |- ! rowspan="2" | Processeur sans émission multiple | rowspan="2" | Chargement | rowspan="2" | Décodage | rowspan="2" | Renommage | rowspan="2" | Émission | Exécution / ALU | rowspan="2" | ''Commit''/ROB |- | Exécution / ALU |- ! rowspan="4" | Processeur superscalaire | rowspan="4" | Chargement | rowspan="2" | Décodage | rowspan="4" | Renommage | rowspan="4" | Émission | Exécution / ALU | rowspan="4" | ''Commit''/ROB |- | Exécution / ALU |- | rowspan="2" | Décodage | Exécution / ALU |- | Exécution / ALU |} Un processeur superscalaire doit pouvoir charger plusieurs instructions en même temps. Deux solutions pour cela. La première est de doubler la taille du bus connecté au cache d'instruction. Si les instructions sont de longueur fixe, cela charge deux instructions à la fois. Pour un processeur à triple émission, il faut tripler la taille du bus, quadrupler pour un processeur quadruple émission, etc. Mais tout n'est pas si simple, quelques subtilités font qu'on doit ajouter des circuits en plus pour corriger les défauts peu intuitifs de cette implémentation naïve. Une autre solution est d'utiliser un cache d'instruction multiport. Mais dans ce cas, le ''program counter'' doit générer deux adresses, au mieux consécutives, au pire prédites par l'unité de prédiction de branchement. L'implémentation est alors encore plus complexe, comme on le verra plus bas. Il doit ensuite décoder plusieurs instructions en même temps. Il se trouve que les dépendances entre instruction ne posent pas de problème pour le décodeur. Rien ne s'oppose à ce qu'on utilise plusieurs décodeurs séparés. Il faut dire que les décodeurs sont de purs circuits combinatoires, du moins sur les processeurs avec une file de micro-opérations, ou avec une fenêtre d'instruction, ou des stations de réservation. Par contre, l'unité de renommage de registre n'est pas dupliquée, mais adaptées, pour gérer le cas où des instructions consécutives ont des dépendances de registre. Par exemple, prenons un processeur à double émission, qui renomme deux instructions consécutives. Si elles ont une dépendance, le renommage de la seconde instruction dépend du renommage de la première. La première doit être renommée et le résultat du renommage est utilisé pour renommer la seconde, ce qui empêche d'utiliser deux unités de renommage séparées. L'unité d'émission, la file de micro-opération et tous les circuits liés aux dépendances d'instruction ne sont pas dupliqués, car il peut y avoir des dépendances entre instruction chargées simultanément. L'unité d'émission est modifiée de manière à émettre plusieurs instructions à la fois. Si c'est un ''scoreboard'', il doit être modifié pour détecter les dépendances entre les instructions à émettre. Si c'est une fenêtre d'instruction ou une station de réservation, les choses sont plus simples, il faut basiquement rajouter des ports de lecture et écriture pour insérer et émettre plusieurs instructions à la fois, et modifier la logique de sélection en conséquence. Le ROB et les autres structures doivent aussi être modifiées pour pouvoir émettre et terminer plusieurs instructions en même temps. ===La duplication des unités de calcul et les contraintes d’appariement=== Pour émettre plusieurs instructions en même temps, encore faut-il avoir de quoi les exécuter. En clair : un processeur superscalaire doit avoir plusieurs unités de calcul séparées. Les processeurs avec un pipeline dynamique incorporent plusieurs unités pour les instructions entières, une unité pour les instructions flottantes, une unité pour les accès mémoire et éventuellement une unité pour les tests/branchements. Au lieu de parler d'unités de calcul, un terme plus correct serait le terme d''''avals''', que nous avions introduit dans le chapitre sur les pipelines dynamiques, mais n'avons pas eu l'occasion d'utiliser par la suite. Les processeurs avec un pipeline dynamique incorporent déjà plusieurs avals, mais chaque aval ne peut accepter qu'une nouvelle instruction par cycle. Et cela ne change pas sur les processeurs superscalaire, une unité de calcul reste une unité de calcul. Il y a plusieurs manières de gérer les avals sur un processeur superscalaire. La première duplique tous les avals : toutes les unités de calcul sont dupliquées. Par exemple, prenons un processeur simple-émission et transformons-le en processeur à double émission. Intuitivement, on se dit qu'il faut dupliquer toutes les unités de calcul. Si le processeur de base a une ALU entière, une FPU et un circuit multiplieur, ils sont tous dupliqués. L'avantage de faire ainsi est que le processeur n'a pas de contrainte quand il veut émettre deux instructions. Tant que les deux instructions n'ont pas de dépendances de données, il peut les émettre. Pour le dire autrement, toutes les paires d'instructions possibles sont compatibles avec la double émission. Si le processeur veut émettre deux multiplications consécutives, il le peut. S'il veut émettre deux instructions flottantes, il le peut. Le problème, c'est que le cout en circuit est conséquent ! Dupliquer la FPU ou les circuits multiplieurs bouffe du transistor. Pour économiser des transistors, il est possible de ne pas dupliquer tous les circuits. Typiquement, les ALU simples sont dupliquées, de même que les unités de calcul d'adresse, mais la FPU et les circuits multiplieurs ne sont pas dupliqués. En faisant ainsi, le cout en transistors est grandement réduire. Par contre, cela entraine l'apparition de dépendances structurelles. Par exemple, le CPU ne peut pas émettre deux multiplications consécutives sur un seul multiplieur, idem avec deux additions flottantes si l'additionneur flottant n'est pas dupliqué. La conséquence est que les processeurs superscalaires ont des contraintes sur les instructions à émettre en même temps. Si on prend un processeur ''dual-issue'', il y a donc des paires d'instructions autorisées et des paires interdites. Par exemple, l'exécution simultanée de deux branchements est interdite. Les branchements sont sérialisés, exécutés l'un après l'autre. Il est possible d'émettre un branchement en même temps qu'une autre instruction, en espérant que la prédiction de branchement ait fait une bonne prédiction. Mais il n'est souvent pas possible d'émettre deux branchements en même temps. La raison est qu'il n'y a qu'une seule unité de calcul pour les branchements dans un processeur. ==L'étape de chargement superscalaire== Pour charger plusieurs instructions, il suffit de doubler, tripler ou quadrupler le bus mémoire. Précisément, c'est le port de lecture du cache d’instruction qui est élargit, pour lire 2/3/4/... instructions. Un bloc de 8, 16, 32 octets est dnc lu depuis le cache et est ensuite découpé en instructions, envoyées chacun à un décodeur. Découper un bloc en instructions est trivial avec des instructions de longueur fixe, mais plus compliqué avec des instructions de taille variable. Il est cependant possible de s'en sortir avec deux solutions distinctes. La première solution utilise les techniques de prédécodage vues dans le chapitre sur les caches, à savoir que le découpage d'une ligne de cache est réalisé lors du chargement dans le cache d’instruction. Une autre solution améliore le circuit de détection des tailles d'instruction vu dans le chapitre sur l'unité de chargement. Avec la seconde solution, cela prend parfois un étage de pipeline entier, comme c'est le cas sur les processeurs Intel de microarchitecture P6. Mais laissons de côté cette difficulté et passons au vrai problème. Charger un gros bloc de mémoire permet de charger plusieurs instructions, mais il y a potentiellement des branchements dans le bloc. Et on doit gérer le cas où ils sont pris, le cas où les instructions suivantes dans le bloc doivent être annulées. En clair, il faut détecter les branchements dans le bloc chargé et gérer le cas où ils sont pris. : Dans ce qui va suivre, un morceau de code sans branchement est appelé un bloc de base (''basic block''). ===Le circuit de fusion de blocs=== Les processeurs superscalaires simples ne se préoccupent pas des branchements lors du chargement. Les instructions chargées en même temps sont toutes décodées et exécutées en même temps, même s'il y a un branchement dans le tas. Les branchements sont donc prédits comme étant non-pris systématiquement. Mais d'autres sont plus malins et utilisent la prédiction de branchement pour savoir si un branchement est pris ou non. Partons du principe que le branchement est pris : le processeur doit charger toutes les instructions d'un bloc, sauf celles qui suivent le branchement pris. L'unité de chargement coupe le bloc chargé au niveau du premier branchement non-pris, remplit les vides avec des NOP, avant d'envoyer le tout à l'unité de décodage. [[File:Fetch sur un processeur superscalaire avec prediction de branchements.png|centre|vignette|upright=2|Fetch sur un processeur superscalaire avec prédiction de branchements.]] Une solution plus performante charge les instructions de destination du branchement et les placent à sa suite. Ils chargent deux blocs à la fois et les fusionnent en un seul qui ne contient que les instructions présumées utiles. [[File:Cache d'instructions autoaligné.png|centre|vignette|upright=2|Cache d'instructions autoaligné.]] Mais cela demande de charger deux blocs de mémoire en une fois, ce qui demande un cache d'instruction multiports. Il faut aussi ajouter un circuit pour assembler plusieurs morceaux de blocs en un seul : le fusionneur (''merger''). Le résultat en sortie du fusionneur est ce qu'on appelle une '''trace'''. [[File:Implémentation d'un cache d'instructions autoaligné.png|centre|vignette|upright=2|Implémentation d'un cache d'instructions autoaligné.]] Le principe peut se généraliser si un bloc contient plusieurs branchements pris, avec un nombre de blocs supérieur à deux. Mais cela demande une unité de prédiction de branchement capable de prédire plusieurs branchements par cycle. ===Le cache de traces=== Si jamais un bloc est rechargé et que ses branchements sont pris à l'identique, le résultat du fusionneur sera le même. Il est intéressant de conserver cette trace dans un '''cache de traces''' pour la réutiliser ultérieurement. Le cache de trace n'a été utilisé que sur un seul processeur commercial : le Pentium 4 d'Intel. Fait intéressant, son cache de trace ne mémorisait pas des suites d'instructions, mais des suites de micro-opérations. En clair, il mémorisait des traces décodées, ce qui fait qu'un succès de cache de trace contournait non seulement le cache d'instruction, mais aussi les décodeurs. Ce qui explique que le temps d'accès au cache de trace n'était pas un problème, même s'il était comparable au temps d'accès du cache d'instruction. Il a depuis été remplacé par une alternative bien plus intéressante, le cache de micro-opérations, plus flexible et plus performant. Une trace est réutilisable quand le premier bloc de base est identique et que les prédictions de branchement restent identiques. Pour vérifier cela, le tag du cache de traces contient l'adresse du premier bloc de base, la position des branchements dans la trace et le résultat des prédictions utilisées pour construire la trace. Le résultat des prédictions de branchement de la trace est stocké sous la forme d'une suite de bits : si la trace contient n branchements, le n-ième bit vaut 1 si ce branchement a été pris, et 0 sinon. Même chose pour la position des branchements dans la trace : le bit numéro n indique si la n-ième instruction de la trace est un branchement : si c'est le cas, il vaut 1, et 0 sinon. Pour savoir si une trace est réutilisable, l'unité de chargement envoie le ''program counter'' au cache de traces, l'unité de prédiction de branchement fournit le reste des informations. Si on a un succès de cache de traces, et la trace est envoyée directement au décodeur. Sinon, la trace est chargée depuis le cache d'instructions et assemblée. [[File:TraceCache.png|centre|vignette|upright=2|Cache de traces.]] [[File:BasicBlocks.png|vignette|Blocs de base.]] Pour comprendre ce qu'est une trace, regardez le code illustré ci-contre. Il est composé d'un bloc de base A, suivi par un bloc de base B, qui peut faire appel soit au bloc C, soit un bloc D. Un tel code peut donner deux traces : ABC ou ABD. La trace exécutée dépend du résultat du branchement qui choisit entre C et D. Un cache de trace idéal mémorise les deux traces ABC et ABD dans deux lignes de cache séparées. Il peut mémoriser des traces différentes, même si leur début est le même. Un cache de trace peut supporter des '''succès de cache de trace partiels'''. Prenez le cas où le processeur veut lire la trace ABC mais que le cache de trace ne contient que la trace ABD : c'est un succès partiel. Dans ce cas, le processeur peut lire les blocs de base A et B depuis le cache de trace, et lit D depuis le cache d'instruction. Et cela vaut dans le cas général : si le cache a mémorisé une trace similaire à celle demandée, dont seuls les premiers blocs de base correspondent, il peut lire les premiers blocs de base dans le cache de trace et lire le reste dans le cache d'instruction. Il y a une certaine redondance dans le contenu du cache de trace, car certaines traces partagent des blocs de base. Pour éviter cela, il est possible de mémoriser les blocs de base dans des caches séparés et les assembler avec un fusionneur. Par exemple, au lieu d'utiliser un cache de traces unique, on va utiliser quatre '''caches de blocs de base''', suivi par un fusionneur qui reconstitue la trace. On économise du cache, au dépend d'un temps d'accès plus long vu qu'il faut reconstituer la trace. ==Le séquenceur d'un processeur superscalaire== Le séquenceur d'un processeur superscalaire est modifié, afin de pouvoir décoder plusieurs instructions à la fois. Ce n'est pas le cas général, mais la présence de plusieurs décodeurs est très fréquent sur les processeur superscalaires. De plus, les unités de renommage et d'émission doivent être modifiées. ===Les décodeurs d'instructions superscalaires=== Un processeur superscalaire contient généralement plusieurs décodeurs, chacun pouvant décoder une instruction en parallèle des autres. Prenons par exemple un processeur RISC dont toutes les instructions font 32 bits. Un processeur superscalaire de ce type peut charger des blocs de 128 bits, ce qui permet de charger 4 instructions d'un seul coup. Et pour les décoder, le décodage se fera dans quatre décodeurs séparés, qui fonctionneront en parallèle. Ou alors, il se fera dans un seul décodeur qui pourra décoder plusieurs instructions par cycles. Les processeurs CISC utilisent des décodeurs hybrides, avec un microcode qui complémente un décodeur câblés. Dupliquer le microcode aurait un cout en transistors trop important, ce qui fait que seuls les décodeurs câblés sont dupliqués. Les CPU CISC superscalaires disposent donc de plusieurs décodeurs simples, capables de décoder les instructions les plus courantes, avec un seul microcode. La conséquence est qu'il n'est pas possible de décoder deux instructions microcodées en même temps. Par contre, il reste possible de décoder plusieurs instructions non-microcodées ou une instruction microcodée couplée à une instruction non-microcodée. Vu qu'il est rare que deux instructions microcodées se suivent dans un programme, le cout en performance est extrêmement mineur. Les processeurs superscalaires supportent la technique dite de '''macro-fusion''', qui permet de fusionner deux-trois instructions consécutives en une seule micro-opération. Par exemple, il est possible fusionner une instruction de test et une instruction de saut en une seule micro-opération de branchement. Il s'agit là de l'utilisation la plus importante de la macro-fusion sur les processeurs x86 modernes. En théorie, d'autres utilisations de la macro-fusion sont possibles, certaines ont même été [https://www2.eecs.berkeley.edu/Pubs/TechRpts/2016/EECS-2016-130.pdf proposées pour le jeu d'instruction RISC-V], mais rien n'est encore implémenté (à ma connaissance). La fusion des instructions se fait lors du décodage des instructions, grâce à la coopération des décodeurs. ===L'unité de renommage superscalaire=== Sur un processeur à émission multiple, l'unité de renommage de registres doit renommer plusieurs instructions à la fois, mais aussi gérer les dépendances entre instructions. Pour cela, elle renomme les registres sans tenir compte des dépendances, pour ensuite corriger le résultat. [[File:Unité de renommage superscalaire.png|centre|vignette|upright=2|Unité de renommage superscalaire.]] Seules les dépendances lecture-après-écriture doivent être détectées, les autres étant supprimées par le renommage de registres. Repérer ce genre de dépendances se fait assez simplement : il suffit de regarder si un registre de destination d'une instruction est un opérande d'une instruction suivante. [[File:Détection des dépendances sur un processeur superscalaire.png|centre|vignette|upright=2|Détection des dépendances sur un processeur superscalaire.]] Ensuite, il faut corriger le résultat du renommage en fonction des dépendances. Si une instruction n'a pas de dépendance avec une autre, on la laisse telle quelle. Dans le cas contraire, un registre opérande sera identique avec le registre de destination d'une instruction précédente. Dans ce cas, le registre opérande n'est pas le bon après renommage : on doit le remplacer par le registre de destination de l'instruction avec laquelle il y a dépendance. Cela se fait simplement en utilisant un multiplexeur dont les entrées sont reliées à l'unité de détection des dépendances. On doit faire ce replacement pour chaque registre opérande. [[File:Correction des dépendances sur un processeur superscalaire.png|centre|vignette|upright=2|Correction des dépendances sur un processeur superscalaire.]] ===L'unité d'émission superscalaire=== Pour émettre plusieurs instructions en même temps, l'unité d'émission doit être capable d'émettre plusieurs instructions par cycle. Et Pour cela, elle doit détecter les dépendances entre instructions. Il faut noter que la plupart des processeurs superscalaires utilisent le renommage de registre pour éliminer un maximum de dépendances inter-instructions. Les seules dépendances à détecter sont alors les dépendances RAW, qu'on peut détecter en comparant les registres de deux instructions consécutives. Sur les processeurs superscalaires à exécution dans l’ordre, il faut aussi gérer l'alignement des instructions dans la fenêtre d'instruction. Dans le cas le plus simple, les instructions sont chargées par blocs et on doit attendre que toutes les instructions du bloc soient émises pour charger un nouveau bloc. Avec la seconde méthode, La fenêtre d'instruction fonctionne comme une fenêtre glissante, qui se déplace de plusieurs crans à chaque cycle d'horloge. Mais au-delà de ça, le design de l'unité d'émission change. Avant, elle recevait une micro-opération sur son entrée, et fournissait une micro-opération émise sur une sortie. Et cela vaut aussi bien pour une unité d'émission simple, un ''scoreboard'', une fenêtre d'instruction ou des stations de réservation. Mais avec l'émission multiple, les sorties et entrées sont dupliquées. Pour la double émission, il y a deux entrées vu qu'elle doit recevoir deux micro-opération décodées/renommées, et deux sorties pour émettre deux micro-opérations. Formellement, il est possible de faire une analogie avec une mémoire : l'unité d'émission dispose de ports d'écriture et de lecture. On envoie des micro-opérations décodées/renommées sur des ports d'écriture, et elle renvoie des micro-opérations émises sur le port de lecture. Dans ce qui suit, nous parlerons de '''ports de décodage''' et de '''ports d'émission'''. Si l'unité d'émission est un vulgaire ''scoreboard'', il doit détecter les dépendances entre instructions émises simultanément. De plus, il doit détecter les paires d'instructions interdites et les sérialiser. Autant dire que ce n'est pas très pratique. La détection des dépendances entre instructions consécutives est simplifiée avec une fenêtre d'instruction, il n'y a pour ainsi dire pas grand chose à faire, vu que les dépendances sont éliminées par le renommage de registre et que les signaux de réveil s'occupent de gérer les dépendances RAW. C'est la raison pour laquelle les processeurs superscalaires utilisent tous une fenêtre d'instruction centralisée ou décentralisée, et non des ''scoreboard''. Les processeurs superscalaires privilégient souvent des stations de réservations aux fenêtres d'instruction. Rappelons la terminologie utilisée dans ce cours. Les fenêtres d'instruction se contentent de mémoriser la micro-opération à émettre et quelques bits pour la disponibilité des opérandes. Par contre, les stations de réservations mémorisent aussi les opérandes des instructions. Les registres sont lus après émission avec une fenêtre d'instruction, avant avec des stations de réservation. Et cette différence a une influence sur le pipeline du processeur, le banc de registres et tout ce qui s'en suit. La différence principale est liée au banc de registre, et précisément au nombre de ports de lecture. Supposons que toutes les instructions sont dyadiques, ou du moins qu'il n'existe pas de micro-opération à trois opérandes. Avec une fenêtre d'instruction, le nombre d'opérandes à lire simultanément est proportionnel à la quantité d'instructions qu'on peut émettre en même temps. Sur un processeur ''dual issue'', qui peut émettre deux micro-opérations, cela fait deux micro-opérations à deux opérandes chacune, soit 4 opérandes. Le nombre de ports de lecture est donc de quatre. Avec une station de réservation, la lecture des opérandes a lieu avant l'émission, juste après le décodage/renommage. Le nombre d'opérande est le double du nombre de micro-opérations décodées/renommées, pas émises. Si le décodeur peut décoder/renommer 4 instructions par cycle, cela veut dire 4 micro-opérations émises par cycle. Et il se trouve que les deux situations ne sont pas évidentes. Avec une fenêtre d'instruction centralisée, cela ne change rien. Le nombre d'instructions décodées et émises en même temps sont identiques. Mais dès qu'on utilise des fenêtres d'instruction décentralisées, les choses changent. Si le décodeur peut décoder/renommer 4 instructions par cycle, alors l'idéal est d'avoir 4 micro-opérations émises par cycle, ''par fenêtre d'instruction''. Imaginez que le décodeur décode 4 instructions entières : la fenêtre d'instruction entière doit pouvoir émettre 4 micro-opérations entières en même temps. Idem pour des instructions flottantes avec la fenêtre d'instruction flottantes. Vu qu'il y a deux fenêtres d'instruction, cela fait 4 micro-opérations entières + 4 micro-opérations flottantes = 8 ports de lecture. Non pas qu'ils soient tous simultanément utiles, mais il faut les câbler. Les fenêtres d'instruction impliquent plus de lectures d'opérandes, ce qui implique plus de ports de lecture. Les stations de réservation sont plus économes, elles vont bien avec un nombre modéré de ports de lecture. ===Les conséquences sur le banc de registre=== Émettre plusieurs instructions en même temps signifie lire ou écrire plusieurs opérandes à la fois : le nombre de ports du banc de registres doit être augmenté. De plus, le banc de registre doit être relié à toutes les unités de calcul en même temps, ce qui fait 2 ports de lecture par unité de calcul. Et avec plusieurs dizaines d'unités de calcul différentes, le câblage est tout simplement ignoble. Et plus un banc de registres a de ports, plus il utilise de circuits, est compliqué à concevoir, consomme de courant et chauffe. Mais diverses optimisations permettent de réduire le nombre de ports assez simplement. Un autre solution utilise un banc de registre unique, mais n'utilise pas autant de ports que le pire des cas le demanderait. Pour cela, le processeur doit détecter quand il n'y a pas assez de ports pour servir toutes les instructions : l'unité d'émission devra alors mettre en attente certaines instructions, le temps que les ports se libèrent. Cette détection est réalisée par un circuit d'arbitrage spécialisé, intégré à l'unité d'émission, l’arbitre du banc de registres (''register file arbiter''). ==Les unités de calcul des processeurs superscalaires== Un processeur superscalaire émet/exécute plusieurs instructions simultanément dans plusieurs unités de calcul séparées. Intuitivement, on se dit qu'il faut dupliquer les unités de calcul à l'identique. Un processeur superscalaire contient alors N unités de calcul identiques, précédées par une fenêtre d'instruction avec N ports d'émission. Un tel processeur peut émettre N micro-opérations, tant qu'elles n'ont pas de dépendances. Manque de chance, ce cas est l'exception. La raison est que les processeurs superscalaires usuels sont conçus à partir d'un processeur à pipeline dynamique normal, qu'ils améliorent pour le rendre superscalaire. Les processeurs avec un pipeline dynamique incorporent plusieurs unités de calcul distinctes, avec une ALU pour les instructions entières, une FPU pour les instructions flottantes, une unité pour les accès mémoire (calcul d'adresse) et éventuellement une unité pour les tests/branchements. Sans superscalarité, ces unités sont toutes reliées au même port d'émission. Avec superscalarité, les unités de calcul existantes sont connectées à des ports d'émission différents. ===La double émission entière-flottante=== En théorie, il est possible d'imaginer un CPU superscalaire sans dupliquer les ALU, en se contenant d'exploiter au mieux les unités de calcul existantes. Prenons le cas d'un processeur avec une ALU entière et une ALU flottante, qu'on veut transformer en processeur superscalaire. L'idée est alors de permettre d'émettre une micro-opération entière en même temps qu'une micro-opération flottante. La micro-opération entière s'exécute dans l'ALU entière, la micro-opération flottante dans la FPU. Il suffit juste d'ajouter un port d'émission dédié sur la FPU. Le processeur a donc deux pipelines séparés : un pour les micro-opérations entières, un autre pour les micro-opérations flottantes. On parle alors de '''double émission entière-flottante'''. L'idée est simple, la mise en œuvre utilise assez peu de circuits pour un gain en performance qui est faible, mais en vaut la peine. La plupart des premiers processeurs superscalaires étaient de ce type. Les exemples les plus notables sont les processeurs POWER 1 et ses dérivés comme le ''RISC Single Chip''. Ils sont assez anciens et avaient un budget en transistors limité, ce qui fait qu'ils devaient se débrouiller avec peu de circuits dont ils disposaient. L'usage d'une double émission entière-flottante était assez naturelle. [[File:Double émission entière-flottante.png|centre|vignette|upright=2|Double émission entière-flottante]] Cependant, la méthode a un léger défaut. Une instruction flottante peut parfois lever une exception, par exemple en cas de division par zéro, ou pour certains calculs précis. Si une exception est levée, alors l'instruction flottante est annulée, de même que toutes les instructions qui suivent. Ce n'est pas un problème si le processeur gère nativement les exceptions précises, par exemple avec un tampon de ré-ordonnancement. Et c'est le cas pour la totalité des processeurs à exécution dans le désordre. Mais sur les processeurs à exécution dans l'ordre, si le budget en transistors est limité, les techniques de ce genre sont absentes. En théorie, sans tampon de ré-ordonnancement ou équivalent, on ne peut pas émettre d'instruction flottante en même temps qu'une instruction entière à cause de ce problème d'exceptions flottantes. Le problème s'est manifesté sur les processeurs Atom d'Intel, et les concepteurs du processeur ont trouvé une parade. L'idée est de tester les opérandes flottantes, pour détecter les combinaisons d'opérandes à problème, dont l'addition/multiplication peut lever une exception. Si des opérandes à problème sont détectées, on stoppe l'émission de nouvelles instructions en parallèle de l'instruction flottante et l'unité d'émission émet des bulles de pipeline tant que l'instruction flottante est en cours. Sinon, l'émission multiple fonctionne normalement. La technique, appelée ''Safe Instruction Recognition'' par Intel, est décrite dans le brevet US00525721.6A. Il faut noter que la double émission entière-flottante peut aussi être adaptée aux accès mémoire. En théorie, les accès mémoire sont pris en charge par le pipeline pour les opérations entières. L'avantage est que l'on peut alors utiliser l'unité de calcul pour calculer des adresses. Mais il est aussi possible de relier l'unité mémoire à son propre port d'émission. Le processeur devient alors capable d’émettre une micro-opération entière, une micro-opération flottante, et une micro-opération mémoire. On parle alors de '''triple émission entière-flottante-mémoire'''. La seule contrainte est que l'unité mémoire incorpore une unité de calcul d'adresse dédiée. ===L'émission multiple des micro-opérations flottantes=== La double émission entière-flottante ajoute un port d'émission pour la FPU, ce qui a un cout en circuits modeste, pour un gain en performance intéressant. Mais il faut savoir que les FPU regroupent un additionneur-soustracteur flottant et un multiplieur flottant, qui sont reliés au même port d'émission. Et il est possible d'ajouter des ports d'émission séparés pour l'additionneur flottant et le multiplieur flottant. Le processeur peut alors émettre une addition flottante en même temps qu'une multiplication flottante. Les autres circuits de calcul flottant sont répartis sur ces deux ports d'émission flottants. L'avantage est que cela se marie bien avec l'usage d'une fenêtre d'instruction séparée pour les opérations flottantes. La fenêtre d'instruction a alors deux ports séparés, au lieu d'un seul. Rajouter un second port d'émission flottant n'est pas trop un problème, car le cout lié à l'ajout d'un port n'est pas linéaire. Passer de un port à deux a un cout tolérable, bien plus que de passer de 3 ports à 4 ou de 4 à 5. Il est même possible de dupliquer l'additionneur et le multiplieur flottant, ce qui permet d'émettre deux additions et multiplications flottantes en même temps. C'est ce qui est fait sur les processeur AMD de architecture Zen 1 et 2. Ils ont deux additionneurs flottants par cœur, deux multiplieurs flottants, chacun avec leur propre port d'émission. Les performances en calcul flottant sont assez impressionnantes pour un processeur de l'époque. [[File:ZEN - émission multiple flottante.png|centre|vignette|upright=2.5|Microarchitecture Zen 1 d'AMD.]] ===L'émission multiple des micro-opérations entières=== Nous avons vu plus haut qu'il est possible d'ajouter plusieurs ports d'émission pour la FPU. Intuitivement, on se dit que la méthode peut aussi être appliquée pour émettre plusieurs micro-opérations entières en même temps. En effet, un processeur contient généralement plusieurs unités de calcul entières séparées, avec typiquement une ALU entière simple, un circuit multiplieur/diviseur, un ''barrel shifter'', une unité de manipulation de bit. Les 5 unités permettent d'émettre 4 micro-opérations entières en même temps, à condition qu'on ajoute assez de ports d'émission. [[File:Emission multiple des opérations entières, implémentation naive.png|centre|vignette|upright=2|Émission multiple des opérations entières, implémentation naïve.]] Maintenant, posons-nous la question : est-ce que faire ainsi en vaut la peine ? Le processeur peut en théorie émettre une addition, une multiplication, un décalage et une opération de manipulation de bits en même temps. Mais une telle situation est rare. En conséquence, les ports d'émission seront sous-utilisés, sous celui pour l'ALU entière. Pour réduire le nombre de ports d'émission sous-utilisés, il est possible de regrouper plusieurs unités de calcul sur le même port d'émission. Typiquement, il y a un port d'émission pour le multiplieur et un autre port d'émission pour le reste. L'avantage est que cela permet d'exécuter des micro-opérations entières en parallèle d'une multiplication. Mais on ne peut pas émettre/exécuter en parallèle des instructions simples. Il n'est pas exemple pas possible de faire un décalage en même temps qu'une addition. Le cout en performance est le prix à payer pour la réduction du nombre de ports d'émission, et il est assez faible. : Je dis exécuter/émettre, car ces instructions s'exécutent en un cycle. Si elles ne sont pas émises en même temps, elles ne s'exécutent pas en même temps. [[File:Emission multiple des opérations entières, double émission.png|centre|vignette|upright=2|Émission multiple des opérations entières, double émission]] Typiquement, la plupart des programmes sont majoritairement remplis d'additions, avec des multiplications assez rares et des décalages qui le sont encore plus. En pratique, il n'est pas rare d'avoir une multiplication pour 4/5 additions. Si on veut profiter au maximum de l'émission multiple, il faut pouvoir émettre plusieurs additions/soustractions en même temps, ce qui demande de dupliquer les ALU simples et leur donner chacune son propre port d'émission. : Le multiplieur n'est presque jamais dupliqué, car il est rare d'avoir plusieurs multiplications consécutives. Disposer de plusieurs circuits multiplieurs serait donc un cout en circuits qui ne servirait que rarement et n'en vaut pas la chandelle. Pour économiser des ports d'émission, les ALU entières dupliquées sont reliées à des ports d'émission existants. Par exemple, on peut ajouter la seconde ALU entière au port d'émission du multiplieur, la troisième ALU entière au port dédié au ''barrel shifter'', etc. Ainsi, les ports d'émission sont mieux utilisés : il est rare qu'on n'ait pas d'instruction à émettre sur un port. Le résultat est un gain en performance bien plus important qu'avec les techniques précédentes, pour un cout en transistor mineur. [[File:Emission multiple des opérations entières, implémentation courante.png|centre|vignette|upright=2|Emission multiple des opérations entières, implémentation courante]] ===L'émission multiple des accès mémoire=== Après avoir vu l'émission multiple pour les opérations flottantes et etnières, il est temps de voir l''''émission multiple des accès mémoire'''. ! Il est en effet possible d'émettre plusieurs micro-opérations mémoire en même temps. Les processeurs superscalaires modernes sont capables d'émettre plusieurs lectures/écritures simultanément. Par exemple, ils peuvent émettre une lecture en même temps qu'une écriture, ou plusieurs lectures, ou plusieurs écritures. Il faut noter que selon le processeur, il peut y avoir des restrictions quant aux accès mémoire émis en même temps. Par exemple, certains processeurs peuvent émettre une lecture avec une écriture en même temps, mais pas deux lectures ni deux écritures. Ou encore, ils peuvent émettre deux lectures, une lecture et une écriture, mais pas deux écritures en même temps. Dans la majorité des cas, les processeurs ne permettent pas d'émettre deux écritures en même temps, alors qu'ils supportent plusieurs lectures. Il faut dire que les lectures sont plus fréquentes que les écritures. Les processeurs qui autorisent toutes les combinaisons de lecture/écriture possibles, sont rares. L'émission multiple des accès mémoire demande évidemment de dupliquer des circuits, mais pas l'unité mémoire complète. Pour rappel, l'unité mémoire s'interpose entre le cache et le reste du pipeline. Elle est composée au minimum d'une unité de calcul d'adresse, des ports de lecture/écriture du cache de données. Le tout peut éventuellement être complété par des structures qui remettent en ordre les accès mémoire, comme une ''Load-store queue''. Émettre plusieurs micro-opérations mémoire demande d'avoir plusieurs unités de calcul, une par micro-opération mémoire émise par cycle. Si le processeur peut émettre trois micro-opérations mémoire à la fois, il y aura besoin de trois unités de calcul d'adresse. Chaque unité de calcul d'adresse est directement reliée à un port d'émission mémoire. Les ports de lecture/écriture du cache sont aussi dupliqués, afin de gérer plusieurs accès mémoire simultanés au cache de données. Par contre, la structure qui remet les accès mémoire en ordre n'est pas dupliquée. Les processeurs avec une ''Load-store queue'' ne la dupliquent pas. Par contre, elle est rendue multi-ports afin de gérer plusieurs micro-opérations mémoire simultanés. Par exemple, les processeurs skylake ont une LSQ avec deux ports de lecture et un port d'écriture, ce qui permet de faire deux lectures en même temps qu'une écriture. C'est la même chose avec les processeurs avec juste une ''Store Queue' et une ''Load Queue''. Prenons un processeur qui peut émettre une lecture et une écriture en même temps. Dans ce cas, la lecture va dans la ''Load Queue'', l'écriture dans la ''Store Queue''. Il y a bien des modifications à faire sur les deux files, afin de gérer deux accès simultanés, mais les structures ne sont pas dupliqués. Si on veut gérer plusieurs lectures ou plusieurs écritures, il suffit d'ajouter des ports à la ''Load Queue' ou à la ''Store Queue''. : Dans ce qui suit, nous parlerons d'AGU (''Adress Generation Unit'') pour désigner les unités de calcul d'adresse. Un exemple est celui des processeurs Intel de microarchitecture Nehalem, qui pouvaient seulement émettre une lecture en même temps qu'une écriture. Ils avaient deux ports d'émission reliés à l'unité mémoire. Un port pour les lectures, un autre pour les écritures. Le premier port d'écriture recevait la donnée à écrire et s'occupait des calculs d'adresse, Le port de lecture faisait uniquement des calculs d'adresse. Les processeurs AMD K6 sont similaires, avec un port d'émission pour les lectures et un autre pour les écritures. Le port de lecture alimente une unité de calcul d'adresse dédiée, directement reliée au cache. Le port d'écriture du cache alimente une unité de calcul, qui est suivie par une ''Store Queue'', une version simplifiée de la LSQ dédiée aux écritures. Le processeur exécutait les lectures dès qu'elles avaient leurs opérandes de disponibles, seules les écritures étaient mises en attente. D'autres processeurs ont plusieurs ports d'émission pour les unités mémoire, mais qui peuvent faire indifféremment lecture comme écritures. Un exemple est celui du processeur Athlon 64, un processeur AMD sorti dans les années 2000. Il disposait d'une LSQ unique, reliée à un cache L1 de donnée double port. La LSQ était reliée à trois unités de calcul séparées de la LSQ. La LSQ avait des connexions avec les registres, pour gérer les lectures/écritures. [[File:Athlon.png|centre|vignette|upright=2.5|Athlon]] ===L'interaction avec les fenêtres d'instruction=== Nous venons de voir qu'un processeur superscalaire peut avoir des ports d'émission reliés à plusieurs ALU. Pour le moment, nous avons vu le cas où le processeur dispose de fenêtres d'instruction séparées pour les opérations entières et flottantes. Un port d'émission est donc relié soit à des ALU entières, soit à des FPU. Mais il existe des processeurs où un même port d'émission alimente à la fois une ALU entière et une FPU. Par exemple, on peut relier un additionneur flottant sur le même port qu'une ALU entière. Il faut noter que cela implique une fenêtre d'instruction centralisée, capable de mettre en attente micro-opérations entières et flottantes. Un exemple est celui des processeurs Core 2 Duo. Ils disposent de 6 ports d'émission, dont 3 ports dédiés à l'unité mémoire. Les 3 ports restants alimentent chacun une ALU entière, un circuit de calcul flottant et une unité de calcul SSE (une unité de calcul SIMD, qu'on abordera dans quelques chapitres). Le premier port alimente une ALU entière simple et un multiplieur/diviseur flottant. Le second alimente une ALU entière, un multiplieur entier et un additionneur flottant. Le troisième alimente une ALU entière, sans circuit flottant dédié. [[File:Intel Core2 arch.svg|centre|vignette|upright=2.5|Intel Core 2 Duo - microarchitecture.]] Une conséquence de partager les ports d'émission est l'apparition de dépendances structurelles. Par exemple, imaginez qu'on connecte un multiplieur entier et la FPU, sur le même port d'émission. Il est alors impossible d'émettre une multiplication et une opération flottante en même temps. Mais la situation ne se présente que pour certaines combinaisons de micro-opérations bien précises, qui sont idéalement assez rares. De telles dépendances structurelles n'apparaissent que sur des programmes qui entremêlent instructions flottantes et entières, ce qui est assez rare. Les dépendances structurelles doivent cependant être prises en compte par les unités d'émission. Dans le même genre, il est possible de partager un port d'émission entre l'unité mémoire et une ALU entière. Cela permet d'utiliser l'ALU entière pour les calculs d'adresse, ce qui évite d'avoir à utiliser une unité de calcul d'adresse distincte. Un exemple est celui du processeur superscalaire double émission Power PC 440. Il dispose de deux ports d'émission. Le premier est connecté à une ALU entière et un circuit multiplieur, le second est relié à l'unité mémoire et une seconde ALU entière. L'organisation en question permet soit d'émettre un accès mémoire en même temps qu'une opération entière, soit d'émettre deux opérations entières simples, soit d’émettre une multiplication et une addition/soustraction/comparaison. Une organisation simple, mais très efficace ! [[File:PowerPC 440.png|centre|vignette|upright=2|Microarchitecture du PowerPC 440.]] ===Résumé=== Faisons un résumé rapide de cette section. Nous venons de voir que les différentes unités de calcul sont reliés à des ports d'émission, la répartition des ALU sur les ports d'émission étant très variable d'un processeur à l'autre. Entre les processeurs qui séparent les ports d'émission entier et flottant, ceux qui les mélangent, ceux qui séparent les ports d'émission mémoire des ports entiers et ceux qui les fusionnent, ceux qui autorisent l'émission multiple des micro-opérations mémoire ou flottante, il y a beaucoup de choix. Les divers choix possibles sont tous des compromis entre deux forces : réduire le nombre de ports d'émission d'un côté, garder de bonnes performances en limitant les dépendances structurelles de l'autre. Réduire le nombre de ports d'émission permet de garder des fenêtres d'instruction relativement simples. Plus elles ont de ports, plus elles consomment d'énergie, chauffent, sont lentes, et j'en passe. De plus, plus on émet de micro-opérations en même temps, plus la logique de détection des dépendances bouffe du circuit. Et cela a des conséquences sur la fréquence du processeur : à quoi bon augmenter le nombre de ports d'émission si c'est pour que ce soit compensé par une fréquence plus faible ? Par contre, regrouper plusieurs ALU sur un même port d'émission est à l'origine de dépendances structurelles. Impossible d'émettre deux micro-opérations sur deux ALU si elles sont sur le même port. Le nombre de ports peut être un facteur limitant pour la performance dans certaines situations de '''''port contention''''' où on a assez d'ALU pour exécuter N micro-opérations, mais où la répartition des ALUs sur les ports l’empêche. Suivant la répartition des ALU sur les ports, la perte de performance peut être légère ou importante, tout dépend des choix réalisés. Et les choix en question dépendent fortement de la répartition des instructions dans le programme exécuté. Le fait que certaines instructions sont plus fréquentes que d'autres, que certaines instructions sont rarement consécutives : tout cela guide ce choix de répartition des ALu sur les ports. ==Le contournement sur les processeurs superscalaires== Pour rappel, la technique du contournement (''register bypass'') permet au résultat d'une instruction d'être immédiatement utilisable en sortie de l'ALU, avant même d'être enregistré dans les registres. Implémenter la technique du contournement demande d'utiliser des multiplexeurs pour relier la sortie de l'unité de calcul sur son entrée si besoin. il faut aussi des comparateurs pour détecter des dépendances de données. [[File:Pipeline Bypass.png|centre|vignette|upright=1|Pipeline Bypass]] ===Les problèmes du contournement sur les CPU avec beaucoup d'ALUs=== Avec plusieurs unités de calcul, la sortie de chaque ALU doit être reliée aux entrées de toutes les autres, avec les comparateurs qui vont avec ! Sur les processeurs ayant plusieurs d'unités de calculs, cela demande beaucoup de circuits. Pour N unités de calcul, cela demande 2 * N² interconnexions, implémentées avec 2N multiplexeurs de N entrées chacun. Si c'est faisable pour 2 ou 3 ALUs, la solution est impraticable sur les processeurs modernes, qui ont facilement une dizaine d'unité de calcul. De plus, la complexité du réseau de contournement (l'ensemble des interconnexions entre ALU) a un cout en terme de rapidité du processeur. Plus il est complexe, plus les données contournées traversent de longs fils, plus leur temps de trajet est long, plus la fréquence du processeur en prend un coup. Diverses techniques permettent de limiter la casse, comme l'usage d'un bus de contournement, mais elle est assez impraticable avec beaucoup d'unités de calcul. Notez que cela vaut pour les processeurs superscalaires, mais aussi pour tout processeur avec beaucoup d'unités de calcul. Un simple CPU à exécution dans le désordre, non-superscalaire, a souvent pas mal d'unités de calcul et fait face au même problème. En théorie, un processeur sans exécution dans le désordre ou superscalarité pourrait avoir le problème. Mais en pratique, avoir une dizaine d'ALU implique processeur superscalaire à exécution dans le désordre. D'où le fait qu'on parle du problème maintenant. La seule solution praticable est de ne pas relier toutes les unités de calcul ensemble. À la place, on préfère regrouper les unités de calcul dans différents '''agglomérats''' ('''cluster'''). Le contournement est alors possible entre les unités d'un même agglomérat, mais pas entre agglomérats différents. Généralement, cela arrive pour les unités de calcul entières, mais pas pour les unités flottantes. La raison est que les CPU ont souvent beaucoup d'unités de calcul entières, car les instructions entières sont légion, alors que les instructions flottantes sont plus rares et demandent au mieux une FPU simple. Évidemment, l'usage d'agglomérats fait que certaines possibilités de contournement sont perdues, avec la perte de performance qui va avec. Mais la perte en possibilités de contournement vaut bien le gain en fréquence et le cout en circuit/fils réduit. C'est un bon compromis, ce qui explique que presque tous les processeurs modernes l'utilisent. Les rares exceptions sont les processeurs POWER 4 et POWER 5, qui ont préféré se passer de contournement pour garder un processeur très simple et une fréquence élevée. ===Les bancs de registre sont aussi adaptés pour le contournement=== L'usage d'agglomérats peut aussi prendre en compte les interconnections entre unités de calcul et registres. C'est-à-dire que les registres peuvent être agglomérés. Et cela peut se faire de plusieurs façons différentes. Une première solution, déjà vue dans les chapitres sur la micro-architecture d'un processeur, consiste à découper le banc de registres en plusieurs bancs de registres plus petits. Il faut juste prévoir un réseau d'interconnexions pour échanger des données entre bancs de registres. Dans la plupart des cas, cette séparation est invisible du point de vue de l'assembleur et du langage machine. Le processeur se charge de transférer les données entre bancs de registres suivant les besoins. Sur d'autres processeurs, les transferts de données se font via une instruction spéciale, souvent appelée ''COPY''. [[File:Banc de registres distribué.png|centre|vignette|upright=2|Banc de registres distribué.]] Sur de certains processeurs, un branchement est exécuté par une unité de calcul spécialisée. Or les registres à lire pour déterminer l'adresse de destination du branchement ne sont pas forcément dans le même agglomérat que cette unité de calcul. Pour éviter cela, certains processeurs disposent d'une unité de calcul des branchements dans chaque agglomérat. Dans les cas où plusieurs unités veulent modifier le ''program counter'' en même temps, un système de contrôle général décide quelle unité a la priorité sur les autres. Mais d'autres processeurs fonctionnent autrement : seul un agglomérat possède une unité de branchement, qui peut recevoir des résultats de tests de toutes les autres unités de calcul, quel que soit l’agglomérat. Une autre solution duplique le banc de registres en plusieurs exemplaires qui contiennent exactement les mêmes données, mais avec moins de ports de lecture/écriture. Un exemple est celui des processeurs POWER, Alpha 21264 et Alpha 21464. Sur ces processeurs, le banc de registre est dupliqué en plusieurs exemplaires, qui contiennent exactement les mêmes données. Les lectures en RAM et les résultats des opérations sont envoyées à tous les bancs de registres, afin de garantir que leur contenu est identique. Le banc de registre est dupliqué en autant d'exemplaires qu'il y a d'agglomérats. Chaque exemplaire a exactement deux ports de lecture, une par opérande, au lieu de plusieurs dizaines. La conception du processeur est simplifiée, que ce soit au niveau du câblage, que de la conception des bancs de registres. ==Les optimisations de la pile d'appel : le ''stack engine''== Les processeurs modernes intègrent une optimisation liée au pointeur de pile. Pour rappel, sur les architectures modernes, le pointeur de pile est un registre utilisé pour gérer la pile d'appel, précisément pour savoir où se trouve le sommet de la pile. Il est manipulé par les instructions CALL, RET, PUSH et POP, mais aussi par les instructions d'addition/soustraction pour gérer des cadres de pile de taille variable. De plus, il peut servir d'opérande pour des instructions LOAD/STORE, afin de lire/écrire des variables locales, les arguments d'une fonction, et autres. C'est donc un registre général adressable, intégré au banc de registre, altéré par l'unité de calcul entière. L'incrémentation/décrémentation du pointeur de pile passe donc par l'unité de calcul, lors des instructions CALL, RET, PUSH et POP. Mais, l'optimisation que nous allons voir permet d'incrémenter/décrémenter le pointeur de pile sans passer par l'ALU, ou presque. L'idée est de s'inspirer des architectures avec une pile d'adresse de retour, qui intègrent le pointeur de pile dans le séquenceur et l'incrémentent avec un incrémenteur dédié. ===Le ''stack engine''=== L'optimisation que nous allons voir utilise un '''''stack engine''''' intégré à l'unité de contrôle, au séquenceur. Le processeur contient toujours un pointeur de pile dans le banc de registre, cela ne change pas. Par contre, il n'est pas incrémenté/décrémenté à chaque instruction CALL, RET, PUSH, POP. Un compteur intégré au séquenceur est incrémenté à la place, nous l’appellerons le '''compteur delta'''. La vraie valeur du pointeur de pile s'obtient en additionnant le compteur delta avec le registre dans le banc de registre. Précisons que si le compteur delta vaut zéro, la vraie valeur est dans le banc de registre et peut s'utiliser telle quelle. Lorsqu'une instruction ADD/SUB/LOAD/STORE utilise le pointeur de pile comme opérande, elle a besoin de la vraie valeur. Si elle n'est pas dans le banc de registre, le séquenceur déclenche l'addition compteur-registre pour calculer la vraie valeur. Finalement, le banc de registre contient alors la bonne valeur et l'instruction peut s'exécuter sans encombre. L'idée est que le pointeur de pile est généralement altéré par une série d'instruction PUSH/POP consécutives, puis des instructions LOAD/STORE/ADD/SUB utilisent le pointeur de pile final comme opérande. En clair, une bonne partie des incrémentations/décrémentation est accumulée dans le compteur delta, puis la vraie valeur est calculée une fois pour toutes et est utilisée comme opérande. On accumule un delta dans le compteur delta, et ce compteur delta est additionné quand nécessaire. Précisons que le compteur delta est placé juste après le décodeur d'instruction, avant même le cache de micro-opération, l'unité de renommage et l'unité d'émission. Ainsi, les incrémentations/décrémentations du pointeur de pile disparaissent dès l'unité de décodage. Elles ne prennent pas de place dans le cache de micro-opération, ni dans la fenêtre d'instruction, ni dans la suite du pipeline. De nombreuses ressources sont économisées dans le ''front-end''. Mais utiliser un ''stack engine'' a aussi de nombreux avantages au niveau du chemin de données/''back-end''. Déjà, sur les processeurs à exécution dans le désordre, cela libère une unité de calcul qui peut être utilisée pour faire d'autres calculs. Ensuite, le compteur delta mémorise un delta assez court, de 8 bits sur le processeur Pentium M, un peu plus pour les suivants. L'incrémentation se fait donc via un incrémenteur 8 bits, pas une grosse ALU 32/64 bits. Il y a un gain en termes de consommation d'énergie, un incrémenteur 8 bits étant moins gourmand qu'une grosse ALU 32/64 bits. ===Les points de synchronisation du delta=== La technique ne fonctionne que si la vraie valeur du pointeur de pile est calculée au bon moment, avant chaque utilisation pertinente. Il y a donc des '''points de synchronisation''' qui forcent le calcul de la vraie valeur. Plus haut, nous avions dit que c'était à chaque fois qu'une instruction adresse le pointeur de pile explicitement, qui l'utilise comme opérande. Les instructions CALL, RET, PUSH et POP ne sont pas concernées par elles utilisent le pointeur de pile de manière implicite et ne font que l'incrémenter/décrémenter. Mais dans les faits, c'est plus compliqué. D'autres situations peuvent forcer une synchronisation, notamment un débordement du compteur delta. Le compteur delta est généralement un compteur de 8 bits, ce qui fait qu'il peut déborder. En cas de débordement du compteur, le séquenceur déclenche le calcul de la vraie valeur, puis réinitialise le compteur delta. La vraie valeur est donc calculée en avance dans ce cas précis. Précisons qu'un compteur delta de 8 bits permet de gérer environ 30 instructions PUSH/POP consécutives, ce qui rend les débordements de compteur delta assez peu fréquent. A noter que si le compteur delta vaut zéro, il n'y a pas besoin de calculer la vraie valeur, le séquenceur prend cette situation en compte. Un autre point de synchronisation est celui des interruptions et exceptions matérielles. Il faut que le compteur delta soit sauvegardé lors d'une interruption et restauré quand elle se termine. Idem lors d'une commutation de contexte, quand on passe d'un programme à un autre. Pour cela, le processeur peut déclencher le calcul de la vraie valeur lors d'une interruption, avant de sauvegarder les registres. Pour cela, le processeur intègre un mécanisme de sauvegarde automatique, qui mémorise la valeur de ce compteur dans le tampon de réordonnancement, pour forcer le calcul de la vraie valeur en cas de problème. La technique du ''stack engine'' est apparue sur les processeurs Pentium M d'Intel et les processeurs K10 d'AMD, et a été conservée sur tous les modèles ultérieurs. L'implémentation est cependant différente selon les processeurs, bien qu'on n'en connaisse pas les détails et que l'on doive se contenter des résultats de micro-benchmarks et des détails fournit par Intel et AMD. Selon certaines sources, dont les manuels d'optimisation d'Agner Fog, les processeurs AMD auraient moins de points de synchronisation que les processeurs Intel. De plus, leur ''stack engine'' serait placé plus loin que prévu dans le pipeline, après la file de micro-opération. ==Un étude des microarchitectures superscalaires x86 d'Intel== Après avoir vu beaucoup de théorie, voyons maintenant comment les microarchitectures Intel et AMD ont implémenté l'exécution superscalaire. Nous allons nous concentrer sur les processeurs Intel pour une raison simple : il y a plus de schémas disponibles sur wikicommons, ce qui me facilite le travail. ===Les processeurs Atom d'Intel, de microarchitecture Bonnell=== Les processeurs Atom sont des processeurs basse consommation produits et conçus par Intel. Il regroupent des processeurs de microarchitecture très différentes. La toute première microarchitecture ATOM était la microarchitecture Bonnell, qui est de loin la plus simple à étudier. Il s'agissait de processeurs sans exécution dans le désordre, sans renommage de registres. De nos jours, de tels processeurs ont disparus, même pour les processeurs basse consommation, mais les premiers processeurs Atom étaient dans ce cas. Mais le processeur était superscalaire et pouvait émettre deux instructions simultanées. Son pipeline faisait 16 étages, ce qui est beaucoup. L'architecture est assez simple. Premièrement, le cache d'instruction permet de lire 8 octets par cycle, qui sont placés dans une file d'instruction. La file d'instruction est alors reliée à deux décodeurs, ce qui permet de décoder deux instructions en même temps. Le fait que les décodeurs lisent les instructions depuis une file d'instruction fait que les deux instructions décodées ne sont pas forcément consécutives en mémoire RAM. Par exemple, l'Atom peut décoder un branchement prédit comme pris, suivi par l'instruction de destination du branchement. Les deux instructions ont été chargées dans la file d'instruction et sont consécutifs dedans, alors qu'elles ne sont pas consécutives en mémoire RAM. Les deux décodeurs alimentent une file de micro-opérations de petite taille : 32 µops maximum, 16 par ''thread'' si le ''multithreading'' matériel est activé. La majorité des instructions x86 sont décodées en une seule micro-opération, y compris les instructions ''load-up''. Le chemin de données est conçu pour exécuter les instruction ''load-up'' nativement, en une seule micro-opération. Le microcode n'est utilisé que pour une extrême minorité d'instructions et est à part des deux décodeurs précédents. L'avantage est que cela permet d'utiliser au mieux la file de micro-opération, qui est de petite taille. La file de micro-opérations est suivie par deux ports d'exécution, avec chacun leur logique d'émission. Les deux ports peuvent émettre au maximum 2 µops par cycle. Le résultat est que deux instructions consécutives peuvent s'exécuter, chacune dans deux avals séparés, dans deux pipelines différents. Les conditions pour cela sont cependant drastiques. Les deux instructions ne doivent pas avoir de dépendances de registres, à quelques exceptions près liées au registre d'état. Le multithreading matériel doit aussi être désactivé. Les deux instructions doivent aller chacun dans un port différent, et cela tient en compte du fait que les deux ports sont reliés à des unités de calcul fort différentes. Le tout est illustré ci-dessous. [[File:Intel Atom Microarchitecture.png|centre|vignette|upright=2.5|Intel Atom Microarchitecture]] Les deux ports sont capables de faire des additions/soustractions, des opérations bit à bit et des copies entre registres. Pour cela, ils ont chacun une ALU simple dédiée. Mais cela s'arrête là. Le second port est optimisé pour les opérations de type ''load-up''. Il contient toute la machinerie pour faire les accès mémoire, notamment des unités de calcul d'adresse et un cache L1 de données. A la suite du cache, se trouvent une ALU entière simple, un ''barrel shifter'', et un circuit multiplieur/diviseur. Le circuit multiplieur/diviseur est utilisé à la fois pour les opérations flottantes et entières. Le premier port permet d’exécuter des opérations entières simples, une addition flottante, des comparaisons/branchements, ou une instruction de calcul d'adresse LEA. Comme on le voit, la séparation entre les deux pipelines est assez complexe. Il ne s'agit pas du cas simple avec un pipeline entier et un pipeline flottant séparés. En réalité, il y a deux pipelines, chacun capables de faire des opérations entières et flottantes, mais pas les mêmes opérations. Et cette organisation difficile à comprendre est en réalité très efficace, très économe en circuit, tout en gardant une performance intéressante. Les instructions simples, ADD/SUB/bitwise sont supportées dans les deux pipelines. Il faut dire que ce sont des opérations courantes qu'il vaut mieux optimiser au mieux. Les opérations plus complexes, à savoir les multiplications/divisions/décalages/rotations/manipulations de bit sont supportées dans un seul pipeline. La raison est qu'il est rare que de telles opérations soient consécutives, et qu'il n'est donc pas utile d'optimiser pour cette situation. Si les deux pipelines devaient supporter ces opérations, cela demanderait de dupliquer les circuits multiplieurs/diviseur, ce qui aurait un cout en circuit important pour un gain en performance assez faible. ===Le Pentium 1/MMX et les pipelines U/V=== Le processeur Pentium d'Intel avait un pipeline de 5 étages : un étage de chargement/prédiction de branchement, deux étages de décodage, un étage d'exécution et un dernier étage pour l'écriture dans les registres. Chose étonnante pour un processeur superscalaire, il n'utilisait pas de renommage de registre ni d’exécution dans le désordre. Vous avez bien lu : la superscalarité est apparue dans les processeurs commerciaux avant l'exécution dans le désordre. Le Pentium 1 était un processeur à double émission, qui disposait de deux pipelines nommés U et V. On pouvait en tirer parti lorsque deux instructions consécutives pouvaient être exécutées en parallèles, si elles n'avaient pas de dépendances. Chose peu courante, les deux pipelines n'étaient pas identiques. Le pipeline U pouvait exécuter toutes les instructions, mais le pipeline V était beaucoup plus limité. Par exemple, seul le pipeline U peut faire des calculs flottants, le pipeline V ne fait que des calculs entiers et des branchements. L'unité flottante était sur le port d'émission du pipeline U, idem pour l'unité de calcul vectoriel MMX sur le Pentium MMX. Les deux pipelines disposaient d'une unité de calcul entière identiques dans les deux pipelines. Le pipeline U incorporait un circuit multiplieur/diviseur et un ''barrel shifter'' pour les décalages/rotations. Les deux pipelines avaient chacun uen unité de calcul d'adresse, mais elle n'étaient pas identique : celle du pipeline V ne gérait que l’instruction LEA, celle du pipeline U gérait tous les calculs d'adresse. La FPU était dans le pipeline U, de même que l'unité MMX. {|class="wikitable" |- ! Pipeline U ! Pipeline V |- | colspan="2" | ALU simple (une par pipeline) |- | Multiplieur/diviseur | |- | ''Barrel Shifter'' | |- | AGU complexe | AGU simple (opération LEA) |- | FPU | |- | Unité SIMD | |} Les deux ALU géraient les opérations bit à bit, les additions et soustractions, et les comparaisons (qui sont des soustractions déguisées). En conséquence, les instructions suivantes étaient exécutables dans les deux pipelines, ce qui fait qu'on pouvait en faire deux en même temps : * l'instruction MOV, dépend du mode d'adressage ; * les instructions de gestion de la pile PUSH et POP, dépend du mode d'adressage ; * Les instructions arithmétiques INC, DEC, ADD, SUB ; * l'instruction de comparaison CMP ; * les instructions bit à bit AND, OR, XOR ; * l'instruction de calcul d'adresse LEA ; * l'instruction NOP, qui ne fait rien. Les instructions suivantes sont exécutables seulement dans le pipeline U : les calculs d'adresse autres que LEA, les décalages et rotations, la multiplication et la division, les opérations flottantes. Il faut noter qu'il y a cependant quelques restrictions. Par exemple, si le pipeline U exécute une multiplication ou une division, le processeur ne peut pas exécuter une opération dans le pipeline V en parallèle. Dans le même genre, les branchements sont exécutables dans les deux pipelines, mais on ne peut exécuter une autre opération en parallèle qu'à la condition que le branchement soit exécuté dans le pipeline V. [[File:Intel Pentium arch.svg|centre|vignette|upright=2.5|Microarchitecture de l'Intel Pentium MMX. On voit que certaines unités de calcul sont dupliquées.]] ===La microarchitecture P6 du Pentium 2/3=== La microachitecture suivante, nommée P6, était une microarchitecture plus élaborée. Le pipeline faisait 12 étages, dont seuls les trois derniers correspondent au chemin de données. Il s'agissait du premier processeur à exécution dans le désordre de la marque, avec une implémentation basée sur des stations de réservation. Il gérait aussi le renommage de registre, avec un renommage de registre dans le ROB, commandé par une table d'alias. [[File:Intel Pentium Pro Microarchitecture Block Diagram.svg|centre|vignette|upright=2|Intel Pentium Pro Microarchitecture Block Diagram]] Le décodage des instructions x86 était géré par plusieurs décodeurs. Il y avait trois décodeurs : deux décodeurs simples, et un décodeur complexe. Les décodeurs simples décodaient les instructions les plus fréquentes, mais aussi les plus simples. Les instructions CISC complexes étaient gérées uniquement par le décodeur complexe, basé sur un microcode. Le processeur était à doubvle émission, du fait que les deux décodeurs simples faisaient le gros du travail, et passaient la main au décodeur microcodé quand aucune instruction ne leur était attribué. Les stations de réservations étaient regroupées dans une structure centralisée, en sortie de l'unité de renommage. Elles avaient 5 ports d'émission, qui étaient sous-utilisés en pratique. Niveau ALU, on trouve deux ALUs entières, une flottante, une unité pour les instructions SSE et autres, et trois unités pour les accès mémoire (regroupées en une seule unité dans le schéma ci-dessous). Les unités mémoire regroupent une unité de calcul d'adresse pour les lectures, une autre pour les écritures, et une unité pour la gestion des données à écrire. Les unités de calcul d'adresse sont des additionneurs à 4 opérandes, complétement différents des ALU entières. Les ALU entières sont deux unités asymétriques : une ALU simple, et une ALU complexe incorporant un multiplieur. Les deux peuvent exécuter des opérations d'addition, soustraction, comparaison, etc. [[File:P6 func diag.png|centre|vignette|upright=2|P6 func diag]] ===La microarchitecture Netburst du Pentium 4=== La microarchitecture Netburst, utilisée sur le Pentium 4, utilisait un pipeline à 20 étage, augmenté à 32 sur une révision ultérieure. Il a existé quatre révisions de l'architecture : Willamette (180 nm), Northwood (130 nm), Prescott (90 nm) et Cedar Mill (65 nm). Les deux premières avaient un pipeline de 20 étages, les deux suivants avaient 32 étages ! Le grand nombre d'étages permettait d'avoir une fréquence très élevée, mais posait de nombreux problèmes. Vider le pipeline était très long et il fallait une prédiction de branchement au top pour réduire l'impact des mauvaises prédictions. L'unité de prédiction de branchement était une des plus élvoluées pour l'époque. Pour l'époque. Il dispose d'un cache de trace et a été le seul processeur commercial à en utiliser un. Niveau décodeurs, on retrouve le décodeur lent à base de microcode présent sur les anciennes versions, couplé à un décodeur simple. L'unité de renomage utilise une table d'alias. Le renommage de registres se fait avec un banc de registres physiques. Vous pouvez remarquer dans le schéma suivant la présence de deux files de micro-opérations : une pour les accès mémoire, l'autre pour les autres opérations. Il s'agit bel et bien de deux files d'instructions, pas de fenêtres d'instruction ni de stations de réservation. Niveau ports d'émission, il y a quatre ports. Un pour les lectures mémoire, un pour les écriture mémoire, et deux autres qui mélangent FPU et ALUs. Le premier port est relié à une ALU complexe et une FPU spécialisée dans les MOV flottants. Le second port est relié à tout le reste : ALU basique ''barrel shifter'', FPU. Fait amusant, les ALU entières étaient cadencées à une fréquence double de celle du processeur, ce qui fait que les files d'émissionsont aussi censées l'être, de même que les ''scoreboard''. Sauf qu'en réalité, les circuits étaient dupliqués : l'un allait à une fréquence double, l'autre allait à la fréquence normale. [[File:Architettura Pentium 4.png|centre|vignette|upright=3|Microarchitecture du Pentium 4.]] ==Un étude des microarchitectures superscalaires x86 d'AMD== Les architectures AMD ont beaucoup évoluées avec le temps. Dans ce qui va suivre, nous allons les voir dans l'ordre chronologique, en partant de l'architecture K5, pour arriver aux dernières architectures Zen. Nous allons voir que les architectures AMD ont évoluées progressivement, chacune améliorant la précédente en faisant des rajouts ou modifications mineures, à l'exception de quelques grandes cassures dans la continuité où AMD a revu sa copie de fond en comble. L'architecture Bulldozer a été une première cassure, suivie par l'introduction des architectures Zen. Étudier ces architectures demande de voir trois choses séparément : le ''front-end'' qui regroupe l'unité de chargement et les décodeurs, le ''back-end'' qui gère l'exécution dans le désordre et les unités de calcul, et le sous-système mémoire avec les caches et la ''Load Store Queue''. Leur étude sera plus ou moins séparée dans ce qui suit, pour chaque classe d'architecture. ===La première génération de CPU AMD : les architectures K5, K6, K7, K8 et K10=== La première génération de processeurs AMD est celle des architectures K5, K6, K7, K8 et K10. Il n'y a pas de K9, qui a été abandonné en cours de développement. Les processeurs K5 et K6 portent ce nom au niveau commercial. Par contre, les processeurs d'architecture K7 sont aussi connus sous le nom d''''AMD Athlon''', les AMD K8 sont connus sous le nom d''''AMD Athlon 64''', et les architecture K10 sont appelées les '''AMD Phenom'''. Comme le nom l'indique, l'architecture K8 a introduit le 64 bits chez les processeurs AMD. Elles ont une architecture assez similaire pour ce qui est du chargement et des caches. Toutes disposent d'au minimum un cache L1 d'instruction et d'un cache L1 de données. Le K5 n'avait que ces caches, mais un cache L2 a été ajouté avec le K7, puis un L3 avec le K10. L'AMD K5 avait une TLB unique, mais les processeurs suivants avaient une TLB pour le L1 d'instruction et une autre pour le L1 de données. Idem pour le cache L2, avec deux TLB : une pour les données, une pour les instructions. Les caches L1/L2 sont de type exclusifs, à savoir que les données dans le L1 ne sont pas recopiées dans le L2. Le cache L2 est précisément un cache de victime, qui mémorise les données/instructions, évincées des caches L1 lors du remplacement des lignes de cache. L'introduction du cache L2 a entrainé l'ajout de deux TLB de second niveau : une L2 TLB pour les données et une autre pour les instructions. Les architectures K8 et K10 ont ajouté un cache L3, avec un accès indirect à travers l'interface avec le bus. : L'AMD K7 originel, aussi appelée Athlon classique, n'avait pas de cache L2, mais celui-ci était placé sur la carte mère et fonctionnait à une fréquence moitié moindre de celle du CPU. L'Athlon Thunderbird, puis l'Athlon XP, ont intégré le cache L2 dans le processeur. {|class="wikitable" |- ! Architecture AMD ! colspan="5" | Caches |- | rowspan="2" | K5 | L1 instruction || L1 données || colspan="3" | |- | colspan="2" | TLB unique || colspan="3" | |- | colspan="4" | |- | rowspan="2" | K6 | L1 instruction || L1 données || colspan="3" | L2 unifié |- | TLB L1 instruction || TLB L1 données || colspan="3" | |- | colspan="6" | |- | rowspan="2" | K7, K8 | L1 instruction || L1 données || colspan="2" | L2 unifié || |- | TLB L1 instruction || TLB L1 données || TLB L2 instruction || TLB L2 données || |- | colspan="6" | |- | rowspan="2" | K10 | L1 instruction || L1 données || colspan="2" | L2 unifié || L3 |- | TLB L1 instruction || TLB L1 données || TLB L2 instruction || TLB L2 données || |} Fait important, les architectures K5 à K10 utilisent la technique du '''prédécodage''', où les instructions sont partiellement décodées avant d'entrer dans le cache d'instruction. Le prédécodage facilite grandement le travail des décodeurs d'instruction proprement dit. Par contre, le prédécodage prend de la place dans le cache L1 d'instruction, une partie de sa capacité est utilisé pour mémoriser les informations prédécodées. C'est donc un compromis entre taille du cache et taille/rapidité des décodeurs d'instruction. Sur les architectures K5 et K6, le prédécodage précise, pour chaque octet, si c'est le début ou la fin d'une instruction, si c'est un octet d'opcode, en combien de micro-opérations sera décodée l'instruction, etc. A partir de l'AMD K7, le prédécodage reconnait les branchements inconditionnels. Lorsqu'un branchement inconditionnel est pré-décodé, le pré-décodage tient compte du branchement et continue le pré-décodage des instructions à partir de la destination du branchement. Le système de prédécodage est abandonnée à partir de l'architecture Bulldozer, qui suit l'architecture K10. La prédiction de branchement de ces CPU tire partie de ce système de pré-décodage, à savoir que les prédictions de branchement sont partiellement mémorisées dans les lignes de cache du L1 d'instruction. Par exemple, l'AMD K5 se passe de ''Branch Target Buffer'' grâce à cela. Si une ligne de cache contient un branchement, elle mémorise l'adresse de destination de ce branchement, en plus des bits de pré-décodage. Si il y a plusieurs branchements dans une ligne de cache, c'est l'adresse de destination du premier branchement pris dans cette ligne de cache qui est mémoirsée. Un défaut de cette approche est que si le branchement n'est pas dans le L1 d'instruction, aucune prédiction de branchement ne peut être faite et le préchargement ne peut pas fonctionner. C'est une limitation que n'ont pas les BTB découplées du cache L1 : elles peuvent prédire un branchement qui a été évincé dans le L2 ou le L3, tant que l'entrée associée est dans le BTB. Les prédictions peuvent même servir à précharger les instructions utiles. [[File:Comparaison du chargement de l'AMD K5 et K6.png|centre|vignette|upright=2|Comparaison du chargement de l'AMD K5 et K6]] Au niveau du décodage, on trouve de nombreuses différences entre les premières architectures AMD. L'AMD K5 contient 4 décodeurs hybrides, afin de décoder 4 instructions par cycles. Le K5 a quatre décodeurs simples couplés à 4 décodeurs complexes avec chacun un accès au micro-code. Une instruction peut donc passer par a donc deux voies de décodage : un décodage rapide et simple pour les instructions simples, un décodage lent et passant par le microcode pour les instructions complexes. Pour décoder 4 instructions, les deux voies sont dupliquées en 4 exemplaires, ce qui a un cout en circuits non-négligeable. L'AMD K6 utilise moins de décodeurs et ne peut que décoder deux instructions à la fois maximum. Par contre, il fournit en sortie 4 micro-opérations. Il intègre pour cela deux décodeurs simples, un décodeur complexe et un décodeur micro-codé. Un décodeur simple transforme une instruction simple en une ou deux micro-opérations. Il est possible d'utiliser les deux décodeurs simples en même temps, afin de fournir 4 micro-opérations en sortie du décodeur. Les deux autres décodent une instruction complexe en 1 à 4 micro-opérations. Si jamais la ou les deux instructions sont décodées en 1, 2 ou 3 micro-opérations, les micro-opérations manquantes pour atteindre 4 sont remplies par des NOPs. Pour le K7 et au-delà, le processeur dispose de décodeurs séparées pour les instructions micro-codées de celles qui ne le sont pas. Le processeur peut décoder jusqu’à 3 instructions par cycle. Le décodage d'une instruction microcodée ne peut pas se faire en parallèle du décodage non-microcodé. C'est soit le décodeur microcodé qui est utilisé, soit les décodeurs câblés, pas les deux en même temps. Le décodage d'une instruction prend 4 cycles. Les instructions non-microcodées sont décodées en une seule micro-opération, à un détail près : le CPU optimise la prise en charge des instructions ''load-up''. La différence entre le K6 et le K7 s'explique par des optimisations des instructions ''load-up''. Sur le K6, les instructions ''load-up'' sont décodées en deux micro-opération : la lecture en RAM, l'opération proprement dite. Mais sur le K7, une instruction ''load-up'' est décodée en une seule micro-opération. En conséquence, les décodeurs simples sont fortement simplifiés et le décodeur complexe disparait au profit d'un microcode unique. [[File:Décodage sur le K5 et le K5.png|centre|vignette|upright=3|Décodage sur le K5 et le K5]] ====Les microarchitectures K5 et K6 d'AMD==== Les deux premières architectures étaient les architectures K5 et K6, l'architecture K6 ayant été déclinée en quatre versions, nommées K6-1, K6-2, et K-3, avec une version K6-3 bis. Elles sont regroupées ensemble car elles ont beaucoup de points communs. Par exemple, tout ce qui a trait au chargement et au cache était similaire, de même que les unités de calcul. Les deux architectures avaient n'avaient pas de cache L2 et devaient se contenter d'un cache L1 d'instruction et d'un cache L1 de données. L'AMD K5 incorpore une TLB unique, alors que le K6 utilise des TLB séparées pour le cache d'instruction et le cache de données. Une différence entre l'architecture K5 et K6 est que la première utilise des caches normaux, alors que la seconde utilise des ''sector caches''. Les deux architectures disposaient des unités de calcul suivantes : deux ALU entières, une FPU, deux unités LOAD/STORE pour les accès mémoire, une unité de branchement et une ou plusieurs unités SIMD. Une organisation classique, donc. Pour les unités entières, il y avait deux ALU simples, un ''barrel shifter'' et un diviseur. Il n'y a pas d'erreur, le processeur incorpore un circuit diviseur, mais pas de circuit multiplieur. La raison est que la multiplication est réalisée par la FPU ! En effet, le multiplieur flottant de la FPU intègre un multiplieur entier pour multiplier les mantisses, qui est utilisé pour les multiplications entières. La même technique a été utilisée sur l'Atom, comme vu plus haut. Le tout était alimenté par deux ports d'émission, appelés ports X et Y. Sur l'architecture K5, le ''barrel shifter'' et le diviseur sont des ports différents. {|class="wikitable" |+ AMD K5 |- ! Port X ! Port Y |- | ALU simple | ALU simple |- | ''Barrel Shifter'' | Diviseur |} Sur l'architecture K6, le ''barrel shifter'' et le diviseur sont sur le même port. {|class="wikitable" |+ AMD K6 |- ! Port X ! Port Y |- | ALU simple | ALU simple |- | | ''Barrel Shifter'' |- | | Diviseur |} Niveau unités mémoire, le K5 avait deux unités LOAD/STORE, chacune capable de faire lecture et écriture. Par contre, la ''store queue'' n'a qu'un seul port d'entrée, ce qui fait que le processeur peut seulement accepter une écriture par cycle. Le processeur peut donc émettre soit deux lectures simultanées, soit une lecture accompagnée d'une écriture. Impossible d'émettre deux écritures simultanées, ce qui est de toute façon très rare. L'architecture K6 utilise quant à elle une unité LOAD pour les lectures et une unité STORE pour les écritures. Ce qui permet de faire une lecture et une écriture par cycle, pas autre chose. Niveau unités SIMD, l'architecture K7 n'avait qu'une seule unité SIMD, placée sur le port d'émission X. L'architecture K8 ajouta une seconde unité SIMD, sur l'autre port d'émission entier. De plus, trois ALU SIMD ont été ajoutées : un décaleur MMX, une unité 3DNow!, une unité mixte MMX/3DNow. Elles sont reliées aux deux ports d'émission entier X et Y ! Elles ne sont pas représentées ci-dessous, par souci de simplicité. [[File:Unité de calcul des processeurs AMD K5 et K6.png|centre|vignette|upright=2|Unité de calcul des processeurs AMD K5 et K6. les unités sur la même colonnes sont reliées au même port d'émission.]] Si les unités de calcul et le chargement sont globalement les mêmes, les deux architectures se différencient sur l'exécution dans le désordre. L'AMD K5 utilise du renommage de registre dans le ROB avec des stations de réservation. Par contre, l'AMD K6 utilise une fenêtre d'instruction centralisée. De plus, son renommage de registre se fait avec un banc de registre physique. L'architecture AMD K5 utilisait de deux stations de réservation par unité de calcul, sauf pour les deux unités mémoire partageaient une station de réservation unique (deux fois plus grande). Les stations de réservation sont cependant mal nommées, vu que ce sont en réalité des mémoire FIFO. Une micro-opération n'est émise que si elle est la plus ancienne dans la FIFO/station de réservation. Le renommage de registres se faisait dans le tampon de ré-ordonnancement, il n'y avait pas encore de banc de registre physique. Le tampon de ré-ordonnancement faisait seulement 16 instructions. [[File:AMD K5.jpg|centre|vignette|upright=3|AMDK5 Diagramme.]] L'architecture K6 remplace les stations de réservations par une fenêtre d'instruction centralisée. Les 4 micro-opérations renommées sont écrites dans la fenêtre d'instruction par groupe de 4, NOP de ''padding'' inclus. La fenêtre d'instruction centralisé contient 24 micro-opérations, groupées en 6 groupes de 4 micro-opérations, avec potentiellement des NOP dedans suivant le résultat du décodage. L'avantage est que l'implémentation de la fenêtre d'instruction est simple. La fenêtre d'instruction centralisée permettait d'émettre 6 micro-opérations en même temps (une par unité de calcul/mémoire). Le renommage de registres se faisait dans le tampon de ré-ordonnancement, il n'y avait pas encore de banc de registre physique. Le processeur utilisait un renommage avec un banc de registre physique. Le banc de registre physique pour les entiers contenait 48 registres, dont 24 étaient des registres architecturaux et 24 étaient des registres renommés. Sur les 24 registres architecturaux, 16 avaient une fonction de ''scratchpad'' que les ''datasheets'' d'AMD ne détaillent pas, les 8 restants étaient les registres généraux EAX, EBX, etc. [[File:AMD K6 Little foot & Modl 6.png|centre|vignette|upright=3|AMD K6 original.]] ====Les microarchitectures K7, K8 et K10 d'AMD==== Les microarchitectures suivantes sont les architectures K7, K8 et K10. Les architectures K7, K8 et K10 sont assez similaires. La différence principale entre le K7 et le K8 est le support du 64 bits. Les apports du K10 sont la présence d'un cache L3, d'une unité de calcul supplémentaire et d'améliorations de la prédiction de branchement. La taille de certains caches a été augmentée, de même que la largeur de certaines interconnexions/bus. A partir du K7, le CPU optimise la prise en charge des instructions ''load-up''. Les instructions ''load-op'' sont appelées des macro-opérations dans la terminologie d'AMD, et aussi d'Intel. L'idée est que les instructions ''load-up'' sont décodées en micro-opérations intermédiaires. Elles sont propagées dans le pipeline comme étant une seule micro-opération, jusqu'à l'étage d'émission. Lors de l'émission, les instructions ''load-up'' sont scindées en deux micro-opérations : la lecture de l'opérande, puis l'opération proprement dite. Faire ainsi économise des ressources et optimise le remplissage du tampon de ré-ordonnancement, des fenêtres d'instructions, des stations de réservation, etc. Le tampon de réordonnancement est combiné avec divers circuits en charge de l'exécution dans le désordre, dans ce qui s'appelle l'''instruction control unit''. Il contient de 72 à, 84 instructions, qui sont regroupées en groupes de 3. Là encore, comme pour le K5 et le K6, le tampon de réordonnancement tient compte de la sortie des décodeurs. Les décodeurs fournissent toujours trois micro-opérations par cycle, quitte à remplir les vides par des NOP. Le tampon de réordonnancement reçoit les micro-opérations, NOP inclus, par groupes de 3, et est structuré autour de ces triplets de micro-opération, y compris en interne. Les architectures K7, K8 et K10 ont des unités de calcul très similaires. Concrètement, il y a trois ALU entières, trois unités de calcul d'adresse, et une FPU. Le processeur incorpore, aussi un multiplieur entier, relié sur le port d'émission de la première ALU. La FPU regroupe un additionneur flottant, un multiplieur flottant, et une troisième unité LOAD/STORE pour les lectures/écritures pour les nombres flottants. L'architecture K8 ajoute une unité de manipulation de bit, la K10 un diviseur entier. [[File:Unité de calcul des processeurs AMD K7, K8 et K10.png|centre|vignette|upright=2|Unité de calcul des processeurs AMD K7, K8 et K10]] Par contre, la manière d'alimenter ces ALU en micro-opérations varie un petit peu entre les architectures K7, K8 et K10. Il y a cependant quelques constantes entre les trois. La première est qu'il y a une fenêtre d'instruction séparée pour les flottants, de 36 à 42 entrées, avec renommage de registre. La fenêtre d'instruction flottante a trois ports d'émission : un pour l'additionneur flottant, un autre pour le multiplieur, et un troisième pour la troisième unité flottante qui s'occupe du reste. La seconde est que chaque ALU entière est couplée avec une unité de calcul d'adresse. Par contre, la méthode de couplage varie d'un processeur à l'autre. L'architecture K7 des processeurs Athlon utilisait le renommage de registre, mais seulement pour les registres flottants, pas pour les registres entiers. Elle avait deux fenêtres d'instruction : une pour les opérations flottantes, une autre pour les instructions entières et les accès mémoire. La fenêtre d'instruction entière pouvait émettre trois micro-opérations en même temps : trois micro-opérations entières, trois micro-opération mémoire. La fenêtre d'instruction entière contenait 5 à 6 groupes de 3 macro-opérations. Vous noterez que j'ai parlé de macro-opérations et pas de micro-opérations, car les instructions ''load-up'' sont considérées comme une seule "micro-opération" dans la fenêtre d'instruction entière. Et cela se marie bien avec une fenêtre d'instruction unique partagée entre pipeline entier et pipeline mémoire. Une macro-opération était scindée en deux micro-opérations : une micro-opération mémoire et une micro-opération entière. Il est donc avantageux de regrouper unités mémoire et unités entières à la même fenêtre d'instruction pour ce faire. La ''Load-Store Queue'' peut mémoriser 44 lectures/écritures, avec cependant une petite nuance. Parmi les 44 lectures/écritures, 12 sont réservées au cache L1 et 32 le sont pour le cache L2. En réalité, il y a deux ''LSQ'', une pour le cache L1 qui fait 12 entrées, une seconde pour le L2 qui fait 32 entrées. [[File:Athlon arch.png|centre|vignette|upright=3|Microarchitecture K7 d'AMD.]] Les architectures K8 et K10 utilisent le renommage de registres pour tous les registres, entiers comme flottants. Par contre, le renommage de registre n'est pas réalisé de la même manière pour les registres entiers et flottants. Les registres entiers sont renommés dans le tampon de ré-ordonnancement, comme c'était le cas sur les architectures Intel avant le Pentium 4. Par contre, les registres flottants sont renommés grâce à un banc de registre physique. Le K8 est donc un processeur au renommage hybride, qui utilise les deux solutions de renommage principales. Niveau micro-opérations entières, la station de réservation unique de 15 micro-opérations est remplacée par trois stations de réservations, une par ALU entière, de 8 micro-opérations chacune. Chaque station de réservation entière alimente une unité de calcul entière et une unité de calcul d'adresse. Le multiplieur est relié à la première station de réservation, sur le même port d'émission que l'ALU. Les stations de réservation sont nommées des ''schedulers'' dans les schémas qui suivent. [[File:AMD Grayhound microarchitecture.png|centre|vignette|upright=3|Microarchitecture K8 et K10 d'AMD.]] La microarchitecture K10 a été déclinée en plusieurs versions, nommées Grayhound, Grayhound+ et Husky, Husky étant une architecture gravée en 32 nm dédiée aux processeurs A-3000. L'architecture Grayhound a plus de cache et un ROB plus grand, la Husky est quand à elle un peu plus différente. Elle n'a pas de cache L3, contrairement aux autres architectures K10, ce qui simplifie fortement son sous-système mémoire. Par contre, les fenêtres d'instructions/stations de réservation et le ROB sont plus grands, pareil pour les files dans l'unité mémoire. Une ALU pour les divisions entières a aussi été ajoutée. [[File:AMD Husky microarchitecture.png|centre|vignette|upright=3|AMD Husky microarchitecture]] Pour résumer, les architectures K7, K8 et K10 séparent les pipelines entiers et flottants : trois pipelines entiers avec chacun son unité de calcul, et un pipeline flottant avec plusieurs unités de calcul. Les raisons à cela sont assez diverses. Disons que dupliquer des ALU entières simples prend peu de transistors, là où les gros circuits comme le multiplieur ou la FPU ne sont pas dupliqués. Et cela a un autre avantage : le renommage, ''dispatch'' et l'émission sont plus simples. Les pipelines entiers ont une exécution dans le désordre peu complexe, grâce au grand nombre d'unités de calcul, ce qui fait que le pipeline entier est de seulement 15 cycles au total (chargement et décodage inclus). A l'opposé, la FPU est alimentée par une exécution dans le désordre très complexe, avec banc de registre physique et beaucoup de ressources, mais au prix d'un pipeline flottant plus long de 3 cycles, soit 18 cycles au total. ===Les microarchitectures ZEN d'AMD=== Viennent ensuite les '''microarchitectures Bulldozer''', avec trois révisions ultérieures nommées Piledriver, Steamroller et Excavator. Mais du fait de l'utilisation de techniques de multithreading matériel que nous n'avons pas encore abordé, nous ne pouvons pas en parler ici. Les microarchitectures suivantes sont les '''architectures ZEN 1/2/3/4/5'''. Elles se ressemblent beaucoup, chacune accumulant les améliorations des précédentes. Mais le cœur de l'architecture reste plus ou moins le même. En passant à la suivante, le nombre de registre virtuel augmente, le ''branch target buffer'' augmente en taille, le ROB et les files d'attente grossissent, les caches de micro-opération aussi, les caches grossissent, etc. La microarchitecture Zen 1 est illustrée ci-dessous. Le passage à Zen 2 a ajouté une unité de calcul d'adresse (4 ALU / 3 AGU), le Zen 5 a ajouté deux autres ALU entières et une unité de calcul d'adresse (6 ALU / 4 AGU) [[File:Zen microarchitecture.svg|centre|vignette|upright=3|Microarchitecture Zen 1 d'AMD.]] <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Le parallélisme mémoire au niveau du cache | prevText=Le parallélisme mémoire au niveau du cache | next=Les processeurs VLIW et EPIC | nextText=Les processeurs VLIW et EPIC }} </noinclude> pw5hx54yf4guuhrcxti5fovqol47b76 745873 745872 2025-07-03T16:04:10Z Mewtow 31375 /* L'émission multiple des accès mémoire */ 745873 wikitext text/x-wiki Les processeurs vus auparavant ne peuvent émettre au maximum qu'une instruction par cycle d'horloge : ce sont des processeurs à émission unique. Ils peuvent avoir plusieurs instructions qui s'exécutent en même temps, dans des unités de calcul séparées. C'est le cas dès qu'une instruction multicycle s'exécute. Par contre, ils ne peuvent démarrer qu'une seule instruction par cycle. Et quand on court après la performance, ce n'est pas assez ! Les concepteurs de processeurs ont inventés des processeurs qui émettent plusieurs instructions par cycle : les '''processeurs à émissions multiples'''. Un processeur à émission multiple charge plusieurs instructions en même temps, les décode en parallèle, puis les émet en même temps sur des unités de calculs séparées. Pour cela, il faut gérer les dépendances entre instructions, répartir les instructions sur différentes unités de calcul, et cela n'est pas une mince affaire. [[File:Superscalarpipeline.svg|centre|vignette|upright=1.5|Pipeline RISC classique à cinq étages sur un processeur superscalaire. On voit bien que plusieurs instructions sont chargées en même temps.]] Les processeurs à émission multiple sont de deux types : les processeurs VLIW et les '''processeurs superscalaires'''. Nous mettons les processeurs VLIW de côté en attendant le prochain chapitre. La raison est qu'ils ont un jeu d'instruction spécialisé qui expose le parallélisme d'instruction directement au niveau du jeu d'instructions, là où les processeurs superscalaires restent des processeurs au jeu d'instruction normal. La différence principale entre processeur VLIW et superscalaire est qu'un processeur superscalaire répartit les instructions sur les unités de calcul à l’exécution, là où un processeur VLIW délègue cette tâche au compilateur. ==L'implémentation d'un processeur superscalaire== Sur un processeur à émission multiple, plusieurs micro-opérations sont émises en même temps, le nombre varie d'un processeur à l'autre. Les processeurs superscalaires les plus simples ne permettent que d'émettre deux micro-opérations à la fois, d'où leur nom de processeur ''dual issue'', ce qui se traduit en '''processeur à double émission'''. Les processeurs modernes peuvent émettre 3, 4, 6, voire 8 micro-opérations simultanément. Aller au-delà ne sert pas à grand-chose. ===Les circuits hors-ALU sont soit dupliqués, soit adaptés=== Un processeur superscalaire doit être capable de : lire plusieurs instructions depuis la mémoire, les décoder, renommer leurs registres, et les envoyer à l'unité d'émission. Intuitivement, on se fit qu'on doit dupliquer tous les circuits : les décodeurs, l'unité de renommage, les unités de calcul, le ROB, etc. Dans les faits, l'implémentation d'un processeur superscalaire demande de dupliquer plusieurs circuits et d'en adapter d'autres. Voici ce que cela donne dans les grandes lignes. {|class="wikitable" |- ! rowspan="2" | Processeur sans émission multiple | rowspan="2" | Chargement | rowspan="2" | Décodage | rowspan="2" | Renommage | rowspan="2" | Émission | Exécution / ALU | rowspan="2" | ''Commit''/ROB |- | Exécution / ALU |- ! rowspan="4" | Processeur superscalaire | rowspan="4" | Chargement | rowspan="2" | Décodage | rowspan="4" | Renommage | rowspan="4" | Émission | Exécution / ALU | rowspan="4" | ''Commit''/ROB |- | Exécution / ALU |- | rowspan="2" | Décodage | Exécution / ALU |- | Exécution / ALU |} Un processeur superscalaire doit pouvoir charger plusieurs instructions en même temps. Deux solutions pour cela. La première est de doubler la taille du bus connecté au cache d'instruction. Si les instructions sont de longueur fixe, cela charge deux instructions à la fois. Pour un processeur à triple émission, il faut tripler la taille du bus, quadrupler pour un processeur quadruple émission, etc. Mais tout n'est pas si simple, quelques subtilités font qu'on doit ajouter des circuits en plus pour corriger les défauts peu intuitifs de cette implémentation naïve. Une autre solution est d'utiliser un cache d'instruction multiport. Mais dans ce cas, le ''program counter'' doit générer deux adresses, au mieux consécutives, au pire prédites par l'unité de prédiction de branchement. L'implémentation est alors encore plus complexe, comme on le verra plus bas. Il doit ensuite décoder plusieurs instructions en même temps. Il se trouve que les dépendances entre instruction ne posent pas de problème pour le décodeur. Rien ne s'oppose à ce qu'on utilise plusieurs décodeurs séparés. Il faut dire que les décodeurs sont de purs circuits combinatoires, du moins sur les processeurs avec une file de micro-opérations, ou avec une fenêtre d'instruction, ou des stations de réservation. Par contre, l'unité de renommage de registre n'est pas dupliquée, mais adaptées, pour gérer le cas où des instructions consécutives ont des dépendances de registre. Par exemple, prenons un processeur à double émission, qui renomme deux instructions consécutives. Si elles ont une dépendance, le renommage de la seconde instruction dépend du renommage de la première. La première doit être renommée et le résultat du renommage est utilisé pour renommer la seconde, ce qui empêche d'utiliser deux unités de renommage séparées. L'unité d'émission, la file de micro-opération et tous les circuits liés aux dépendances d'instruction ne sont pas dupliqués, car il peut y avoir des dépendances entre instruction chargées simultanément. L'unité d'émission est modifiée de manière à émettre plusieurs instructions à la fois. Si c'est un ''scoreboard'', il doit être modifié pour détecter les dépendances entre les instructions à émettre. Si c'est une fenêtre d'instruction ou une station de réservation, les choses sont plus simples, il faut basiquement rajouter des ports de lecture et écriture pour insérer et émettre plusieurs instructions à la fois, et modifier la logique de sélection en conséquence. Le ROB et les autres structures doivent aussi être modifiées pour pouvoir émettre et terminer plusieurs instructions en même temps. ===La duplication des unités de calcul et les contraintes d’appariement=== Pour émettre plusieurs instructions en même temps, encore faut-il avoir de quoi les exécuter. En clair : un processeur superscalaire doit avoir plusieurs unités de calcul séparées. Les processeurs avec un pipeline dynamique incorporent plusieurs unités pour les instructions entières, une unité pour les instructions flottantes, une unité pour les accès mémoire et éventuellement une unité pour les tests/branchements. Au lieu de parler d'unités de calcul, un terme plus correct serait le terme d''''avals''', que nous avions introduit dans le chapitre sur les pipelines dynamiques, mais n'avons pas eu l'occasion d'utiliser par la suite. Les processeurs avec un pipeline dynamique incorporent déjà plusieurs avals, mais chaque aval ne peut accepter qu'une nouvelle instruction par cycle. Et cela ne change pas sur les processeurs superscalaire, une unité de calcul reste une unité de calcul. Il y a plusieurs manières de gérer les avals sur un processeur superscalaire. La première duplique tous les avals : toutes les unités de calcul sont dupliquées. Par exemple, prenons un processeur simple-émission et transformons-le en processeur à double émission. Intuitivement, on se dit qu'il faut dupliquer toutes les unités de calcul. Si le processeur de base a une ALU entière, une FPU et un circuit multiplieur, ils sont tous dupliqués. L'avantage de faire ainsi est que le processeur n'a pas de contrainte quand il veut émettre deux instructions. Tant que les deux instructions n'ont pas de dépendances de données, il peut les émettre. Pour le dire autrement, toutes les paires d'instructions possibles sont compatibles avec la double émission. Si le processeur veut émettre deux multiplications consécutives, il le peut. S'il veut émettre deux instructions flottantes, il le peut. Le problème, c'est que le cout en circuit est conséquent ! Dupliquer la FPU ou les circuits multiplieurs bouffe du transistor. Pour économiser des transistors, il est possible de ne pas dupliquer tous les circuits. Typiquement, les ALU simples sont dupliquées, de même que les unités de calcul d'adresse, mais la FPU et les circuits multiplieurs ne sont pas dupliqués. En faisant ainsi, le cout en transistors est grandement réduire. Par contre, cela entraine l'apparition de dépendances structurelles. Par exemple, le CPU ne peut pas émettre deux multiplications consécutives sur un seul multiplieur, idem avec deux additions flottantes si l'additionneur flottant n'est pas dupliqué. La conséquence est que les processeurs superscalaires ont des contraintes sur les instructions à émettre en même temps. Si on prend un processeur ''dual-issue'', il y a donc des paires d'instructions autorisées et des paires interdites. Par exemple, l'exécution simultanée de deux branchements est interdite. Les branchements sont sérialisés, exécutés l'un après l'autre. Il est possible d'émettre un branchement en même temps qu'une autre instruction, en espérant que la prédiction de branchement ait fait une bonne prédiction. Mais il n'est souvent pas possible d'émettre deux branchements en même temps. La raison est qu'il n'y a qu'une seule unité de calcul pour les branchements dans un processeur. ==L'étape de chargement superscalaire== Pour charger plusieurs instructions, il suffit de doubler, tripler ou quadrupler le bus mémoire. Précisément, c'est le port de lecture du cache d’instruction qui est élargit, pour lire 2/3/4/... instructions. Un bloc de 8, 16, 32 octets est dnc lu depuis le cache et est ensuite découpé en instructions, envoyées chacun à un décodeur. Découper un bloc en instructions est trivial avec des instructions de longueur fixe, mais plus compliqué avec des instructions de taille variable. Il est cependant possible de s'en sortir avec deux solutions distinctes. La première solution utilise les techniques de prédécodage vues dans le chapitre sur les caches, à savoir que le découpage d'une ligne de cache est réalisé lors du chargement dans le cache d’instruction. Une autre solution améliore le circuit de détection des tailles d'instruction vu dans le chapitre sur l'unité de chargement. Avec la seconde solution, cela prend parfois un étage de pipeline entier, comme c'est le cas sur les processeurs Intel de microarchitecture P6. Mais laissons de côté cette difficulté et passons au vrai problème. Charger un gros bloc de mémoire permet de charger plusieurs instructions, mais il y a potentiellement des branchements dans le bloc. Et on doit gérer le cas où ils sont pris, le cas où les instructions suivantes dans le bloc doivent être annulées. En clair, il faut détecter les branchements dans le bloc chargé et gérer le cas où ils sont pris. : Dans ce qui va suivre, un morceau de code sans branchement est appelé un bloc de base (''basic block''). ===Le circuit de fusion de blocs=== Les processeurs superscalaires simples ne se préoccupent pas des branchements lors du chargement. Les instructions chargées en même temps sont toutes décodées et exécutées en même temps, même s'il y a un branchement dans le tas. Les branchements sont donc prédits comme étant non-pris systématiquement. Mais d'autres sont plus malins et utilisent la prédiction de branchement pour savoir si un branchement est pris ou non. Partons du principe que le branchement est pris : le processeur doit charger toutes les instructions d'un bloc, sauf celles qui suivent le branchement pris. L'unité de chargement coupe le bloc chargé au niveau du premier branchement non-pris, remplit les vides avec des NOP, avant d'envoyer le tout à l'unité de décodage. [[File:Fetch sur un processeur superscalaire avec prediction de branchements.png|centre|vignette|upright=2|Fetch sur un processeur superscalaire avec prédiction de branchements.]] Une solution plus performante charge les instructions de destination du branchement et les placent à sa suite. Ils chargent deux blocs à la fois et les fusionnent en un seul qui ne contient que les instructions présumées utiles. [[File:Cache d'instructions autoaligné.png|centre|vignette|upright=2|Cache d'instructions autoaligné.]] Mais cela demande de charger deux blocs de mémoire en une fois, ce qui demande un cache d'instruction multiports. Il faut aussi ajouter un circuit pour assembler plusieurs morceaux de blocs en un seul : le fusionneur (''merger''). Le résultat en sortie du fusionneur est ce qu'on appelle une '''trace'''. [[File:Implémentation d'un cache d'instructions autoaligné.png|centre|vignette|upright=2|Implémentation d'un cache d'instructions autoaligné.]] Le principe peut se généraliser si un bloc contient plusieurs branchements pris, avec un nombre de blocs supérieur à deux. Mais cela demande une unité de prédiction de branchement capable de prédire plusieurs branchements par cycle. ===Le cache de traces=== Si jamais un bloc est rechargé et que ses branchements sont pris à l'identique, le résultat du fusionneur sera le même. Il est intéressant de conserver cette trace dans un '''cache de traces''' pour la réutiliser ultérieurement. Le cache de trace n'a été utilisé que sur un seul processeur commercial : le Pentium 4 d'Intel. Fait intéressant, son cache de trace ne mémorisait pas des suites d'instructions, mais des suites de micro-opérations. En clair, il mémorisait des traces décodées, ce qui fait qu'un succès de cache de trace contournait non seulement le cache d'instruction, mais aussi les décodeurs. Ce qui explique que le temps d'accès au cache de trace n'était pas un problème, même s'il était comparable au temps d'accès du cache d'instruction. Il a depuis été remplacé par une alternative bien plus intéressante, le cache de micro-opérations, plus flexible et plus performant. Une trace est réutilisable quand le premier bloc de base est identique et que les prédictions de branchement restent identiques. Pour vérifier cela, le tag du cache de traces contient l'adresse du premier bloc de base, la position des branchements dans la trace et le résultat des prédictions utilisées pour construire la trace. Le résultat des prédictions de branchement de la trace est stocké sous la forme d'une suite de bits : si la trace contient n branchements, le n-ième bit vaut 1 si ce branchement a été pris, et 0 sinon. Même chose pour la position des branchements dans la trace : le bit numéro n indique si la n-ième instruction de la trace est un branchement : si c'est le cas, il vaut 1, et 0 sinon. Pour savoir si une trace est réutilisable, l'unité de chargement envoie le ''program counter'' au cache de traces, l'unité de prédiction de branchement fournit le reste des informations. Si on a un succès de cache de traces, et la trace est envoyée directement au décodeur. Sinon, la trace est chargée depuis le cache d'instructions et assemblée. [[File:TraceCache.png|centre|vignette|upright=2|Cache de traces.]] [[File:BasicBlocks.png|vignette|Blocs de base.]] Pour comprendre ce qu'est une trace, regardez le code illustré ci-contre. Il est composé d'un bloc de base A, suivi par un bloc de base B, qui peut faire appel soit au bloc C, soit un bloc D. Un tel code peut donner deux traces : ABC ou ABD. La trace exécutée dépend du résultat du branchement qui choisit entre C et D. Un cache de trace idéal mémorise les deux traces ABC et ABD dans deux lignes de cache séparées. Il peut mémoriser des traces différentes, même si leur début est le même. Un cache de trace peut supporter des '''succès de cache de trace partiels'''. Prenez le cas où le processeur veut lire la trace ABC mais que le cache de trace ne contient que la trace ABD : c'est un succès partiel. Dans ce cas, le processeur peut lire les blocs de base A et B depuis le cache de trace, et lit D depuis le cache d'instruction. Et cela vaut dans le cas général : si le cache a mémorisé une trace similaire à celle demandée, dont seuls les premiers blocs de base correspondent, il peut lire les premiers blocs de base dans le cache de trace et lire le reste dans le cache d'instruction. Il y a une certaine redondance dans le contenu du cache de trace, car certaines traces partagent des blocs de base. Pour éviter cela, il est possible de mémoriser les blocs de base dans des caches séparés et les assembler avec un fusionneur. Par exemple, au lieu d'utiliser un cache de traces unique, on va utiliser quatre '''caches de blocs de base''', suivi par un fusionneur qui reconstitue la trace. On économise du cache, au dépend d'un temps d'accès plus long vu qu'il faut reconstituer la trace. ==Le séquenceur d'un processeur superscalaire== Le séquenceur d'un processeur superscalaire est modifié, afin de pouvoir décoder plusieurs instructions à la fois. Ce n'est pas le cas général, mais la présence de plusieurs décodeurs est très fréquent sur les processeur superscalaires. De plus, les unités de renommage et d'émission doivent être modifiées. ===Les décodeurs d'instructions superscalaires=== Un processeur superscalaire contient généralement plusieurs décodeurs, chacun pouvant décoder une instruction en parallèle des autres. Prenons par exemple un processeur RISC dont toutes les instructions font 32 bits. Un processeur superscalaire de ce type peut charger des blocs de 128 bits, ce qui permet de charger 4 instructions d'un seul coup. Et pour les décoder, le décodage se fera dans quatre décodeurs séparés, qui fonctionneront en parallèle. Ou alors, il se fera dans un seul décodeur qui pourra décoder plusieurs instructions par cycles. Les processeurs CISC utilisent des décodeurs hybrides, avec un microcode qui complémente un décodeur câblés. Dupliquer le microcode aurait un cout en transistors trop important, ce qui fait que seuls les décodeurs câblés sont dupliqués. Les CPU CISC superscalaires disposent donc de plusieurs décodeurs simples, capables de décoder les instructions les plus courantes, avec un seul microcode. La conséquence est qu'il n'est pas possible de décoder deux instructions microcodées en même temps. Par contre, il reste possible de décoder plusieurs instructions non-microcodées ou une instruction microcodée couplée à une instruction non-microcodée. Vu qu'il est rare que deux instructions microcodées se suivent dans un programme, le cout en performance est extrêmement mineur. Les processeurs superscalaires supportent la technique dite de '''macro-fusion''', qui permet de fusionner deux-trois instructions consécutives en une seule micro-opération. Par exemple, il est possible fusionner une instruction de test et une instruction de saut en une seule micro-opération de branchement. Il s'agit là de l'utilisation la plus importante de la macro-fusion sur les processeurs x86 modernes. En théorie, d'autres utilisations de la macro-fusion sont possibles, certaines ont même été [https://www2.eecs.berkeley.edu/Pubs/TechRpts/2016/EECS-2016-130.pdf proposées pour le jeu d'instruction RISC-V], mais rien n'est encore implémenté (à ma connaissance). La fusion des instructions se fait lors du décodage des instructions, grâce à la coopération des décodeurs. ===L'unité de renommage superscalaire=== Sur un processeur à émission multiple, l'unité de renommage de registres doit renommer plusieurs instructions à la fois, mais aussi gérer les dépendances entre instructions. Pour cela, elle renomme les registres sans tenir compte des dépendances, pour ensuite corriger le résultat. [[File:Unité de renommage superscalaire.png|centre|vignette|upright=2|Unité de renommage superscalaire.]] Seules les dépendances lecture-après-écriture doivent être détectées, les autres étant supprimées par le renommage de registres. Repérer ce genre de dépendances se fait assez simplement : il suffit de regarder si un registre de destination d'une instruction est un opérande d'une instruction suivante. [[File:Détection des dépendances sur un processeur superscalaire.png|centre|vignette|upright=2|Détection des dépendances sur un processeur superscalaire.]] Ensuite, il faut corriger le résultat du renommage en fonction des dépendances. Si une instruction n'a pas de dépendance avec une autre, on la laisse telle quelle. Dans le cas contraire, un registre opérande sera identique avec le registre de destination d'une instruction précédente. Dans ce cas, le registre opérande n'est pas le bon après renommage : on doit le remplacer par le registre de destination de l'instruction avec laquelle il y a dépendance. Cela se fait simplement en utilisant un multiplexeur dont les entrées sont reliées à l'unité de détection des dépendances. On doit faire ce replacement pour chaque registre opérande. [[File:Correction des dépendances sur un processeur superscalaire.png|centre|vignette|upright=2|Correction des dépendances sur un processeur superscalaire.]] ===L'unité d'émission superscalaire=== Pour émettre plusieurs instructions en même temps, l'unité d'émission doit être capable d'émettre plusieurs instructions par cycle. Et Pour cela, elle doit détecter les dépendances entre instructions. Il faut noter que la plupart des processeurs superscalaires utilisent le renommage de registre pour éliminer un maximum de dépendances inter-instructions. Les seules dépendances à détecter sont alors les dépendances RAW, qu'on peut détecter en comparant les registres de deux instructions consécutives. Sur les processeurs superscalaires à exécution dans l’ordre, il faut aussi gérer l'alignement des instructions dans la fenêtre d'instruction. Dans le cas le plus simple, les instructions sont chargées par blocs et on doit attendre que toutes les instructions du bloc soient émises pour charger un nouveau bloc. Avec la seconde méthode, La fenêtre d'instruction fonctionne comme une fenêtre glissante, qui se déplace de plusieurs crans à chaque cycle d'horloge. Mais au-delà de ça, le design de l'unité d'émission change. Avant, elle recevait une micro-opération sur son entrée, et fournissait une micro-opération émise sur une sortie. Et cela vaut aussi bien pour une unité d'émission simple, un ''scoreboard'', une fenêtre d'instruction ou des stations de réservation. Mais avec l'émission multiple, les sorties et entrées sont dupliquées. Pour la double émission, il y a deux entrées vu qu'elle doit recevoir deux micro-opération décodées/renommées, et deux sorties pour émettre deux micro-opérations. Formellement, il est possible de faire une analogie avec une mémoire : l'unité d'émission dispose de ports d'écriture et de lecture. On envoie des micro-opérations décodées/renommées sur des ports d'écriture, et elle renvoie des micro-opérations émises sur le port de lecture. Dans ce qui suit, nous parlerons de '''ports de décodage''' et de '''ports d'émission'''. Si l'unité d'émission est un vulgaire ''scoreboard'', il doit détecter les dépendances entre instructions émises simultanément. De plus, il doit détecter les paires d'instructions interdites et les sérialiser. Autant dire que ce n'est pas très pratique. La détection des dépendances entre instructions consécutives est simplifiée avec une fenêtre d'instruction, il n'y a pour ainsi dire pas grand chose à faire, vu que les dépendances sont éliminées par le renommage de registre et que les signaux de réveil s'occupent de gérer les dépendances RAW. C'est la raison pour laquelle les processeurs superscalaires utilisent tous une fenêtre d'instruction centralisée ou décentralisée, et non des ''scoreboard''. Les processeurs superscalaires privilégient souvent des stations de réservations aux fenêtres d'instruction. Rappelons la terminologie utilisée dans ce cours. Les fenêtres d'instruction se contentent de mémoriser la micro-opération à émettre et quelques bits pour la disponibilité des opérandes. Par contre, les stations de réservations mémorisent aussi les opérandes des instructions. Les registres sont lus après émission avec une fenêtre d'instruction, avant avec des stations de réservation. Et cette différence a une influence sur le pipeline du processeur, le banc de registres et tout ce qui s'en suit. La différence principale est liée au banc de registre, et précisément au nombre de ports de lecture. Supposons que toutes les instructions sont dyadiques, ou du moins qu'il n'existe pas de micro-opération à trois opérandes. Avec une fenêtre d'instruction, le nombre d'opérandes à lire simultanément est proportionnel à la quantité d'instructions qu'on peut émettre en même temps. Sur un processeur ''dual issue'', qui peut émettre deux micro-opérations, cela fait deux micro-opérations à deux opérandes chacune, soit 4 opérandes. Le nombre de ports de lecture est donc de quatre. Avec une station de réservation, la lecture des opérandes a lieu avant l'émission, juste après le décodage/renommage. Le nombre d'opérande est le double du nombre de micro-opérations décodées/renommées, pas émises. Si le décodeur peut décoder/renommer 4 instructions par cycle, cela veut dire 4 micro-opérations émises par cycle. Et il se trouve que les deux situations ne sont pas évidentes. Avec une fenêtre d'instruction centralisée, cela ne change rien. Le nombre d'instructions décodées et émises en même temps sont identiques. Mais dès qu'on utilise des fenêtres d'instruction décentralisées, les choses changent. Si le décodeur peut décoder/renommer 4 instructions par cycle, alors l'idéal est d'avoir 4 micro-opérations émises par cycle, ''par fenêtre d'instruction''. Imaginez que le décodeur décode 4 instructions entières : la fenêtre d'instruction entière doit pouvoir émettre 4 micro-opérations entières en même temps. Idem pour des instructions flottantes avec la fenêtre d'instruction flottantes. Vu qu'il y a deux fenêtres d'instruction, cela fait 4 micro-opérations entières + 4 micro-opérations flottantes = 8 ports de lecture. Non pas qu'ils soient tous simultanément utiles, mais il faut les câbler. Les fenêtres d'instruction impliquent plus de lectures d'opérandes, ce qui implique plus de ports de lecture. Les stations de réservation sont plus économes, elles vont bien avec un nombre modéré de ports de lecture. ===Les conséquences sur le banc de registre=== Émettre plusieurs instructions en même temps signifie lire ou écrire plusieurs opérandes à la fois : le nombre de ports du banc de registres doit être augmenté. De plus, le banc de registre doit être relié à toutes les unités de calcul en même temps, ce qui fait 2 ports de lecture par unité de calcul. Et avec plusieurs dizaines d'unités de calcul différentes, le câblage est tout simplement ignoble. Et plus un banc de registres a de ports, plus il utilise de circuits, est compliqué à concevoir, consomme de courant et chauffe. Mais diverses optimisations permettent de réduire le nombre de ports assez simplement. Un autre solution utilise un banc de registre unique, mais n'utilise pas autant de ports que le pire des cas le demanderait. Pour cela, le processeur doit détecter quand il n'y a pas assez de ports pour servir toutes les instructions : l'unité d'émission devra alors mettre en attente certaines instructions, le temps que les ports se libèrent. Cette détection est réalisée par un circuit d'arbitrage spécialisé, intégré à l'unité d'émission, l’arbitre du banc de registres (''register file arbiter''). ==Les unités de calcul des processeurs superscalaires== Un processeur superscalaire émet/exécute plusieurs instructions simultanément dans plusieurs unités de calcul séparées. Intuitivement, on se dit qu'il faut dupliquer les unités de calcul à l'identique. Un processeur superscalaire contient alors N unités de calcul identiques, précédées par une fenêtre d'instruction avec N ports d'émission. Un tel processeur peut émettre N micro-opérations, tant qu'elles n'ont pas de dépendances. Manque de chance, ce cas est l'exception. La raison est que les processeurs superscalaires usuels sont conçus à partir d'un processeur à pipeline dynamique normal, qu'ils améliorent pour le rendre superscalaire. Les processeurs avec un pipeline dynamique incorporent plusieurs unités de calcul distinctes, avec une ALU pour les instructions entières, une FPU pour les instructions flottantes, une unité pour les accès mémoire (calcul d'adresse) et éventuellement une unité pour les tests/branchements. Sans superscalarité, ces unités sont toutes reliées au même port d'émission. Avec superscalarité, les unités de calcul existantes sont connectées à des ports d'émission différents. ===La double émission entière-flottante=== En théorie, il est possible d'imaginer un CPU superscalaire sans dupliquer les ALU, en se contenant d'exploiter au mieux les unités de calcul existantes. Prenons le cas d'un processeur avec une ALU entière et une ALU flottante, qu'on veut transformer en processeur superscalaire. L'idée est alors de permettre d'émettre une micro-opération entière en même temps qu'une micro-opération flottante. La micro-opération entière s'exécute dans l'ALU entière, la micro-opération flottante dans la FPU. Il suffit juste d'ajouter un port d'émission dédié sur la FPU. Le processeur a donc deux pipelines séparés : un pour les micro-opérations entières, un autre pour les micro-opérations flottantes. On parle alors de '''double émission entière-flottante'''. L'idée est simple, la mise en œuvre utilise assez peu de circuits pour un gain en performance qui est faible, mais en vaut la peine. La plupart des premiers processeurs superscalaires étaient de ce type. Les exemples les plus notables sont les processeurs POWER 1 et ses dérivés comme le ''RISC Single Chip''. Ils sont assez anciens et avaient un budget en transistors limité, ce qui fait qu'ils devaient se débrouiller avec peu de circuits dont ils disposaient. L'usage d'une double émission entière-flottante était assez naturelle. [[File:Double émission entière-flottante.png|centre|vignette|upright=2|Double émission entière-flottante]] Cependant, la méthode a un léger défaut. Une instruction flottante peut parfois lever une exception, par exemple en cas de division par zéro, ou pour certains calculs précis. Si une exception est levée, alors l'instruction flottante est annulée, de même que toutes les instructions qui suivent. Ce n'est pas un problème si le processeur gère nativement les exceptions précises, par exemple avec un tampon de ré-ordonnancement. Et c'est le cas pour la totalité des processeurs à exécution dans le désordre. Mais sur les processeurs à exécution dans l'ordre, si le budget en transistors est limité, les techniques de ce genre sont absentes. En théorie, sans tampon de ré-ordonnancement ou équivalent, on ne peut pas émettre d'instruction flottante en même temps qu'une instruction entière à cause de ce problème d'exceptions flottantes. Le problème s'est manifesté sur les processeurs Atom d'Intel, et les concepteurs du processeur ont trouvé une parade. L'idée est de tester les opérandes flottantes, pour détecter les combinaisons d'opérandes à problème, dont l'addition/multiplication peut lever une exception. Si des opérandes à problème sont détectées, on stoppe l'émission de nouvelles instructions en parallèle de l'instruction flottante et l'unité d'émission émet des bulles de pipeline tant que l'instruction flottante est en cours. Sinon, l'émission multiple fonctionne normalement. La technique, appelée ''Safe Instruction Recognition'' par Intel, est décrite dans le brevet US00525721.6A. Il faut noter que la double émission entière-flottante peut aussi être adaptée aux accès mémoire. En théorie, les accès mémoire sont pris en charge par le pipeline pour les opérations entières. L'avantage est que l'on peut alors utiliser l'unité de calcul pour calculer des adresses. Mais il est aussi possible de relier l'unité mémoire à son propre port d'émission. Le processeur devient alors capable d’émettre une micro-opération entière, une micro-opération flottante, et une micro-opération mémoire. On parle alors de '''triple émission entière-flottante-mémoire'''. La seule contrainte est que l'unité mémoire incorpore une unité de calcul d'adresse dédiée. ===L'émission multiple des micro-opérations flottantes=== La double émission entière-flottante ajoute un port d'émission pour la FPU, ce qui a un cout en circuits modeste, pour un gain en performance intéressant. Mais il faut savoir que les FPU regroupent un additionneur-soustracteur flottant et un multiplieur flottant, qui sont reliés au même port d'émission. Et il est possible d'ajouter des ports d'émission séparés pour l'additionneur flottant et le multiplieur flottant. Le processeur peut alors émettre une addition flottante en même temps qu'une multiplication flottante. Les autres circuits de calcul flottant sont répartis sur ces deux ports d'émission flottants. L'avantage est que cela se marie bien avec l'usage d'une fenêtre d'instruction séparée pour les opérations flottantes. La fenêtre d'instruction a alors deux ports séparés, au lieu d'un seul. Rajouter un second port d'émission flottant n'est pas trop un problème, car le cout lié à l'ajout d'un port n'est pas linéaire. Passer de un port à deux a un cout tolérable, bien plus que de passer de 3 ports à 4 ou de 4 à 5. Il est même possible de dupliquer l'additionneur et le multiplieur flottant, ce qui permet d'émettre deux additions et multiplications flottantes en même temps. C'est ce qui est fait sur les processeur AMD de architecture Zen 1 et 2. Ils ont deux additionneurs flottants par cœur, deux multiplieurs flottants, chacun avec leur propre port d'émission. Les performances en calcul flottant sont assez impressionnantes pour un processeur de l'époque. [[File:ZEN - émission multiple flottante.png|centre|vignette|upright=2.5|Microarchitecture Zen 1 d'AMD.]] ===L'émission multiple des micro-opérations entières=== Nous avons vu plus haut qu'il est possible d'ajouter plusieurs ports d'émission pour la FPU. Intuitivement, on se dit que la méthode peut aussi être appliquée pour émettre plusieurs micro-opérations entières en même temps. En effet, un processeur contient généralement plusieurs unités de calcul entières séparées, avec typiquement une ALU entière simple, un circuit multiplieur/diviseur, un ''barrel shifter'', une unité de manipulation de bit. Les 5 unités permettent d'émettre 4 micro-opérations entières en même temps, à condition qu'on ajoute assez de ports d'émission. [[File:Emission multiple des opérations entières, implémentation naive.png|centre|vignette|upright=2|Émission multiple des opérations entières, implémentation naïve.]] Maintenant, posons-nous la question : est-ce que faire ainsi en vaut la peine ? Le processeur peut en théorie émettre une addition, une multiplication, un décalage et une opération de manipulation de bits en même temps. Mais une telle situation est rare. En conséquence, les ports d'émission seront sous-utilisés, sous celui pour l'ALU entière. Pour réduire le nombre de ports d'émission sous-utilisés, il est possible de regrouper plusieurs unités de calcul sur le même port d'émission. Typiquement, il y a un port d'émission pour le multiplieur et un autre port d'émission pour le reste. L'avantage est que cela permet d'exécuter des micro-opérations entières en parallèle d'une multiplication. Mais on ne peut pas émettre/exécuter en parallèle des instructions simples. Il n'est pas exemple pas possible de faire un décalage en même temps qu'une addition. Le cout en performance est le prix à payer pour la réduction du nombre de ports d'émission, et il est assez faible. : Je dis exécuter/émettre, car ces instructions s'exécutent en un cycle. Si elles ne sont pas émises en même temps, elles ne s'exécutent pas en même temps. [[File:Emission multiple des opérations entières, double émission.png|centre|vignette|upright=2|Émission multiple des opérations entières, double émission]] Typiquement, la plupart des programmes sont majoritairement remplis d'additions, avec des multiplications assez rares et des décalages qui le sont encore plus. En pratique, il n'est pas rare d'avoir une multiplication pour 4/5 additions. Si on veut profiter au maximum de l'émission multiple, il faut pouvoir émettre plusieurs additions/soustractions en même temps, ce qui demande de dupliquer les ALU simples et leur donner chacune son propre port d'émission. : Le multiplieur n'est presque jamais dupliqué, car il est rare d'avoir plusieurs multiplications consécutives. Disposer de plusieurs circuits multiplieurs serait donc un cout en circuits qui ne servirait que rarement et n'en vaut pas la chandelle. Pour économiser des ports d'émission, les ALU entières dupliquées sont reliées à des ports d'émission existants. Par exemple, on peut ajouter la seconde ALU entière au port d'émission du multiplieur, la troisième ALU entière au port dédié au ''barrel shifter'', etc. Ainsi, les ports d'émission sont mieux utilisés : il est rare qu'on n'ait pas d'instruction à émettre sur un port. Le résultat est un gain en performance bien plus important qu'avec les techniques précédentes, pour un cout en transistor mineur. [[File:Emission multiple des opérations entières, implémentation courante.png|centre|vignette|upright=2|Emission multiple des opérations entières, implémentation courante]] ===L'émission multiple des accès mémoire=== Après avoir vu l'émission multiple pour les opérations flottantes et etnières, il est temps de voir l''''émission multiple des accès mémoire'''. ! Il est en effet possible d'émettre plusieurs micro-opérations mémoire en même temps. Les processeurs superscalaires modernes sont capables d'émettre plusieurs lectures/écritures simultanément. Par exemple, ils peuvent émettre une lecture en même temps qu'une écriture, ou plusieurs lectures, ou plusieurs écritures. Il faut noter que selon le processeur, il peut y avoir des restrictions quant aux accès mémoire émis en même temps. Par exemple, certains processeurs peuvent émettre une lecture avec une écriture en même temps, mais pas deux lectures ni deux écritures. Ou encore, ils peuvent émettre deux lectures, une lecture et une écriture, mais pas deux écritures en même temps. Dans la majorité des cas, les processeurs ne permettent pas d'émettre deux écritures en même temps, alors qu'ils supportent plusieurs lectures. Il faut dire que les lectures sont plus fréquentes que les écritures. Les processeurs qui autorisent toutes les combinaisons de lecture/écriture possibles, sont rares. L'émission multiple des accès mémoire demande évidemment de dupliquer des circuits, mais pas l'unité mémoire complète. Pour rappel, l'unité mémoire s'interpose entre le cache et le reste du pipeline. Elle est composée au minimum d'une unité de calcul d'adresse, des ports de lecture/écriture du cache de données. Le tout peut éventuellement être complété par des structures qui remettent en ordre les accès mémoire, comme une ''Load-store queue''. Émettre plusieurs micro-opérations mémoire demande d'avoir plusieurs unités de calcul, une par micro-opération mémoire émise par cycle. Si le processeur peut émettre trois micro-opérations mémoire à la fois, il y aura besoin de trois unités de calcul d'adresse. Chaque unité de calcul d'adresse est directement reliée à un port d'émission mémoire. Les ports de lecture/écriture du cache sont aussi dupliqués, afin de gérer plusieurs accès mémoire simultanés au cache de données. Par contre, la structure qui remet les accès mémoire en ordre n'est pas dupliquée. Les processeurs avec une ''Load-store queue'' ne la dupliquent pas. Par contre, elle est rendue multi-ports afin de gérer plusieurs micro-opérations mémoire simultanés. Par exemple, les processeurs skylake ont une LSQ avec deux ports de lecture et un port d'écriture, ce qui permet de faire deux lectures en même temps qu'une écriture. C'est la même chose avec les processeurs avec juste une ''Store Queue'' et une ''Load Queue''. Prenons un processeur qui peut émettre une lecture et une écriture en même temps. Dans ce cas, la lecture va dans la ''Load Queue'', l'écriture dans la ''Store Queue''. Il y a bien des modifications à faire sur les deux files, afin de gérer deux accès simultanés, mais les structures ne sont pas dupliqués. Si on veut gérer plusieurs lectures ou plusieurs écritures, il suffit d'ajouter des ports à la ''Load Queue' ou à la ''Store Queue''. : Dans ce qui suit, nous parlerons d'AGU (''Adress Generation Unit'') pour désigner les unités de calcul d'adresse. Un exemple est celui des processeurs Intel de microarchitecture Nehalem, qui pouvaient seulement émettre une lecture en même temps qu'une écriture. Ils avaient deux ports d'émission reliés à l'unité mémoire. Un port pour les lectures, un autre pour les écritures. Le premier port d'écriture recevait la donnée à écrire et s'occupait des calculs d'adresse, Le port de lecture faisait uniquement des calculs d'adresse. Les processeurs AMD K6 sont similaires, avec un port d'émission pour les lectures et un autre pour les écritures. Le port de lecture alimente une unité de calcul d'adresse dédiée, directement reliée au cache. Le port d'écriture du cache alimente une unité de calcul, qui est suivie par une ''Store Queue'', une version simplifiée de la LSQ dédiée aux écritures. Le processeur exécutait les lectures dès qu'elles avaient leurs opérandes de disponibles, seules les écritures étaient mises en attente. D'autres processeurs ont plusieurs ports d'émission pour les unités mémoire, mais qui peuvent faire indifféremment lecture comme écritures. Un exemple est celui du processeur Athlon 64, un processeur AMD sorti dans les années 2000. Il disposait d'une LSQ unique, reliée à un cache L1 de donnée double port. La LSQ était reliée à trois unités de calcul séparées de la LSQ. La LSQ avait des connexions avec les registres, pour gérer les lectures/écritures. [[File:Athlon.png|centre|vignette|upright=2.5|Athlon]] ===L'interaction avec les fenêtres d'instruction=== Nous venons de voir qu'un processeur superscalaire peut avoir des ports d'émission reliés à plusieurs ALU. Pour le moment, nous avons vu le cas où le processeur dispose de fenêtres d'instruction séparées pour les opérations entières et flottantes. Un port d'émission est donc relié soit à des ALU entières, soit à des FPU. Mais il existe des processeurs où un même port d'émission alimente à la fois une ALU entière et une FPU. Par exemple, on peut relier un additionneur flottant sur le même port qu'une ALU entière. Il faut noter que cela implique une fenêtre d'instruction centralisée, capable de mettre en attente micro-opérations entières et flottantes. Un exemple est celui des processeurs Core 2 Duo. Ils disposent de 6 ports d'émission, dont 3 ports dédiés à l'unité mémoire. Les 3 ports restants alimentent chacun une ALU entière, un circuit de calcul flottant et une unité de calcul SSE (une unité de calcul SIMD, qu'on abordera dans quelques chapitres). Le premier port alimente une ALU entière simple et un multiplieur/diviseur flottant. Le second alimente une ALU entière, un multiplieur entier et un additionneur flottant. Le troisième alimente une ALU entière, sans circuit flottant dédié. [[File:Intel Core2 arch.svg|centre|vignette|upright=2.5|Intel Core 2 Duo - microarchitecture.]] Une conséquence de partager les ports d'émission est l'apparition de dépendances structurelles. Par exemple, imaginez qu'on connecte un multiplieur entier et la FPU, sur le même port d'émission. Il est alors impossible d'émettre une multiplication et une opération flottante en même temps. Mais la situation ne se présente que pour certaines combinaisons de micro-opérations bien précises, qui sont idéalement assez rares. De telles dépendances structurelles n'apparaissent que sur des programmes qui entremêlent instructions flottantes et entières, ce qui est assez rare. Les dépendances structurelles doivent cependant être prises en compte par les unités d'émission. Dans le même genre, il est possible de partager un port d'émission entre l'unité mémoire et une ALU entière. Cela permet d'utiliser l'ALU entière pour les calculs d'adresse, ce qui évite d'avoir à utiliser une unité de calcul d'adresse distincte. Un exemple est celui du processeur superscalaire double émission Power PC 440. Il dispose de deux ports d'émission. Le premier est connecté à une ALU entière et un circuit multiplieur, le second est relié à l'unité mémoire et une seconde ALU entière. L'organisation en question permet soit d'émettre un accès mémoire en même temps qu'une opération entière, soit d'émettre deux opérations entières simples, soit d’émettre une multiplication et une addition/soustraction/comparaison. Une organisation simple, mais très efficace ! [[File:PowerPC 440.png|centre|vignette|upright=2|Microarchitecture du PowerPC 440.]] ===Résumé=== Faisons un résumé rapide de cette section. Nous venons de voir que les différentes unités de calcul sont reliés à des ports d'émission, la répartition des ALU sur les ports d'émission étant très variable d'un processeur à l'autre. Entre les processeurs qui séparent les ports d'émission entier et flottant, ceux qui les mélangent, ceux qui séparent les ports d'émission mémoire des ports entiers et ceux qui les fusionnent, ceux qui autorisent l'émission multiple des micro-opérations mémoire ou flottante, il y a beaucoup de choix. Les divers choix possibles sont tous des compromis entre deux forces : réduire le nombre de ports d'émission d'un côté, garder de bonnes performances en limitant les dépendances structurelles de l'autre. Réduire le nombre de ports d'émission permet de garder des fenêtres d'instruction relativement simples. Plus elles ont de ports, plus elles consomment d'énergie, chauffent, sont lentes, et j'en passe. De plus, plus on émet de micro-opérations en même temps, plus la logique de détection des dépendances bouffe du circuit. Et cela a des conséquences sur la fréquence du processeur : à quoi bon augmenter le nombre de ports d'émission si c'est pour que ce soit compensé par une fréquence plus faible ? Par contre, regrouper plusieurs ALU sur un même port d'émission est à l'origine de dépendances structurelles. Impossible d'émettre deux micro-opérations sur deux ALU si elles sont sur le même port. Le nombre de ports peut être un facteur limitant pour la performance dans certaines situations de '''''port contention''''' où on a assez d'ALU pour exécuter N micro-opérations, mais où la répartition des ALUs sur les ports l’empêche. Suivant la répartition des ALU sur les ports, la perte de performance peut être légère ou importante, tout dépend des choix réalisés. Et les choix en question dépendent fortement de la répartition des instructions dans le programme exécuté. Le fait que certaines instructions sont plus fréquentes que d'autres, que certaines instructions sont rarement consécutives : tout cela guide ce choix de répartition des ALu sur les ports. ==Le contournement sur les processeurs superscalaires== Pour rappel, la technique du contournement (''register bypass'') permet au résultat d'une instruction d'être immédiatement utilisable en sortie de l'ALU, avant même d'être enregistré dans les registres. Implémenter la technique du contournement demande d'utiliser des multiplexeurs pour relier la sortie de l'unité de calcul sur son entrée si besoin. il faut aussi des comparateurs pour détecter des dépendances de données. [[File:Pipeline Bypass.png|centre|vignette|upright=1|Pipeline Bypass]] ===Les problèmes du contournement sur les CPU avec beaucoup d'ALUs=== Avec plusieurs unités de calcul, la sortie de chaque ALU doit être reliée aux entrées de toutes les autres, avec les comparateurs qui vont avec ! Sur les processeurs ayant plusieurs d'unités de calculs, cela demande beaucoup de circuits. Pour N unités de calcul, cela demande 2 * N² interconnexions, implémentées avec 2N multiplexeurs de N entrées chacun. Si c'est faisable pour 2 ou 3 ALUs, la solution est impraticable sur les processeurs modernes, qui ont facilement une dizaine d'unité de calcul. De plus, la complexité du réseau de contournement (l'ensemble des interconnexions entre ALU) a un cout en terme de rapidité du processeur. Plus il est complexe, plus les données contournées traversent de longs fils, plus leur temps de trajet est long, plus la fréquence du processeur en prend un coup. Diverses techniques permettent de limiter la casse, comme l'usage d'un bus de contournement, mais elle est assez impraticable avec beaucoup d'unités de calcul. Notez que cela vaut pour les processeurs superscalaires, mais aussi pour tout processeur avec beaucoup d'unités de calcul. Un simple CPU à exécution dans le désordre, non-superscalaire, a souvent pas mal d'unités de calcul et fait face au même problème. En théorie, un processeur sans exécution dans le désordre ou superscalarité pourrait avoir le problème. Mais en pratique, avoir une dizaine d'ALU implique processeur superscalaire à exécution dans le désordre. D'où le fait qu'on parle du problème maintenant. La seule solution praticable est de ne pas relier toutes les unités de calcul ensemble. À la place, on préfère regrouper les unités de calcul dans différents '''agglomérats''' ('''cluster'''). Le contournement est alors possible entre les unités d'un même agglomérat, mais pas entre agglomérats différents. Généralement, cela arrive pour les unités de calcul entières, mais pas pour les unités flottantes. La raison est que les CPU ont souvent beaucoup d'unités de calcul entières, car les instructions entières sont légion, alors que les instructions flottantes sont plus rares et demandent au mieux une FPU simple. Évidemment, l'usage d'agglomérats fait que certaines possibilités de contournement sont perdues, avec la perte de performance qui va avec. Mais la perte en possibilités de contournement vaut bien le gain en fréquence et le cout en circuit/fils réduit. C'est un bon compromis, ce qui explique que presque tous les processeurs modernes l'utilisent. Les rares exceptions sont les processeurs POWER 4 et POWER 5, qui ont préféré se passer de contournement pour garder un processeur très simple et une fréquence élevée. ===Les bancs de registre sont aussi adaptés pour le contournement=== L'usage d'agglomérats peut aussi prendre en compte les interconnections entre unités de calcul et registres. C'est-à-dire que les registres peuvent être agglomérés. Et cela peut se faire de plusieurs façons différentes. Une première solution, déjà vue dans les chapitres sur la micro-architecture d'un processeur, consiste à découper le banc de registres en plusieurs bancs de registres plus petits. Il faut juste prévoir un réseau d'interconnexions pour échanger des données entre bancs de registres. Dans la plupart des cas, cette séparation est invisible du point de vue de l'assembleur et du langage machine. Le processeur se charge de transférer les données entre bancs de registres suivant les besoins. Sur d'autres processeurs, les transferts de données se font via une instruction spéciale, souvent appelée ''COPY''. [[File:Banc de registres distribué.png|centre|vignette|upright=2|Banc de registres distribué.]] Sur de certains processeurs, un branchement est exécuté par une unité de calcul spécialisée. Or les registres à lire pour déterminer l'adresse de destination du branchement ne sont pas forcément dans le même agglomérat que cette unité de calcul. Pour éviter cela, certains processeurs disposent d'une unité de calcul des branchements dans chaque agglomérat. Dans les cas où plusieurs unités veulent modifier le ''program counter'' en même temps, un système de contrôle général décide quelle unité a la priorité sur les autres. Mais d'autres processeurs fonctionnent autrement : seul un agglomérat possède une unité de branchement, qui peut recevoir des résultats de tests de toutes les autres unités de calcul, quel que soit l’agglomérat. Une autre solution duplique le banc de registres en plusieurs exemplaires qui contiennent exactement les mêmes données, mais avec moins de ports de lecture/écriture. Un exemple est celui des processeurs POWER, Alpha 21264 et Alpha 21464. Sur ces processeurs, le banc de registre est dupliqué en plusieurs exemplaires, qui contiennent exactement les mêmes données. Les lectures en RAM et les résultats des opérations sont envoyées à tous les bancs de registres, afin de garantir que leur contenu est identique. Le banc de registre est dupliqué en autant d'exemplaires qu'il y a d'agglomérats. Chaque exemplaire a exactement deux ports de lecture, une par opérande, au lieu de plusieurs dizaines. La conception du processeur est simplifiée, que ce soit au niveau du câblage, que de la conception des bancs de registres. ==Les optimisations de la pile d'appel : le ''stack engine''== Les processeurs modernes intègrent une optimisation liée au pointeur de pile. Pour rappel, sur les architectures modernes, le pointeur de pile est un registre utilisé pour gérer la pile d'appel, précisément pour savoir où se trouve le sommet de la pile. Il est manipulé par les instructions CALL, RET, PUSH et POP, mais aussi par les instructions d'addition/soustraction pour gérer des cadres de pile de taille variable. De plus, il peut servir d'opérande pour des instructions LOAD/STORE, afin de lire/écrire des variables locales, les arguments d'une fonction, et autres. C'est donc un registre général adressable, intégré au banc de registre, altéré par l'unité de calcul entière. L'incrémentation/décrémentation du pointeur de pile passe donc par l'unité de calcul, lors des instructions CALL, RET, PUSH et POP. Mais, l'optimisation que nous allons voir permet d'incrémenter/décrémenter le pointeur de pile sans passer par l'ALU, ou presque. L'idée est de s'inspirer des architectures avec une pile d'adresse de retour, qui intègrent le pointeur de pile dans le séquenceur et l'incrémentent avec un incrémenteur dédié. ===Le ''stack engine''=== L'optimisation que nous allons voir utilise un '''''stack engine''''' intégré à l'unité de contrôle, au séquenceur. Le processeur contient toujours un pointeur de pile dans le banc de registre, cela ne change pas. Par contre, il n'est pas incrémenté/décrémenté à chaque instruction CALL, RET, PUSH, POP. Un compteur intégré au séquenceur est incrémenté à la place, nous l’appellerons le '''compteur delta'''. La vraie valeur du pointeur de pile s'obtient en additionnant le compteur delta avec le registre dans le banc de registre. Précisons que si le compteur delta vaut zéro, la vraie valeur est dans le banc de registre et peut s'utiliser telle quelle. Lorsqu'une instruction ADD/SUB/LOAD/STORE utilise le pointeur de pile comme opérande, elle a besoin de la vraie valeur. Si elle n'est pas dans le banc de registre, le séquenceur déclenche l'addition compteur-registre pour calculer la vraie valeur. Finalement, le banc de registre contient alors la bonne valeur et l'instruction peut s'exécuter sans encombre. L'idée est que le pointeur de pile est généralement altéré par une série d'instruction PUSH/POP consécutives, puis des instructions LOAD/STORE/ADD/SUB utilisent le pointeur de pile final comme opérande. En clair, une bonne partie des incrémentations/décrémentation est accumulée dans le compteur delta, puis la vraie valeur est calculée une fois pour toutes et est utilisée comme opérande. On accumule un delta dans le compteur delta, et ce compteur delta est additionné quand nécessaire. Précisons que le compteur delta est placé juste après le décodeur d'instruction, avant même le cache de micro-opération, l'unité de renommage et l'unité d'émission. Ainsi, les incrémentations/décrémentations du pointeur de pile disparaissent dès l'unité de décodage. Elles ne prennent pas de place dans le cache de micro-opération, ni dans la fenêtre d'instruction, ni dans la suite du pipeline. De nombreuses ressources sont économisées dans le ''front-end''. Mais utiliser un ''stack engine'' a aussi de nombreux avantages au niveau du chemin de données/''back-end''. Déjà, sur les processeurs à exécution dans le désordre, cela libère une unité de calcul qui peut être utilisée pour faire d'autres calculs. Ensuite, le compteur delta mémorise un delta assez court, de 8 bits sur le processeur Pentium M, un peu plus pour les suivants. L'incrémentation se fait donc via un incrémenteur 8 bits, pas une grosse ALU 32/64 bits. Il y a un gain en termes de consommation d'énergie, un incrémenteur 8 bits étant moins gourmand qu'une grosse ALU 32/64 bits. ===Les points de synchronisation du delta=== La technique ne fonctionne que si la vraie valeur du pointeur de pile est calculée au bon moment, avant chaque utilisation pertinente. Il y a donc des '''points de synchronisation''' qui forcent le calcul de la vraie valeur. Plus haut, nous avions dit que c'était à chaque fois qu'une instruction adresse le pointeur de pile explicitement, qui l'utilise comme opérande. Les instructions CALL, RET, PUSH et POP ne sont pas concernées par elles utilisent le pointeur de pile de manière implicite et ne font que l'incrémenter/décrémenter. Mais dans les faits, c'est plus compliqué. D'autres situations peuvent forcer une synchronisation, notamment un débordement du compteur delta. Le compteur delta est généralement un compteur de 8 bits, ce qui fait qu'il peut déborder. En cas de débordement du compteur, le séquenceur déclenche le calcul de la vraie valeur, puis réinitialise le compteur delta. La vraie valeur est donc calculée en avance dans ce cas précis. Précisons qu'un compteur delta de 8 bits permet de gérer environ 30 instructions PUSH/POP consécutives, ce qui rend les débordements de compteur delta assez peu fréquent. A noter que si le compteur delta vaut zéro, il n'y a pas besoin de calculer la vraie valeur, le séquenceur prend cette situation en compte. Un autre point de synchronisation est celui des interruptions et exceptions matérielles. Il faut que le compteur delta soit sauvegardé lors d'une interruption et restauré quand elle se termine. Idem lors d'une commutation de contexte, quand on passe d'un programme à un autre. Pour cela, le processeur peut déclencher le calcul de la vraie valeur lors d'une interruption, avant de sauvegarder les registres. Pour cela, le processeur intègre un mécanisme de sauvegarde automatique, qui mémorise la valeur de ce compteur dans le tampon de réordonnancement, pour forcer le calcul de la vraie valeur en cas de problème. La technique du ''stack engine'' est apparue sur les processeurs Pentium M d'Intel et les processeurs K10 d'AMD, et a été conservée sur tous les modèles ultérieurs. L'implémentation est cependant différente selon les processeurs, bien qu'on n'en connaisse pas les détails et que l'on doive se contenter des résultats de micro-benchmarks et des détails fournit par Intel et AMD. Selon certaines sources, dont les manuels d'optimisation d'Agner Fog, les processeurs AMD auraient moins de points de synchronisation que les processeurs Intel. De plus, leur ''stack engine'' serait placé plus loin que prévu dans le pipeline, après la file de micro-opération. ==Un étude des microarchitectures superscalaires x86 d'Intel== Après avoir vu beaucoup de théorie, voyons maintenant comment les microarchitectures Intel et AMD ont implémenté l'exécution superscalaire. Nous allons nous concentrer sur les processeurs Intel pour une raison simple : il y a plus de schémas disponibles sur wikicommons, ce qui me facilite le travail. ===Les processeurs Atom d'Intel, de microarchitecture Bonnell=== Les processeurs Atom sont des processeurs basse consommation produits et conçus par Intel. Il regroupent des processeurs de microarchitecture très différentes. La toute première microarchitecture ATOM était la microarchitecture Bonnell, qui est de loin la plus simple à étudier. Il s'agissait de processeurs sans exécution dans le désordre, sans renommage de registres. De nos jours, de tels processeurs ont disparus, même pour les processeurs basse consommation, mais les premiers processeurs Atom étaient dans ce cas. Mais le processeur était superscalaire et pouvait émettre deux instructions simultanées. Son pipeline faisait 16 étages, ce qui est beaucoup. L'architecture est assez simple. Premièrement, le cache d'instruction permet de lire 8 octets par cycle, qui sont placés dans une file d'instruction. La file d'instruction est alors reliée à deux décodeurs, ce qui permet de décoder deux instructions en même temps. Le fait que les décodeurs lisent les instructions depuis une file d'instruction fait que les deux instructions décodées ne sont pas forcément consécutives en mémoire RAM. Par exemple, l'Atom peut décoder un branchement prédit comme pris, suivi par l'instruction de destination du branchement. Les deux instructions ont été chargées dans la file d'instruction et sont consécutifs dedans, alors qu'elles ne sont pas consécutives en mémoire RAM. Les deux décodeurs alimentent une file de micro-opérations de petite taille : 32 µops maximum, 16 par ''thread'' si le ''multithreading'' matériel est activé. La majorité des instructions x86 sont décodées en une seule micro-opération, y compris les instructions ''load-up''. Le chemin de données est conçu pour exécuter les instruction ''load-up'' nativement, en une seule micro-opération. Le microcode n'est utilisé que pour une extrême minorité d'instructions et est à part des deux décodeurs précédents. L'avantage est que cela permet d'utiliser au mieux la file de micro-opération, qui est de petite taille. La file de micro-opérations est suivie par deux ports d'exécution, avec chacun leur logique d'émission. Les deux ports peuvent émettre au maximum 2 µops par cycle. Le résultat est que deux instructions consécutives peuvent s'exécuter, chacune dans deux avals séparés, dans deux pipelines différents. Les conditions pour cela sont cependant drastiques. Les deux instructions ne doivent pas avoir de dépendances de registres, à quelques exceptions près liées au registre d'état. Le multithreading matériel doit aussi être désactivé. Les deux instructions doivent aller chacun dans un port différent, et cela tient en compte du fait que les deux ports sont reliés à des unités de calcul fort différentes. Le tout est illustré ci-dessous. [[File:Intel Atom Microarchitecture.png|centre|vignette|upright=2.5|Intel Atom Microarchitecture]] Les deux ports sont capables de faire des additions/soustractions, des opérations bit à bit et des copies entre registres. Pour cela, ils ont chacun une ALU simple dédiée. Mais cela s'arrête là. Le second port est optimisé pour les opérations de type ''load-up''. Il contient toute la machinerie pour faire les accès mémoire, notamment des unités de calcul d'adresse et un cache L1 de données. A la suite du cache, se trouvent une ALU entière simple, un ''barrel shifter'', et un circuit multiplieur/diviseur. Le circuit multiplieur/diviseur est utilisé à la fois pour les opérations flottantes et entières. Le premier port permet d’exécuter des opérations entières simples, une addition flottante, des comparaisons/branchements, ou une instruction de calcul d'adresse LEA. Comme on le voit, la séparation entre les deux pipelines est assez complexe. Il ne s'agit pas du cas simple avec un pipeline entier et un pipeline flottant séparés. En réalité, il y a deux pipelines, chacun capables de faire des opérations entières et flottantes, mais pas les mêmes opérations. Et cette organisation difficile à comprendre est en réalité très efficace, très économe en circuit, tout en gardant une performance intéressante. Les instructions simples, ADD/SUB/bitwise sont supportées dans les deux pipelines. Il faut dire que ce sont des opérations courantes qu'il vaut mieux optimiser au mieux. Les opérations plus complexes, à savoir les multiplications/divisions/décalages/rotations/manipulations de bit sont supportées dans un seul pipeline. La raison est qu'il est rare que de telles opérations soient consécutives, et qu'il n'est donc pas utile d'optimiser pour cette situation. Si les deux pipelines devaient supporter ces opérations, cela demanderait de dupliquer les circuits multiplieurs/diviseur, ce qui aurait un cout en circuit important pour un gain en performance assez faible. ===Le Pentium 1/MMX et les pipelines U/V=== Le processeur Pentium d'Intel avait un pipeline de 5 étages : un étage de chargement/prédiction de branchement, deux étages de décodage, un étage d'exécution et un dernier étage pour l'écriture dans les registres. Chose étonnante pour un processeur superscalaire, il n'utilisait pas de renommage de registre ni d’exécution dans le désordre. Vous avez bien lu : la superscalarité est apparue dans les processeurs commerciaux avant l'exécution dans le désordre. Le Pentium 1 était un processeur à double émission, qui disposait de deux pipelines nommés U et V. On pouvait en tirer parti lorsque deux instructions consécutives pouvaient être exécutées en parallèles, si elles n'avaient pas de dépendances. Chose peu courante, les deux pipelines n'étaient pas identiques. Le pipeline U pouvait exécuter toutes les instructions, mais le pipeline V était beaucoup plus limité. Par exemple, seul le pipeline U peut faire des calculs flottants, le pipeline V ne fait que des calculs entiers et des branchements. L'unité flottante était sur le port d'émission du pipeline U, idem pour l'unité de calcul vectoriel MMX sur le Pentium MMX. Les deux pipelines disposaient d'une unité de calcul entière identiques dans les deux pipelines. Le pipeline U incorporait un circuit multiplieur/diviseur et un ''barrel shifter'' pour les décalages/rotations. Les deux pipelines avaient chacun uen unité de calcul d'adresse, mais elle n'étaient pas identique : celle du pipeline V ne gérait que l’instruction LEA, celle du pipeline U gérait tous les calculs d'adresse. La FPU était dans le pipeline U, de même que l'unité MMX. {|class="wikitable" |- ! Pipeline U ! Pipeline V |- | colspan="2" | ALU simple (une par pipeline) |- | Multiplieur/diviseur | |- | ''Barrel Shifter'' | |- | AGU complexe | AGU simple (opération LEA) |- | FPU | |- | Unité SIMD | |} Les deux ALU géraient les opérations bit à bit, les additions et soustractions, et les comparaisons (qui sont des soustractions déguisées). En conséquence, les instructions suivantes étaient exécutables dans les deux pipelines, ce qui fait qu'on pouvait en faire deux en même temps : * l'instruction MOV, dépend du mode d'adressage ; * les instructions de gestion de la pile PUSH et POP, dépend du mode d'adressage ; * Les instructions arithmétiques INC, DEC, ADD, SUB ; * l'instruction de comparaison CMP ; * les instructions bit à bit AND, OR, XOR ; * l'instruction de calcul d'adresse LEA ; * l'instruction NOP, qui ne fait rien. Les instructions suivantes sont exécutables seulement dans le pipeline U : les calculs d'adresse autres que LEA, les décalages et rotations, la multiplication et la division, les opérations flottantes. Il faut noter qu'il y a cependant quelques restrictions. Par exemple, si le pipeline U exécute une multiplication ou une division, le processeur ne peut pas exécuter une opération dans le pipeline V en parallèle. Dans le même genre, les branchements sont exécutables dans les deux pipelines, mais on ne peut exécuter une autre opération en parallèle qu'à la condition que le branchement soit exécuté dans le pipeline V. [[File:Intel Pentium arch.svg|centre|vignette|upright=2.5|Microarchitecture de l'Intel Pentium MMX. On voit que certaines unités de calcul sont dupliquées.]] ===La microarchitecture P6 du Pentium 2/3=== La microachitecture suivante, nommée P6, était une microarchitecture plus élaborée. Le pipeline faisait 12 étages, dont seuls les trois derniers correspondent au chemin de données. Il s'agissait du premier processeur à exécution dans le désordre de la marque, avec une implémentation basée sur des stations de réservation. Il gérait aussi le renommage de registre, avec un renommage de registre dans le ROB, commandé par une table d'alias. [[File:Intel Pentium Pro Microarchitecture Block Diagram.svg|centre|vignette|upright=2|Intel Pentium Pro Microarchitecture Block Diagram]] Le décodage des instructions x86 était géré par plusieurs décodeurs. Il y avait trois décodeurs : deux décodeurs simples, et un décodeur complexe. Les décodeurs simples décodaient les instructions les plus fréquentes, mais aussi les plus simples. Les instructions CISC complexes étaient gérées uniquement par le décodeur complexe, basé sur un microcode. Le processeur était à doubvle émission, du fait que les deux décodeurs simples faisaient le gros du travail, et passaient la main au décodeur microcodé quand aucune instruction ne leur était attribué. Les stations de réservations étaient regroupées dans une structure centralisée, en sortie de l'unité de renommage. Elles avaient 5 ports d'émission, qui étaient sous-utilisés en pratique. Niveau ALU, on trouve deux ALUs entières, une flottante, une unité pour les instructions SSE et autres, et trois unités pour les accès mémoire (regroupées en une seule unité dans le schéma ci-dessous). Les unités mémoire regroupent une unité de calcul d'adresse pour les lectures, une autre pour les écritures, et une unité pour la gestion des données à écrire. Les unités de calcul d'adresse sont des additionneurs à 4 opérandes, complétement différents des ALU entières. Les ALU entières sont deux unités asymétriques : une ALU simple, et une ALU complexe incorporant un multiplieur. Les deux peuvent exécuter des opérations d'addition, soustraction, comparaison, etc. [[File:P6 func diag.png|centre|vignette|upright=2|P6 func diag]] ===La microarchitecture Netburst du Pentium 4=== La microarchitecture Netburst, utilisée sur le Pentium 4, utilisait un pipeline à 20 étage, augmenté à 32 sur une révision ultérieure. Il a existé quatre révisions de l'architecture : Willamette (180 nm), Northwood (130 nm), Prescott (90 nm) et Cedar Mill (65 nm). Les deux premières avaient un pipeline de 20 étages, les deux suivants avaient 32 étages ! Le grand nombre d'étages permettait d'avoir une fréquence très élevée, mais posait de nombreux problèmes. Vider le pipeline était très long et il fallait une prédiction de branchement au top pour réduire l'impact des mauvaises prédictions. L'unité de prédiction de branchement était une des plus élvoluées pour l'époque. Pour l'époque. Il dispose d'un cache de trace et a été le seul processeur commercial à en utiliser un. Niveau décodeurs, on retrouve le décodeur lent à base de microcode présent sur les anciennes versions, couplé à un décodeur simple. L'unité de renomage utilise une table d'alias. Le renommage de registres se fait avec un banc de registres physiques. Vous pouvez remarquer dans le schéma suivant la présence de deux files de micro-opérations : une pour les accès mémoire, l'autre pour les autres opérations. Il s'agit bel et bien de deux files d'instructions, pas de fenêtres d'instruction ni de stations de réservation. Niveau ports d'émission, il y a quatre ports. Un pour les lectures mémoire, un pour les écriture mémoire, et deux autres qui mélangent FPU et ALUs. Le premier port est relié à une ALU complexe et une FPU spécialisée dans les MOV flottants. Le second port est relié à tout le reste : ALU basique ''barrel shifter'', FPU. Fait amusant, les ALU entières étaient cadencées à une fréquence double de celle du processeur, ce qui fait que les files d'émissionsont aussi censées l'être, de même que les ''scoreboard''. Sauf qu'en réalité, les circuits étaient dupliqués : l'un allait à une fréquence double, l'autre allait à la fréquence normale. [[File:Architettura Pentium 4.png|centre|vignette|upright=3|Microarchitecture du Pentium 4.]] ==Un étude des microarchitectures superscalaires x86 d'AMD== Les architectures AMD ont beaucoup évoluées avec le temps. Dans ce qui va suivre, nous allons les voir dans l'ordre chronologique, en partant de l'architecture K5, pour arriver aux dernières architectures Zen. Nous allons voir que les architectures AMD ont évoluées progressivement, chacune améliorant la précédente en faisant des rajouts ou modifications mineures, à l'exception de quelques grandes cassures dans la continuité où AMD a revu sa copie de fond en comble. L'architecture Bulldozer a été une première cassure, suivie par l'introduction des architectures Zen. Étudier ces architectures demande de voir trois choses séparément : le ''front-end'' qui regroupe l'unité de chargement et les décodeurs, le ''back-end'' qui gère l'exécution dans le désordre et les unités de calcul, et le sous-système mémoire avec les caches et la ''Load Store Queue''. Leur étude sera plus ou moins séparée dans ce qui suit, pour chaque classe d'architecture. ===La première génération de CPU AMD : les architectures K5, K6, K7, K8 et K10=== La première génération de processeurs AMD est celle des architectures K5, K6, K7, K8 et K10. Il n'y a pas de K9, qui a été abandonné en cours de développement. Les processeurs K5 et K6 portent ce nom au niveau commercial. Par contre, les processeurs d'architecture K7 sont aussi connus sous le nom d''''AMD Athlon''', les AMD K8 sont connus sous le nom d''''AMD Athlon 64''', et les architecture K10 sont appelées les '''AMD Phenom'''. Comme le nom l'indique, l'architecture K8 a introduit le 64 bits chez les processeurs AMD. Elles ont une architecture assez similaire pour ce qui est du chargement et des caches. Toutes disposent d'au minimum un cache L1 d'instruction et d'un cache L1 de données. Le K5 n'avait que ces caches, mais un cache L2 a été ajouté avec le K7, puis un L3 avec le K10. L'AMD K5 avait une TLB unique, mais les processeurs suivants avaient une TLB pour le L1 d'instruction et une autre pour le L1 de données. Idem pour le cache L2, avec deux TLB : une pour les données, une pour les instructions. Les caches L1/L2 sont de type exclusifs, à savoir que les données dans le L1 ne sont pas recopiées dans le L2. Le cache L2 est précisément un cache de victime, qui mémorise les données/instructions, évincées des caches L1 lors du remplacement des lignes de cache. L'introduction du cache L2 a entrainé l'ajout de deux TLB de second niveau : une L2 TLB pour les données et une autre pour les instructions. Les architectures K8 et K10 ont ajouté un cache L3, avec un accès indirect à travers l'interface avec le bus. : L'AMD K7 originel, aussi appelée Athlon classique, n'avait pas de cache L2, mais celui-ci était placé sur la carte mère et fonctionnait à une fréquence moitié moindre de celle du CPU. L'Athlon Thunderbird, puis l'Athlon XP, ont intégré le cache L2 dans le processeur. {|class="wikitable" |- ! Architecture AMD ! colspan="5" | Caches |- | rowspan="2" | K5 | L1 instruction || L1 données || colspan="3" | |- | colspan="2" | TLB unique || colspan="3" | |- | colspan="4" | |- | rowspan="2" | K6 | L1 instruction || L1 données || colspan="3" | L2 unifié |- | TLB L1 instruction || TLB L1 données || colspan="3" | |- | colspan="6" | |- | rowspan="2" | K7, K8 | L1 instruction || L1 données || colspan="2" | L2 unifié || |- | TLB L1 instruction || TLB L1 données || TLB L2 instruction || TLB L2 données || |- | colspan="6" | |- | rowspan="2" | K10 | L1 instruction || L1 données || colspan="2" | L2 unifié || L3 |- | TLB L1 instruction || TLB L1 données || TLB L2 instruction || TLB L2 données || |} Fait important, les architectures K5 à K10 utilisent la technique du '''prédécodage''', où les instructions sont partiellement décodées avant d'entrer dans le cache d'instruction. Le prédécodage facilite grandement le travail des décodeurs d'instruction proprement dit. Par contre, le prédécodage prend de la place dans le cache L1 d'instruction, une partie de sa capacité est utilisé pour mémoriser les informations prédécodées. C'est donc un compromis entre taille du cache et taille/rapidité des décodeurs d'instruction. Sur les architectures K5 et K6, le prédécodage précise, pour chaque octet, si c'est le début ou la fin d'une instruction, si c'est un octet d'opcode, en combien de micro-opérations sera décodée l'instruction, etc. A partir de l'AMD K7, le prédécodage reconnait les branchements inconditionnels. Lorsqu'un branchement inconditionnel est pré-décodé, le pré-décodage tient compte du branchement et continue le pré-décodage des instructions à partir de la destination du branchement. Le système de prédécodage est abandonnée à partir de l'architecture Bulldozer, qui suit l'architecture K10. La prédiction de branchement de ces CPU tire partie de ce système de pré-décodage, à savoir que les prédictions de branchement sont partiellement mémorisées dans les lignes de cache du L1 d'instruction. Par exemple, l'AMD K5 se passe de ''Branch Target Buffer'' grâce à cela. Si une ligne de cache contient un branchement, elle mémorise l'adresse de destination de ce branchement, en plus des bits de pré-décodage. Si il y a plusieurs branchements dans une ligne de cache, c'est l'adresse de destination du premier branchement pris dans cette ligne de cache qui est mémoirsée. Un défaut de cette approche est que si le branchement n'est pas dans le L1 d'instruction, aucune prédiction de branchement ne peut être faite et le préchargement ne peut pas fonctionner. C'est une limitation que n'ont pas les BTB découplées du cache L1 : elles peuvent prédire un branchement qui a été évincé dans le L2 ou le L3, tant que l'entrée associée est dans le BTB. Les prédictions peuvent même servir à précharger les instructions utiles. [[File:Comparaison du chargement de l'AMD K5 et K6.png|centre|vignette|upright=2|Comparaison du chargement de l'AMD K5 et K6]] Au niveau du décodage, on trouve de nombreuses différences entre les premières architectures AMD. L'AMD K5 contient 4 décodeurs hybrides, afin de décoder 4 instructions par cycles. Le K5 a quatre décodeurs simples couplés à 4 décodeurs complexes avec chacun un accès au micro-code. Une instruction peut donc passer par a donc deux voies de décodage : un décodage rapide et simple pour les instructions simples, un décodage lent et passant par le microcode pour les instructions complexes. Pour décoder 4 instructions, les deux voies sont dupliquées en 4 exemplaires, ce qui a un cout en circuits non-négligeable. L'AMD K6 utilise moins de décodeurs et ne peut que décoder deux instructions à la fois maximum. Par contre, il fournit en sortie 4 micro-opérations. Il intègre pour cela deux décodeurs simples, un décodeur complexe et un décodeur micro-codé. Un décodeur simple transforme une instruction simple en une ou deux micro-opérations. Il est possible d'utiliser les deux décodeurs simples en même temps, afin de fournir 4 micro-opérations en sortie du décodeur. Les deux autres décodent une instruction complexe en 1 à 4 micro-opérations. Si jamais la ou les deux instructions sont décodées en 1, 2 ou 3 micro-opérations, les micro-opérations manquantes pour atteindre 4 sont remplies par des NOPs. Pour le K7 et au-delà, le processeur dispose de décodeurs séparées pour les instructions micro-codées de celles qui ne le sont pas. Le processeur peut décoder jusqu’à 3 instructions par cycle. Le décodage d'une instruction microcodée ne peut pas se faire en parallèle du décodage non-microcodé. C'est soit le décodeur microcodé qui est utilisé, soit les décodeurs câblés, pas les deux en même temps. Le décodage d'une instruction prend 4 cycles. Les instructions non-microcodées sont décodées en une seule micro-opération, à un détail près : le CPU optimise la prise en charge des instructions ''load-up''. La différence entre le K6 et le K7 s'explique par des optimisations des instructions ''load-up''. Sur le K6, les instructions ''load-up'' sont décodées en deux micro-opération : la lecture en RAM, l'opération proprement dite. Mais sur le K7, une instruction ''load-up'' est décodée en une seule micro-opération. En conséquence, les décodeurs simples sont fortement simplifiés et le décodeur complexe disparait au profit d'un microcode unique. [[File:Décodage sur le K5 et le K5.png|centre|vignette|upright=3|Décodage sur le K5 et le K5]] ====Les microarchitectures K5 et K6 d'AMD==== Les deux premières architectures étaient les architectures K5 et K6, l'architecture K6 ayant été déclinée en quatre versions, nommées K6-1, K6-2, et K-3, avec une version K6-3 bis. Elles sont regroupées ensemble car elles ont beaucoup de points communs. Par exemple, tout ce qui a trait au chargement et au cache était similaire, de même que les unités de calcul. Les deux architectures avaient n'avaient pas de cache L2 et devaient se contenter d'un cache L1 d'instruction et d'un cache L1 de données. L'AMD K5 incorpore une TLB unique, alors que le K6 utilise des TLB séparées pour le cache d'instruction et le cache de données. Une différence entre l'architecture K5 et K6 est que la première utilise des caches normaux, alors que la seconde utilise des ''sector caches''. Les deux architectures disposaient des unités de calcul suivantes : deux ALU entières, une FPU, deux unités LOAD/STORE pour les accès mémoire, une unité de branchement et une ou plusieurs unités SIMD. Une organisation classique, donc. Pour les unités entières, il y avait deux ALU simples, un ''barrel shifter'' et un diviseur. Il n'y a pas d'erreur, le processeur incorpore un circuit diviseur, mais pas de circuit multiplieur. La raison est que la multiplication est réalisée par la FPU ! En effet, le multiplieur flottant de la FPU intègre un multiplieur entier pour multiplier les mantisses, qui est utilisé pour les multiplications entières. La même technique a été utilisée sur l'Atom, comme vu plus haut. Le tout était alimenté par deux ports d'émission, appelés ports X et Y. Sur l'architecture K5, le ''barrel shifter'' et le diviseur sont des ports différents. {|class="wikitable" |+ AMD K5 |- ! Port X ! Port Y |- | ALU simple | ALU simple |- | ''Barrel Shifter'' | Diviseur |} Sur l'architecture K6, le ''barrel shifter'' et le diviseur sont sur le même port. {|class="wikitable" |+ AMD K6 |- ! Port X ! Port Y |- | ALU simple | ALU simple |- | | ''Barrel Shifter'' |- | | Diviseur |} Niveau unités mémoire, le K5 avait deux unités LOAD/STORE, chacune capable de faire lecture et écriture. Par contre, la ''store queue'' n'a qu'un seul port d'entrée, ce qui fait que le processeur peut seulement accepter une écriture par cycle. Le processeur peut donc émettre soit deux lectures simultanées, soit une lecture accompagnée d'une écriture. Impossible d'émettre deux écritures simultanées, ce qui est de toute façon très rare. L'architecture K6 utilise quant à elle une unité LOAD pour les lectures et une unité STORE pour les écritures. Ce qui permet de faire une lecture et une écriture par cycle, pas autre chose. Niveau unités SIMD, l'architecture K7 n'avait qu'une seule unité SIMD, placée sur le port d'émission X. L'architecture K8 ajouta une seconde unité SIMD, sur l'autre port d'émission entier. De plus, trois ALU SIMD ont été ajoutées : un décaleur MMX, une unité 3DNow!, une unité mixte MMX/3DNow. Elles sont reliées aux deux ports d'émission entier X et Y ! Elles ne sont pas représentées ci-dessous, par souci de simplicité. [[File:Unité de calcul des processeurs AMD K5 et K6.png|centre|vignette|upright=2|Unité de calcul des processeurs AMD K5 et K6. les unités sur la même colonnes sont reliées au même port d'émission.]] Si les unités de calcul et le chargement sont globalement les mêmes, les deux architectures se différencient sur l'exécution dans le désordre. L'AMD K5 utilise du renommage de registre dans le ROB avec des stations de réservation. Par contre, l'AMD K6 utilise une fenêtre d'instruction centralisée. De plus, son renommage de registre se fait avec un banc de registre physique. L'architecture AMD K5 utilisait de deux stations de réservation par unité de calcul, sauf pour les deux unités mémoire partageaient une station de réservation unique (deux fois plus grande). Les stations de réservation sont cependant mal nommées, vu que ce sont en réalité des mémoire FIFO. Une micro-opération n'est émise que si elle est la plus ancienne dans la FIFO/station de réservation. Le renommage de registres se faisait dans le tampon de ré-ordonnancement, il n'y avait pas encore de banc de registre physique. Le tampon de ré-ordonnancement faisait seulement 16 instructions. [[File:AMD K5.jpg|centre|vignette|upright=3|AMDK5 Diagramme.]] L'architecture K6 remplace les stations de réservations par une fenêtre d'instruction centralisée. Les 4 micro-opérations renommées sont écrites dans la fenêtre d'instruction par groupe de 4, NOP de ''padding'' inclus. La fenêtre d'instruction centralisé contient 24 micro-opérations, groupées en 6 groupes de 4 micro-opérations, avec potentiellement des NOP dedans suivant le résultat du décodage. L'avantage est que l'implémentation de la fenêtre d'instruction est simple. La fenêtre d'instruction centralisée permettait d'émettre 6 micro-opérations en même temps (une par unité de calcul/mémoire). Le renommage de registres se faisait dans le tampon de ré-ordonnancement, il n'y avait pas encore de banc de registre physique. Le processeur utilisait un renommage avec un banc de registre physique. Le banc de registre physique pour les entiers contenait 48 registres, dont 24 étaient des registres architecturaux et 24 étaient des registres renommés. Sur les 24 registres architecturaux, 16 avaient une fonction de ''scratchpad'' que les ''datasheets'' d'AMD ne détaillent pas, les 8 restants étaient les registres généraux EAX, EBX, etc. [[File:AMD K6 Little foot & Modl 6.png|centre|vignette|upright=3|AMD K6 original.]] ====Les microarchitectures K7, K8 et K10 d'AMD==== Les microarchitectures suivantes sont les architectures K7, K8 et K10. Les architectures K7, K8 et K10 sont assez similaires. La différence principale entre le K7 et le K8 est le support du 64 bits. Les apports du K10 sont la présence d'un cache L3, d'une unité de calcul supplémentaire et d'améliorations de la prédiction de branchement. La taille de certains caches a été augmentée, de même que la largeur de certaines interconnexions/bus. A partir du K7, le CPU optimise la prise en charge des instructions ''load-up''. Les instructions ''load-op'' sont appelées des macro-opérations dans la terminologie d'AMD, et aussi d'Intel. L'idée est que les instructions ''load-up'' sont décodées en micro-opérations intermédiaires. Elles sont propagées dans le pipeline comme étant une seule micro-opération, jusqu'à l'étage d'émission. Lors de l'émission, les instructions ''load-up'' sont scindées en deux micro-opérations : la lecture de l'opérande, puis l'opération proprement dite. Faire ainsi économise des ressources et optimise le remplissage du tampon de ré-ordonnancement, des fenêtres d'instructions, des stations de réservation, etc. Le tampon de réordonnancement est combiné avec divers circuits en charge de l'exécution dans le désordre, dans ce qui s'appelle l'''instruction control unit''. Il contient de 72 à, 84 instructions, qui sont regroupées en groupes de 3. Là encore, comme pour le K5 et le K6, le tampon de réordonnancement tient compte de la sortie des décodeurs. Les décodeurs fournissent toujours trois micro-opérations par cycle, quitte à remplir les vides par des NOP. Le tampon de réordonnancement reçoit les micro-opérations, NOP inclus, par groupes de 3, et est structuré autour de ces triplets de micro-opération, y compris en interne. Les architectures K7, K8 et K10 ont des unités de calcul très similaires. Concrètement, il y a trois ALU entières, trois unités de calcul d'adresse, et une FPU. Le processeur incorpore, aussi un multiplieur entier, relié sur le port d'émission de la première ALU. La FPU regroupe un additionneur flottant, un multiplieur flottant, et une troisième unité LOAD/STORE pour les lectures/écritures pour les nombres flottants. L'architecture K8 ajoute une unité de manipulation de bit, la K10 un diviseur entier. [[File:Unité de calcul des processeurs AMD K7, K8 et K10.png|centre|vignette|upright=2|Unité de calcul des processeurs AMD K7, K8 et K10]] Par contre, la manière d'alimenter ces ALU en micro-opérations varie un petit peu entre les architectures K7, K8 et K10. Il y a cependant quelques constantes entre les trois. La première est qu'il y a une fenêtre d'instruction séparée pour les flottants, de 36 à 42 entrées, avec renommage de registre. La fenêtre d'instruction flottante a trois ports d'émission : un pour l'additionneur flottant, un autre pour le multiplieur, et un troisième pour la troisième unité flottante qui s'occupe du reste. La seconde est que chaque ALU entière est couplée avec une unité de calcul d'adresse. Par contre, la méthode de couplage varie d'un processeur à l'autre. L'architecture K7 des processeurs Athlon utilisait le renommage de registre, mais seulement pour les registres flottants, pas pour les registres entiers. Elle avait deux fenêtres d'instruction : une pour les opérations flottantes, une autre pour les instructions entières et les accès mémoire. La fenêtre d'instruction entière pouvait émettre trois micro-opérations en même temps : trois micro-opérations entières, trois micro-opération mémoire. La fenêtre d'instruction entière contenait 5 à 6 groupes de 3 macro-opérations. Vous noterez que j'ai parlé de macro-opérations et pas de micro-opérations, car les instructions ''load-up'' sont considérées comme une seule "micro-opération" dans la fenêtre d'instruction entière. Et cela se marie bien avec une fenêtre d'instruction unique partagée entre pipeline entier et pipeline mémoire. Une macro-opération était scindée en deux micro-opérations : une micro-opération mémoire et une micro-opération entière. Il est donc avantageux de regrouper unités mémoire et unités entières à la même fenêtre d'instruction pour ce faire. La ''Load-Store Queue'' peut mémoriser 44 lectures/écritures, avec cependant une petite nuance. Parmi les 44 lectures/écritures, 12 sont réservées au cache L1 et 32 le sont pour le cache L2. En réalité, il y a deux ''LSQ'', une pour le cache L1 qui fait 12 entrées, une seconde pour le L2 qui fait 32 entrées. [[File:Athlon arch.png|centre|vignette|upright=3|Microarchitecture K7 d'AMD.]] Les architectures K8 et K10 utilisent le renommage de registres pour tous les registres, entiers comme flottants. Par contre, le renommage de registre n'est pas réalisé de la même manière pour les registres entiers et flottants. Les registres entiers sont renommés dans le tampon de ré-ordonnancement, comme c'était le cas sur les architectures Intel avant le Pentium 4. Par contre, les registres flottants sont renommés grâce à un banc de registre physique. Le K8 est donc un processeur au renommage hybride, qui utilise les deux solutions de renommage principales. Niveau micro-opérations entières, la station de réservation unique de 15 micro-opérations est remplacée par trois stations de réservations, une par ALU entière, de 8 micro-opérations chacune. Chaque station de réservation entière alimente une unité de calcul entière et une unité de calcul d'adresse. Le multiplieur est relié à la première station de réservation, sur le même port d'émission que l'ALU. Les stations de réservation sont nommées des ''schedulers'' dans les schémas qui suivent. [[File:AMD Grayhound microarchitecture.png|centre|vignette|upright=3|Microarchitecture K8 et K10 d'AMD.]] La microarchitecture K10 a été déclinée en plusieurs versions, nommées Grayhound, Grayhound+ et Husky, Husky étant une architecture gravée en 32 nm dédiée aux processeurs A-3000. L'architecture Grayhound a plus de cache et un ROB plus grand, la Husky est quand à elle un peu plus différente. Elle n'a pas de cache L3, contrairement aux autres architectures K10, ce qui simplifie fortement son sous-système mémoire. Par contre, les fenêtres d'instructions/stations de réservation et le ROB sont plus grands, pareil pour les files dans l'unité mémoire. Une ALU pour les divisions entières a aussi été ajoutée. [[File:AMD Husky microarchitecture.png|centre|vignette|upright=3|AMD Husky microarchitecture]] Pour résumer, les architectures K7, K8 et K10 séparent les pipelines entiers et flottants : trois pipelines entiers avec chacun son unité de calcul, et un pipeline flottant avec plusieurs unités de calcul. Les raisons à cela sont assez diverses. Disons que dupliquer des ALU entières simples prend peu de transistors, là où les gros circuits comme le multiplieur ou la FPU ne sont pas dupliqués. Et cela a un autre avantage : le renommage, ''dispatch'' et l'émission sont plus simples. Les pipelines entiers ont une exécution dans le désordre peu complexe, grâce au grand nombre d'unités de calcul, ce qui fait que le pipeline entier est de seulement 15 cycles au total (chargement et décodage inclus). A l'opposé, la FPU est alimentée par une exécution dans le désordre très complexe, avec banc de registre physique et beaucoup de ressources, mais au prix d'un pipeline flottant plus long de 3 cycles, soit 18 cycles au total. ===Les microarchitectures ZEN d'AMD=== Viennent ensuite les '''microarchitectures Bulldozer''', avec trois révisions ultérieures nommées Piledriver, Steamroller et Excavator. Mais du fait de l'utilisation de techniques de multithreading matériel que nous n'avons pas encore abordé, nous ne pouvons pas en parler ici. Les microarchitectures suivantes sont les '''architectures ZEN 1/2/3/4/5'''. Elles se ressemblent beaucoup, chacune accumulant les améliorations des précédentes. Mais le cœur de l'architecture reste plus ou moins le même. En passant à la suivante, le nombre de registre virtuel augmente, le ''branch target buffer'' augmente en taille, le ROB et les files d'attente grossissent, les caches de micro-opération aussi, les caches grossissent, etc. La microarchitecture Zen 1 est illustrée ci-dessous. Le passage à Zen 2 a ajouté une unité de calcul d'adresse (4 ALU / 3 AGU), le Zen 5 a ajouté deux autres ALU entières et une unité de calcul d'adresse (6 ALU / 4 AGU) [[File:Zen microarchitecture.svg|centre|vignette|upright=3|Microarchitecture Zen 1 d'AMD.]] <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Le parallélisme mémoire au niveau du cache | prevText=Le parallélisme mémoire au niveau du cache | next=Les processeurs VLIW et EPIC | nextText=Les processeurs VLIW et EPIC }} </noinclude> fmckflh4j9op1exnvyxudh3yceml45k 745874 745873 2025-07-03T16:04:21Z Mewtow 31375 /* L'émission multiple des accès mémoire */ 745874 wikitext text/x-wiki Les processeurs vus auparavant ne peuvent émettre au maximum qu'une instruction par cycle d'horloge : ce sont des processeurs à émission unique. Ils peuvent avoir plusieurs instructions qui s'exécutent en même temps, dans des unités de calcul séparées. C'est le cas dès qu'une instruction multicycle s'exécute. Par contre, ils ne peuvent démarrer qu'une seule instruction par cycle. Et quand on court après la performance, ce n'est pas assez ! Les concepteurs de processeurs ont inventés des processeurs qui émettent plusieurs instructions par cycle : les '''processeurs à émissions multiples'''. Un processeur à émission multiple charge plusieurs instructions en même temps, les décode en parallèle, puis les émet en même temps sur des unités de calculs séparées. Pour cela, il faut gérer les dépendances entre instructions, répartir les instructions sur différentes unités de calcul, et cela n'est pas une mince affaire. [[File:Superscalarpipeline.svg|centre|vignette|upright=1.5|Pipeline RISC classique à cinq étages sur un processeur superscalaire. On voit bien que plusieurs instructions sont chargées en même temps.]] Les processeurs à émission multiple sont de deux types : les processeurs VLIW et les '''processeurs superscalaires'''. Nous mettons les processeurs VLIW de côté en attendant le prochain chapitre. La raison est qu'ils ont un jeu d'instruction spécialisé qui expose le parallélisme d'instruction directement au niveau du jeu d'instructions, là où les processeurs superscalaires restent des processeurs au jeu d'instruction normal. La différence principale entre processeur VLIW et superscalaire est qu'un processeur superscalaire répartit les instructions sur les unités de calcul à l’exécution, là où un processeur VLIW délègue cette tâche au compilateur. ==L'implémentation d'un processeur superscalaire== Sur un processeur à émission multiple, plusieurs micro-opérations sont émises en même temps, le nombre varie d'un processeur à l'autre. Les processeurs superscalaires les plus simples ne permettent que d'émettre deux micro-opérations à la fois, d'où leur nom de processeur ''dual issue'', ce qui se traduit en '''processeur à double émission'''. Les processeurs modernes peuvent émettre 3, 4, 6, voire 8 micro-opérations simultanément. Aller au-delà ne sert pas à grand-chose. ===Les circuits hors-ALU sont soit dupliqués, soit adaptés=== Un processeur superscalaire doit être capable de : lire plusieurs instructions depuis la mémoire, les décoder, renommer leurs registres, et les envoyer à l'unité d'émission. Intuitivement, on se fit qu'on doit dupliquer tous les circuits : les décodeurs, l'unité de renommage, les unités de calcul, le ROB, etc. Dans les faits, l'implémentation d'un processeur superscalaire demande de dupliquer plusieurs circuits et d'en adapter d'autres. Voici ce que cela donne dans les grandes lignes. {|class="wikitable" |- ! rowspan="2" | Processeur sans émission multiple | rowspan="2" | Chargement | rowspan="2" | Décodage | rowspan="2" | Renommage | rowspan="2" | Émission | Exécution / ALU | rowspan="2" | ''Commit''/ROB |- | Exécution / ALU |- ! rowspan="4" | Processeur superscalaire | rowspan="4" | Chargement | rowspan="2" | Décodage | rowspan="4" | Renommage | rowspan="4" | Émission | Exécution / ALU | rowspan="4" | ''Commit''/ROB |- | Exécution / ALU |- | rowspan="2" | Décodage | Exécution / ALU |- | Exécution / ALU |} Un processeur superscalaire doit pouvoir charger plusieurs instructions en même temps. Deux solutions pour cela. La première est de doubler la taille du bus connecté au cache d'instruction. Si les instructions sont de longueur fixe, cela charge deux instructions à la fois. Pour un processeur à triple émission, il faut tripler la taille du bus, quadrupler pour un processeur quadruple émission, etc. Mais tout n'est pas si simple, quelques subtilités font qu'on doit ajouter des circuits en plus pour corriger les défauts peu intuitifs de cette implémentation naïve. Une autre solution est d'utiliser un cache d'instruction multiport. Mais dans ce cas, le ''program counter'' doit générer deux adresses, au mieux consécutives, au pire prédites par l'unité de prédiction de branchement. L'implémentation est alors encore plus complexe, comme on le verra plus bas. Il doit ensuite décoder plusieurs instructions en même temps. Il se trouve que les dépendances entre instruction ne posent pas de problème pour le décodeur. Rien ne s'oppose à ce qu'on utilise plusieurs décodeurs séparés. Il faut dire que les décodeurs sont de purs circuits combinatoires, du moins sur les processeurs avec une file de micro-opérations, ou avec une fenêtre d'instruction, ou des stations de réservation. Par contre, l'unité de renommage de registre n'est pas dupliquée, mais adaptées, pour gérer le cas où des instructions consécutives ont des dépendances de registre. Par exemple, prenons un processeur à double émission, qui renomme deux instructions consécutives. Si elles ont une dépendance, le renommage de la seconde instruction dépend du renommage de la première. La première doit être renommée et le résultat du renommage est utilisé pour renommer la seconde, ce qui empêche d'utiliser deux unités de renommage séparées. L'unité d'émission, la file de micro-opération et tous les circuits liés aux dépendances d'instruction ne sont pas dupliqués, car il peut y avoir des dépendances entre instruction chargées simultanément. L'unité d'émission est modifiée de manière à émettre plusieurs instructions à la fois. Si c'est un ''scoreboard'', il doit être modifié pour détecter les dépendances entre les instructions à émettre. Si c'est une fenêtre d'instruction ou une station de réservation, les choses sont plus simples, il faut basiquement rajouter des ports de lecture et écriture pour insérer et émettre plusieurs instructions à la fois, et modifier la logique de sélection en conséquence. Le ROB et les autres structures doivent aussi être modifiées pour pouvoir émettre et terminer plusieurs instructions en même temps. ===La duplication des unités de calcul et les contraintes d’appariement=== Pour émettre plusieurs instructions en même temps, encore faut-il avoir de quoi les exécuter. En clair : un processeur superscalaire doit avoir plusieurs unités de calcul séparées. Les processeurs avec un pipeline dynamique incorporent plusieurs unités pour les instructions entières, une unité pour les instructions flottantes, une unité pour les accès mémoire et éventuellement une unité pour les tests/branchements. Au lieu de parler d'unités de calcul, un terme plus correct serait le terme d''''avals''', que nous avions introduit dans le chapitre sur les pipelines dynamiques, mais n'avons pas eu l'occasion d'utiliser par la suite. Les processeurs avec un pipeline dynamique incorporent déjà plusieurs avals, mais chaque aval ne peut accepter qu'une nouvelle instruction par cycle. Et cela ne change pas sur les processeurs superscalaire, une unité de calcul reste une unité de calcul. Il y a plusieurs manières de gérer les avals sur un processeur superscalaire. La première duplique tous les avals : toutes les unités de calcul sont dupliquées. Par exemple, prenons un processeur simple-émission et transformons-le en processeur à double émission. Intuitivement, on se dit qu'il faut dupliquer toutes les unités de calcul. Si le processeur de base a une ALU entière, une FPU et un circuit multiplieur, ils sont tous dupliqués. L'avantage de faire ainsi est que le processeur n'a pas de contrainte quand il veut émettre deux instructions. Tant que les deux instructions n'ont pas de dépendances de données, il peut les émettre. Pour le dire autrement, toutes les paires d'instructions possibles sont compatibles avec la double émission. Si le processeur veut émettre deux multiplications consécutives, il le peut. S'il veut émettre deux instructions flottantes, il le peut. Le problème, c'est que le cout en circuit est conséquent ! Dupliquer la FPU ou les circuits multiplieurs bouffe du transistor. Pour économiser des transistors, il est possible de ne pas dupliquer tous les circuits. Typiquement, les ALU simples sont dupliquées, de même que les unités de calcul d'adresse, mais la FPU et les circuits multiplieurs ne sont pas dupliqués. En faisant ainsi, le cout en transistors est grandement réduire. Par contre, cela entraine l'apparition de dépendances structurelles. Par exemple, le CPU ne peut pas émettre deux multiplications consécutives sur un seul multiplieur, idem avec deux additions flottantes si l'additionneur flottant n'est pas dupliqué. La conséquence est que les processeurs superscalaires ont des contraintes sur les instructions à émettre en même temps. Si on prend un processeur ''dual-issue'', il y a donc des paires d'instructions autorisées et des paires interdites. Par exemple, l'exécution simultanée de deux branchements est interdite. Les branchements sont sérialisés, exécutés l'un après l'autre. Il est possible d'émettre un branchement en même temps qu'une autre instruction, en espérant que la prédiction de branchement ait fait une bonne prédiction. Mais il n'est souvent pas possible d'émettre deux branchements en même temps. La raison est qu'il n'y a qu'une seule unité de calcul pour les branchements dans un processeur. ==L'étape de chargement superscalaire== Pour charger plusieurs instructions, il suffit de doubler, tripler ou quadrupler le bus mémoire. Précisément, c'est le port de lecture du cache d’instruction qui est élargit, pour lire 2/3/4/... instructions. Un bloc de 8, 16, 32 octets est dnc lu depuis le cache et est ensuite découpé en instructions, envoyées chacun à un décodeur. Découper un bloc en instructions est trivial avec des instructions de longueur fixe, mais plus compliqué avec des instructions de taille variable. Il est cependant possible de s'en sortir avec deux solutions distinctes. La première solution utilise les techniques de prédécodage vues dans le chapitre sur les caches, à savoir que le découpage d'une ligne de cache est réalisé lors du chargement dans le cache d’instruction. Une autre solution améliore le circuit de détection des tailles d'instruction vu dans le chapitre sur l'unité de chargement. Avec la seconde solution, cela prend parfois un étage de pipeline entier, comme c'est le cas sur les processeurs Intel de microarchitecture P6. Mais laissons de côté cette difficulté et passons au vrai problème. Charger un gros bloc de mémoire permet de charger plusieurs instructions, mais il y a potentiellement des branchements dans le bloc. Et on doit gérer le cas où ils sont pris, le cas où les instructions suivantes dans le bloc doivent être annulées. En clair, il faut détecter les branchements dans le bloc chargé et gérer le cas où ils sont pris. : Dans ce qui va suivre, un morceau de code sans branchement est appelé un bloc de base (''basic block''). ===Le circuit de fusion de blocs=== Les processeurs superscalaires simples ne se préoccupent pas des branchements lors du chargement. Les instructions chargées en même temps sont toutes décodées et exécutées en même temps, même s'il y a un branchement dans le tas. Les branchements sont donc prédits comme étant non-pris systématiquement. Mais d'autres sont plus malins et utilisent la prédiction de branchement pour savoir si un branchement est pris ou non. Partons du principe que le branchement est pris : le processeur doit charger toutes les instructions d'un bloc, sauf celles qui suivent le branchement pris. L'unité de chargement coupe le bloc chargé au niveau du premier branchement non-pris, remplit les vides avec des NOP, avant d'envoyer le tout à l'unité de décodage. [[File:Fetch sur un processeur superscalaire avec prediction de branchements.png|centre|vignette|upright=2|Fetch sur un processeur superscalaire avec prédiction de branchements.]] Une solution plus performante charge les instructions de destination du branchement et les placent à sa suite. Ils chargent deux blocs à la fois et les fusionnent en un seul qui ne contient que les instructions présumées utiles. [[File:Cache d'instructions autoaligné.png|centre|vignette|upright=2|Cache d'instructions autoaligné.]] Mais cela demande de charger deux blocs de mémoire en une fois, ce qui demande un cache d'instruction multiports. Il faut aussi ajouter un circuit pour assembler plusieurs morceaux de blocs en un seul : le fusionneur (''merger''). Le résultat en sortie du fusionneur est ce qu'on appelle une '''trace'''. [[File:Implémentation d'un cache d'instructions autoaligné.png|centre|vignette|upright=2|Implémentation d'un cache d'instructions autoaligné.]] Le principe peut se généraliser si un bloc contient plusieurs branchements pris, avec un nombre de blocs supérieur à deux. Mais cela demande une unité de prédiction de branchement capable de prédire plusieurs branchements par cycle. ===Le cache de traces=== Si jamais un bloc est rechargé et que ses branchements sont pris à l'identique, le résultat du fusionneur sera le même. Il est intéressant de conserver cette trace dans un '''cache de traces''' pour la réutiliser ultérieurement. Le cache de trace n'a été utilisé que sur un seul processeur commercial : le Pentium 4 d'Intel. Fait intéressant, son cache de trace ne mémorisait pas des suites d'instructions, mais des suites de micro-opérations. En clair, il mémorisait des traces décodées, ce qui fait qu'un succès de cache de trace contournait non seulement le cache d'instruction, mais aussi les décodeurs. Ce qui explique que le temps d'accès au cache de trace n'était pas un problème, même s'il était comparable au temps d'accès du cache d'instruction. Il a depuis été remplacé par une alternative bien plus intéressante, le cache de micro-opérations, plus flexible et plus performant. Une trace est réutilisable quand le premier bloc de base est identique et que les prédictions de branchement restent identiques. Pour vérifier cela, le tag du cache de traces contient l'adresse du premier bloc de base, la position des branchements dans la trace et le résultat des prédictions utilisées pour construire la trace. Le résultat des prédictions de branchement de la trace est stocké sous la forme d'une suite de bits : si la trace contient n branchements, le n-ième bit vaut 1 si ce branchement a été pris, et 0 sinon. Même chose pour la position des branchements dans la trace : le bit numéro n indique si la n-ième instruction de la trace est un branchement : si c'est le cas, il vaut 1, et 0 sinon. Pour savoir si une trace est réutilisable, l'unité de chargement envoie le ''program counter'' au cache de traces, l'unité de prédiction de branchement fournit le reste des informations. Si on a un succès de cache de traces, et la trace est envoyée directement au décodeur. Sinon, la trace est chargée depuis le cache d'instructions et assemblée. [[File:TraceCache.png|centre|vignette|upright=2|Cache de traces.]] [[File:BasicBlocks.png|vignette|Blocs de base.]] Pour comprendre ce qu'est une trace, regardez le code illustré ci-contre. Il est composé d'un bloc de base A, suivi par un bloc de base B, qui peut faire appel soit au bloc C, soit un bloc D. Un tel code peut donner deux traces : ABC ou ABD. La trace exécutée dépend du résultat du branchement qui choisit entre C et D. Un cache de trace idéal mémorise les deux traces ABC et ABD dans deux lignes de cache séparées. Il peut mémoriser des traces différentes, même si leur début est le même. Un cache de trace peut supporter des '''succès de cache de trace partiels'''. Prenez le cas où le processeur veut lire la trace ABC mais que le cache de trace ne contient que la trace ABD : c'est un succès partiel. Dans ce cas, le processeur peut lire les blocs de base A et B depuis le cache de trace, et lit D depuis le cache d'instruction. Et cela vaut dans le cas général : si le cache a mémorisé une trace similaire à celle demandée, dont seuls les premiers blocs de base correspondent, il peut lire les premiers blocs de base dans le cache de trace et lire le reste dans le cache d'instruction. Il y a une certaine redondance dans le contenu du cache de trace, car certaines traces partagent des blocs de base. Pour éviter cela, il est possible de mémoriser les blocs de base dans des caches séparés et les assembler avec un fusionneur. Par exemple, au lieu d'utiliser un cache de traces unique, on va utiliser quatre '''caches de blocs de base''', suivi par un fusionneur qui reconstitue la trace. On économise du cache, au dépend d'un temps d'accès plus long vu qu'il faut reconstituer la trace. ==Le séquenceur d'un processeur superscalaire== Le séquenceur d'un processeur superscalaire est modifié, afin de pouvoir décoder plusieurs instructions à la fois. Ce n'est pas le cas général, mais la présence de plusieurs décodeurs est très fréquent sur les processeur superscalaires. De plus, les unités de renommage et d'émission doivent être modifiées. ===Les décodeurs d'instructions superscalaires=== Un processeur superscalaire contient généralement plusieurs décodeurs, chacun pouvant décoder une instruction en parallèle des autres. Prenons par exemple un processeur RISC dont toutes les instructions font 32 bits. Un processeur superscalaire de ce type peut charger des blocs de 128 bits, ce qui permet de charger 4 instructions d'un seul coup. Et pour les décoder, le décodage se fera dans quatre décodeurs séparés, qui fonctionneront en parallèle. Ou alors, il se fera dans un seul décodeur qui pourra décoder plusieurs instructions par cycles. Les processeurs CISC utilisent des décodeurs hybrides, avec un microcode qui complémente un décodeur câblés. Dupliquer le microcode aurait un cout en transistors trop important, ce qui fait que seuls les décodeurs câblés sont dupliqués. Les CPU CISC superscalaires disposent donc de plusieurs décodeurs simples, capables de décoder les instructions les plus courantes, avec un seul microcode. La conséquence est qu'il n'est pas possible de décoder deux instructions microcodées en même temps. Par contre, il reste possible de décoder plusieurs instructions non-microcodées ou une instruction microcodée couplée à une instruction non-microcodée. Vu qu'il est rare que deux instructions microcodées se suivent dans un programme, le cout en performance est extrêmement mineur. Les processeurs superscalaires supportent la technique dite de '''macro-fusion''', qui permet de fusionner deux-trois instructions consécutives en une seule micro-opération. Par exemple, il est possible fusionner une instruction de test et une instruction de saut en une seule micro-opération de branchement. Il s'agit là de l'utilisation la plus importante de la macro-fusion sur les processeurs x86 modernes. En théorie, d'autres utilisations de la macro-fusion sont possibles, certaines ont même été [https://www2.eecs.berkeley.edu/Pubs/TechRpts/2016/EECS-2016-130.pdf proposées pour le jeu d'instruction RISC-V], mais rien n'est encore implémenté (à ma connaissance). La fusion des instructions se fait lors du décodage des instructions, grâce à la coopération des décodeurs. ===L'unité de renommage superscalaire=== Sur un processeur à émission multiple, l'unité de renommage de registres doit renommer plusieurs instructions à la fois, mais aussi gérer les dépendances entre instructions. Pour cela, elle renomme les registres sans tenir compte des dépendances, pour ensuite corriger le résultat. [[File:Unité de renommage superscalaire.png|centre|vignette|upright=2|Unité de renommage superscalaire.]] Seules les dépendances lecture-après-écriture doivent être détectées, les autres étant supprimées par le renommage de registres. Repérer ce genre de dépendances se fait assez simplement : il suffit de regarder si un registre de destination d'une instruction est un opérande d'une instruction suivante. [[File:Détection des dépendances sur un processeur superscalaire.png|centre|vignette|upright=2|Détection des dépendances sur un processeur superscalaire.]] Ensuite, il faut corriger le résultat du renommage en fonction des dépendances. Si une instruction n'a pas de dépendance avec une autre, on la laisse telle quelle. Dans le cas contraire, un registre opérande sera identique avec le registre de destination d'une instruction précédente. Dans ce cas, le registre opérande n'est pas le bon après renommage : on doit le remplacer par le registre de destination de l'instruction avec laquelle il y a dépendance. Cela se fait simplement en utilisant un multiplexeur dont les entrées sont reliées à l'unité de détection des dépendances. On doit faire ce replacement pour chaque registre opérande. [[File:Correction des dépendances sur un processeur superscalaire.png|centre|vignette|upright=2|Correction des dépendances sur un processeur superscalaire.]] ===L'unité d'émission superscalaire=== Pour émettre plusieurs instructions en même temps, l'unité d'émission doit être capable d'émettre plusieurs instructions par cycle. Et Pour cela, elle doit détecter les dépendances entre instructions. Il faut noter que la plupart des processeurs superscalaires utilisent le renommage de registre pour éliminer un maximum de dépendances inter-instructions. Les seules dépendances à détecter sont alors les dépendances RAW, qu'on peut détecter en comparant les registres de deux instructions consécutives. Sur les processeurs superscalaires à exécution dans l’ordre, il faut aussi gérer l'alignement des instructions dans la fenêtre d'instruction. Dans le cas le plus simple, les instructions sont chargées par blocs et on doit attendre que toutes les instructions du bloc soient émises pour charger un nouveau bloc. Avec la seconde méthode, La fenêtre d'instruction fonctionne comme une fenêtre glissante, qui se déplace de plusieurs crans à chaque cycle d'horloge. Mais au-delà de ça, le design de l'unité d'émission change. Avant, elle recevait une micro-opération sur son entrée, et fournissait une micro-opération émise sur une sortie. Et cela vaut aussi bien pour une unité d'émission simple, un ''scoreboard'', une fenêtre d'instruction ou des stations de réservation. Mais avec l'émission multiple, les sorties et entrées sont dupliquées. Pour la double émission, il y a deux entrées vu qu'elle doit recevoir deux micro-opération décodées/renommées, et deux sorties pour émettre deux micro-opérations. Formellement, il est possible de faire une analogie avec une mémoire : l'unité d'émission dispose de ports d'écriture et de lecture. On envoie des micro-opérations décodées/renommées sur des ports d'écriture, et elle renvoie des micro-opérations émises sur le port de lecture. Dans ce qui suit, nous parlerons de '''ports de décodage''' et de '''ports d'émission'''. Si l'unité d'émission est un vulgaire ''scoreboard'', il doit détecter les dépendances entre instructions émises simultanément. De plus, il doit détecter les paires d'instructions interdites et les sérialiser. Autant dire que ce n'est pas très pratique. La détection des dépendances entre instructions consécutives est simplifiée avec une fenêtre d'instruction, il n'y a pour ainsi dire pas grand chose à faire, vu que les dépendances sont éliminées par le renommage de registre et que les signaux de réveil s'occupent de gérer les dépendances RAW. C'est la raison pour laquelle les processeurs superscalaires utilisent tous une fenêtre d'instruction centralisée ou décentralisée, et non des ''scoreboard''. Les processeurs superscalaires privilégient souvent des stations de réservations aux fenêtres d'instruction. Rappelons la terminologie utilisée dans ce cours. Les fenêtres d'instruction se contentent de mémoriser la micro-opération à émettre et quelques bits pour la disponibilité des opérandes. Par contre, les stations de réservations mémorisent aussi les opérandes des instructions. Les registres sont lus après émission avec une fenêtre d'instruction, avant avec des stations de réservation. Et cette différence a une influence sur le pipeline du processeur, le banc de registres et tout ce qui s'en suit. La différence principale est liée au banc de registre, et précisément au nombre de ports de lecture. Supposons que toutes les instructions sont dyadiques, ou du moins qu'il n'existe pas de micro-opération à trois opérandes. Avec une fenêtre d'instruction, le nombre d'opérandes à lire simultanément est proportionnel à la quantité d'instructions qu'on peut émettre en même temps. Sur un processeur ''dual issue'', qui peut émettre deux micro-opérations, cela fait deux micro-opérations à deux opérandes chacune, soit 4 opérandes. Le nombre de ports de lecture est donc de quatre. Avec une station de réservation, la lecture des opérandes a lieu avant l'émission, juste après le décodage/renommage. Le nombre d'opérande est le double du nombre de micro-opérations décodées/renommées, pas émises. Si le décodeur peut décoder/renommer 4 instructions par cycle, cela veut dire 4 micro-opérations émises par cycle. Et il se trouve que les deux situations ne sont pas évidentes. Avec une fenêtre d'instruction centralisée, cela ne change rien. Le nombre d'instructions décodées et émises en même temps sont identiques. Mais dès qu'on utilise des fenêtres d'instruction décentralisées, les choses changent. Si le décodeur peut décoder/renommer 4 instructions par cycle, alors l'idéal est d'avoir 4 micro-opérations émises par cycle, ''par fenêtre d'instruction''. Imaginez que le décodeur décode 4 instructions entières : la fenêtre d'instruction entière doit pouvoir émettre 4 micro-opérations entières en même temps. Idem pour des instructions flottantes avec la fenêtre d'instruction flottantes. Vu qu'il y a deux fenêtres d'instruction, cela fait 4 micro-opérations entières + 4 micro-opérations flottantes = 8 ports de lecture. Non pas qu'ils soient tous simultanément utiles, mais il faut les câbler. Les fenêtres d'instruction impliquent plus de lectures d'opérandes, ce qui implique plus de ports de lecture. Les stations de réservation sont plus économes, elles vont bien avec un nombre modéré de ports de lecture. ===Les conséquences sur le banc de registre=== Émettre plusieurs instructions en même temps signifie lire ou écrire plusieurs opérandes à la fois : le nombre de ports du banc de registres doit être augmenté. De plus, le banc de registre doit être relié à toutes les unités de calcul en même temps, ce qui fait 2 ports de lecture par unité de calcul. Et avec plusieurs dizaines d'unités de calcul différentes, le câblage est tout simplement ignoble. Et plus un banc de registres a de ports, plus il utilise de circuits, est compliqué à concevoir, consomme de courant et chauffe. Mais diverses optimisations permettent de réduire le nombre de ports assez simplement. Un autre solution utilise un banc de registre unique, mais n'utilise pas autant de ports que le pire des cas le demanderait. Pour cela, le processeur doit détecter quand il n'y a pas assez de ports pour servir toutes les instructions : l'unité d'émission devra alors mettre en attente certaines instructions, le temps que les ports se libèrent. Cette détection est réalisée par un circuit d'arbitrage spécialisé, intégré à l'unité d'émission, l’arbitre du banc de registres (''register file arbiter''). ==Les unités de calcul des processeurs superscalaires== Un processeur superscalaire émet/exécute plusieurs instructions simultanément dans plusieurs unités de calcul séparées. Intuitivement, on se dit qu'il faut dupliquer les unités de calcul à l'identique. Un processeur superscalaire contient alors N unités de calcul identiques, précédées par une fenêtre d'instruction avec N ports d'émission. Un tel processeur peut émettre N micro-opérations, tant qu'elles n'ont pas de dépendances. Manque de chance, ce cas est l'exception. La raison est que les processeurs superscalaires usuels sont conçus à partir d'un processeur à pipeline dynamique normal, qu'ils améliorent pour le rendre superscalaire. Les processeurs avec un pipeline dynamique incorporent plusieurs unités de calcul distinctes, avec une ALU pour les instructions entières, une FPU pour les instructions flottantes, une unité pour les accès mémoire (calcul d'adresse) et éventuellement une unité pour les tests/branchements. Sans superscalarité, ces unités sont toutes reliées au même port d'émission. Avec superscalarité, les unités de calcul existantes sont connectées à des ports d'émission différents. ===La double émission entière-flottante=== En théorie, il est possible d'imaginer un CPU superscalaire sans dupliquer les ALU, en se contenant d'exploiter au mieux les unités de calcul existantes. Prenons le cas d'un processeur avec une ALU entière et une ALU flottante, qu'on veut transformer en processeur superscalaire. L'idée est alors de permettre d'émettre une micro-opération entière en même temps qu'une micro-opération flottante. La micro-opération entière s'exécute dans l'ALU entière, la micro-opération flottante dans la FPU. Il suffit juste d'ajouter un port d'émission dédié sur la FPU. Le processeur a donc deux pipelines séparés : un pour les micro-opérations entières, un autre pour les micro-opérations flottantes. On parle alors de '''double émission entière-flottante'''. L'idée est simple, la mise en œuvre utilise assez peu de circuits pour un gain en performance qui est faible, mais en vaut la peine. La plupart des premiers processeurs superscalaires étaient de ce type. Les exemples les plus notables sont les processeurs POWER 1 et ses dérivés comme le ''RISC Single Chip''. Ils sont assez anciens et avaient un budget en transistors limité, ce qui fait qu'ils devaient se débrouiller avec peu de circuits dont ils disposaient. L'usage d'une double émission entière-flottante était assez naturelle. [[File:Double émission entière-flottante.png|centre|vignette|upright=2|Double émission entière-flottante]] Cependant, la méthode a un léger défaut. Une instruction flottante peut parfois lever une exception, par exemple en cas de division par zéro, ou pour certains calculs précis. Si une exception est levée, alors l'instruction flottante est annulée, de même que toutes les instructions qui suivent. Ce n'est pas un problème si le processeur gère nativement les exceptions précises, par exemple avec un tampon de ré-ordonnancement. Et c'est le cas pour la totalité des processeurs à exécution dans le désordre. Mais sur les processeurs à exécution dans l'ordre, si le budget en transistors est limité, les techniques de ce genre sont absentes. En théorie, sans tampon de ré-ordonnancement ou équivalent, on ne peut pas émettre d'instruction flottante en même temps qu'une instruction entière à cause de ce problème d'exceptions flottantes. Le problème s'est manifesté sur les processeurs Atom d'Intel, et les concepteurs du processeur ont trouvé une parade. L'idée est de tester les opérandes flottantes, pour détecter les combinaisons d'opérandes à problème, dont l'addition/multiplication peut lever une exception. Si des opérandes à problème sont détectées, on stoppe l'émission de nouvelles instructions en parallèle de l'instruction flottante et l'unité d'émission émet des bulles de pipeline tant que l'instruction flottante est en cours. Sinon, l'émission multiple fonctionne normalement. La technique, appelée ''Safe Instruction Recognition'' par Intel, est décrite dans le brevet US00525721.6A. Il faut noter que la double émission entière-flottante peut aussi être adaptée aux accès mémoire. En théorie, les accès mémoire sont pris en charge par le pipeline pour les opérations entières. L'avantage est que l'on peut alors utiliser l'unité de calcul pour calculer des adresses. Mais il est aussi possible de relier l'unité mémoire à son propre port d'émission. Le processeur devient alors capable d’émettre une micro-opération entière, une micro-opération flottante, et une micro-opération mémoire. On parle alors de '''triple émission entière-flottante-mémoire'''. La seule contrainte est que l'unité mémoire incorpore une unité de calcul d'adresse dédiée. ===L'émission multiple des micro-opérations flottantes=== La double émission entière-flottante ajoute un port d'émission pour la FPU, ce qui a un cout en circuits modeste, pour un gain en performance intéressant. Mais il faut savoir que les FPU regroupent un additionneur-soustracteur flottant et un multiplieur flottant, qui sont reliés au même port d'émission. Et il est possible d'ajouter des ports d'émission séparés pour l'additionneur flottant et le multiplieur flottant. Le processeur peut alors émettre une addition flottante en même temps qu'une multiplication flottante. Les autres circuits de calcul flottant sont répartis sur ces deux ports d'émission flottants. L'avantage est que cela se marie bien avec l'usage d'une fenêtre d'instruction séparée pour les opérations flottantes. La fenêtre d'instruction a alors deux ports séparés, au lieu d'un seul. Rajouter un second port d'émission flottant n'est pas trop un problème, car le cout lié à l'ajout d'un port n'est pas linéaire. Passer de un port à deux a un cout tolérable, bien plus que de passer de 3 ports à 4 ou de 4 à 5. Il est même possible de dupliquer l'additionneur et le multiplieur flottant, ce qui permet d'émettre deux additions et multiplications flottantes en même temps. C'est ce qui est fait sur les processeur AMD de architecture Zen 1 et 2. Ils ont deux additionneurs flottants par cœur, deux multiplieurs flottants, chacun avec leur propre port d'émission. Les performances en calcul flottant sont assez impressionnantes pour un processeur de l'époque. [[File:ZEN - émission multiple flottante.png|centre|vignette|upright=2.5|Microarchitecture Zen 1 d'AMD.]] ===L'émission multiple des micro-opérations entières=== Nous avons vu plus haut qu'il est possible d'ajouter plusieurs ports d'émission pour la FPU. Intuitivement, on se dit que la méthode peut aussi être appliquée pour émettre plusieurs micro-opérations entières en même temps. En effet, un processeur contient généralement plusieurs unités de calcul entières séparées, avec typiquement une ALU entière simple, un circuit multiplieur/diviseur, un ''barrel shifter'', une unité de manipulation de bit. Les 5 unités permettent d'émettre 4 micro-opérations entières en même temps, à condition qu'on ajoute assez de ports d'émission. [[File:Emission multiple des opérations entières, implémentation naive.png|centre|vignette|upright=2|Émission multiple des opérations entières, implémentation naïve.]] Maintenant, posons-nous la question : est-ce que faire ainsi en vaut la peine ? Le processeur peut en théorie émettre une addition, une multiplication, un décalage et une opération de manipulation de bits en même temps. Mais une telle situation est rare. En conséquence, les ports d'émission seront sous-utilisés, sous celui pour l'ALU entière. Pour réduire le nombre de ports d'émission sous-utilisés, il est possible de regrouper plusieurs unités de calcul sur le même port d'émission. Typiquement, il y a un port d'émission pour le multiplieur et un autre port d'émission pour le reste. L'avantage est que cela permet d'exécuter des micro-opérations entières en parallèle d'une multiplication. Mais on ne peut pas émettre/exécuter en parallèle des instructions simples. Il n'est pas exemple pas possible de faire un décalage en même temps qu'une addition. Le cout en performance est le prix à payer pour la réduction du nombre de ports d'émission, et il est assez faible. : Je dis exécuter/émettre, car ces instructions s'exécutent en un cycle. Si elles ne sont pas émises en même temps, elles ne s'exécutent pas en même temps. [[File:Emission multiple des opérations entières, double émission.png|centre|vignette|upright=2|Émission multiple des opérations entières, double émission]] Typiquement, la plupart des programmes sont majoritairement remplis d'additions, avec des multiplications assez rares et des décalages qui le sont encore plus. En pratique, il n'est pas rare d'avoir une multiplication pour 4/5 additions. Si on veut profiter au maximum de l'émission multiple, il faut pouvoir émettre plusieurs additions/soustractions en même temps, ce qui demande de dupliquer les ALU simples et leur donner chacune son propre port d'émission. : Le multiplieur n'est presque jamais dupliqué, car il est rare d'avoir plusieurs multiplications consécutives. Disposer de plusieurs circuits multiplieurs serait donc un cout en circuits qui ne servirait que rarement et n'en vaut pas la chandelle. Pour économiser des ports d'émission, les ALU entières dupliquées sont reliées à des ports d'émission existants. Par exemple, on peut ajouter la seconde ALU entière au port d'émission du multiplieur, la troisième ALU entière au port dédié au ''barrel shifter'', etc. Ainsi, les ports d'émission sont mieux utilisés : il est rare qu'on n'ait pas d'instruction à émettre sur un port. Le résultat est un gain en performance bien plus important qu'avec les techniques précédentes, pour un cout en transistor mineur. [[File:Emission multiple des opérations entières, implémentation courante.png|centre|vignette|upright=2|Emission multiple des opérations entières, implémentation courante]] ===L'émission multiple des accès mémoire=== Après avoir vu l'émission multiple pour les opérations flottantes et etnières, il est temps de voir l''''émission multiple des accès mémoire'''. ! Il est en effet possible d'émettre plusieurs micro-opérations mémoire en même temps. Les processeurs superscalaires modernes sont capables d'émettre plusieurs lectures/écritures simultanément. Par exemple, ils peuvent émettre une lecture en même temps qu'une écriture, ou plusieurs lectures, ou plusieurs écritures. Il faut noter que selon le processeur, il peut y avoir des restrictions quant aux accès mémoire émis en même temps. Par exemple, certains processeurs peuvent émettre une lecture avec une écriture en même temps, mais pas deux lectures ni deux écritures. Ou encore, ils peuvent émettre deux lectures, une lecture et une écriture, mais pas deux écritures en même temps. Dans la majorité des cas, les processeurs ne permettent pas d'émettre deux écritures en même temps, alors qu'ils supportent plusieurs lectures. Il faut dire que les lectures sont plus fréquentes que les écritures. Les processeurs qui autorisent toutes les combinaisons de lecture/écriture possibles, sont rares. L'émission multiple des accès mémoire demande évidemment de dupliquer des circuits, mais pas l'unité mémoire complète. Pour rappel, l'unité mémoire s'interpose entre le cache et le reste du pipeline. Elle est composée au minimum d'une unité de calcul d'adresse, des ports de lecture/écriture du cache de données. Le tout peut éventuellement être complété par des structures qui remettent en ordre les accès mémoire, comme une ''Load-store queue''. Émettre plusieurs micro-opérations mémoire demande d'avoir plusieurs unités de calcul, une par micro-opération mémoire émise par cycle. Si le processeur peut émettre trois micro-opérations mémoire à la fois, il y aura besoin de trois unités de calcul d'adresse. Chaque unité de calcul d'adresse est directement reliée à un port d'émission mémoire. Les ports de lecture/écriture du cache sont aussi dupliqués, afin de gérer plusieurs accès mémoire simultanés au cache de données. Par contre, la structure qui remet les accès mémoire en ordre n'est pas dupliquée. Les processeurs avec une ''Load-store queue'' ne la dupliquent pas. Par contre, elle est rendue multi-ports afin de gérer plusieurs micro-opérations mémoire simultanés. Par exemple, les processeurs skylake ont une LSQ avec deux ports de lecture et un port d'écriture, ce qui permet de faire deux lectures en même temps qu'une écriture. C'est la même chose avec les processeurs avec juste une ''Store Queue'' et une ''Load Queue''. Prenons un processeur qui peut émettre une lecture et une écriture en même temps. Dans ce cas, la lecture va dans la ''Load Queue'', l'écriture dans la ''Store Queue''. Il y a bien des modifications à faire sur les deux files, afin de gérer deux accès simultanés, mais les structures ne sont pas dupliqués. Si on veut gérer plusieurs lectures ou plusieurs écritures, il suffit d'ajouter des ports à la ''Load Queue' ou à la ''Store Queue''. : Dans ce qui suit, nous parlerons d'AGU (''Adress Generation Unit'') pour désigner les unités de calcul d'adresse. Un exemple est celui des processeurs Intel de microarchitecture Nehalem, qui pouvaient seulement émettre une lecture en même temps qu'une écriture. Ils avaient deux ports d'émission reliés à l'unité mémoire. Un port pour les lectures, un autre pour les écritures. Le premier port d'écriture recevait la donnée à écrire et s'occupait des calculs d'adresse, Le port de lecture faisait uniquement des calculs d'adresse. Les processeurs AMD K6 sont similaires, avec un port d'émission pour les lectures et un autre pour les écritures. Le port de lecture alimente une unité de calcul d'adresse dédiée, directement reliée au cache. Le port d'écriture du cache alimente une unité de calcul, qui est suivie par une ''Store Queue'', une version simplifiée de la LSQ dédiée aux écritures. Le processeur exécutait les lectures dès qu'elles avaient leurs opérandes de disponibles, seules les écritures étaient mises en attente. D'autres processeurs ont plusieurs ports d'émission pour les unités mémoire, mais qui peuvent faire indifféremment lecture comme écritures. Un exemple est celui du processeur Athlon 64, un processeur AMD sorti dans les années 2000. Il disposait d'une LSQ unique, reliée à un cache L1 de donnée double port. La LSQ était reliée à trois unités de calcul séparées de la LSQ. La LSQ avait des connexions avec les registres, pour gérer les lectures/écritures. ===L'interaction avec les fenêtres d'instruction=== Nous venons de voir qu'un processeur superscalaire peut avoir des ports d'émission reliés à plusieurs ALU. Pour le moment, nous avons vu le cas où le processeur dispose de fenêtres d'instruction séparées pour les opérations entières et flottantes. Un port d'émission est donc relié soit à des ALU entières, soit à des FPU. Mais il existe des processeurs où un même port d'émission alimente à la fois une ALU entière et une FPU. Par exemple, on peut relier un additionneur flottant sur le même port qu'une ALU entière. Il faut noter que cela implique une fenêtre d'instruction centralisée, capable de mettre en attente micro-opérations entières et flottantes. Un exemple est celui des processeurs Core 2 Duo. Ils disposent de 6 ports d'émission, dont 3 ports dédiés à l'unité mémoire. Les 3 ports restants alimentent chacun une ALU entière, un circuit de calcul flottant et une unité de calcul SSE (une unité de calcul SIMD, qu'on abordera dans quelques chapitres). Le premier port alimente une ALU entière simple et un multiplieur/diviseur flottant. Le second alimente une ALU entière, un multiplieur entier et un additionneur flottant. Le troisième alimente une ALU entière, sans circuit flottant dédié. [[File:Intel Core2 arch.svg|centre|vignette|upright=2.5|Intel Core 2 Duo - microarchitecture.]] Une conséquence de partager les ports d'émission est l'apparition de dépendances structurelles. Par exemple, imaginez qu'on connecte un multiplieur entier et la FPU, sur le même port d'émission. Il est alors impossible d'émettre une multiplication et une opération flottante en même temps. Mais la situation ne se présente que pour certaines combinaisons de micro-opérations bien précises, qui sont idéalement assez rares. De telles dépendances structurelles n'apparaissent que sur des programmes qui entremêlent instructions flottantes et entières, ce qui est assez rare. Les dépendances structurelles doivent cependant être prises en compte par les unités d'émission. Dans le même genre, il est possible de partager un port d'émission entre l'unité mémoire et une ALU entière. Cela permet d'utiliser l'ALU entière pour les calculs d'adresse, ce qui évite d'avoir à utiliser une unité de calcul d'adresse distincte. Un exemple est celui du processeur superscalaire double émission Power PC 440. Il dispose de deux ports d'émission. Le premier est connecté à une ALU entière et un circuit multiplieur, le second est relié à l'unité mémoire et une seconde ALU entière. L'organisation en question permet soit d'émettre un accès mémoire en même temps qu'une opération entière, soit d'émettre deux opérations entières simples, soit d’émettre une multiplication et une addition/soustraction/comparaison. Une organisation simple, mais très efficace ! [[File:PowerPC 440.png|centre|vignette|upright=2|Microarchitecture du PowerPC 440.]] ===Résumé=== Faisons un résumé rapide de cette section. Nous venons de voir que les différentes unités de calcul sont reliés à des ports d'émission, la répartition des ALU sur les ports d'émission étant très variable d'un processeur à l'autre. Entre les processeurs qui séparent les ports d'émission entier et flottant, ceux qui les mélangent, ceux qui séparent les ports d'émission mémoire des ports entiers et ceux qui les fusionnent, ceux qui autorisent l'émission multiple des micro-opérations mémoire ou flottante, il y a beaucoup de choix. Les divers choix possibles sont tous des compromis entre deux forces : réduire le nombre de ports d'émission d'un côté, garder de bonnes performances en limitant les dépendances structurelles de l'autre. Réduire le nombre de ports d'émission permet de garder des fenêtres d'instruction relativement simples. Plus elles ont de ports, plus elles consomment d'énergie, chauffent, sont lentes, et j'en passe. De plus, plus on émet de micro-opérations en même temps, plus la logique de détection des dépendances bouffe du circuit. Et cela a des conséquences sur la fréquence du processeur : à quoi bon augmenter le nombre de ports d'émission si c'est pour que ce soit compensé par une fréquence plus faible ? Par contre, regrouper plusieurs ALU sur un même port d'émission est à l'origine de dépendances structurelles. Impossible d'émettre deux micro-opérations sur deux ALU si elles sont sur le même port. Le nombre de ports peut être un facteur limitant pour la performance dans certaines situations de '''''port contention''''' où on a assez d'ALU pour exécuter N micro-opérations, mais où la répartition des ALUs sur les ports l’empêche. Suivant la répartition des ALU sur les ports, la perte de performance peut être légère ou importante, tout dépend des choix réalisés. Et les choix en question dépendent fortement de la répartition des instructions dans le programme exécuté. Le fait que certaines instructions sont plus fréquentes que d'autres, que certaines instructions sont rarement consécutives : tout cela guide ce choix de répartition des ALu sur les ports. ==Le contournement sur les processeurs superscalaires== Pour rappel, la technique du contournement (''register bypass'') permet au résultat d'une instruction d'être immédiatement utilisable en sortie de l'ALU, avant même d'être enregistré dans les registres. Implémenter la technique du contournement demande d'utiliser des multiplexeurs pour relier la sortie de l'unité de calcul sur son entrée si besoin. il faut aussi des comparateurs pour détecter des dépendances de données. [[File:Pipeline Bypass.png|centre|vignette|upright=1|Pipeline Bypass]] ===Les problèmes du contournement sur les CPU avec beaucoup d'ALUs=== Avec plusieurs unités de calcul, la sortie de chaque ALU doit être reliée aux entrées de toutes les autres, avec les comparateurs qui vont avec ! Sur les processeurs ayant plusieurs d'unités de calculs, cela demande beaucoup de circuits. Pour N unités de calcul, cela demande 2 * N² interconnexions, implémentées avec 2N multiplexeurs de N entrées chacun. Si c'est faisable pour 2 ou 3 ALUs, la solution est impraticable sur les processeurs modernes, qui ont facilement une dizaine d'unité de calcul. De plus, la complexité du réseau de contournement (l'ensemble des interconnexions entre ALU) a un cout en terme de rapidité du processeur. Plus il est complexe, plus les données contournées traversent de longs fils, plus leur temps de trajet est long, plus la fréquence du processeur en prend un coup. Diverses techniques permettent de limiter la casse, comme l'usage d'un bus de contournement, mais elle est assez impraticable avec beaucoup d'unités de calcul. Notez que cela vaut pour les processeurs superscalaires, mais aussi pour tout processeur avec beaucoup d'unités de calcul. Un simple CPU à exécution dans le désordre, non-superscalaire, a souvent pas mal d'unités de calcul et fait face au même problème. En théorie, un processeur sans exécution dans le désordre ou superscalarité pourrait avoir le problème. Mais en pratique, avoir une dizaine d'ALU implique processeur superscalaire à exécution dans le désordre. D'où le fait qu'on parle du problème maintenant. La seule solution praticable est de ne pas relier toutes les unités de calcul ensemble. À la place, on préfère regrouper les unités de calcul dans différents '''agglomérats''' ('''cluster'''). Le contournement est alors possible entre les unités d'un même agglomérat, mais pas entre agglomérats différents. Généralement, cela arrive pour les unités de calcul entières, mais pas pour les unités flottantes. La raison est que les CPU ont souvent beaucoup d'unités de calcul entières, car les instructions entières sont légion, alors que les instructions flottantes sont plus rares et demandent au mieux une FPU simple. Évidemment, l'usage d'agglomérats fait que certaines possibilités de contournement sont perdues, avec la perte de performance qui va avec. Mais la perte en possibilités de contournement vaut bien le gain en fréquence et le cout en circuit/fils réduit. C'est un bon compromis, ce qui explique que presque tous les processeurs modernes l'utilisent. Les rares exceptions sont les processeurs POWER 4 et POWER 5, qui ont préféré se passer de contournement pour garder un processeur très simple et une fréquence élevée. ===Les bancs de registre sont aussi adaptés pour le contournement=== L'usage d'agglomérats peut aussi prendre en compte les interconnections entre unités de calcul et registres. C'est-à-dire que les registres peuvent être agglomérés. Et cela peut se faire de plusieurs façons différentes. Une première solution, déjà vue dans les chapitres sur la micro-architecture d'un processeur, consiste à découper le banc de registres en plusieurs bancs de registres plus petits. Il faut juste prévoir un réseau d'interconnexions pour échanger des données entre bancs de registres. Dans la plupart des cas, cette séparation est invisible du point de vue de l'assembleur et du langage machine. Le processeur se charge de transférer les données entre bancs de registres suivant les besoins. Sur d'autres processeurs, les transferts de données se font via une instruction spéciale, souvent appelée ''COPY''. [[File:Banc de registres distribué.png|centre|vignette|upright=2|Banc de registres distribué.]] Sur de certains processeurs, un branchement est exécuté par une unité de calcul spécialisée. Or les registres à lire pour déterminer l'adresse de destination du branchement ne sont pas forcément dans le même agglomérat que cette unité de calcul. Pour éviter cela, certains processeurs disposent d'une unité de calcul des branchements dans chaque agglomérat. Dans les cas où plusieurs unités veulent modifier le ''program counter'' en même temps, un système de contrôle général décide quelle unité a la priorité sur les autres. Mais d'autres processeurs fonctionnent autrement : seul un agglomérat possède une unité de branchement, qui peut recevoir des résultats de tests de toutes les autres unités de calcul, quel que soit l’agglomérat. Une autre solution duplique le banc de registres en plusieurs exemplaires qui contiennent exactement les mêmes données, mais avec moins de ports de lecture/écriture. Un exemple est celui des processeurs POWER, Alpha 21264 et Alpha 21464. Sur ces processeurs, le banc de registre est dupliqué en plusieurs exemplaires, qui contiennent exactement les mêmes données. Les lectures en RAM et les résultats des opérations sont envoyées à tous les bancs de registres, afin de garantir que leur contenu est identique. Le banc de registre est dupliqué en autant d'exemplaires qu'il y a d'agglomérats. Chaque exemplaire a exactement deux ports de lecture, une par opérande, au lieu de plusieurs dizaines. La conception du processeur est simplifiée, que ce soit au niveau du câblage, que de la conception des bancs de registres. ==Les optimisations de la pile d'appel : le ''stack engine''== Les processeurs modernes intègrent une optimisation liée au pointeur de pile. Pour rappel, sur les architectures modernes, le pointeur de pile est un registre utilisé pour gérer la pile d'appel, précisément pour savoir où se trouve le sommet de la pile. Il est manipulé par les instructions CALL, RET, PUSH et POP, mais aussi par les instructions d'addition/soustraction pour gérer des cadres de pile de taille variable. De plus, il peut servir d'opérande pour des instructions LOAD/STORE, afin de lire/écrire des variables locales, les arguments d'une fonction, et autres. C'est donc un registre général adressable, intégré au banc de registre, altéré par l'unité de calcul entière. L'incrémentation/décrémentation du pointeur de pile passe donc par l'unité de calcul, lors des instructions CALL, RET, PUSH et POP. Mais, l'optimisation que nous allons voir permet d'incrémenter/décrémenter le pointeur de pile sans passer par l'ALU, ou presque. L'idée est de s'inspirer des architectures avec une pile d'adresse de retour, qui intègrent le pointeur de pile dans le séquenceur et l'incrémentent avec un incrémenteur dédié. ===Le ''stack engine''=== L'optimisation que nous allons voir utilise un '''''stack engine''''' intégré à l'unité de contrôle, au séquenceur. Le processeur contient toujours un pointeur de pile dans le banc de registre, cela ne change pas. Par contre, il n'est pas incrémenté/décrémenté à chaque instruction CALL, RET, PUSH, POP. Un compteur intégré au séquenceur est incrémenté à la place, nous l’appellerons le '''compteur delta'''. La vraie valeur du pointeur de pile s'obtient en additionnant le compteur delta avec le registre dans le banc de registre. Précisons que si le compteur delta vaut zéro, la vraie valeur est dans le banc de registre et peut s'utiliser telle quelle. Lorsqu'une instruction ADD/SUB/LOAD/STORE utilise le pointeur de pile comme opérande, elle a besoin de la vraie valeur. Si elle n'est pas dans le banc de registre, le séquenceur déclenche l'addition compteur-registre pour calculer la vraie valeur. Finalement, le banc de registre contient alors la bonne valeur et l'instruction peut s'exécuter sans encombre. L'idée est que le pointeur de pile est généralement altéré par une série d'instruction PUSH/POP consécutives, puis des instructions LOAD/STORE/ADD/SUB utilisent le pointeur de pile final comme opérande. En clair, une bonne partie des incrémentations/décrémentation est accumulée dans le compteur delta, puis la vraie valeur est calculée une fois pour toutes et est utilisée comme opérande. On accumule un delta dans le compteur delta, et ce compteur delta est additionné quand nécessaire. Précisons que le compteur delta est placé juste après le décodeur d'instruction, avant même le cache de micro-opération, l'unité de renommage et l'unité d'émission. Ainsi, les incrémentations/décrémentations du pointeur de pile disparaissent dès l'unité de décodage. Elles ne prennent pas de place dans le cache de micro-opération, ni dans la fenêtre d'instruction, ni dans la suite du pipeline. De nombreuses ressources sont économisées dans le ''front-end''. Mais utiliser un ''stack engine'' a aussi de nombreux avantages au niveau du chemin de données/''back-end''. Déjà, sur les processeurs à exécution dans le désordre, cela libère une unité de calcul qui peut être utilisée pour faire d'autres calculs. Ensuite, le compteur delta mémorise un delta assez court, de 8 bits sur le processeur Pentium M, un peu plus pour les suivants. L'incrémentation se fait donc via un incrémenteur 8 bits, pas une grosse ALU 32/64 bits. Il y a un gain en termes de consommation d'énergie, un incrémenteur 8 bits étant moins gourmand qu'une grosse ALU 32/64 bits. ===Les points de synchronisation du delta=== La technique ne fonctionne que si la vraie valeur du pointeur de pile est calculée au bon moment, avant chaque utilisation pertinente. Il y a donc des '''points de synchronisation''' qui forcent le calcul de la vraie valeur. Plus haut, nous avions dit que c'était à chaque fois qu'une instruction adresse le pointeur de pile explicitement, qui l'utilise comme opérande. Les instructions CALL, RET, PUSH et POP ne sont pas concernées par elles utilisent le pointeur de pile de manière implicite et ne font que l'incrémenter/décrémenter. Mais dans les faits, c'est plus compliqué. D'autres situations peuvent forcer une synchronisation, notamment un débordement du compteur delta. Le compteur delta est généralement un compteur de 8 bits, ce qui fait qu'il peut déborder. En cas de débordement du compteur, le séquenceur déclenche le calcul de la vraie valeur, puis réinitialise le compteur delta. La vraie valeur est donc calculée en avance dans ce cas précis. Précisons qu'un compteur delta de 8 bits permet de gérer environ 30 instructions PUSH/POP consécutives, ce qui rend les débordements de compteur delta assez peu fréquent. A noter que si le compteur delta vaut zéro, il n'y a pas besoin de calculer la vraie valeur, le séquenceur prend cette situation en compte. Un autre point de synchronisation est celui des interruptions et exceptions matérielles. Il faut que le compteur delta soit sauvegardé lors d'une interruption et restauré quand elle se termine. Idem lors d'une commutation de contexte, quand on passe d'un programme à un autre. Pour cela, le processeur peut déclencher le calcul de la vraie valeur lors d'une interruption, avant de sauvegarder les registres. Pour cela, le processeur intègre un mécanisme de sauvegarde automatique, qui mémorise la valeur de ce compteur dans le tampon de réordonnancement, pour forcer le calcul de la vraie valeur en cas de problème. La technique du ''stack engine'' est apparue sur les processeurs Pentium M d'Intel et les processeurs K10 d'AMD, et a été conservée sur tous les modèles ultérieurs. L'implémentation est cependant différente selon les processeurs, bien qu'on n'en connaisse pas les détails et que l'on doive se contenter des résultats de micro-benchmarks et des détails fournit par Intel et AMD. Selon certaines sources, dont les manuels d'optimisation d'Agner Fog, les processeurs AMD auraient moins de points de synchronisation que les processeurs Intel. De plus, leur ''stack engine'' serait placé plus loin que prévu dans le pipeline, après la file de micro-opération. ==Un étude des microarchitectures superscalaires x86 d'Intel== Après avoir vu beaucoup de théorie, voyons maintenant comment les microarchitectures Intel et AMD ont implémenté l'exécution superscalaire. Nous allons nous concentrer sur les processeurs Intel pour une raison simple : il y a plus de schémas disponibles sur wikicommons, ce qui me facilite le travail. ===Les processeurs Atom d'Intel, de microarchitecture Bonnell=== Les processeurs Atom sont des processeurs basse consommation produits et conçus par Intel. Il regroupent des processeurs de microarchitecture très différentes. La toute première microarchitecture ATOM était la microarchitecture Bonnell, qui est de loin la plus simple à étudier. Il s'agissait de processeurs sans exécution dans le désordre, sans renommage de registres. De nos jours, de tels processeurs ont disparus, même pour les processeurs basse consommation, mais les premiers processeurs Atom étaient dans ce cas. Mais le processeur était superscalaire et pouvait émettre deux instructions simultanées. Son pipeline faisait 16 étages, ce qui est beaucoup. L'architecture est assez simple. Premièrement, le cache d'instruction permet de lire 8 octets par cycle, qui sont placés dans une file d'instruction. La file d'instruction est alors reliée à deux décodeurs, ce qui permet de décoder deux instructions en même temps. Le fait que les décodeurs lisent les instructions depuis une file d'instruction fait que les deux instructions décodées ne sont pas forcément consécutives en mémoire RAM. Par exemple, l'Atom peut décoder un branchement prédit comme pris, suivi par l'instruction de destination du branchement. Les deux instructions ont été chargées dans la file d'instruction et sont consécutifs dedans, alors qu'elles ne sont pas consécutives en mémoire RAM. Les deux décodeurs alimentent une file de micro-opérations de petite taille : 32 µops maximum, 16 par ''thread'' si le ''multithreading'' matériel est activé. La majorité des instructions x86 sont décodées en une seule micro-opération, y compris les instructions ''load-up''. Le chemin de données est conçu pour exécuter les instruction ''load-up'' nativement, en une seule micro-opération. Le microcode n'est utilisé que pour une extrême minorité d'instructions et est à part des deux décodeurs précédents. L'avantage est que cela permet d'utiliser au mieux la file de micro-opération, qui est de petite taille. La file de micro-opérations est suivie par deux ports d'exécution, avec chacun leur logique d'émission. Les deux ports peuvent émettre au maximum 2 µops par cycle. Le résultat est que deux instructions consécutives peuvent s'exécuter, chacune dans deux avals séparés, dans deux pipelines différents. Les conditions pour cela sont cependant drastiques. Les deux instructions ne doivent pas avoir de dépendances de registres, à quelques exceptions près liées au registre d'état. Le multithreading matériel doit aussi être désactivé. Les deux instructions doivent aller chacun dans un port différent, et cela tient en compte du fait que les deux ports sont reliés à des unités de calcul fort différentes. Le tout est illustré ci-dessous. [[File:Intel Atom Microarchitecture.png|centre|vignette|upright=2.5|Intel Atom Microarchitecture]] Les deux ports sont capables de faire des additions/soustractions, des opérations bit à bit et des copies entre registres. Pour cela, ils ont chacun une ALU simple dédiée. Mais cela s'arrête là. Le second port est optimisé pour les opérations de type ''load-up''. Il contient toute la machinerie pour faire les accès mémoire, notamment des unités de calcul d'adresse et un cache L1 de données. A la suite du cache, se trouvent une ALU entière simple, un ''barrel shifter'', et un circuit multiplieur/diviseur. Le circuit multiplieur/diviseur est utilisé à la fois pour les opérations flottantes et entières. Le premier port permet d’exécuter des opérations entières simples, une addition flottante, des comparaisons/branchements, ou une instruction de calcul d'adresse LEA. Comme on le voit, la séparation entre les deux pipelines est assez complexe. Il ne s'agit pas du cas simple avec un pipeline entier et un pipeline flottant séparés. En réalité, il y a deux pipelines, chacun capables de faire des opérations entières et flottantes, mais pas les mêmes opérations. Et cette organisation difficile à comprendre est en réalité très efficace, très économe en circuit, tout en gardant une performance intéressante. Les instructions simples, ADD/SUB/bitwise sont supportées dans les deux pipelines. Il faut dire que ce sont des opérations courantes qu'il vaut mieux optimiser au mieux. Les opérations plus complexes, à savoir les multiplications/divisions/décalages/rotations/manipulations de bit sont supportées dans un seul pipeline. La raison est qu'il est rare que de telles opérations soient consécutives, et qu'il n'est donc pas utile d'optimiser pour cette situation. Si les deux pipelines devaient supporter ces opérations, cela demanderait de dupliquer les circuits multiplieurs/diviseur, ce qui aurait un cout en circuit important pour un gain en performance assez faible. ===Le Pentium 1/MMX et les pipelines U/V=== Le processeur Pentium d'Intel avait un pipeline de 5 étages : un étage de chargement/prédiction de branchement, deux étages de décodage, un étage d'exécution et un dernier étage pour l'écriture dans les registres. Chose étonnante pour un processeur superscalaire, il n'utilisait pas de renommage de registre ni d’exécution dans le désordre. Vous avez bien lu : la superscalarité est apparue dans les processeurs commerciaux avant l'exécution dans le désordre. Le Pentium 1 était un processeur à double émission, qui disposait de deux pipelines nommés U et V. On pouvait en tirer parti lorsque deux instructions consécutives pouvaient être exécutées en parallèles, si elles n'avaient pas de dépendances. Chose peu courante, les deux pipelines n'étaient pas identiques. Le pipeline U pouvait exécuter toutes les instructions, mais le pipeline V était beaucoup plus limité. Par exemple, seul le pipeline U peut faire des calculs flottants, le pipeline V ne fait que des calculs entiers et des branchements. L'unité flottante était sur le port d'émission du pipeline U, idem pour l'unité de calcul vectoriel MMX sur le Pentium MMX. Les deux pipelines disposaient d'une unité de calcul entière identiques dans les deux pipelines. Le pipeline U incorporait un circuit multiplieur/diviseur et un ''barrel shifter'' pour les décalages/rotations. Les deux pipelines avaient chacun uen unité de calcul d'adresse, mais elle n'étaient pas identique : celle du pipeline V ne gérait que l’instruction LEA, celle du pipeline U gérait tous les calculs d'adresse. La FPU était dans le pipeline U, de même que l'unité MMX. {|class="wikitable" |- ! Pipeline U ! Pipeline V |- | colspan="2" | ALU simple (une par pipeline) |- | Multiplieur/diviseur | |- | ''Barrel Shifter'' | |- | AGU complexe | AGU simple (opération LEA) |- | FPU | |- | Unité SIMD | |} Les deux ALU géraient les opérations bit à bit, les additions et soustractions, et les comparaisons (qui sont des soustractions déguisées). En conséquence, les instructions suivantes étaient exécutables dans les deux pipelines, ce qui fait qu'on pouvait en faire deux en même temps : * l'instruction MOV, dépend du mode d'adressage ; * les instructions de gestion de la pile PUSH et POP, dépend du mode d'adressage ; * Les instructions arithmétiques INC, DEC, ADD, SUB ; * l'instruction de comparaison CMP ; * les instructions bit à bit AND, OR, XOR ; * l'instruction de calcul d'adresse LEA ; * l'instruction NOP, qui ne fait rien. Les instructions suivantes sont exécutables seulement dans le pipeline U : les calculs d'adresse autres que LEA, les décalages et rotations, la multiplication et la division, les opérations flottantes. Il faut noter qu'il y a cependant quelques restrictions. Par exemple, si le pipeline U exécute une multiplication ou une division, le processeur ne peut pas exécuter une opération dans le pipeline V en parallèle. Dans le même genre, les branchements sont exécutables dans les deux pipelines, mais on ne peut exécuter une autre opération en parallèle qu'à la condition que le branchement soit exécuté dans le pipeline V. [[File:Intel Pentium arch.svg|centre|vignette|upright=2.5|Microarchitecture de l'Intel Pentium MMX. On voit que certaines unités de calcul sont dupliquées.]] ===La microarchitecture P6 du Pentium 2/3=== La microachitecture suivante, nommée P6, était une microarchitecture plus élaborée. Le pipeline faisait 12 étages, dont seuls les trois derniers correspondent au chemin de données. Il s'agissait du premier processeur à exécution dans le désordre de la marque, avec une implémentation basée sur des stations de réservation. Il gérait aussi le renommage de registre, avec un renommage de registre dans le ROB, commandé par une table d'alias. [[File:Intel Pentium Pro Microarchitecture Block Diagram.svg|centre|vignette|upright=2|Intel Pentium Pro Microarchitecture Block Diagram]] Le décodage des instructions x86 était géré par plusieurs décodeurs. Il y avait trois décodeurs : deux décodeurs simples, et un décodeur complexe. Les décodeurs simples décodaient les instructions les plus fréquentes, mais aussi les plus simples. Les instructions CISC complexes étaient gérées uniquement par le décodeur complexe, basé sur un microcode. Le processeur était à doubvle émission, du fait que les deux décodeurs simples faisaient le gros du travail, et passaient la main au décodeur microcodé quand aucune instruction ne leur était attribué. Les stations de réservations étaient regroupées dans une structure centralisée, en sortie de l'unité de renommage. Elles avaient 5 ports d'émission, qui étaient sous-utilisés en pratique. Niveau ALU, on trouve deux ALUs entières, une flottante, une unité pour les instructions SSE et autres, et trois unités pour les accès mémoire (regroupées en une seule unité dans le schéma ci-dessous). Les unités mémoire regroupent une unité de calcul d'adresse pour les lectures, une autre pour les écritures, et une unité pour la gestion des données à écrire. Les unités de calcul d'adresse sont des additionneurs à 4 opérandes, complétement différents des ALU entières. Les ALU entières sont deux unités asymétriques : une ALU simple, et une ALU complexe incorporant un multiplieur. Les deux peuvent exécuter des opérations d'addition, soustraction, comparaison, etc. [[File:P6 func diag.png|centre|vignette|upright=2|P6 func diag]] ===La microarchitecture Netburst du Pentium 4=== La microarchitecture Netburst, utilisée sur le Pentium 4, utilisait un pipeline à 20 étage, augmenté à 32 sur une révision ultérieure. Il a existé quatre révisions de l'architecture : Willamette (180 nm), Northwood (130 nm), Prescott (90 nm) et Cedar Mill (65 nm). Les deux premières avaient un pipeline de 20 étages, les deux suivants avaient 32 étages ! Le grand nombre d'étages permettait d'avoir une fréquence très élevée, mais posait de nombreux problèmes. Vider le pipeline était très long et il fallait une prédiction de branchement au top pour réduire l'impact des mauvaises prédictions. L'unité de prédiction de branchement était une des plus élvoluées pour l'époque. Pour l'époque. Il dispose d'un cache de trace et a été le seul processeur commercial à en utiliser un. Niveau décodeurs, on retrouve le décodeur lent à base de microcode présent sur les anciennes versions, couplé à un décodeur simple. L'unité de renomage utilise une table d'alias. Le renommage de registres se fait avec un banc de registres physiques. Vous pouvez remarquer dans le schéma suivant la présence de deux files de micro-opérations : une pour les accès mémoire, l'autre pour les autres opérations. Il s'agit bel et bien de deux files d'instructions, pas de fenêtres d'instruction ni de stations de réservation. Niveau ports d'émission, il y a quatre ports. Un pour les lectures mémoire, un pour les écriture mémoire, et deux autres qui mélangent FPU et ALUs. Le premier port est relié à une ALU complexe et une FPU spécialisée dans les MOV flottants. Le second port est relié à tout le reste : ALU basique ''barrel shifter'', FPU. Fait amusant, les ALU entières étaient cadencées à une fréquence double de celle du processeur, ce qui fait que les files d'émissionsont aussi censées l'être, de même que les ''scoreboard''. Sauf qu'en réalité, les circuits étaient dupliqués : l'un allait à une fréquence double, l'autre allait à la fréquence normale. [[File:Architettura Pentium 4.png|centre|vignette|upright=3|Microarchitecture du Pentium 4.]] ==Un étude des microarchitectures superscalaires x86 d'AMD== Les architectures AMD ont beaucoup évoluées avec le temps. Dans ce qui va suivre, nous allons les voir dans l'ordre chronologique, en partant de l'architecture K5, pour arriver aux dernières architectures Zen. Nous allons voir que les architectures AMD ont évoluées progressivement, chacune améliorant la précédente en faisant des rajouts ou modifications mineures, à l'exception de quelques grandes cassures dans la continuité où AMD a revu sa copie de fond en comble. L'architecture Bulldozer a été une première cassure, suivie par l'introduction des architectures Zen. Étudier ces architectures demande de voir trois choses séparément : le ''front-end'' qui regroupe l'unité de chargement et les décodeurs, le ''back-end'' qui gère l'exécution dans le désordre et les unités de calcul, et le sous-système mémoire avec les caches et la ''Load Store Queue''. Leur étude sera plus ou moins séparée dans ce qui suit, pour chaque classe d'architecture. ===La première génération de CPU AMD : les architectures K5, K6, K7, K8 et K10=== La première génération de processeurs AMD est celle des architectures K5, K6, K7, K8 et K10. Il n'y a pas de K9, qui a été abandonné en cours de développement. Les processeurs K5 et K6 portent ce nom au niveau commercial. Par contre, les processeurs d'architecture K7 sont aussi connus sous le nom d''''AMD Athlon''', les AMD K8 sont connus sous le nom d''''AMD Athlon 64''', et les architecture K10 sont appelées les '''AMD Phenom'''. Comme le nom l'indique, l'architecture K8 a introduit le 64 bits chez les processeurs AMD. Elles ont une architecture assez similaire pour ce qui est du chargement et des caches. Toutes disposent d'au minimum un cache L1 d'instruction et d'un cache L1 de données. Le K5 n'avait que ces caches, mais un cache L2 a été ajouté avec le K7, puis un L3 avec le K10. L'AMD K5 avait une TLB unique, mais les processeurs suivants avaient une TLB pour le L1 d'instruction et une autre pour le L1 de données. Idem pour le cache L2, avec deux TLB : une pour les données, une pour les instructions. Les caches L1/L2 sont de type exclusifs, à savoir que les données dans le L1 ne sont pas recopiées dans le L2. Le cache L2 est précisément un cache de victime, qui mémorise les données/instructions, évincées des caches L1 lors du remplacement des lignes de cache. L'introduction du cache L2 a entrainé l'ajout de deux TLB de second niveau : une L2 TLB pour les données et une autre pour les instructions. Les architectures K8 et K10 ont ajouté un cache L3, avec un accès indirect à travers l'interface avec le bus. : L'AMD K7 originel, aussi appelée Athlon classique, n'avait pas de cache L2, mais celui-ci était placé sur la carte mère et fonctionnait à une fréquence moitié moindre de celle du CPU. L'Athlon Thunderbird, puis l'Athlon XP, ont intégré le cache L2 dans le processeur. {|class="wikitable" |- ! Architecture AMD ! colspan="5" | Caches |- | rowspan="2" | K5 | L1 instruction || L1 données || colspan="3" | |- | colspan="2" | TLB unique || colspan="3" | |- | colspan="4" | |- | rowspan="2" | K6 | L1 instruction || L1 données || colspan="3" | L2 unifié |- | TLB L1 instruction || TLB L1 données || colspan="3" | |- | colspan="6" | |- | rowspan="2" | K7, K8 | L1 instruction || L1 données || colspan="2" | L2 unifié || |- | TLB L1 instruction || TLB L1 données || TLB L2 instruction || TLB L2 données || |- | colspan="6" | |- | rowspan="2" | K10 | L1 instruction || L1 données || colspan="2" | L2 unifié || L3 |- | TLB L1 instruction || TLB L1 données || TLB L2 instruction || TLB L2 données || |} Fait important, les architectures K5 à K10 utilisent la technique du '''prédécodage''', où les instructions sont partiellement décodées avant d'entrer dans le cache d'instruction. Le prédécodage facilite grandement le travail des décodeurs d'instruction proprement dit. Par contre, le prédécodage prend de la place dans le cache L1 d'instruction, une partie de sa capacité est utilisé pour mémoriser les informations prédécodées. C'est donc un compromis entre taille du cache et taille/rapidité des décodeurs d'instruction. Sur les architectures K5 et K6, le prédécodage précise, pour chaque octet, si c'est le début ou la fin d'une instruction, si c'est un octet d'opcode, en combien de micro-opérations sera décodée l'instruction, etc. A partir de l'AMD K7, le prédécodage reconnait les branchements inconditionnels. Lorsqu'un branchement inconditionnel est pré-décodé, le pré-décodage tient compte du branchement et continue le pré-décodage des instructions à partir de la destination du branchement. Le système de prédécodage est abandonnée à partir de l'architecture Bulldozer, qui suit l'architecture K10. La prédiction de branchement de ces CPU tire partie de ce système de pré-décodage, à savoir que les prédictions de branchement sont partiellement mémorisées dans les lignes de cache du L1 d'instruction. Par exemple, l'AMD K5 se passe de ''Branch Target Buffer'' grâce à cela. Si une ligne de cache contient un branchement, elle mémorise l'adresse de destination de ce branchement, en plus des bits de pré-décodage. Si il y a plusieurs branchements dans une ligne de cache, c'est l'adresse de destination du premier branchement pris dans cette ligne de cache qui est mémoirsée. Un défaut de cette approche est que si le branchement n'est pas dans le L1 d'instruction, aucune prédiction de branchement ne peut être faite et le préchargement ne peut pas fonctionner. C'est une limitation que n'ont pas les BTB découplées du cache L1 : elles peuvent prédire un branchement qui a été évincé dans le L2 ou le L3, tant que l'entrée associée est dans le BTB. Les prédictions peuvent même servir à précharger les instructions utiles. [[File:Comparaison du chargement de l'AMD K5 et K6.png|centre|vignette|upright=2|Comparaison du chargement de l'AMD K5 et K6]] Au niveau du décodage, on trouve de nombreuses différences entre les premières architectures AMD. L'AMD K5 contient 4 décodeurs hybrides, afin de décoder 4 instructions par cycles. Le K5 a quatre décodeurs simples couplés à 4 décodeurs complexes avec chacun un accès au micro-code. Une instruction peut donc passer par a donc deux voies de décodage : un décodage rapide et simple pour les instructions simples, un décodage lent et passant par le microcode pour les instructions complexes. Pour décoder 4 instructions, les deux voies sont dupliquées en 4 exemplaires, ce qui a un cout en circuits non-négligeable. L'AMD K6 utilise moins de décodeurs et ne peut que décoder deux instructions à la fois maximum. Par contre, il fournit en sortie 4 micro-opérations. Il intègre pour cela deux décodeurs simples, un décodeur complexe et un décodeur micro-codé. Un décodeur simple transforme une instruction simple en une ou deux micro-opérations. Il est possible d'utiliser les deux décodeurs simples en même temps, afin de fournir 4 micro-opérations en sortie du décodeur. Les deux autres décodent une instruction complexe en 1 à 4 micro-opérations. Si jamais la ou les deux instructions sont décodées en 1, 2 ou 3 micro-opérations, les micro-opérations manquantes pour atteindre 4 sont remplies par des NOPs. Pour le K7 et au-delà, le processeur dispose de décodeurs séparées pour les instructions micro-codées de celles qui ne le sont pas. Le processeur peut décoder jusqu’à 3 instructions par cycle. Le décodage d'une instruction microcodée ne peut pas se faire en parallèle du décodage non-microcodé. C'est soit le décodeur microcodé qui est utilisé, soit les décodeurs câblés, pas les deux en même temps. Le décodage d'une instruction prend 4 cycles. Les instructions non-microcodées sont décodées en une seule micro-opération, à un détail près : le CPU optimise la prise en charge des instructions ''load-up''. La différence entre le K6 et le K7 s'explique par des optimisations des instructions ''load-up''. Sur le K6, les instructions ''load-up'' sont décodées en deux micro-opération : la lecture en RAM, l'opération proprement dite. Mais sur le K7, une instruction ''load-up'' est décodée en une seule micro-opération. En conséquence, les décodeurs simples sont fortement simplifiés et le décodeur complexe disparait au profit d'un microcode unique. [[File:Décodage sur le K5 et le K5.png|centre|vignette|upright=3|Décodage sur le K5 et le K5]] ====Les microarchitectures K5 et K6 d'AMD==== Les deux premières architectures étaient les architectures K5 et K6, l'architecture K6 ayant été déclinée en quatre versions, nommées K6-1, K6-2, et K-3, avec une version K6-3 bis. Elles sont regroupées ensemble car elles ont beaucoup de points communs. Par exemple, tout ce qui a trait au chargement et au cache était similaire, de même que les unités de calcul. Les deux architectures avaient n'avaient pas de cache L2 et devaient se contenter d'un cache L1 d'instruction et d'un cache L1 de données. L'AMD K5 incorpore une TLB unique, alors que le K6 utilise des TLB séparées pour le cache d'instruction et le cache de données. Une différence entre l'architecture K5 et K6 est que la première utilise des caches normaux, alors que la seconde utilise des ''sector caches''. Les deux architectures disposaient des unités de calcul suivantes : deux ALU entières, une FPU, deux unités LOAD/STORE pour les accès mémoire, une unité de branchement et une ou plusieurs unités SIMD. Une organisation classique, donc. Pour les unités entières, il y avait deux ALU simples, un ''barrel shifter'' et un diviseur. Il n'y a pas d'erreur, le processeur incorpore un circuit diviseur, mais pas de circuit multiplieur. La raison est que la multiplication est réalisée par la FPU ! En effet, le multiplieur flottant de la FPU intègre un multiplieur entier pour multiplier les mantisses, qui est utilisé pour les multiplications entières. La même technique a été utilisée sur l'Atom, comme vu plus haut. Le tout était alimenté par deux ports d'émission, appelés ports X et Y. Sur l'architecture K5, le ''barrel shifter'' et le diviseur sont des ports différents. {|class="wikitable" |+ AMD K5 |- ! Port X ! Port Y |- | ALU simple | ALU simple |- | ''Barrel Shifter'' | Diviseur |} Sur l'architecture K6, le ''barrel shifter'' et le diviseur sont sur le même port. {|class="wikitable" |+ AMD K6 |- ! Port X ! Port Y |- | ALU simple | ALU simple |- | | ''Barrel Shifter'' |- | | Diviseur |} Niveau unités mémoire, le K5 avait deux unités LOAD/STORE, chacune capable de faire lecture et écriture. Par contre, la ''store queue'' n'a qu'un seul port d'entrée, ce qui fait que le processeur peut seulement accepter une écriture par cycle. Le processeur peut donc émettre soit deux lectures simultanées, soit une lecture accompagnée d'une écriture. Impossible d'émettre deux écritures simultanées, ce qui est de toute façon très rare. L'architecture K6 utilise quant à elle une unité LOAD pour les lectures et une unité STORE pour les écritures. Ce qui permet de faire une lecture et une écriture par cycle, pas autre chose. Niveau unités SIMD, l'architecture K7 n'avait qu'une seule unité SIMD, placée sur le port d'émission X. L'architecture K8 ajouta une seconde unité SIMD, sur l'autre port d'émission entier. De plus, trois ALU SIMD ont été ajoutées : un décaleur MMX, une unité 3DNow!, une unité mixte MMX/3DNow. Elles sont reliées aux deux ports d'émission entier X et Y ! Elles ne sont pas représentées ci-dessous, par souci de simplicité. [[File:Unité de calcul des processeurs AMD K5 et K6.png|centre|vignette|upright=2|Unité de calcul des processeurs AMD K5 et K6. les unités sur la même colonnes sont reliées au même port d'émission.]] Si les unités de calcul et le chargement sont globalement les mêmes, les deux architectures se différencient sur l'exécution dans le désordre. L'AMD K5 utilise du renommage de registre dans le ROB avec des stations de réservation. Par contre, l'AMD K6 utilise une fenêtre d'instruction centralisée. De plus, son renommage de registre se fait avec un banc de registre physique. L'architecture AMD K5 utilisait de deux stations de réservation par unité de calcul, sauf pour les deux unités mémoire partageaient une station de réservation unique (deux fois plus grande). Les stations de réservation sont cependant mal nommées, vu que ce sont en réalité des mémoire FIFO. Une micro-opération n'est émise que si elle est la plus ancienne dans la FIFO/station de réservation. Le renommage de registres se faisait dans le tampon de ré-ordonnancement, il n'y avait pas encore de banc de registre physique. Le tampon de ré-ordonnancement faisait seulement 16 instructions. [[File:AMD K5.jpg|centre|vignette|upright=3|AMDK5 Diagramme.]] L'architecture K6 remplace les stations de réservations par une fenêtre d'instruction centralisée. Les 4 micro-opérations renommées sont écrites dans la fenêtre d'instruction par groupe de 4, NOP de ''padding'' inclus. La fenêtre d'instruction centralisé contient 24 micro-opérations, groupées en 6 groupes de 4 micro-opérations, avec potentiellement des NOP dedans suivant le résultat du décodage. L'avantage est que l'implémentation de la fenêtre d'instruction est simple. La fenêtre d'instruction centralisée permettait d'émettre 6 micro-opérations en même temps (une par unité de calcul/mémoire). Le renommage de registres se faisait dans le tampon de ré-ordonnancement, il n'y avait pas encore de banc de registre physique. Le processeur utilisait un renommage avec un banc de registre physique. Le banc de registre physique pour les entiers contenait 48 registres, dont 24 étaient des registres architecturaux et 24 étaient des registres renommés. Sur les 24 registres architecturaux, 16 avaient une fonction de ''scratchpad'' que les ''datasheets'' d'AMD ne détaillent pas, les 8 restants étaient les registres généraux EAX, EBX, etc. [[File:AMD K6 Little foot & Modl 6.png|centre|vignette|upright=3|AMD K6 original.]] ====Les microarchitectures K7, K8 et K10 d'AMD==== Les microarchitectures suivantes sont les architectures K7, K8 et K10. Les architectures K7, K8 et K10 sont assez similaires. La différence principale entre le K7 et le K8 est le support du 64 bits. Les apports du K10 sont la présence d'un cache L3, d'une unité de calcul supplémentaire et d'améliorations de la prédiction de branchement. La taille de certains caches a été augmentée, de même que la largeur de certaines interconnexions/bus. A partir du K7, le CPU optimise la prise en charge des instructions ''load-up''. Les instructions ''load-op'' sont appelées des macro-opérations dans la terminologie d'AMD, et aussi d'Intel. L'idée est que les instructions ''load-up'' sont décodées en micro-opérations intermédiaires. Elles sont propagées dans le pipeline comme étant une seule micro-opération, jusqu'à l'étage d'émission. Lors de l'émission, les instructions ''load-up'' sont scindées en deux micro-opérations : la lecture de l'opérande, puis l'opération proprement dite. Faire ainsi économise des ressources et optimise le remplissage du tampon de ré-ordonnancement, des fenêtres d'instructions, des stations de réservation, etc. Le tampon de réordonnancement est combiné avec divers circuits en charge de l'exécution dans le désordre, dans ce qui s'appelle l'''instruction control unit''. Il contient de 72 à, 84 instructions, qui sont regroupées en groupes de 3. Là encore, comme pour le K5 et le K6, le tampon de réordonnancement tient compte de la sortie des décodeurs. Les décodeurs fournissent toujours trois micro-opérations par cycle, quitte à remplir les vides par des NOP. Le tampon de réordonnancement reçoit les micro-opérations, NOP inclus, par groupes de 3, et est structuré autour de ces triplets de micro-opération, y compris en interne. Les architectures K7, K8 et K10 ont des unités de calcul très similaires. Concrètement, il y a trois ALU entières, trois unités de calcul d'adresse, et une FPU. Le processeur incorpore, aussi un multiplieur entier, relié sur le port d'émission de la première ALU. La FPU regroupe un additionneur flottant, un multiplieur flottant, et une troisième unité LOAD/STORE pour les lectures/écritures pour les nombres flottants. L'architecture K8 ajoute une unité de manipulation de bit, la K10 un diviseur entier. [[File:Unité de calcul des processeurs AMD K7, K8 et K10.png|centre|vignette|upright=2|Unité de calcul des processeurs AMD K7, K8 et K10]] Par contre, la manière d'alimenter ces ALU en micro-opérations varie un petit peu entre les architectures K7, K8 et K10. Il y a cependant quelques constantes entre les trois. La première est qu'il y a une fenêtre d'instruction séparée pour les flottants, de 36 à 42 entrées, avec renommage de registre. La fenêtre d'instruction flottante a trois ports d'émission : un pour l'additionneur flottant, un autre pour le multiplieur, et un troisième pour la troisième unité flottante qui s'occupe du reste. La seconde est que chaque ALU entière est couplée avec une unité de calcul d'adresse. Par contre, la méthode de couplage varie d'un processeur à l'autre. L'architecture K7 des processeurs Athlon utilisait le renommage de registre, mais seulement pour les registres flottants, pas pour les registres entiers. Elle avait deux fenêtres d'instruction : une pour les opérations flottantes, une autre pour les instructions entières et les accès mémoire. La fenêtre d'instruction entière pouvait émettre trois micro-opérations en même temps : trois micro-opérations entières, trois micro-opération mémoire. La fenêtre d'instruction entière contenait 5 à 6 groupes de 3 macro-opérations. Vous noterez que j'ai parlé de macro-opérations et pas de micro-opérations, car les instructions ''load-up'' sont considérées comme une seule "micro-opération" dans la fenêtre d'instruction entière. Et cela se marie bien avec une fenêtre d'instruction unique partagée entre pipeline entier et pipeline mémoire. Une macro-opération était scindée en deux micro-opérations : une micro-opération mémoire et une micro-opération entière. Il est donc avantageux de regrouper unités mémoire et unités entières à la même fenêtre d'instruction pour ce faire. La ''Load-Store Queue'' peut mémoriser 44 lectures/écritures, avec cependant une petite nuance. Parmi les 44 lectures/écritures, 12 sont réservées au cache L1 et 32 le sont pour le cache L2. En réalité, il y a deux ''LSQ'', une pour le cache L1 qui fait 12 entrées, une seconde pour le L2 qui fait 32 entrées. [[File:Athlon arch.png|centre|vignette|upright=3|Microarchitecture K7 d'AMD.]] Les architectures K8 et K10 utilisent le renommage de registres pour tous les registres, entiers comme flottants. Par contre, le renommage de registre n'est pas réalisé de la même manière pour les registres entiers et flottants. Les registres entiers sont renommés dans le tampon de ré-ordonnancement, comme c'était le cas sur les architectures Intel avant le Pentium 4. Par contre, les registres flottants sont renommés grâce à un banc de registre physique. Le K8 est donc un processeur au renommage hybride, qui utilise les deux solutions de renommage principales. Niveau micro-opérations entières, la station de réservation unique de 15 micro-opérations est remplacée par trois stations de réservations, une par ALU entière, de 8 micro-opérations chacune. Chaque station de réservation entière alimente une unité de calcul entière et une unité de calcul d'adresse. Le multiplieur est relié à la première station de réservation, sur le même port d'émission que l'ALU. Les stations de réservation sont nommées des ''schedulers'' dans les schémas qui suivent. [[File:AMD Grayhound microarchitecture.png|centre|vignette|upright=3|Microarchitecture K8 et K10 d'AMD.]] La microarchitecture K10 a été déclinée en plusieurs versions, nommées Grayhound, Grayhound+ et Husky, Husky étant une architecture gravée en 32 nm dédiée aux processeurs A-3000. L'architecture Grayhound a plus de cache et un ROB plus grand, la Husky est quand à elle un peu plus différente. Elle n'a pas de cache L3, contrairement aux autres architectures K10, ce qui simplifie fortement son sous-système mémoire. Par contre, les fenêtres d'instructions/stations de réservation et le ROB sont plus grands, pareil pour les files dans l'unité mémoire. Une ALU pour les divisions entières a aussi été ajoutée. [[File:AMD Husky microarchitecture.png|centre|vignette|upright=3|AMD Husky microarchitecture]] Pour résumer, les architectures K7, K8 et K10 séparent les pipelines entiers et flottants : trois pipelines entiers avec chacun son unité de calcul, et un pipeline flottant avec plusieurs unités de calcul. Les raisons à cela sont assez diverses. Disons que dupliquer des ALU entières simples prend peu de transistors, là où les gros circuits comme le multiplieur ou la FPU ne sont pas dupliqués. Et cela a un autre avantage : le renommage, ''dispatch'' et l'émission sont plus simples. Les pipelines entiers ont une exécution dans le désordre peu complexe, grâce au grand nombre d'unités de calcul, ce qui fait que le pipeline entier est de seulement 15 cycles au total (chargement et décodage inclus). A l'opposé, la FPU est alimentée par une exécution dans le désordre très complexe, avec banc de registre physique et beaucoup de ressources, mais au prix d'un pipeline flottant plus long de 3 cycles, soit 18 cycles au total. ===Les microarchitectures ZEN d'AMD=== Viennent ensuite les '''microarchitectures Bulldozer''', avec trois révisions ultérieures nommées Piledriver, Steamroller et Excavator. Mais du fait de l'utilisation de techniques de multithreading matériel que nous n'avons pas encore abordé, nous ne pouvons pas en parler ici. Les microarchitectures suivantes sont les '''architectures ZEN 1/2/3/4/5'''. Elles se ressemblent beaucoup, chacune accumulant les améliorations des précédentes. Mais le cœur de l'architecture reste plus ou moins le même. En passant à la suivante, le nombre de registre virtuel augmente, le ''branch target buffer'' augmente en taille, le ROB et les files d'attente grossissent, les caches de micro-opération aussi, les caches grossissent, etc. La microarchitecture Zen 1 est illustrée ci-dessous. Le passage à Zen 2 a ajouté une unité de calcul d'adresse (4 ALU / 3 AGU), le Zen 5 a ajouté deux autres ALU entières et une unité de calcul d'adresse (6 ALU / 4 AGU) [[File:Zen microarchitecture.svg|centre|vignette|upright=3|Microarchitecture Zen 1 d'AMD.]] <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Le parallélisme mémoire au niveau du cache | prevText=Le parallélisme mémoire au niveau du cache | next=Les processeurs VLIW et EPIC | nextText=Les processeurs VLIW et EPIC }} </noinclude> 8araf41ib8it2hisb48n6hy8guqehgo Les cartes graphiques/Les cartes d'affichage 0 67388 745904 742068 2025-07-04T11:31:30Z Mewtow 31375 /* Les cartes graphiques dédiées, intégrées et soudées */ 745904 wikitext text/x-wiki Les cartes graphiques sont des cartes qui communiquent avec l'écran, pour y afficher des images. Les cartes graphiques modernes incorporent aussi des circuits de calcul pour accélérer du rendu 2D ou 3D. Dans ce chapitre, nous allons faire une introduction et expliquer ce qu'est une carte graphique, nous allons parler des cartes dédiées/intégrées, et surtout : nous allons voir ce qu'il y a à l'intérieur, du moins dans les grandes lignes. ==Les cartes graphiques dédiées, intégrées et soudées== Vous avez sans doute déjà démonté votre PC pour en changer la carte graphique, vous savez sans doute à quoi elle ressemble. Sur les PC modernes, il s'agit d'un composant séparé, qu'on branche sur la carte mère, sur un port spécialisé. Du moins, c'est le cas si vous avez un PC fixe assez puissant. Mais il y a deux autres possibilités. [[File:PX7800 GTX (557505323).jpg|centre|vignette|Carte graphique dédiée PX 7800 GTX I]] La première est celle où la carte graphique est directement intégrée dans le processeur de la machine ! C'est quelque chose qui se fait depuis les années 2000-2010, avec l'amélioration de la technologie et la miniaturisation des transistors. Il est possible de mettre tellement de transistors sur une puce de silicium que les concepteurs de processeur en ont profité pour mettre une carte graphique peut puissante dans le processeur. Une autre possibilité, surtout utilisée sur les consoles de jeu et les PC portables, est celle où la carte graphique est composée de circuits soudés à la carte mère. Pour résumer, il faut distinguer trois types de cartes graphiques différentes : * Les '''cartes graphiques dédiées''', séparées dans une carte d'extension qu'on doit connecter à la carte mère via un connecteur dédié. * Les '''cartes graphiques intégrées''', qui font partie du processeur. * Les '''cartes graphiques soudées''' à la carte mère. Vous avez sans doute vu qu'il y a une grande différence de performance entre une carte graphique dédiée et une carte graphique intégrée. La raison est simplement que les cartes graphiques intégrées ont moins de transistors à leur disposition, ce qui fait qu'elles contiennent moins de circuits de calcul. Les cartes graphiques dédiées et soudées n'ont pas de différences de performances notables. Les cartes soudées des PC portables sont généralement moins performantes car il faut éviter que le PC chauffe trop, vu que la dissipation thermique est moins bonne avec un PC portable (moins de gros ventilos), ce qui demande d'utiliser une carte graphique moins puissante. Mais les cartes soudées des consoles de jeu n'ont pas ce problème : elles sont dans un boitier bien ventilés, on peut en utiliser une très puissante. Il y a de très fortes chances que votre ordinateur intègre plusieurs cartes graphique, peu importe que ce soit un PC portable ou fixe. Tous les PC ont une carte graphique intégrée, de faible performance, qui consomme peu d'énergie/électricité. Et si je dis presque tous, c'est parce que tous les processeurs commerciaux modernes incorporent une carte graphique intégrée. Le marché du processeur grand public est ainsi, seuls quelques processeurs dédiés aux serveurs n'ont pas de carte graphique intégrée. Et en plus de la carte intégrée, une bonne partie des PC intègrent aussi soit une carte dédiée, soit une carte soudée. Soudée sur les PC portables, dédiée sur les PC fixe. Vous vous demandez comment est-ce possible qu'une carte graphique soit soudée ou intégrée dans un processeur. La raison est que les trois types de cartes graphiques sont très similaires, elles sont composées des mêmes types de composants, ce qu'il y a à l'intérieur est globalement le même, comme on va le voir dans ce qui suit. ==Les cartes d'affichage et leur architecture== Au tout début de l'informatique, le rendu graphique était pris en charge par le processeur. Il calculait l'image à afficher et l'envoyait à l'écran, pixel par pixel. Le problème est que le processeur devait se synchroniser avec l'écran, pour envoyer les pixels au bon moment. Pour simplifier la vie des programmeurs, les fabricants de matériel ont inventé des cartes vidéo. Avec celles-ci, le processeur calcule l'image à envoyer à l'écran et la transmet à la carte d'affichage, sans avoir à se synchroniser avec l'écran. L'avantage est que le processeur n'a pas à se synchroniser avec l'écran, juste à envoyer l'image à une carte d'affichage. Les cartes d'affichage ne géraient pas le rendu 3D. Le processeur calculait une image, la copiait dans la mémoire vidéo, puis la carte d'affichage l'envoyait à l'écran au bon moment. Il n'y avait pas de circuits de calcul graphique, ni de circuits de décodage vidéo. Juste de quoi afficher une image à l'écran. Et mine de rien, il est intéressant d'étudier de telles cartes graphiques anciennes. De telles cartes graphiques sont ce que j'ai décidé d'appeler des '''cartes d'affichage'''. ===L'intérieur d'une carte d'affichage=== Une carte d'affichage contient plusieurs sous-circuits, chacun dédié à une fonction précise. * La '''mémoire vidéo''' est une mémoire RAM intégrée à la carte graphique, qui a des fonctions multiples. * L''''interface écran''', ou ''Display interface'', regroupe les connecteurs et tous les circuits permettant d'envoyer l'image à l'écran. * Le '''circuit d'interface avec le bus''' existe uniquement sur les cartes dédiées et éventuellement sur quelques cartes soudées. Il s'occupe des transmissions sur le bus PCI/AGP/PCI-Express, le connecteur qui relie la carte mère et la carte graphique. * Un circuit de contrôle qui commande le tout, appelé le '''''Video Display Controler'''''. [[File:Carte d'affichage - architecture.png|centre|vignette|upright=2|Carte d'affichage - architecture.]] La mémoire vidéo mémorise l'image à afficher, les deux circuits d'interfaçage permettent à la carte d'affichage de communiquer respectivement avec l'écran et le reste de l'ordinateur, le ''Video Display Controler'' commande les autres circuits. Le ''Video Display Controler'' sert de chef d'orchestre pour un orchestre dont les autres circuits seraient les musiciens. Le circuit de contrôle était appelé autrefois le CRTC, car il commandait des écrans dit CRT, mais ce n'est plus d'actualité de nos jours. La carte graphique communique via un bus, un vulgaire tas de fils qui connectent la carte graphique à la carte mère. Les premières cartes graphiques utilisaient un bus nommé ISA, qui fût rapidement remplacé par le bus PCI, plus rapide, lui-même remplacé par le bus AGP, puis le bus PCI-Express. Ce bus est géré par un contrôleur de bus, un circuit qui se charge d'envoyer ou de réceptionner les données sur le bus. Les circuits de communication avec le bus permettent à l'ordinateur de communiquer avec la carte graphique, via le bus PCI-Express, AGP, PCI ou autre. Il contient quelques registres dans lesquels le processeur pourra écrire ou lire, afin de lui envoyer des ordres du style : j'envoie une donnée, transmission terminée, je ne suis pas prêt à recevoir les données que tu veux m'envoyer, etc. Il y a peu à dire sur ce circuit, aussi nous allons nous concentrer sur les autres circuits. Le circuit d'interfaçage écran est au minimum un circuit d’interfaçage électrique se contente de convertir les signaux de la carte graphique en signaux que l'on peut envoyer à l'écran. Il s'occupe notamment de convertir les tensions et courants : si l'écran demande des signaux de 5 Volts mais que la carte graphique fonctionne avec du 3,3 Volt, il y a une conversion à faire. De même, le circuit d'interfaçage électrique peut s'occuper de la conversion des signaux numériques vers de l'analogique. L'écran peut avoir une entrée analogique, surtout s'il est assez ancien. Les anciens écrans CRT ne comprenaient que des données analogiques et pas le binaire, alors que c'est l'inverse pour la carte graphique, ce qui fait que le circuit d'interfaçage devait faire la conversion. La conversion était réalisée par un circuit qui traduit des données numériques (ici, du binaire) en données analogiques : le '''convertisseur numérique-analogique''' ou DAC (''Digital-to-Analogue Converter''). Au tout début, le circuit d’interfaçage était un DAC combiné avec des circuits annexes, ce qu'on appelle un RAMDAC (''Random Access Memory Digital-to-Analog Converter''). De nos jours, les écrans comprennent le binaire sous réserve qu'il soit codé suivant le standard adapté et les cartes graphiques n'ont plus besoin de RAMDAC. Il y a peu à dire sur les circuits d'interfaçage. Leur conception et leur fonctionnement dépendent beaucoup du standard utilisé. Sans compter qu'expliquer leur fonctionnement demande de faire de l'électronique pure et dure, ce qui est rarement agréable pour le commun des mortels. Par contre, étudier le circuit de contrôle et la mémoire vidéo est beaucoup plus intéressant. Plusieurs chapitres seront dédiés à leur fonctionnement. Mais parlons maintenant des GPU modernes et passons à la section suivante. ===Un historique rapide des cartes d’affichage=== Les cartes d'affichages sont opposées aux cartes accélératrices 2D et 3D, qui permettent de décharger le processeur d'une partie du rendu 2D/3D. Pour cela, elles intègrent des circuits spécialisés. Vous imaginez peut-être que les cartes d'affichage sont apparues en premier, puis qu'elles ont gagné en puissance et en fonctionnalités pour devenir d'abord des cartes accélératrices 2D, puis des cartes 3D. C'est une suite assez logique, intuitive. Et ce n'est pas du tout ce qui s'est passé ! Les cartes d'affichage pures, sans rendu 2D, sont une invention des premiers PC. Elles sont arrivées alors que les consoles de jeu avaient déjà des cartes hybrides entre carte d'affichage et cartes de rendu 2D depuis une bonne décennie. Sur les consoles de jeu ou les microordinateurs anciens, il n'y avait pas de cartes d'affichage séparée. A la place, le système vidéo d'un ordinateur était un ensemble de circuits soudés sur la carte mère. Les consoles de jeu, ainsi que les premiers micro-ordinateurs, avaient une configuration fixée une fois pour toute et n'étaient pas upgradables. Mais avec l'arrivée de l'IBM PC, les cartes d’affichages se sont séparées de la carte mère. Leurs composants étaient soudés sur une carte qu'on pouvait clipser et détacher de la carte mère si besoin. Et c'est ainsi que l'on peut actuellement changer la carte graphique d'un PC, alors que ce n'est pas le cas sur une console de jeu. La différence entre les deux se limite cependant à cela. Les composant d'une carte d'affichage ou d'une console de jeu sont globalement les mêmes. Aussi, dans ce qui suit, nous parlerons de carte d'affichage pour désigner cet ensemble de circuits, peu importe qu'il soit soudé à la carte mère ou placé sur une carte d’affichage séparée. C'est un abus de langage qu'on ne retrouvera que dans ce cours. ===Les différents types de cartes d'affichage=== Dans la suite du cours, nous allons voir que toutes les cartes d'affichage ne fonctionnent pas de la même manière. Et ces différences font qu'on peut les classer en plusieurs types distincts. Leur classement s'explique par un fait assez simple : une image prend beaucoup de mémoire ! Par exemple, prenons le cas d'une image en niveaux de gris d'une résolution de 320 par 240 pixels, chaque pixel étant codé sur un octet. L'image prend alors 76800 octets, soit environ 76 kiloctets. Mine de rien, cela fait beaucoup de mémoire ! Et si on ajoute le support de la couleur, cela triple, voire quadruple la taille de l'image. Les cartes graphiques récentes ont assez de mémoire pour stocker l'image à afficher. Une partie de la mémoire vidéo est utilisée pour mémoriser l'image à afficher. La portion en question s'appelle le ''framebuffer'', '''tampon d'image''' en français. Il s'agit là d'une solution très simple, mais qui demande une mémoire vidéo de grande taille. Les systèmes récents peuvent se le permettre, mais les tout premiers ordinateurs n'avaient pas assez de mémoire vidéo. Les cartes d'affichages devaient se débrouiller avec peu de mémoire, impossible de mémoriser l'image à afficher entièrement. Pour compenser cela, les cartes d'affichage anciennes utilisaient diverses optimisations assez intéressantes. La première d'entre elle utilise pour cela le fonctionnement des anciens écrans CRT, qui affichaient l'image ligne par ligne. Pour rappel, l'image a afficher à l'écran a une certaine résolution : 320 pixels pour 240 pixels, par exemple. Pour l'écran CRT, l'image est composée de plusieurs lignes. Par exemple, pour une résolution de 640 par 480, l'image est découpée en 480 lignes, chacune faisant 640 pixels de long. L'écran est conçu pour qu'on lui envoie les lignes les unes après les autres, avec une petite pause entre l'affichage/envoi de deux lignes. Précisons que les écrans LCD ont abandonné ce mode de fonctionnement. L'idée est alors la suivante : la mémoire vidéo ne mémorise que la ligne en cours d'affichage par l'écran. Le processeur met à jour la mémoire vidéo entre l'affichage de deux lignes. La mémoire vidéo n'est alors pas un tampon d'image, mais un '''tampon de ligne'''. Le défaut de cette technique est qu'elle demande que le processeur et la carte d'affichage soient synchronisés, de manière à ce que les lignes soient mises à jour au bon moment. L'avantage est que la quantité de mémoire vidéo nécessaire est divisée par un facteur 100, voire plus, égal à la résolution verticale (le nombre de lignes). Une autre méthode, appelée le '''rendu en tiles''', est formellement une technique de compression d'image particulière. L'image à afficher est stockée sous un format compressé en mémoire vidéo, mais est décompressée pixel par pixel lors de l'affichage. Il nous est difficile de décrire cette technique maintenant, mais un chapitre entier sera dédié à cette technique. Le chapitre en question abordera une technique similaire, appelée le rendu en mode texte, qui servira d'introduction propédeutique. Le rendu en tiles et l'usage d'un tampon ligne sont deux optimisations complémentaires. Il est ainsi possible d'utiliser soit l'une, soit l'autre, soit les deux. En clair, cela donne quatre types de cartes d'affichage distincts : * les cartes d'affichage à tampon d'image ; * les cartes à tampon d'images en rendu à tiles ; * les cartes d'affichage à tampon de ligne ; * les cartes d'affichage à tampon de ligne en rendu à tiles. {|class="wikitable" |- ! ! Rendu normal ! Rendu à tile |- ! Tampon d'image | Cartes graphiques post-années 90, standard VGA sur PC | Consoles de jeu 8 bits et 16 bits, standards CGA, MGA |- ! Tampon de ligne | Consoles de jeu ATARI 2600 et postérieures | Console de jeu néo-géo |} Lez prochains chapitres porteront surtout sur les cartes d'affichages à tampon d'image, plus simples à, expliquer. Deux chapitres seront dédiés respectivement aux cartes à rendu en tile, et aux cartes à tampon de ligne. ==Les cartes graphiques actuelles sont très complexes== Les cartes graphiques actuelles sont des cartes d'affichage améliorées auxquelles on a ajouté des circuits annexes, afin de leur donner des capacités de calcul pour le rendu 2D et/ou 3D, mais elles n'en restent pas moins des cartes d'affichages. La seule différence est que le processeur n’envoie pas une image à la mémoire vidéo, mais que l'image à afficher est calculée par la carte graphique 2D/3D. Les calculs autrefois effectués sur le CPU sont donc déportés sur la carte graphique. Si vous analysez une carte graphique récente, vous verrez que les circuits des cartes d'affichage sont toujours là, bien que noyés dans des circuits de rendu 2D/3D. On retrouve une mémoire vidéo, une interface écran, un circuit d'interface avec le bus, un ''Video Display Controler''. L'interface écran est par contre fusionnée avec le ''Video Display Controler''. Mais à ces circuits d'affichage, sont ajoutés un '''GPU''' (''Graphic Processing Unit''), qui s'occupe du rendu 3D, du rendu 2D, mais aussi d'autres fonctions comme du décodage de fichiers vidéos. [[File:Architecture d'une carte graphique avec un GPU.png|centre|vignette|upright=2|Architecture d'une carte graphique avec un GPU]] ===L'intérieur d'un GPU=== Le GPU est un composant assez complexe, surtout sur les cartes graphiques modernes. Il regroupe plusieurs circuits aux fonctions distinctes. * Un '''''Video Display controler''''' est toujours présent, mais ne sera pas représenté dans ce qui suit. * Des '''circuit de rendu 2D''' séparés peuvent être présents, mais sont la plupart du temps intégrés au VDC. * Les '''circuits de rendu 3D''' s'occupent du rendu 3D. * Les '''circuits de décodage vidéo''', pour améliorer la performance du visionnage de vidéos. Les trois circuits précédents sont gouvernés par un '''processeur de commande''', un circuit assez difficile à décrire. Pour le moment, disons qu'il s'occupe de répartir le travail entre les différents circuits précédents. Le processeur de commande reçoit du travail à faire, envoyé par le CPU via le bus, et le redistribue dans les trois circuits précédents. Par exemple, si on lui envoie une vidéo encodée en H264, il envoie le tout au circuit vidéo. De plus, il le configure pour qu'il la décode correctement : il dit au circuit que c'est une vidéo encodée en H264, afin que le circuit sache comment la décoder. Ce genre de configuration est aussi présente sur les circuits de rendu 2D et 3D, bien qu'elle soit plus compliquée. [[File:Microarchitecture simplifiée d'un GPU.png|centre|vignette|upright=2|Microarchitecture simplifiée d'un GPU]] Un GPU contient aussi un contrôleur mémoire, qui est une interface entre le GPU et la mémoire vidéo. Interface électrique, car GPU et mémoire n'utilisent pas les mêmes tensions et qu'en plus, leur interconnexion demande de gérer pas mal de détails purement électriques. Mais aussi interface de communication, car communiquer entre mémoire vidéo et GPU demande de faire pas mal de manipulations, comme gérer l'adressage et bien d'autres choses qu'on ne peut pas encore détailler ici. Un GPU contient aussi d'autres circuits annexes, comme des circuits pour gérer la consommation électrique, un BIOS vidéo, etc. L'interface écran et l'interface avec le bus sont parfois intégrées au GPU. [[File:Generic block diagram of a GPU.svg|centre|vignette|upright=3|Architecture d'une carte graphique moderne.]] ===Un historique simplifié des pipelines 2D/3D/vidéo=== Avant les années 90, les cartes graphiques des ordinateurs personnels et des consoles de jeux se résumaient à des circuits d'accélération 2D, elles n'avaient pas de décodeurs vidéos ou de circuits de rendu 3D. C'est dans les années 90 qu'elles ont commencé à incorporer des circuits d'accélération 3D. Puis, après les années 2000-2010, elles ont commencé à intégrer des circuits de décodage vidéo, aux alentours des années 2010. En parallèle, les circuits de rendu 2D ont progressivement été réduits puis abandonnés. Les circuits de rendu 2D sont des circuits qui ne sont pas programmables, mais qu'on peut configurer. On dit aussi que ce sont des '''circuits fixes'''. Ils sont opposés aux circuits programmables, basés sur des processeurs. Les circuits de rendu 3D étaient initialement des circuits fixes eux aussi, mais sont devenus de plus en plus programmables avec le temps. Les GPU d'après les années 2000 utilisent un mélange de circuits programmables et fixes assez variable. Nous reviendrons là-dessus dans un chapitre dédié. [[File:Microarchitecture globale d'un GPU.png|centre|vignette|upright=2|Microarchitecture globale d'un GPU]] Pour les circuits de décodage vidéo, les choses sont assez complexes. Initialement, ils s'agissait de circuits fixes, qu'on pouvait programmer. Un GPU de ce type est illustré ci-dessus. Mais de nos jours, les calculs de décodage vidéo sont réalisés sur les processeurs de shaders. Les circuits de rendu 3D et de décodage vidéo ont chacun des circuits fixes dédiés, mais partagent des processeurs. [[File:GPU avec processeurs de shaders partagés entre rendu 3D et décodage vidéo.png|centre|vignette|upright=2|GPU avec processeurs de shaders partagés entre rendu 3D et décodage vidéo]] Les cinq prochains chapitres vont parler des cartes d'affichage et des cartes accélératrices 2D, les deux étant fortement liées. C'est seulement dans les chapitres qui suivront que nous parlerons des cartes 3D. Les cartes 3D sont composées d'une carte d'affichage à laquelle on a rajouté des circuits de calcul, ce qui fait qu'il est préférable de faire ainsi : on voit ce qui est commun entre les deux d'abord, avant de voir le rendu 3D ensuite. De plus, le rendu 3D est plus complexe que l'affichage d'une image à l'écran, ce qui fait qu'il vaut mieux voir cela après. {{NavChapitre | book=Les cartes graphiques | next=Le Video Display Controler | nextText=Le Video Display Controler }}{{autocat}} rltqtkwkaj9hgobp81f22s3blcw1q12 745905 745904 2025-07-04T11:33:45Z Mewtow 31375 /* Les cartes graphiques dédiées, intégrées et soudées */ 745905 wikitext text/x-wiki Les cartes graphiques sont des cartes qui communiquent avec l'écran, pour y afficher des images. Les cartes graphiques modernes incorporent aussi des circuits de calcul pour accélérer du rendu 2D ou 3D. Dans ce chapitre, nous allons faire une introduction et expliquer ce qu'est une carte graphique, nous allons parler des cartes dédiées/intégrées, et surtout : nous allons voir ce qu'il y a à l'intérieur, du moins dans les grandes lignes. ==Les cartes graphiques dédiées, intégrées et soudées== Vous avez sans doute déjà démonté votre PC pour en changer la carte graphique, vous savez sans doute à quoi elle ressemble. Sur les PC modernes, il s'agit d'un composant séparé, qu'on branche sur la carte mère, sur un port spécialisé. Du moins, c'est le cas si vous avez un PC fixe assez puissant. Mais il y a deux autres possibilités. [[File:PX7800 GTX (557505323).jpg|centre|vignette|Carte graphique dédiée PX 7800 GTX I]] La première est celle où la carte graphique est directement intégrée dans le processeur de la machine ! C'est quelque chose qui se fait depuis les années 2000-2010, avec l'amélioration de la technologie et la miniaturisation des transistors. Il est possible de mettre tellement de transistors sur une puce de silicium que les concepteurs de processeur en ont profité pour mettre une carte graphique peut puissante dans le processeur. Une autre possibilité, surtout utilisée sur les consoles de jeu et les PC portables, est celle où la carte graphique est composée de circuits soudés à la carte mère. Pour résumer, il faut distinguer trois types de cartes graphiques différentes : * Les '''cartes graphiques dédiées''', séparées dans une carte d'extension qu'on doit connecter à la carte mère via un connecteur dédié. * Les '''cartes graphiques intégrées''', qui font partie du processeur. * Les '''cartes graphiques soudées''' à la carte mère. Vous avez sans doute vu qu'il y a une grande différence de performance entre une carte graphique dédiée et une carte graphique intégrée. La raison est simplement que les cartes graphiques intégrées ont moins de transistors à leur disposition, ce qui fait qu'elles contiennent moins de circuits de calcul. Les cartes graphiques dédiées et soudées n'ont pas de différences de performances notables. Les cartes soudées des PC portables sont généralement moins performantes car il faut éviter que le PC chauffe trop, vu que la dissipation thermique est moins bonne avec un PC portable (moins de gros ventilos), ce qui demande d'utiliser une carte graphique moins puissante. Mais les cartes soudées des consoles de jeu n'ont pas ce problème : elles sont dans un boitier bien ventilés, on peut en utiliser une très puissante. Il y a de très fortes chances que votre ordinateur intègre plusieurs cartes graphique, peu importe que ce soit un PC portable ou fixe. Tous les PC ont une carte graphique intégrée, de faible performance, qui consomme peu d'énergie/électricité. Et si je dis presque tous, c'est parce que tous les processeurs commerciaux modernes incorporent une carte graphique intégrée. Le marché du processeur grand public est ainsi, seuls quelques processeurs dédiés aux serveurs n'ont pas de carte graphique intégrée. Et en plus de la carte intégrée, une bonne partie des PC intègrent aussi soit une carte dédiée, soit une carte soudée. Soudée sur les PC portables, dédiée sur les PC fixe. Dans le passé, il était possible de mettre plusieurs cartes graphiques dédiées dans un même PC, mais avec des conditions drastiques. ATI/AMD et NVIDIA avaient ajouté des fonctionnalités de multi-GPU, qui permettaient à deux GPU de travailler ensemble, afin de presque doubler les performances. Mais cela ne marchait qu'avec deux GPU NVIDIA ou deux GPU ATI/AMD, utiliser deux GPU de deux marques différentes ne marchait pas. Un chapitre entier sera dédié à ces techniques, mais nous n'en parlerons pas ici, car elles sont tombées en désuétude, aucun GPU grand public ne supporte ces technologies. Vous vous demandez comment est-ce possible qu'une carte graphique soit soudée ou intégrée dans un processeur. La raison est que les trois types de cartes graphiques sont très similaires, elles sont composées des mêmes types de composants, ce qu'il y a à l'intérieur est globalement le même, comme on va le voir dans ce qui suit. ==Les cartes d'affichage et leur architecture== Au tout début de l'informatique, le rendu graphique était pris en charge par le processeur. Il calculait l'image à afficher et l'envoyait à l'écran, pixel par pixel. Le problème est que le processeur devait se synchroniser avec l'écran, pour envoyer les pixels au bon moment. Pour simplifier la vie des programmeurs, les fabricants de matériel ont inventé des cartes vidéo. Avec celles-ci, le processeur calcule l'image à envoyer à l'écran et la transmet à la carte d'affichage, sans avoir à se synchroniser avec l'écran. L'avantage est que le processeur n'a pas à se synchroniser avec l'écran, juste à envoyer l'image à une carte d'affichage. Les cartes d'affichage ne géraient pas le rendu 3D. Le processeur calculait une image, la copiait dans la mémoire vidéo, puis la carte d'affichage l'envoyait à l'écran au bon moment. Il n'y avait pas de circuits de calcul graphique, ni de circuits de décodage vidéo. Juste de quoi afficher une image à l'écran. Et mine de rien, il est intéressant d'étudier de telles cartes graphiques anciennes. De telles cartes graphiques sont ce que j'ai décidé d'appeler des '''cartes d'affichage'''. ===L'intérieur d'une carte d'affichage=== Une carte d'affichage contient plusieurs sous-circuits, chacun dédié à une fonction précise. * La '''mémoire vidéo''' est une mémoire RAM intégrée à la carte graphique, qui a des fonctions multiples. * L''''interface écran''', ou ''Display interface'', regroupe les connecteurs et tous les circuits permettant d'envoyer l'image à l'écran. * Le '''circuit d'interface avec le bus''' existe uniquement sur les cartes dédiées et éventuellement sur quelques cartes soudées. Il s'occupe des transmissions sur le bus PCI/AGP/PCI-Express, le connecteur qui relie la carte mère et la carte graphique. * Un circuit de contrôle qui commande le tout, appelé le '''''Video Display Controler'''''. [[File:Carte d'affichage - architecture.png|centre|vignette|upright=2|Carte d'affichage - architecture.]] La mémoire vidéo mémorise l'image à afficher, les deux circuits d'interfaçage permettent à la carte d'affichage de communiquer respectivement avec l'écran et le reste de l'ordinateur, le ''Video Display Controler'' commande les autres circuits. Le ''Video Display Controler'' sert de chef d'orchestre pour un orchestre dont les autres circuits seraient les musiciens. Le circuit de contrôle était appelé autrefois le CRTC, car il commandait des écrans dit CRT, mais ce n'est plus d'actualité de nos jours. La carte graphique communique via un bus, un vulgaire tas de fils qui connectent la carte graphique à la carte mère. Les premières cartes graphiques utilisaient un bus nommé ISA, qui fût rapidement remplacé par le bus PCI, plus rapide, lui-même remplacé par le bus AGP, puis le bus PCI-Express. Ce bus est géré par un contrôleur de bus, un circuit qui se charge d'envoyer ou de réceptionner les données sur le bus. Les circuits de communication avec le bus permettent à l'ordinateur de communiquer avec la carte graphique, via le bus PCI-Express, AGP, PCI ou autre. Il contient quelques registres dans lesquels le processeur pourra écrire ou lire, afin de lui envoyer des ordres du style : j'envoie une donnée, transmission terminée, je ne suis pas prêt à recevoir les données que tu veux m'envoyer, etc. Il y a peu à dire sur ce circuit, aussi nous allons nous concentrer sur les autres circuits. Le circuit d'interfaçage écran est au minimum un circuit d’interfaçage électrique se contente de convertir les signaux de la carte graphique en signaux que l'on peut envoyer à l'écran. Il s'occupe notamment de convertir les tensions et courants : si l'écran demande des signaux de 5 Volts mais que la carte graphique fonctionne avec du 3,3 Volt, il y a une conversion à faire. De même, le circuit d'interfaçage électrique peut s'occuper de la conversion des signaux numériques vers de l'analogique. L'écran peut avoir une entrée analogique, surtout s'il est assez ancien. Les anciens écrans CRT ne comprenaient que des données analogiques et pas le binaire, alors que c'est l'inverse pour la carte graphique, ce qui fait que le circuit d'interfaçage devait faire la conversion. La conversion était réalisée par un circuit qui traduit des données numériques (ici, du binaire) en données analogiques : le '''convertisseur numérique-analogique''' ou DAC (''Digital-to-Analogue Converter''). Au tout début, le circuit d’interfaçage était un DAC combiné avec des circuits annexes, ce qu'on appelle un RAMDAC (''Random Access Memory Digital-to-Analog Converter''). De nos jours, les écrans comprennent le binaire sous réserve qu'il soit codé suivant le standard adapté et les cartes graphiques n'ont plus besoin de RAMDAC. Il y a peu à dire sur les circuits d'interfaçage. Leur conception et leur fonctionnement dépendent beaucoup du standard utilisé. Sans compter qu'expliquer leur fonctionnement demande de faire de l'électronique pure et dure, ce qui est rarement agréable pour le commun des mortels. Par contre, étudier le circuit de contrôle et la mémoire vidéo est beaucoup plus intéressant. Plusieurs chapitres seront dédiés à leur fonctionnement. Mais parlons maintenant des GPU modernes et passons à la section suivante. ===Un historique rapide des cartes d’affichage=== Les cartes d'affichages sont opposées aux cartes accélératrices 2D et 3D, qui permettent de décharger le processeur d'une partie du rendu 2D/3D. Pour cela, elles intègrent des circuits spécialisés. Vous imaginez peut-être que les cartes d'affichage sont apparues en premier, puis qu'elles ont gagné en puissance et en fonctionnalités pour devenir d'abord des cartes accélératrices 2D, puis des cartes 3D. C'est une suite assez logique, intuitive. Et ce n'est pas du tout ce qui s'est passé ! Les cartes d'affichage pures, sans rendu 2D, sont une invention des premiers PC. Elles sont arrivées alors que les consoles de jeu avaient déjà des cartes hybrides entre carte d'affichage et cartes de rendu 2D depuis une bonne décennie. Sur les consoles de jeu ou les microordinateurs anciens, il n'y avait pas de cartes d'affichage séparée. A la place, le système vidéo d'un ordinateur était un ensemble de circuits soudés sur la carte mère. Les consoles de jeu, ainsi que les premiers micro-ordinateurs, avaient une configuration fixée une fois pour toute et n'étaient pas upgradables. Mais avec l'arrivée de l'IBM PC, les cartes d’affichages se sont séparées de la carte mère. Leurs composants étaient soudés sur une carte qu'on pouvait clipser et détacher de la carte mère si besoin. Et c'est ainsi que l'on peut actuellement changer la carte graphique d'un PC, alors que ce n'est pas le cas sur une console de jeu. La différence entre les deux se limite cependant à cela. Les composant d'une carte d'affichage ou d'une console de jeu sont globalement les mêmes. Aussi, dans ce qui suit, nous parlerons de carte d'affichage pour désigner cet ensemble de circuits, peu importe qu'il soit soudé à la carte mère ou placé sur une carte d’affichage séparée. C'est un abus de langage qu'on ne retrouvera que dans ce cours. ===Les différents types de cartes d'affichage=== Dans la suite du cours, nous allons voir que toutes les cartes d'affichage ne fonctionnent pas de la même manière. Et ces différences font qu'on peut les classer en plusieurs types distincts. Leur classement s'explique par un fait assez simple : une image prend beaucoup de mémoire ! Par exemple, prenons le cas d'une image en niveaux de gris d'une résolution de 320 par 240 pixels, chaque pixel étant codé sur un octet. L'image prend alors 76800 octets, soit environ 76 kiloctets. Mine de rien, cela fait beaucoup de mémoire ! Et si on ajoute le support de la couleur, cela triple, voire quadruple la taille de l'image. Les cartes graphiques récentes ont assez de mémoire pour stocker l'image à afficher. Une partie de la mémoire vidéo est utilisée pour mémoriser l'image à afficher. La portion en question s'appelle le ''framebuffer'', '''tampon d'image''' en français. Il s'agit là d'une solution très simple, mais qui demande une mémoire vidéo de grande taille. Les systèmes récents peuvent se le permettre, mais les tout premiers ordinateurs n'avaient pas assez de mémoire vidéo. Les cartes d'affichages devaient se débrouiller avec peu de mémoire, impossible de mémoriser l'image à afficher entièrement. Pour compenser cela, les cartes d'affichage anciennes utilisaient diverses optimisations assez intéressantes. La première d'entre elle utilise pour cela le fonctionnement des anciens écrans CRT, qui affichaient l'image ligne par ligne. Pour rappel, l'image a afficher à l'écran a une certaine résolution : 320 pixels pour 240 pixels, par exemple. Pour l'écran CRT, l'image est composée de plusieurs lignes. Par exemple, pour une résolution de 640 par 480, l'image est découpée en 480 lignes, chacune faisant 640 pixels de long. L'écran est conçu pour qu'on lui envoie les lignes les unes après les autres, avec une petite pause entre l'affichage/envoi de deux lignes. Précisons que les écrans LCD ont abandonné ce mode de fonctionnement. L'idée est alors la suivante : la mémoire vidéo ne mémorise que la ligne en cours d'affichage par l'écran. Le processeur met à jour la mémoire vidéo entre l'affichage de deux lignes. La mémoire vidéo n'est alors pas un tampon d'image, mais un '''tampon de ligne'''. Le défaut de cette technique est qu'elle demande que le processeur et la carte d'affichage soient synchronisés, de manière à ce que les lignes soient mises à jour au bon moment. L'avantage est que la quantité de mémoire vidéo nécessaire est divisée par un facteur 100, voire plus, égal à la résolution verticale (le nombre de lignes). Une autre méthode, appelée le '''rendu en tiles''', est formellement une technique de compression d'image particulière. L'image à afficher est stockée sous un format compressé en mémoire vidéo, mais est décompressée pixel par pixel lors de l'affichage. Il nous est difficile de décrire cette technique maintenant, mais un chapitre entier sera dédié à cette technique. Le chapitre en question abordera une technique similaire, appelée le rendu en mode texte, qui servira d'introduction propédeutique. Le rendu en tiles et l'usage d'un tampon ligne sont deux optimisations complémentaires. Il est ainsi possible d'utiliser soit l'une, soit l'autre, soit les deux. En clair, cela donne quatre types de cartes d'affichage distincts : * les cartes d'affichage à tampon d'image ; * les cartes à tampon d'images en rendu à tiles ; * les cartes d'affichage à tampon de ligne ; * les cartes d'affichage à tampon de ligne en rendu à tiles. {|class="wikitable" |- ! ! Rendu normal ! Rendu à tile |- ! Tampon d'image | Cartes graphiques post-années 90, standard VGA sur PC | Consoles de jeu 8 bits et 16 bits, standards CGA, MGA |- ! Tampon de ligne | Consoles de jeu ATARI 2600 et postérieures | Console de jeu néo-géo |} Lez prochains chapitres porteront surtout sur les cartes d'affichages à tampon d'image, plus simples à, expliquer. Deux chapitres seront dédiés respectivement aux cartes à rendu en tile, et aux cartes à tampon de ligne. ==Les cartes graphiques actuelles sont très complexes== Les cartes graphiques actuelles sont des cartes d'affichage améliorées auxquelles on a ajouté des circuits annexes, afin de leur donner des capacités de calcul pour le rendu 2D et/ou 3D, mais elles n'en restent pas moins des cartes d'affichages. La seule différence est que le processeur n’envoie pas une image à la mémoire vidéo, mais que l'image à afficher est calculée par la carte graphique 2D/3D. Les calculs autrefois effectués sur le CPU sont donc déportés sur la carte graphique. Si vous analysez une carte graphique récente, vous verrez que les circuits des cartes d'affichage sont toujours là, bien que noyés dans des circuits de rendu 2D/3D. On retrouve une mémoire vidéo, une interface écran, un circuit d'interface avec le bus, un ''Video Display Controler''. L'interface écran est par contre fusionnée avec le ''Video Display Controler''. Mais à ces circuits d'affichage, sont ajoutés un '''GPU''' (''Graphic Processing Unit''), qui s'occupe du rendu 3D, du rendu 2D, mais aussi d'autres fonctions comme du décodage de fichiers vidéos. [[File:Architecture d'une carte graphique avec un GPU.png|centre|vignette|upright=2|Architecture d'une carte graphique avec un GPU]] ===L'intérieur d'un GPU=== Le GPU est un composant assez complexe, surtout sur les cartes graphiques modernes. Il regroupe plusieurs circuits aux fonctions distinctes. * Un '''''Video Display controler''''' est toujours présent, mais ne sera pas représenté dans ce qui suit. * Des '''circuit de rendu 2D''' séparés peuvent être présents, mais sont la plupart du temps intégrés au VDC. * Les '''circuits de rendu 3D''' s'occupent du rendu 3D. * Les '''circuits de décodage vidéo''', pour améliorer la performance du visionnage de vidéos. Les trois circuits précédents sont gouvernés par un '''processeur de commande''', un circuit assez difficile à décrire. Pour le moment, disons qu'il s'occupe de répartir le travail entre les différents circuits précédents. Le processeur de commande reçoit du travail à faire, envoyé par le CPU via le bus, et le redistribue dans les trois circuits précédents. Par exemple, si on lui envoie une vidéo encodée en H264, il envoie le tout au circuit vidéo. De plus, il le configure pour qu'il la décode correctement : il dit au circuit que c'est une vidéo encodée en H264, afin que le circuit sache comment la décoder. Ce genre de configuration est aussi présente sur les circuits de rendu 2D et 3D, bien qu'elle soit plus compliquée. [[File:Microarchitecture simplifiée d'un GPU.png|centre|vignette|upright=2|Microarchitecture simplifiée d'un GPU]] Un GPU contient aussi un contrôleur mémoire, qui est une interface entre le GPU et la mémoire vidéo. Interface électrique, car GPU et mémoire n'utilisent pas les mêmes tensions et qu'en plus, leur interconnexion demande de gérer pas mal de détails purement électriques. Mais aussi interface de communication, car communiquer entre mémoire vidéo et GPU demande de faire pas mal de manipulations, comme gérer l'adressage et bien d'autres choses qu'on ne peut pas encore détailler ici. Un GPU contient aussi d'autres circuits annexes, comme des circuits pour gérer la consommation électrique, un BIOS vidéo, etc. L'interface écran et l'interface avec le bus sont parfois intégrées au GPU. [[File:Generic block diagram of a GPU.svg|centre|vignette|upright=3|Architecture d'une carte graphique moderne.]] ===Un historique simplifié des pipelines 2D/3D/vidéo=== Avant les années 90, les cartes graphiques des ordinateurs personnels et des consoles de jeux se résumaient à des circuits d'accélération 2D, elles n'avaient pas de décodeurs vidéos ou de circuits de rendu 3D. C'est dans les années 90 qu'elles ont commencé à incorporer des circuits d'accélération 3D. Puis, après les années 2000-2010, elles ont commencé à intégrer des circuits de décodage vidéo, aux alentours des années 2010. En parallèle, les circuits de rendu 2D ont progressivement été réduits puis abandonnés. Les circuits de rendu 2D sont des circuits qui ne sont pas programmables, mais qu'on peut configurer. On dit aussi que ce sont des '''circuits fixes'''. Ils sont opposés aux circuits programmables, basés sur des processeurs. Les circuits de rendu 3D étaient initialement des circuits fixes eux aussi, mais sont devenus de plus en plus programmables avec le temps. Les GPU d'après les années 2000 utilisent un mélange de circuits programmables et fixes assez variable. Nous reviendrons là-dessus dans un chapitre dédié. [[File:Microarchitecture globale d'un GPU.png|centre|vignette|upright=2|Microarchitecture globale d'un GPU]] Pour les circuits de décodage vidéo, les choses sont assez complexes. Initialement, ils s'agissait de circuits fixes, qu'on pouvait programmer. Un GPU de ce type est illustré ci-dessus. Mais de nos jours, les calculs de décodage vidéo sont réalisés sur les processeurs de shaders. Les circuits de rendu 3D et de décodage vidéo ont chacun des circuits fixes dédiés, mais partagent des processeurs. [[File:GPU avec processeurs de shaders partagés entre rendu 3D et décodage vidéo.png|centre|vignette|upright=2|GPU avec processeurs de shaders partagés entre rendu 3D et décodage vidéo]] Les cinq prochains chapitres vont parler des cartes d'affichage et des cartes accélératrices 2D, les deux étant fortement liées. C'est seulement dans les chapitres qui suivront que nous parlerons des cartes 3D. Les cartes 3D sont composées d'une carte d'affichage à laquelle on a rajouté des circuits de calcul, ce qui fait qu'il est préférable de faire ainsi : on voit ce qui est commun entre les deux d'abord, avant de voir le rendu 3D ensuite. De plus, le rendu 3D est plus complexe que l'affichage d'une image à l'écran, ce qui fait qu'il vaut mieux voir cela après. {{NavChapitre | book=Les cartes graphiques | next=Le Video Display Controler | nextText=Le Video Display Controler }}{{autocat}} 4oh7ehyivgs25bfgvabtlin6hhftgia 745906 745905 2025-07-04T11:34:07Z Mewtow 31375 745906 wikitext text/x-wiki Les cartes graphiques sont des cartes qui communiquent avec l'écran, pour y afficher des images. Les cartes graphiques modernes incorporent aussi des circuits de calcul pour accélérer du rendu 2D ou 3D. Dans ce chapitre, nous allons faire une introduction et expliquer ce qu'est une carte graphique et surtout : nous allons voir ce qu'il y a à l'intérieur, du moins dans les grandes lignes. ==Les cartes graphiques dédiées, intégrées et soudées== Vous avez sans doute déjà démonté votre PC pour en changer la carte graphique, vous savez sans doute à quoi elle ressemble. Sur les PC modernes, il s'agit d'un composant séparé, qu'on branche sur la carte mère, sur un port spécialisé. Du moins, c'est le cas si vous avez un PC fixe assez puissant. Mais il y a deux autres possibilités. [[File:PX7800 GTX (557505323).jpg|centre|vignette|Carte graphique dédiée PX 7800 GTX I]] La première est celle où la carte graphique est directement intégrée dans le processeur de la machine ! C'est quelque chose qui se fait depuis les années 2000-2010, avec l'amélioration de la technologie et la miniaturisation des transistors. Il est possible de mettre tellement de transistors sur une puce de silicium que les concepteurs de processeur en ont profité pour mettre une carte graphique peut puissante dans le processeur. Une autre possibilité, surtout utilisée sur les consoles de jeu et les PC portables, est celle où la carte graphique est composée de circuits soudés à la carte mère. Pour résumer, il faut distinguer trois types de cartes graphiques différentes : * Les '''cartes graphiques dédiées''', séparées dans une carte d'extension qu'on doit connecter à la carte mère via un connecteur dédié. * Les '''cartes graphiques intégrées''', qui font partie du processeur. * Les '''cartes graphiques soudées''' à la carte mère. Vous avez sans doute vu qu'il y a une grande différence de performance entre une carte graphique dédiée et une carte graphique intégrée. La raison est simplement que les cartes graphiques intégrées ont moins de transistors à leur disposition, ce qui fait qu'elles contiennent moins de circuits de calcul. Les cartes graphiques dédiées et soudées n'ont pas de différences de performances notables. Les cartes soudées des PC portables sont généralement moins performantes car il faut éviter que le PC chauffe trop, vu que la dissipation thermique est moins bonne avec un PC portable (moins de gros ventilos), ce qui demande d'utiliser une carte graphique moins puissante. Mais les cartes soudées des consoles de jeu n'ont pas ce problème : elles sont dans un boitier bien ventilés, on peut en utiliser une très puissante. Il y a de très fortes chances que votre ordinateur intègre plusieurs cartes graphique, peu importe que ce soit un PC portable ou fixe. Tous les PC ont une carte graphique intégrée, de faible performance, qui consomme peu d'énergie/électricité. Et si je dis presque tous, c'est parce que tous les processeurs commerciaux modernes incorporent une carte graphique intégrée. Le marché du processeur grand public est ainsi, seuls quelques processeurs dédiés aux serveurs n'ont pas de carte graphique intégrée. Et en plus de la carte intégrée, une bonne partie des PC intègrent aussi soit une carte dédiée, soit une carte soudée. Soudée sur les PC portables, dédiée sur les PC fixe. Dans le passé, il était possible de mettre plusieurs cartes graphiques dédiées dans un même PC, mais avec des conditions drastiques. ATI/AMD et NVIDIA avaient ajouté des fonctionnalités de multi-GPU, qui permettaient à deux GPU de travailler ensemble, afin de presque doubler les performances. Mais cela ne marchait qu'avec deux GPU NVIDIA ou deux GPU ATI/AMD, utiliser deux GPU de deux marques différentes ne marchait pas. Un chapitre entier sera dédié à ces techniques, mais nous n'en parlerons pas ici, car elles sont tombées en désuétude, aucun GPU grand public ne supporte ces technologies. Vous vous demandez comment est-ce possible qu'une carte graphique soit soudée ou intégrée dans un processeur. La raison est que les trois types de cartes graphiques sont très similaires, elles sont composées des mêmes types de composants, ce qu'il y a à l'intérieur est globalement le même, comme on va le voir dans ce qui suit. ==Les cartes d'affichage et leur architecture== Au tout début de l'informatique, le rendu graphique était pris en charge par le processeur. Il calculait l'image à afficher et l'envoyait à l'écran, pixel par pixel. Le problème est que le processeur devait se synchroniser avec l'écran, pour envoyer les pixels au bon moment. Pour simplifier la vie des programmeurs, les fabricants de matériel ont inventé des cartes vidéo. Avec celles-ci, le processeur calcule l'image à envoyer à l'écran et la transmet à la carte d'affichage, sans avoir à se synchroniser avec l'écran. L'avantage est que le processeur n'a pas à se synchroniser avec l'écran, juste à envoyer l'image à une carte d'affichage. Les cartes d'affichage ne géraient pas le rendu 3D. Le processeur calculait une image, la copiait dans la mémoire vidéo, puis la carte d'affichage l'envoyait à l'écran au bon moment. Il n'y avait pas de circuits de calcul graphique, ni de circuits de décodage vidéo. Juste de quoi afficher une image à l'écran. Et mine de rien, il est intéressant d'étudier de telles cartes graphiques anciennes. De telles cartes graphiques sont ce que j'ai décidé d'appeler des '''cartes d'affichage'''. ===L'intérieur d'une carte d'affichage=== Une carte d'affichage contient plusieurs sous-circuits, chacun dédié à une fonction précise. * La '''mémoire vidéo''' est une mémoire RAM intégrée à la carte graphique, qui a des fonctions multiples. * L''''interface écran''', ou ''Display interface'', regroupe les connecteurs et tous les circuits permettant d'envoyer l'image à l'écran. * Le '''circuit d'interface avec le bus''' existe uniquement sur les cartes dédiées et éventuellement sur quelques cartes soudées. Il s'occupe des transmissions sur le bus PCI/AGP/PCI-Express, le connecteur qui relie la carte mère et la carte graphique. * Un circuit de contrôle qui commande le tout, appelé le '''''Video Display Controler'''''. [[File:Carte d'affichage - architecture.png|centre|vignette|upright=2|Carte d'affichage - architecture.]] La mémoire vidéo mémorise l'image à afficher, les deux circuits d'interfaçage permettent à la carte d'affichage de communiquer respectivement avec l'écran et le reste de l'ordinateur, le ''Video Display Controler'' commande les autres circuits. Le ''Video Display Controler'' sert de chef d'orchestre pour un orchestre dont les autres circuits seraient les musiciens. Le circuit de contrôle était appelé autrefois le CRTC, car il commandait des écrans dit CRT, mais ce n'est plus d'actualité de nos jours. La carte graphique communique via un bus, un vulgaire tas de fils qui connectent la carte graphique à la carte mère. Les premières cartes graphiques utilisaient un bus nommé ISA, qui fût rapidement remplacé par le bus PCI, plus rapide, lui-même remplacé par le bus AGP, puis le bus PCI-Express. Ce bus est géré par un contrôleur de bus, un circuit qui se charge d'envoyer ou de réceptionner les données sur le bus. Les circuits de communication avec le bus permettent à l'ordinateur de communiquer avec la carte graphique, via le bus PCI-Express, AGP, PCI ou autre. Il contient quelques registres dans lesquels le processeur pourra écrire ou lire, afin de lui envoyer des ordres du style : j'envoie une donnée, transmission terminée, je ne suis pas prêt à recevoir les données que tu veux m'envoyer, etc. Il y a peu à dire sur ce circuit, aussi nous allons nous concentrer sur les autres circuits. Le circuit d'interfaçage écran est au minimum un circuit d’interfaçage électrique se contente de convertir les signaux de la carte graphique en signaux que l'on peut envoyer à l'écran. Il s'occupe notamment de convertir les tensions et courants : si l'écran demande des signaux de 5 Volts mais que la carte graphique fonctionne avec du 3,3 Volt, il y a une conversion à faire. De même, le circuit d'interfaçage électrique peut s'occuper de la conversion des signaux numériques vers de l'analogique. L'écran peut avoir une entrée analogique, surtout s'il est assez ancien. Les anciens écrans CRT ne comprenaient que des données analogiques et pas le binaire, alors que c'est l'inverse pour la carte graphique, ce qui fait que le circuit d'interfaçage devait faire la conversion. La conversion était réalisée par un circuit qui traduit des données numériques (ici, du binaire) en données analogiques : le '''convertisseur numérique-analogique''' ou DAC (''Digital-to-Analogue Converter''). Au tout début, le circuit d’interfaçage était un DAC combiné avec des circuits annexes, ce qu'on appelle un RAMDAC (''Random Access Memory Digital-to-Analog Converter''). De nos jours, les écrans comprennent le binaire sous réserve qu'il soit codé suivant le standard adapté et les cartes graphiques n'ont plus besoin de RAMDAC. Il y a peu à dire sur les circuits d'interfaçage. Leur conception et leur fonctionnement dépendent beaucoup du standard utilisé. Sans compter qu'expliquer leur fonctionnement demande de faire de l'électronique pure et dure, ce qui est rarement agréable pour le commun des mortels. Par contre, étudier le circuit de contrôle et la mémoire vidéo est beaucoup plus intéressant. Plusieurs chapitres seront dédiés à leur fonctionnement. Mais parlons maintenant des GPU modernes et passons à la section suivante. ===Un historique rapide des cartes d’affichage=== Les cartes d'affichages sont opposées aux cartes accélératrices 2D et 3D, qui permettent de décharger le processeur d'une partie du rendu 2D/3D. Pour cela, elles intègrent des circuits spécialisés. Vous imaginez peut-être que les cartes d'affichage sont apparues en premier, puis qu'elles ont gagné en puissance et en fonctionnalités pour devenir d'abord des cartes accélératrices 2D, puis des cartes 3D. C'est une suite assez logique, intuitive. Et ce n'est pas du tout ce qui s'est passé ! Les cartes d'affichage pures, sans rendu 2D, sont une invention des premiers PC. Elles sont arrivées alors que les consoles de jeu avaient déjà des cartes hybrides entre carte d'affichage et cartes de rendu 2D depuis une bonne décennie. Sur les consoles de jeu ou les microordinateurs anciens, il n'y avait pas de cartes d'affichage séparée. A la place, le système vidéo d'un ordinateur était un ensemble de circuits soudés sur la carte mère. Les consoles de jeu, ainsi que les premiers micro-ordinateurs, avaient une configuration fixée une fois pour toute et n'étaient pas upgradables. Mais avec l'arrivée de l'IBM PC, les cartes d’affichages se sont séparées de la carte mère. Leurs composants étaient soudés sur une carte qu'on pouvait clipser et détacher de la carte mère si besoin. Et c'est ainsi que l'on peut actuellement changer la carte graphique d'un PC, alors que ce n'est pas le cas sur une console de jeu. La différence entre les deux se limite cependant à cela. Les composant d'une carte d'affichage ou d'une console de jeu sont globalement les mêmes. Aussi, dans ce qui suit, nous parlerons de carte d'affichage pour désigner cet ensemble de circuits, peu importe qu'il soit soudé à la carte mère ou placé sur une carte d’affichage séparée. C'est un abus de langage qu'on ne retrouvera que dans ce cours. ===Les différents types de cartes d'affichage=== Dans la suite du cours, nous allons voir que toutes les cartes d'affichage ne fonctionnent pas de la même manière. Et ces différences font qu'on peut les classer en plusieurs types distincts. Leur classement s'explique par un fait assez simple : une image prend beaucoup de mémoire ! Par exemple, prenons le cas d'une image en niveaux de gris d'une résolution de 320 par 240 pixels, chaque pixel étant codé sur un octet. L'image prend alors 76800 octets, soit environ 76 kiloctets. Mine de rien, cela fait beaucoup de mémoire ! Et si on ajoute le support de la couleur, cela triple, voire quadruple la taille de l'image. Les cartes graphiques récentes ont assez de mémoire pour stocker l'image à afficher. Une partie de la mémoire vidéo est utilisée pour mémoriser l'image à afficher. La portion en question s'appelle le ''framebuffer'', '''tampon d'image''' en français. Il s'agit là d'une solution très simple, mais qui demande une mémoire vidéo de grande taille. Les systèmes récents peuvent se le permettre, mais les tout premiers ordinateurs n'avaient pas assez de mémoire vidéo. Les cartes d'affichages devaient se débrouiller avec peu de mémoire, impossible de mémoriser l'image à afficher entièrement. Pour compenser cela, les cartes d'affichage anciennes utilisaient diverses optimisations assez intéressantes. La première d'entre elle utilise pour cela le fonctionnement des anciens écrans CRT, qui affichaient l'image ligne par ligne. Pour rappel, l'image a afficher à l'écran a une certaine résolution : 320 pixels pour 240 pixels, par exemple. Pour l'écran CRT, l'image est composée de plusieurs lignes. Par exemple, pour une résolution de 640 par 480, l'image est découpée en 480 lignes, chacune faisant 640 pixels de long. L'écran est conçu pour qu'on lui envoie les lignes les unes après les autres, avec une petite pause entre l'affichage/envoi de deux lignes. Précisons que les écrans LCD ont abandonné ce mode de fonctionnement. L'idée est alors la suivante : la mémoire vidéo ne mémorise que la ligne en cours d'affichage par l'écran. Le processeur met à jour la mémoire vidéo entre l'affichage de deux lignes. La mémoire vidéo n'est alors pas un tampon d'image, mais un '''tampon de ligne'''. Le défaut de cette technique est qu'elle demande que le processeur et la carte d'affichage soient synchronisés, de manière à ce que les lignes soient mises à jour au bon moment. L'avantage est que la quantité de mémoire vidéo nécessaire est divisée par un facteur 100, voire plus, égal à la résolution verticale (le nombre de lignes). Une autre méthode, appelée le '''rendu en tiles''', est formellement une technique de compression d'image particulière. L'image à afficher est stockée sous un format compressé en mémoire vidéo, mais est décompressée pixel par pixel lors de l'affichage. Il nous est difficile de décrire cette technique maintenant, mais un chapitre entier sera dédié à cette technique. Le chapitre en question abordera une technique similaire, appelée le rendu en mode texte, qui servira d'introduction propédeutique. Le rendu en tiles et l'usage d'un tampon ligne sont deux optimisations complémentaires. Il est ainsi possible d'utiliser soit l'une, soit l'autre, soit les deux. En clair, cela donne quatre types de cartes d'affichage distincts : * les cartes d'affichage à tampon d'image ; * les cartes à tampon d'images en rendu à tiles ; * les cartes d'affichage à tampon de ligne ; * les cartes d'affichage à tampon de ligne en rendu à tiles. {|class="wikitable" |- ! ! Rendu normal ! Rendu à tile |- ! Tampon d'image | Cartes graphiques post-années 90, standard VGA sur PC | Consoles de jeu 8 bits et 16 bits, standards CGA, MGA |- ! Tampon de ligne | Consoles de jeu ATARI 2600 et postérieures | Console de jeu néo-géo |} Lez prochains chapitres porteront surtout sur les cartes d'affichages à tampon d'image, plus simples à, expliquer. Deux chapitres seront dédiés respectivement aux cartes à rendu en tile, et aux cartes à tampon de ligne. ==Les cartes graphiques actuelles sont très complexes== Les cartes graphiques actuelles sont des cartes d'affichage améliorées auxquelles on a ajouté des circuits annexes, afin de leur donner des capacités de calcul pour le rendu 2D et/ou 3D, mais elles n'en restent pas moins des cartes d'affichages. La seule différence est que le processeur n’envoie pas une image à la mémoire vidéo, mais que l'image à afficher est calculée par la carte graphique 2D/3D. Les calculs autrefois effectués sur le CPU sont donc déportés sur la carte graphique. Si vous analysez une carte graphique récente, vous verrez que les circuits des cartes d'affichage sont toujours là, bien que noyés dans des circuits de rendu 2D/3D. On retrouve une mémoire vidéo, une interface écran, un circuit d'interface avec le bus, un ''Video Display Controler''. L'interface écran est par contre fusionnée avec le ''Video Display Controler''. Mais à ces circuits d'affichage, sont ajoutés un '''GPU''' (''Graphic Processing Unit''), qui s'occupe du rendu 3D, du rendu 2D, mais aussi d'autres fonctions comme du décodage de fichiers vidéos. [[File:Architecture d'une carte graphique avec un GPU.png|centre|vignette|upright=2|Architecture d'une carte graphique avec un GPU]] ===L'intérieur d'un GPU=== Le GPU est un composant assez complexe, surtout sur les cartes graphiques modernes. Il regroupe plusieurs circuits aux fonctions distinctes. * Un '''''Video Display controler''''' est toujours présent, mais ne sera pas représenté dans ce qui suit. * Des '''circuit de rendu 2D''' séparés peuvent être présents, mais sont la plupart du temps intégrés au VDC. * Les '''circuits de rendu 3D''' s'occupent du rendu 3D. * Les '''circuits de décodage vidéo''', pour améliorer la performance du visionnage de vidéos. Les trois circuits précédents sont gouvernés par un '''processeur de commande''', un circuit assez difficile à décrire. Pour le moment, disons qu'il s'occupe de répartir le travail entre les différents circuits précédents. Le processeur de commande reçoit du travail à faire, envoyé par le CPU via le bus, et le redistribue dans les trois circuits précédents. Par exemple, si on lui envoie une vidéo encodée en H264, il envoie le tout au circuit vidéo. De plus, il le configure pour qu'il la décode correctement : il dit au circuit que c'est une vidéo encodée en H264, afin que le circuit sache comment la décoder. Ce genre de configuration est aussi présente sur les circuits de rendu 2D et 3D, bien qu'elle soit plus compliquée. [[File:Microarchitecture simplifiée d'un GPU.png|centre|vignette|upright=2|Microarchitecture simplifiée d'un GPU]] Un GPU contient aussi un contrôleur mémoire, qui est une interface entre le GPU et la mémoire vidéo. Interface électrique, car GPU et mémoire n'utilisent pas les mêmes tensions et qu'en plus, leur interconnexion demande de gérer pas mal de détails purement électriques. Mais aussi interface de communication, car communiquer entre mémoire vidéo et GPU demande de faire pas mal de manipulations, comme gérer l'adressage et bien d'autres choses qu'on ne peut pas encore détailler ici. Un GPU contient aussi d'autres circuits annexes, comme des circuits pour gérer la consommation électrique, un BIOS vidéo, etc. L'interface écran et l'interface avec le bus sont parfois intégrées au GPU. [[File:Generic block diagram of a GPU.svg|centre|vignette|upright=3|Architecture d'une carte graphique moderne.]] ===Un historique simplifié des pipelines 2D/3D/vidéo=== Avant les années 90, les cartes graphiques des ordinateurs personnels et des consoles de jeux se résumaient à des circuits d'accélération 2D, elles n'avaient pas de décodeurs vidéos ou de circuits de rendu 3D. C'est dans les années 90 qu'elles ont commencé à incorporer des circuits d'accélération 3D. Puis, après les années 2000-2010, elles ont commencé à intégrer des circuits de décodage vidéo, aux alentours des années 2010. En parallèle, les circuits de rendu 2D ont progressivement été réduits puis abandonnés. Les circuits de rendu 2D sont des circuits qui ne sont pas programmables, mais qu'on peut configurer. On dit aussi que ce sont des '''circuits fixes'''. Ils sont opposés aux circuits programmables, basés sur des processeurs. Les circuits de rendu 3D étaient initialement des circuits fixes eux aussi, mais sont devenus de plus en plus programmables avec le temps. Les GPU d'après les années 2000 utilisent un mélange de circuits programmables et fixes assez variable. Nous reviendrons là-dessus dans un chapitre dédié. [[File:Microarchitecture globale d'un GPU.png|centre|vignette|upright=2|Microarchitecture globale d'un GPU]] Pour les circuits de décodage vidéo, les choses sont assez complexes. Initialement, ils s'agissait de circuits fixes, qu'on pouvait programmer. Un GPU de ce type est illustré ci-dessus. Mais de nos jours, les calculs de décodage vidéo sont réalisés sur les processeurs de shaders. Les circuits de rendu 3D et de décodage vidéo ont chacun des circuits fixes dédiés, mais partagent des processeurs. [[File:GPU avec processeurs de shaders partagés entre rendu 3D et décodage vidéo.png|centre|vignette|upright=2|GPU avec processeurs de shaders partagés entre rendu 3D et décodage vidéo]] Les cinq prochains chapitres vont parler des cartes d'affichage et des cartes accélératrices 2D, les deux étant fortement liées. C'est seulement dans les chapitres qui suivront que nous parlerons des cartes 3D. Les cartes 3D sont composées d'une carte d'affichage à laquelle on a rajouté des circuits de calcul, ce qui fait qu'il est préférable de faire ainsi : on voit ce qui est commun entre les deux d'abord, avant de voir le rendu 3D ensuite. De plus, le rendu 3D est plus complexe que l'affichage d'une image à l'écran, ce qui fait qu'il vaut mieux voir cela après. {{NavChapitre | book=Les cartes graphiques | next=Le Video Display Controler | nextText=Le Video Display Controler }}{{autocat}} jeout2kpx860guok2i1ybxjblchzvv8 745907 745906 2025-07-04T11:50:19Z Mewtow 31375 /* Les cartes graphiques dédiées, intégrées et soudées */ 745907 wikitext text/x-wiki Les cartes graphiques sont des cartes qui communiquent avec l'écran, pour y afficher des images. Les cartes graphiques modernes incorporent aussi des circuits de calcul pour accélérer du rendu 2D ou 3D. Dans ce chapitre, nous allons faire une introduction et expliquer ce qu'est une carte graphique et surtout : nous allons voir ce qu'il y a à l'intérieur, du moins dans les grandes lignes. ==Les cartes graphiques dédiées, intégrées et soudées== Vous avez sans doute déjà démonté votre PC pour en changer la carte graphique, vous savez sans doute à quoi elle ressemble. Sur les PC modernes, il s'agit d'un composant séparé, qu'on branche sur la carte mère, sur un port spécialisé. Du moins, c'est le cas si vous avez un PC fixe assez puissant. Mais il y a deux autres possibilités. [[File:PX7800 GTX (557505323).jpg|centre|vignette|Carte graphique dédiée PX 7800 GTX I]] La première est celle où la carte graphique est directement intégrée dans le processeur de la machine ! C'est quelque chose qui se fait depuis les années 2000-2010, avec l'amélioration de la technologie et la miniaturisation des transistors. Il est possible de mettre tellement de transistors sur une puce de silicium que les concepteurs de processeur en ont profité pour mettre une carte graphique peut puissante dans le processeur. Une autre possibilité, surtout utilisée sur les consoles de jeu et les PC portables, est celle où la carte graphique est composée de circuits soudés à la carte mère. Pour résumer, il faut distinguer trois types de cartes graphiques différentes : * Les '''cartes graphiques dédiées''', séparées dans une carte d'extension qu'on doit connecter à la carte mère via un connecteur dédié. * Les '''cartes graphiques intégrées''', qui font partie du processeur. * Les '''cartes graphiques soudées''' à la carte mère. Vous avez sans doute vu qu'il y a une grande différence de performance entre une carte graphique dédiée et une carte graphique intégrée. La raison est simplement que les cartes graphiques intégrées ont moins de transistors à leur disposition, ce qui fait qu'elles contiennent moins de circuits de calcul. Les cartes graphiques dédiées et soudées n'ont pas de différences de performances notables. Les cartes soudées des PC portables sont généralement moins performantes car il faut éviter que le PC chauffe trop, vu que la dissipation thermique est moins bonne avec un PC portable (moins de gros ventilos), ce qui demande d'utiliser une carte graphique moins puissante. Mais les cartes soudées des consoles de jeu n'ont pas ce problème : elles sont dans un boitier bien ventilés, on peut en utiliser une très puissante. ===Un PC avec plusieurs GPU : la commutation de GPU=== De nos jours, il y a de très fortes chances que votre ordinateur intègre plusieurs cartes graphique, peu importe que ce soit un PC portable ou fixe. Tous les PC ont une carte graphique intégrée, de faible performance, qui consomme peu d'énergie/électricité. Et si je dis presque tous, c'est parce que tous les processeurs commerciaux modernes incorporent une carte graphique intégrée. Le marché du processeur grand public est ainsi, seuls quelques processeurs dédiés aux serveurs n'ont pas de carte graphique intégrée. Et en plus de la carte intégrée, une bonne partie des PC intègrent aussi soit une carte dédiée, soit une carte soudée. Soudée sur les PC portables, dédiée sur les PC fixe. Dans le passé, il était possible de mettre plusieurs cartes graphiques dédiées dans un même PC, mais avec des conditions drastiques. ATI/AMD et NVIDIA avaient ajouté des fonctionnalités de multi-GPU, qui permettaient à deux GPU de travailler ensemble, afin de presque doubler les performances. Mais cela ne marchait qu'avec deux GPU NVIDIA ou deux GPU ATI/AMD, utiliser deux GPU de deux marques différentes ne marchait pas. Un chapitre entier sera dédié à ces techniques, mais nous n'en parlerons pas ici, car elles sont tombées en désuétude, aucun GPU grand public ne supporte ces technologies. S'il y a deux cartes graphiques, cela ne signifie pas que les deux sont utilisées en même temps. En effet, selon les circonstances, le PC va privilégier l'une ou l'autre. Dans les années 2010, le choix se faisait dans le BIOS : une des deux carte graphique était désactivée pour de bon, typiquement la carte intégrée. Les PC avec une carte dédiée désactivaient la carte intégrée dans le processeur, pour éviter tout conflit entre les deux cartes. De nos jours, les deux sont utilisables, juste pas en même temps. Le système d'exploitation, Windows ou linux, utilise la carte intégrée, soit sur la carte dédiée, suivant les besoins. La carte dédiée est utilisée quand on a besoin de performance, mais elle consomme beaucoup d'énergie/électricité et chauffe plus. La carte graphique intégrée fait l'inverse : ses performances sont basses, mais elle consomme très peu et chauffe moins. La carte dédiée est donc utilisée quand on a besoin de performance, l'intégrée est utilisée quand elle suffit, afin de faire des économies. Prenons l'exemple d'un jeu vidéo : un jeu ancien et peu gourmand sera exécuté sur la carte intégrée, alors qu'un jeu récent/gourmand sera exécuté sur la carte dédiée. Le rendu du bureau de Windows/linux est réalisé par la carte graphique intégrée, pour économiser de l'énergie. Prenons un PC fixe avec deux cartes graphiques, une intégrée et une dédiée. En général, il y a deux connecteurs pour l'écran, un qui est relié à la carte graphique intégrée, un autre qui est sur la carte dédiée proprement dite. Suivant là où vous brancherez l'écran, vous n'utiliserez pas la même carte graphique. Le système d'exploitation se charge d'envoyer les images à afficher à la carte graphique adéquate. Sur un PC portable ''gaming'', les choses sont différentes. Il n'y a qu'un seul connecteur pour l'écran, pas deux. Et dans ce cas, il y a deux possibilités. La première est la plus simple : une seule carte graphique est connectée à l'écran, généralement la carte intégrée. Si la carte dédiée est utilisée, les images qu'elle calcule sont envoyées à la carte intégrée pour ensuite être affichées à l'écran. On passe par un intermédiaire, mais le câblage est plus simple. L'autre solution fait le compromis inverse. Les deux cartes graphiques sont reliées à ce connecteur, par l'intermédiaire d'un circuit multiplexeur. Le circuit multiplexeur reçoit les images à afficher de la part des deux cartes graphiques et choisit l'une d'entre elle. C'est la solution la plus performante, car la carte dédiée peut afficher directement ses images à l'écran, sans avoir à les envoyer à la carte intégrée. Mais elle complexifie le câblage et demande d'ajouter un circuit multiplexeur, ce qui n'est pas gratuit. ne connecte qu'une seule carte graphique sur ce connecteur, généralement la carte graphique intégrée. Vous vous demandez comment est-ce possible qu'une carte graphique soit soudée ou intégrée dans un processeur. La raison est que les trois types de cartes graphiques sont très similaires, elles sont composées des mêmes types de composants, ce qu'il y a à l'intérieur est globalement le même, comme on va le voir dans ce qui suit. ==Les cartes d'affichage et leur architecture== Au tout début de l'informatique, le rendu graphique était pris en charge par le processeur. Il calculait l'image à afficher et l'envoyait à l'écran, pixel par pixel. Le problème est que le processeur devait se synchroniser avec l'écran, pour envoyer les pixels au bon moment. Pour simplifier la vie des programmeurs, les fabricants de matériel ont inventé des cartes vidéo. Avec celles-ci, le processeur calcule l'image à envoyer à l'écran et la transmet à la carte d'affichage, sans avoir à se synchroniser avec l'écran. L'avantage est que le processeur n'a pas à se synchroniser avec l'écran, juste à envoyer l'image à une carte d'affichage. Les cartes d'affichage ne géraient pas le rendu 3D. Le processeur calculait une image, la copiait dans la mémoire vidéo, puis la carte d'affichage l'envoyait à l'écran au bon moment. Il n'y avait pas de circuits de calcul graphique, ni de circuits de décodage vidéo. Juste de quoi afficher une image à l'écran. Et mine de rien, il est intéressant d'étudier de telles cartes graphiques anciennes. De telles cartes graphiques sont ce que j'ai décidé d'appeler des '''cartes d'affichage'''. ===L'intérieur d'une carte d'affichage=== Une carte d'affichage contient plusieurs sous-circuits, chacun dédié à une fonction précise. * La '''mémoire vidéo''' est une mémoire RAM intégrée à la carte graphique, qui a des fonctions multiples. * L''''interface écran''', ou ''Display interface'', regroupe les connecteurs et tous les circuits permettant d'envoyer l'image à l'écran. * Le '''circuit d'interface avec le bus''' existe uniquement sur les cartes dédiées et éventuellement sur quelques cartes soudées. Il s'occupe des transmissions sur le bus PCI/AGP/PCI-Express, le connecteur qui relie la carte mère et la carte graphique. * Un circuit de contrôle qui commande le tout, appelé le '''''Video Display Controler'''''. [[File:Carte d'affichage - architecture.png|centre|vignette|upright=2|Carte d'affichage - architecture.]] La mémoire vidéo mémorise l'image à afficher, les deux circuits d'interfaçage permettent à la carte d'affichage de communiquer respectivement avec l'écran et le reste de l'ordinateur, le ''Video Display Controler'' commande les autres circuits. Le ''Video Display Controler'' sert de chef d'orchestre pour un orchestre dont les autres circuits seraient les musiciens. Le circuit de contrôle était appelé autrefois le CRTC, car il commandait des écrans dit CRT, mais ce n'est plus d'actualité de nos jours. La carte graphique communique via un bus, un vulgaire tas de fils qui connectent la carte graphique à la carte mère. Les premières cartes graphiques utilisaient un bus nommé ISA, qui fût rapidement remplacé par le bus PCI, plus rapide, lui-même remplacé par le bus AGP, puis le bus PCI-Express. Ce bus est géré par un contrôleur de bus, un circuit qui se charge d'envoyer ou de réceptionner les données sur le bus. Les circuits de communication avec le bus permettent à l'ordinateur de communiquer avec la carte graphique, via le bus PCI-Express, AGP, PCI ou autre. Il contient quelques registres dans lesquels le processeur pourra écrire ou lire, afin de lui envoyer des ordres du style : j'envoie une donnée, transmission terminée, je ne suis pas prêt à recevoir les données que tu veux m'envoyer, etc. Il y a peu à dire sur ce circuit, aussi nous allons nous concentrer sur les autres circuits. Le circuit d'interfaçage écran est au minimum un circuit d’interfaçage électrique se contente de convertir les signaux de la carte graphique en signaux que l'on peut envoyer à l'écran. Il s'occupe notamment de convertir les tensions et courants : si l'écran demande des signaux de 5 Volts mais que la carte graphique fonctionne avec du 3,3 Volt, il y a une conversion à faire. De même, le circuit d'interfaçage électrique peut s'occuper de la conversion des signaux numériques vers de l'analogique. L'écran peut avoir une entrée analogique, surtout s'il est assez ancien. Les anciens écrans CRT ne comprenaient que des données analogiques et pas le binaire, alors que c'est l'inverse pour la carte graphique, ce qui fait que le circuit d'interfaçage devait faire la conversion. La conversion était réalisée par un circuit qui traduit des données numériques (ici, du binaire) en données analogiques : le '''convertisseur numérique-analogique''' ou DAC (''Digital-to-Analogue Converter''). Au tout début, le circuit d’interfaçage était un DAC combiné avec des circuits annexes, ce qu'on appelle un RAMDAC (''Random Access Memory Digital-to-Analog Converter''). De nos jours, les écrans comprennent le binaire sous réserve qu'il soit codé suivant le standard adapté et les cartes graphiques n'ont plus besoin de RAMDAC. Il y a peu à dire sur les circuits d'interfaçage. Leur conception et leur fonctionnement dépendent beaucoup du standard utilisé. Sans compter qu'expliquer leur fonctionnement demande de faire de l'électronique pure et dure, ce qui est rarement agréable pour le commun des mortels. Par contre, étudier le circuit de contrôle et la mémoire vidéo est beaucoup plus intéressant. Plusieurs chapitres seront dédiés à leur fonctionnement. Mais parlons maintenant des GPU modernes et passons à la section suivante. ===Un historique rapide des cartes d’affichage=== Les cartes d'affichages sont opposées aux cartes accélératrices 2D et 3D, qui permettent de décharger le processeur d'une partie du rendu 2D/3D. Pour cela, elles intègrent des circuits spécialisés. Vous imaginez peut-être que les cartes d'affichage sont apparues en premier, puis qu'elles ont gagné en puissance et en fonctionnalités pour devenir d'abord des cartes accélératrices 2D, puis des cartes 3D. C'est une suite assez logique, intuitive. Et ce n'est pas du tout ce qui s'est passé ! Les cartes d'affichage pures, sans rendu 2D, sont une invention des premiers PC. Elles sont arrivées alors que les consoles de jeu avaient déjà des cartes hybrides entre carte d'affichage et cartes de rendu 2D depuis une bonne décennie. Sur les consoles de jeu ou les microordinateurs anciens, il n'y avait pas de cartes d'affichage séparée. A la place, le système vidéo d'un ordinateur était un ensemble de circuits soudés sur la carte mère. Les consoles de jeu, ainsi que les premiers micro-ordinateurs, avaient une configuration fixée une fois pour toute et n'étaient pas upgradables. Mais avec l'arrivée de l'IBM PC, les cartes d’affichages se sont séparées de la carte mère. Leurs composants étaient soudés sur une carte qu'on pouvait clipser et détacher de la carte mère si besoin. Et c'est ainsi que l'on peut actuellement changer la carte graphique d'un PC, alors que ce n'est pas le cas sur une console de jeu. La différence entre les deux se limite cependant à cela. Les composant d'une carte d'affichage ou d'une console de jeu sont globalement les mêmes. Aussi, dans ce qui suit, nous parlerons de carte d'affichage pour désigner cet ensemble de circuits, peu importe qu'il soit soudé à la carte mère ou placé sur une carte d’affichage séparée. C'est un abus de langage qu'on ne retrouvera que dans ce cours. ===Les différents types de cartes d'affichage=== Dans la suite du cours, nous allons voir que toutes les cartes d'affichage ne fonctionnent pas de la même manière. Et ces différences font qu'on peut les classer en plusieurs types distincts. Leur classement s'explique par un fait assez simple : une image prend beaucoup de mémoire ! Par exemple, prenons le cas d'une image en niveaux de gris d'une résolution de 320 par 240 pixels, chaque pixel étant codé sur un octet. L'image prend alors 76800 octets, soit environ 76 kiloctets. Mine de rien, cela fait beaucoup de mémoire ! Et si on ajoute le support de la couleur, cela triple, voire quadruple la taille de l'image. Les cartes graphiques récentes ont assez de mémoire pour stocker l'image à afficher. Une partie de la mémoire vidéo est utilisée pour mémoriser l'image à afficher. La portion en question s'appelle le ''framebuffer'', '''tampon d'image''' en français. Il s'agit là d'une solution très simple, mais qui demande une mémoire vidéo de grande taille. Les systèmes récents peuvent se le permettre, mais les tout premiers ordinateurs n'avaient pas assez de mémoire vidéo. Les cartes d'affichages devaient se débrouiller avec peu de mémoire, impossible de mémoriser l'image à afficher entièrement. Pour compenser cela, les cartes d'affichage anciennes utilisaient diverses optimisations assez intéressantes. La première d'entre elle utilise pour cela le fonctionnement des anciens écrans CRT, qui affichaient l'image ligne par ligne. Pour rappel, l'image a afficher à l'écran a une certaine résolution : 320 pixels pour 240 pixels, par exemple. Pour l'écran CRT, l'image est composée de plusieurs lignes. Par exemple, pour une résolution de 640 par 480, l'image est découpée en 480 lignes, chacune faisant 640 pixels de long. L'écran est conçu pour qu'on lui envoie les lignes les unes après les autres, avec une petite pause entre l'affichage/envoi de deux lignes. Précisons que les écrans LCD ont abandonné ce mode de fonctionnement. L'idée est alors la suivante : la mémoire vidéo ne mémorise que la ligne en cours d'affichage par l'écran. Le processeur met à jour la mémoire vidéo entre l'affichage de deux lignes. La mémoire vidéo n'est alors pas un tampon d'image, mais un '''tampon de ligne'''. Le défaut de cette technique est qu'elle demande que le processeur et la carte d'affichage soient synchronisés, de manière à ce que les lignes soient mises à jour au bon moment. L'avantage est que la quantité de mémoire vidéo nécessaire est divisée par un facteur 100, voire plus, égal à la résolution verticale (le nombre de lignes). Une autre méthode, appelée le '''rendu en tiles''', est formellement une technique de compression d'image particulière. L'image à afficher est stockée sous un format compressé en mémoire vidéo, mais est décompressée pixel par pixel lors de l'affichage. Il nous est difficile de décrire cette technique maintenant, mais un chapitre entier sera dédié à cette technique. Le chapitre en question abordera une technique similaire, appelée le rendu en mode texte, qui servira d'introduction propédeutique. Le rendu en tiles et l'usage d'un tampon ligne sont deux optimisations complémentaires. Il est ainsi possible d'utiliser soit l'une, soit l'autre, soit les deux. En clair, cela donne quatre types de cartes d'affichage distincts : * les cartes d'affichage à tampon d'image ; * les cartes à tampon d'images en rendu à tiles ; * les cartes d'affichage à tampon de ligne ; * les cartes d'affichage à tampon de ligne en rendu à tiles. {|class="wikitable" |- ! ! Rendu normal ! Rendu à tile |- ! Tampon d'image | Cartes graphiques post-années 90, standard VGA sur PC | Consoles de jeu 8 bits et 16 bits, standards CGA, MGA |- ! Tampon de ligne | Consoles de jeu ATARI 2600 et postérieures | Console de jeu néo-géo |} Lez prochains chapitres porteront surtout sur les cartes d'affichages à tampon d'image, plus simples à, expliquer. Deux chapitres seront dédiés respectivement aux cartes à rendu en tile, et aux cartes à tampon de ligne. ==Les cartes graphiques actuelles sont très complexes== Les cartes graphiques actuelles sont des cartes d'affichage améliorées auxquelles on a ajouté des circuits annexes, afin de leur donner des capacités de calcul pour le rendu 2D et/ou 3D, mais elles n'en restent pas moins des cartes d'affichages. La seule différence est que le processeur n’envoie pas une image à la mémoire vidéo, mais que l'image à afficher est calculée par la carte graphique 2D/3D. Les calculs autrefois effectués sur le CPU sont donc déportés sur la carte graphique. Si vous analysez une carte graphique récente, vous verrez que les circuits des cartes d'affichage sont toujours là, bien que noyés dans des circuits de rendu 2D/3D. On retrouve une mémoire vidéo, une interface écran, un circuit d'interface avec le bus, un ''Video Display Controler''. L'interface écran est par contre fusionnée avec le ''Video Display Controler''. Mais à ces circuits d'affichage, sont ajoutés un '''GPU''' (''Graphic Processing Unit''), qui s'occupe du rendu 3D, du rendu 2D, mais aussi d'autres fonctions comme du décodage de fichiers vidéos. [[File:Architecture d'une carte graphique avec un GPU.png|centre|vignette|upright=2|Architecture d'une carte graphique avec un GPU]] ===L'intérieur d'un GPU=== Le GPU est un composant assez complexe, surtout sur les cartes graphiques modernes. Il regroupe plusieurs circuits aux fonctions distinctes. * Un '''''Video Display controler''''' est toujours présent, mais ne sera pas représenté dans ce qui suit. * Des '''circuit de rendu 2D''' séparés peuvent être présents, mais sont la plupart du temps intégrés au VDC. * Les '''circuits de rendu 3D''' s'occupent du rendu 3D. * Les '''circuits de décodage vidéo''', pour améliorer la performance du visionnage de vidéos. Les trois circuits précédents sont gouvernés par un '''processeur de commande''', un circuit assez difficile à décrire. Pour le moment, disons qu'il s'occupe de répartir le travail entre les différents circuits précédents. Le processeur de commande reçoit du travail à faire, envoyé par le CPU via le bus, et le redistribue dans les trois circuits précédents. Par exemple, si on lui envoie une vidéo encodée en H264, il envoie le tout au circuit vidéo. De plus, il le configure pour qu'il la décode correctement : il dit au circuit que c'est une vidéo encodée en H264, afin que le circuit sache comment la décoder. Ce genre de configuration est aussi présente sur les circuits de rendu 2D et 3D, bien qu'elle soit plus compliquée. [[File:Microarchitecture simplifiée d'un GPU.png|centre|vignette|upright=2|Microarchitecture simplifiée d'un GPU]] Un GPU contient aussi un contrôleur mémoire, qui est une interface entre le GPU et la mémoire vidéo. Interface électrique, car GPU et mémoire n'utilisent pas les mêmes tensions et qu'en plus, leur interconnexion demande de gérer pas mal de détails purement électriques. Mais aussi interface de communication, car communiquer entre mémoire vidéo et GPU demande de faire pas mal de manipulations, comme gérer l'adressage et bien d'autres choses qu'on ne peut pas encore détailler ici. Un GPU contient aussi d'autres circuits annexes, comme des circuits pour gérer la consommation électrique, un BIOS vidéo, etc. L'interface écran et l'interface avec le bus sont parfois intégrées au GPU. [[File:Generic block diagram of a GPU.svg|centre|vignette|upright=3|Architecture d'une carte graphique moderne.]] ===Un historique simplifié des pipelines 2D/3D/vidéo=== Avant les années 90, les cartes graphiques des ordinateurs personnels et des consoles de jeux se résumaient à des circuits d'accélération 2D, elles n'avaient pas de décodeurs vidéos ou de circuits de rendu 3D. C'est dans les années 90 qu'elles ont commencé à incorporer des circuits d'accélération 3D. Puis, après les années 2000-2010, elles ont commencé à intégrer des circuits de décodage vidéo, aux alentours des années 2010. En parallèle, les circuits de rendu 2D ont progressivement été réduits puis abandonnés. Les circuits de rendu 2D sont des circuits qui ne sont pas programmables, mais qu'on peut configurer. On dit aussi que ce sont des '''circuits fixes'''. Ils sont opposés aux circuits programmables, basés sur des processeurs. Les circuits de rendu 3D étaient initialement des circuits fixes eux aussi, mais sont devenus de plus en plus programmables avec le temps. Les GPU d'après les années 2000 utilisent un mélange de circuits programmables et fixes assez variable. Nous reviendrons là-dessus dans un chapitre dédié. [[File:Microarchitecture globale d'un GPU.png|centre|vignette|upright=2|Microarchitecture globale d'un GPU]] Pour les circuits de décodage vidéo, les choses sont assez complexes. Initialement, ils s'agissait de circuits fixes, qu'on pouvait programmer. Un GPU de ce type est illustré ci-dessus. Mais de nos jours, les calculs de décodage vidéo sont réalisés sur les processeurs de shaders. Les circuits de rendu 3D et de décodage vidéo ont chacun des circuits fixes dédiés, mais partagent des processeurs. [[File:GPU avec processeurs de shaders partagés entre rendu 3D et décodage vidéo.png|centre|vignette|upright=2|GPU avec processeurs de shaders partagés entre rendu 3D et décodage vidéo]] Les cinq prochains chapitres vont parler des cartes d'affichage et des cartes accélératrices 2D, les deux étant fortement liées. C'est seulement dans les chapitres qui suivront que nous parlerons des cartes 3D. Les cartes 3D sont composées d'une carte d'affichage à laquelle on a rajouté des circuits de calcul, ce qui fait qu'il est préférable de faire ainsi : on voit ce qui est commun entre les deux d'abord, avant de voir le rendu 3D ensuite. De plus, le rendu 3D est plus complexe que l'affichage d'une image à l'écran, ce qui fait qu'il vaut mieux voir cela après. {{NavChapitre | book=Les cartes graphiques | next=Le Video Display Controler | nextText=Le Video Display Controler }}{{autocat}} 9v6jrw61x4lkh4dvnzsy1soyxjjgy64 745908 745907 2025-07-04T11:50:33Z Mewtow 31375 /* Un PC avec plusieurs GPU : la commutation de GPU */ 745908 wikitext text/x-wiki Les cartes graphiques sont des cartes qui communiquent avec l'écran, pour y afficher des images. Les cartes graphiques modernes incorporent aussi des circuits de calcul pour accélérer du rendu 2D ou 3D. Dans ce chapitre, nous allons faire une introduction et expliquer ce qu'est une carte graphique et surtout : nous allons voir ce qu'il y a à l'intérieur, du moins dans les grandes lignes. ==Les cartes graphiques dédiées, intégrées et soudées== Vous avez sans doute déjà démonté votre PC pour en changer la carte graphique, vous savez sans doute à quoi elle ressemble. Sur les PC modernes, il s'agit d'un composant séparé, qu'on branche sur la carte mère, sur un port spécialisé. Du moins, c'est le cas si vous avez un PC fixe assez puissant. Mais il y a deux autres possibilités. [[File:PX7800 GTX (557505323).jpg|centre|vignette|Carte graphique dédiée PX 7800 GTX I]] La première est celle où la carte graphique est directement intégrée dans le processeur de la machine ! C'est quelque chose qui se fait depuis les années 2000-2010, avec l'amélioration de la technologie et la miniaturisation des transistors. Il est possible de mettre tellement de transistors sur une puce de silicium que les concepteurs de processeur en ont profité pour mettre une carte graphique peut puissante dans le processeur. Une autre possibilité, surtout utilisée sur les consoles de jeu et les PC portables, est celle où la carte graphique est composée de circuits soudés à la carte mère. Pour résumer, il faut distinguer trois types de cartes graphiques différentes : * Les '''cartes graphiques dédiées''', séparées dans une carte d'extension qu'on doit connecter à la carte mère via un connecteur dédié. * Les '''cartes graphiques intégrées''', qui font partie du processeur. * Les '''cartes graphiques soudées''' à la carte mère. Vous avez sans doute vu qu'il y a une grande différence de performance entre une carte graphique dédiée et une carte graphique intégrée. La raison est simplement que les cartes graphiques intégrées ont moins de transistors à leur disposition, ce qui fait qu'elles contiennent moins de circuits de calcul. Les cartes graphiques dédiées et soudées n'ont pas de différences de performances notables. Les cartes soudées des PC portables sont généralement moins performantes car il faut éviter que le PC chauffe trop, vu que la dissipation thermique est moins bonne avec un PC portable (moins de gros ventilos), ce qui demande d'utiliser une carte graphique moins puissante. Mais les cartes soudées des consoles de jeu n'ont pas ce problème : elles sont dans un boitier bien ventilés, on peut en utiliser une très puissante. ===Un PC avec plusieurs GPU : la commutation de GPU=== De nos jours, il y a de très fortes chances que votre ordinateur intègre plusieurs cartes graphique, peu importe que ce soit un PC portable ou fixe. Tous les PC ont une carte graphique intégrée, de faible performance, qui consomme peu d'énergie/électricité. Et si je dis presque tous, c'est parce que tous les processeurs commerciaux modernes incorporent une carte graphique intégrée. Le marché du processeur grand public est ainsi, seuls quelques processeurs dédiés aux serveurs n'ont pas de carte graphique intégrée. Et en plus de la carte intégrée, une bonne partie des PC intègrent aussi soit une carte dédiée, soit une carte soudée. Soudée sur les PC portables, dédiée sur les PC fixe. Dans le passé, il était possible de mettre plusieurs cartes graphiques dédiées dans un même PC, mais avec des conditions drastiques. ATI/AMD et NVIDIA avaient ajouté des fonctionnalités de multi-GPU, qui permettaient à deux GPU de travailler ensemble, afin de presque doubler les performances. Mais cela ne marchait qu'avec deux GPU NVIDIA ou deux GPU ATI/AMD, utiliser deux GPU de deux marques différentes ne marchait pas. Un chapitre entier sera dédié à ces techniques, mais nous n'en parlerons pas ici, car elles sont tombées en désuétude, aucun GPU grand public ne supporte ces technologies. S'il y a deux cartes graphiques, cela ne signifie pas que les deux sont utilisées en même temps. En effet, selon les circonstances, le PC va privilégier l'une ou l'autre. Dans les années 2010, le choix se faisait dans le BIOS : une des deux carte graphique était désactivée pour de bon, typiquement la carte intégrée. Les PC avec une carte dédiée désactivaient la carte intégrée dans le processeur, pour éviter tout conflit entre les deux cartes. De nos jours, les deux sont utilisables, juste pas en même temps. Le système d'exploitation, Windows ou linux, utilise la carte intégrée, soit sur la carte dédiée, suivant les besoins. La carte dédiée est utilisée quand on a besoin de performance, mais elle consomme beaucoup d'énergie/électricité et chauffe plus. La carte graphique intégrée fait l'inverse : ses performances sont basses, mais elle consomme très peu et chauffe moins. La carte dédiée est donc utilisée quand on a besoin de performance, l'intégrée est utilisée quand elle suffit, afin de faire des économies. Prenons l'exemple d'un jeu vidéo : un jeu ancien et peu gourmand sera exécuté sur la carte intégrée, alors qu'un jeu récent/gourmand sera exécuté sur la carte dédiée. Le rendu du bureau de Windows/linux est réalisé par la carte graphique intégrée, pour économiser de l'énergie. Prenons un PC fixe avec deux cartes graphiques, une intégrée et une dédiée. En général, il y a deux connecteurs pour l'écran, un qui est relié à la carte graphique intégrée, un autre qui est sur la carte dédiée proprement dite. Suivant là où vous brancherez l'écran, vous n'utiliserez pas la même carte graphique. Le système d'exploitation se charge d'envoyer les images à afficher à la carte graphique adéquate. Sur un PC portable ''gaming'', les choses sont différentes. Il n'y a qu'un seul connecteur pour l'écran, pas deux. Et dans ce cas, il y a deux possibilités. La première est la plus simple : une seule carte graphique est connectée à l'écran, généralement la carte intégrée. Si la carte dédiée est utilisée, les images qu'elle calcule sont envoyées à la carte intégrée pour ensuite être affichées à l'écran. On passe par un intermédiaire, mais le câblage est plus simple. L'autre solution fait le compromis inverse. Les deux cartes graphiques sont reliées à ce connecteur, par l'intermédiaire d'un circuit multiplexeur. Le circuit multiplexeur reçoit les images à afficher de la part des deux cartes graphiques et choisit l'une d'entre elle. C'est la solution la plus performante, car la carte dédiée peut afficher directement ses images à l'écran, sans avoir à les envoyer à la carte intégrée. Mais elle complexifie le câblage et demande d'ajouter un circuit multiplexeur, ce qui n'est pas gratuit. ==Les cartes d'affichage et leur architecture== Au tout début de l'informatique, le rendu graphique était pris en charge par le processeur. Il calculait l'image à afficher et l'envoyait à l'écran, pixel par pixel. Le problème est que le processeur devait se synchroniser avec l'écran, pour envoyer les pixels au bon moment. Pour simplifier la vie des programmeurs, les fabricants de matériel ont inventé des cartes vidéo. Avec celles-ci, le processeur calcule l'image à envoyer à l'écran et la transmet à la carte d'affichage, sans avoir à se synchroniser avec l'écran. L'avantage est que le processeur n'a pas à se synchroniser avec l'écran, juste à envoyer l'image à une carte d'affichage. Les cartes d'affichage ne géraient pas le rendu 3D. Le processeur calculait une image, la copiait dans la mémoire vidéo, puis la carte d'affichage l'envoyait à l'écran au bon moment. Il n'y avait pas de circuits de calcul graphique, ni de circuits de décodage vidéo. Juste de quoi afficher une image à l'écran. Et mine de rien, il est intéressant d'étudier de telles cartes graphiques anciennes. De telles cartes graphiques sont ce que j'ai décidé d'appeler des '''cartes d'affichage'''. ===L'intérieur d'une carte d'affichage=== Une carte d'affichage contient plusieurs sous-circuits, chacun dédié à une fonction précise. * La '''mémoire vidéo''' est une mémoire RAM intégrée à la carte graphique, qui a des fonctions multiples. * L''''interface écran''', ou ''Display interface'', regroupe les connecteurs et tous les circuits permettant d'envoyer l'image à l'écran. * Le '''circuit d'interface avec le bus''' existe uniquement sur les cartes dédiées et éventuellement sur quelques cartes soudées. Il s'occupe des transmissions sur le bus PCI/AGP/PCI-Express, le connecteur qui relie la carte mère et la carte graphique. * Un circuit de contrôle qui commande le tout, appelé le '''''Video Display Controler'''''. [[File:Carte d'affichage - architecture.png|centre|vignette|upright=2|Carte d'affichage - architecture.]] La mémoire vidéo mémorise l'image à afficher, les deux circuits d'interfaçage permettent à la carte d'affichage de communiquer respectivement avec l'écran et le reste de l'ordinateur, le ''Video Display Controler'' commande les autres circuits. Le ''Video Display Controler'' sert de chef d'orchestre pour un orchestre dont les autres circuits seraient les musiciens. Le circuit de contrôle était appelé autrefois le CRTC, car il commandait des écrans dit CRT, mais ce n'est plus d'actualité de nos jours. La carte graphique communique via un bus, un vulgaire tas de fils qui connectent la carte graphique à la carte mère. Les premières cartes graphiques utilisaient un bus nommé ISA, qui fût rapidement remplacé par le bus PCI, plus rapide, lui-même remplacé par le bus AGP, puis le bus PCI-Express. Ce bus est géré par un contrôleur de bus, un circuit qui se charge d'envoyer ou de réceptionner les données sur le bus. Les circuits de communication avec le bus permettent à l'ordinateur de communiquer avec la carte graphique, via le bus PCI-Express, AGP, PCI ou autre. Il contient quelques registres dans lesquels le processeur pourra écrire ou lire, afin de lui envoyer des ordres du style : j'envoie une donnée, transmission terminée, je ne suis pas prêt à recevoir les données que tu veux m'envoyer, etc. Il y a peu à dire sur ce circuit, aussi nous allons nous concentrer sur les autres circuits. Le circuit d'interfaçage écran est au minimum un circuit d’interfaçage électrique se contente de convertir les signaux de la carte graphique en signaux que l'on peut envoyer à l'écran. Il s'occupe notamment de convertir les tensions et courants : si l'écran demande des signaux de 5 Volts mais que la carte graphique fonctionne avec du 3,3 Volt, il y a une conversion à faire. De même, le circuit d'interfaçage électrique peut s'occuper de la conversion des signaux numériques vers de l'analogique. L'écran peut avoir une entrée analogique, surtout s'il est assez ancien. Les anciens écrans CRT ne comprenaient que des données analogiques et pas le binaire, alors que c'est l'inverse pour la carte graphique, ce qui fait que le circuit d'interfaçage devait faire la conversion. La conversion était réalisée par un circuit qui traduit des données numériques (ici, du binaire) en données analogiques : le '''convertisseur numérique-analogique''' ou DAC (''Digital-to-Analogue Converter''). Au tout début, le circuit d’interfaçage était un DAC combiné avec des circuits annexes, ce qu'on appelle un RAMDAC (''Random Access Memory Digital-to-Analog Converter''). De nos jours, les écrans comprennent le binaire sous réserve qu'il soit codé suivant le standard adapté et les cartes graphiques n'ont plus besoin de RAMDAC. Il y a peu à dire sur les circuits d'interfaçage. Leur conception et leur fonctionnement dépendent beaucoup du standard utilisé. Sans compter qu'expliquer leur fonctionnement demande de faire de l'électronique pure et dure, ce qui est rarement agréable pour le commun des mortels. Par contre, étudier le circuit de contrôle et la mémoire vidéo est beaucoup plus intéressant. Plusieurs chapitres seront dédiés à leur fonctionnement. Mais parlons maintenant des GPU modernes et passons à la section suivante. ===Un historique rapide des cartes d’affichage=== Les cartes d'affichages sont opposées aux cartes accélératrices 2D et 3D, qui permettent de décharger le processeur d'une partie du rendu 2D/3D. Pour cela, elles intègrent des circuits spécialisés. Vous imaginez peut-être que les cartes d'affichage sont apparues en premier, puis qu'elles ont gagné en puissance et en fonctionnalités pour devenir d'abord des cartes accélératrices 2D, puis des cartes 3D. C'est une suite assez logique, intuitive. Et ce n'est pas du tout ce qui s'est passé ! Les cartes d'affichage pures, sans rendu 2D, sont une invention des premiers PC. Elles sont arrivées alors que les consoles de jeu avaient déjà des cartes hybrides entre carte d'affichage et cartes de rendu 2D depuis une bonne décennie. Sur les consoles de jeu ou les microordinateurs anciens, il n'y avait pas de cartes d'affichage séparée. A la place, le système vidéo d'un ordinateur était un ensemble de circuits soudés sur la carte mère. Les consoles de jeu, ainsi que les premiers micro-ordinateurs, avaient une configuration fixée une fois pour toute et n'étaient pas upgradables. Mais avec l'arrivée de l'IBM PC, les cartes d’affichages se sont séparées de la carte mère. Leurs composants étaient soudés sur une carte qu'on pouvait clipser et détacher de la carte mère si besoin. Et c'est ainsi que l'on peut actuellement changer la carte graphique d'un PC, alors que ce n'est pas le cas sur une console de jeu. La différence entre les deux se limite cependant à cela. Les composant d'une carte d'affichage ou d'une console de jeu sont globalement les mêmes. Aussi, dans ce qui suit, nous parlerons de carte d'affichage pour désigner cet ensemble de circuits, peu importe qu'il soit soudé à la carte mère ou placé sur une carte d’affichage séparée. C'est un abus de langage qu'on ne retrouvera que dans ce cours. ===Les différents types de cartes d'affichage=== Dans la suite du cours, nous allons voir que toutes les cartes d'affichage ne fonctionnent pas de la même manière. Et ces différences font qu'on peut les classer en plusieurs types distincts. Leur classement s'explique par un fait assez simple : une image prend beaucoup de mémoire ! Par exemple, prenons le cas d'une image en niveaux de gris d'une résolution de 320 par 240 pixels, chaque pixel étant codé sur un octet. L'image prend alors 76800 octets, soit environ 76 kiloctets. Mine de rien, cela fait beaucoup de mémoire ! Et si on ajoute le support de la couleur, cela triple, voire quadruple la taille de l'image. Les cartes graphiques récentes ont assez de mémoire pour stocker l'image à afficher. Une partie de la mémoire vidéo est utilisée pour mémoriser l'image à afficher. La portion en question s'appelle le ''framebuffer'', '''tampon d'image''' en français. Il s'agit là d'une solution très simple, mais qui demande une mémoire vidéo de grande taille. Les systèmes récents peuvent se le permettre, mais les tout premiers ordinateurs n'avaient pas assez de mémoire vidéo. Les cartes d'affichages devaient se débrouiller avec peu de mémoire, impossible de mémoriser l'image à afficher entièrement. Pour compenser cela, les cartes d'affichage anciennes utilisaient diverses optimisations assez intéressantes. La première d'entre elle utilise pour cela le fonctionnement des anciens écrans CRT, qui affichaient l'image ligne par ligne. Pour rappel, l'image a afficher à l'écran a une certaine résolution : 320 pixels pour 240 pixels, par exemple. Pour l'écran CRT, l'image est composée de plusieurs lignes. Par exemple, pour une résolution de 640 par 480, l'image est découpée en 480 lignes, chacune faisant 640 pixels de long. L'écran est conçu pour qu'on lui envoie les lignes les unes après les autres, avec une petite pause entre l'affichage/envoi de deux lignes. Précisons que les écrans LCD ont abandonné ce mode de fonctionnement. L'idée est alors la suivante : la mémoire vidéo ne mémorise que la ligne en cours d'affichage par l'écran. Le processeur met à jour la mémoire vidéo entre l'affichage de deux lignes. La mémoire vidéo n'est alors pas un tampon d'image, mais un '''tampon de ligne'''. Le défaut de cette technique est qu'elle demande que le processeur et la carte d'affichage soient synchronisés, de manière à ce que les lignes soient mises à jour au bon moment. L'avantage est que la quantité de mémoire vidéo nécessaire est divisée par un facteur 100, voire plus, égal à la résolution verticale (le nombre de lignes). Une autre méthode, appelée le '''rendu en tiles''', est formellement une technique de compression d'image particulière. L'image à afficher est stockée sous un format compressé en mémoire vidéo, mais est décompressée pixel par pixel lors de l'affichage. Il nous est difficile de décrire cette technique maintenant, mais un chapitre entier sera dédié à cette technique. Le chapitre en question abordera une technique similaire, appelée le rendu en mode texte, qui servira d'introduction propédeutique. Le rendu en tiles et l'usage d'un tampon ligne sont deux optimisations complémentaires. Il est ainsi possible d'utiliser soit l'une, soit l'autre, soit les deux. En clair, cela donne quatre types de cartes d'affichage distincts : * les cartes d'affichage à tampon d'image ; * les cartes à tampon d'images en rendu à tiles ; * les cartes d'affichage à tampon de ligne ; * les cartes d'affichage à tampon de ligne en rendu à tiles. {|class="wikitable" |- ! ! Rendu normal ! Rendu à tile |- ! Tampon d'image | Cartes graphiques post-années 90, standard VGA sur PC | Consoles de jeu 8 bits et 16 bits, standards CGA, MGA |- ! Tampon de ligne | Consoles de jeu ATARI 2600 et postérieures | Console de jeu néo-géo |} Lez prochains chapitres porteront surtout sur les cartes d'affichages à tampon d'image, plus simples à, expliquer. Deux chapitres seront dédiés respectivement aux cartes à rendu en tile, et aux cartes à tampon de ligne. ==Les cartes graphiques actuelles sont très complexes== Les cartes graphiques actuelles sont des cartes d'affichage améliorées auxquelles on a ajouté des circuits annexes, afin de leur donner des capacités de calcul pour le rendu 2D et/ou 3D, mais elles n'en restent pas moins des cartes d'affichages. La seule différence est que le processeur n’envoie pas une image à la mémoire vidéo, mais que l'image à afficher est calculée par la carte graphique 2D/3D. Les calculs autrefois effectués sur le CPU sont donc déportés sur la carte graphique. Si vous analysez une carte graphique récente, vous verrez que les circuits des cartes d'affichage sont toujours là, bien que noyés dans des circuits de rendu 2D/3D. On retrouve une mémoire vidéo, une interface écran, un circuit d'interface avec le bus, un ''Video Display Controler''. L'interface écran est par contre fusionnée avec le ''Video Display Controler''. Mais à ces circuits d'affichage, sont ajoutés un '''GPU''' (''Graphic Processing Unit''), qui s'occupe du rendu 3D, du rendu 2D, mais aussi d'autres fonctions comme du décodage de fichiers vidéos. [[File:Architecture d'une carte graphique avec un GPU.png|centre|vignette|upright=2|Architecture d'une carte graphique avec un GPU]] ===L'intérieur d'un GPU=== Le GPU est un composant assez complexe, surtout sur les cartes graphiques modernes. Il regroupe plusieurs circuits aux fonctions distinctes. * Un '''''Video Display controler''''' est toujours présent, mais ne sera pas représenté dans ce qui suit. * Des '''circuit de rendu 2D''' séparés peuvent être présents, mais sont la plupart du temps intégrés au VDC. * Les '''circuits de rendu 3D''' s'occupent du rendu 3D. * Les '''circuits de décodage vidéo''', pour améliorer la performance du visionnage de vidéos. Les trois circuits précédents sont gouvernés par un '''processeur de commande''', un circuit assez difficile à décrire. Pour le moment, disons qu'il s'occupe de répartir le travail entre les différents circuits précédents. Le processeur de commande reçoit du travail à faire, envoyé par le CPU via le bus, et le redistribue dans les trois circuits précédents. Par exemple, si on lui envoie une vidéo encodée en H264, il envoie le tout au circuit vidéo. De plus, il le configure pour qu'il la décode correctement : il dit au circuit que c'est une vidéo encodée en H264, afin que le circuit sache comment la décoder. Ce genre de configuration est aussi présente sur les circuits de rendu 2D et 3D, bien qu'elle soit plus compliquée. [[File:Microarchitecture simplifiée d'un GPU.png|centre|vignette|upright=2|Microarchitecture simplifiée d'un GPU]] Un GPU contient aussi un contrôleur mémoire, qui est une interface entre le GPU et la mémoire vidéo. Interface électrique, car GPU et mémoire n'utilisent pas les mêmes tensions et qu'en plus, leur interconnexion demande de gérer pas mal de détails purement électriques. Mais aussi interface de communication, car communiquer entre mémoire vidéo et GPU demande de faire pas mal de manipulations, comme gérer l'adressage et bien d'autres choses qu'on ne peut pas encore détailler ici. Un GPU contient aussi d'autres circuits annexes, comme des circuits pour gérer la consommation électrique, un BIOS vidéo, etc. L'interface écran et l'interface avec le bus sont parfois intégrées au GPU. [[File:Generic block diagram of a GPU.svg|centre|vignette|upright=3|Architecture d'une carte graphique moderne.]] ===Un historique simplifié des pipelines 2D/3D/vidéo=== Avant les années 90, les cartes graphiques des ordinateurs personnels et des consoles de jeux se résumaient à des circuits d'accélération 2D, elles n'avaient pas de décodeurs vidéos ou de circuits de rendu 3D. C'est dans les années 90 qu'elles ont commencé à incorporer des circuits d'accélération 3D. Puis, après les années 2000-2010, elles ont commencé à intégrer des circuits de décodage vidéo, aux alentours des années 2010. En parallèle, les circuits de rendu 2D ont progressivement été réduits puis abandonnés. Les circuits de rendu 2D sont des circuits qui ne sont pas programmables, mais qu'on peut configurer. On dit aussi que ce sont des '''circuits fixes'''. Ils sont opposés aux circuits programmables, basés sur des processeurs. Les circuits de rendu 3D étaient initialement des circuits fixes eux aussi, mais sont devenus de plus en plus programmables avec le temps. Les GPU d'après les années 2000 utilisent un mélange de circuits programmables et fixes assez variable. Nous reviendrons là-dessus dans un chapitre dédié. [[File:Microarchitecture globale d'un GPU.png|centre|vignette|upright=2|Microarchitecture globale d'un GPU]] Pour les circuits de décodage vidéo, les choses sont assez complexes. Initialement, ils s'agissait de circuits fixes, qu'on pouvait programmer. Un GPU de ce type est illustré ci-dessus. Mais de nos jours, les calculs de décodage vidéo sont réalisés sur les processeurs de shaders. Les circuits de rendu 3D et de décodage vidéo ont chacun des circuits fixes dédiés, mais partagent des processeurs. [[File:GPU avec processeurs de shaders partagés entre rendu 3D et décodage vidéo.png|centre|vignette|upright=2|GPU avec processeurs de shaders partagés entre rendu 3D et décodage vidéo]] Les cinq prochains chapitres vont parler des cartes d'affichage et des cartes accélératrices 2D, les deux étant fortement liées. C'est seulement dans les chapitres qui suivront que nous parlerons des cartes 3D. Les cartes 3D sont composées d'une carte d'affichage à laquelle on a rajouté des circuits de calcul, ce qui fait qu'il est préférable de faire ainsi : on voit ce qui est commun entre les deux d'abord, avant de voir le rendu 3D ensuite. De plus, le rendu 3D est plus complexe que l'affichage d'une image à l'écran, ce qui fait qu'il vaut mieux voir cela après. {{NavChapitre | book=Les cartes graphiques | next=Le Video Display Controler | nextText=Le Video Display Controler }}{{autocat}} c9dr19b1gdxcuwkxap5rw41laqemge5 745909 745908 2025-07-04T11:50:41Z Mewtow 31375 /* Les cartes d'affichage et leur architecture */ 745909 wikitext text/x-wiki Les cartes graphiques sont des cartes qui communiquent avec l'écran, pour y afficher des images. Les cartes graphiques modernes incorporent aussi des circuits de calcul pour accélérer du rendu 2D ou 3D. Dans ce chapitre, nous allons faire une introduction et expliquer ce qu'est une carte graphique et surtout : nous allons voir ce qu'il y a à l'intérieur, du moins dans les grandes lignes. ==Les cartes graphiques dédiées, intégrées et soudées== Vous avez sans doute déjà démonté votre PC pour en changer la carte graphique, vous savez sans doute à quoi elle ressemble. Sur les PC modernes, il s'agit d'un composant séparé, qu'on branche sur la carte mère, sur un port spécialisé. Du moins, c'est le cas si vous avez un PC fixe assez puissant. Mais il y a deux autres possibilités. [[File:PX7800 GTX (557505323).jpg|centre|vignette|Carte graphique dédiée PX 7800 GTX I]] La première est celle où la carte graphique est directement intégrée dans le processeur de la machine ! C'est quelque chose qui se fait depuis les années 2000-2010, avec l'amélioration de la technologie et la miniaturisation des transistors. Il est possible de mettre tellement de transistors sur une puce de silicium que les concepteurs de processeur en ont profité pour mettre une carte graphique peut puissante dans le processeur. Une autre possibilité, surtout utilisée sur les consoles de jeu et les PC portables, est celle où la carte graphique est composée de circuits soudés à la carte mère. Pour résumer, il faut distinguer trois types de cartes graphiques différentes : * Les '''cartes graphiques dédiées''', séparées dans une carte d'extension qu'on doit connecter à la carte mère via un connecteur dédié. * Les '''cartes graphiques intégrées''', qui font partie du processeur. * Les '''cartes graphiques soudées''' à la carte mère. Vous avez sans doute vu qu'il y a une grande différence de performance entre une carte graphique dédiée et une carte graphique intégrée. La raison est simplement que les cartes graphiques intégrées ont moins de transistors à leur disposition, ce qui fait qu'elles contiennent moins de circuits de calcul. Les cartes graphiques dédiées et soudées n'ont pas de différences de performances notables. Les cartes soudées des PC portables sont généralement moins performantes car il faut éviter que le PC chauffe trop, vu que la dissipation thermique est moins bonne avec un PC portable (moins de gros ventilos), ce qui demande d'utiliser une carte graphique moins puissante. Mais les cartes soudées des consoles de jeu n'ont pas ce problème : elles sont dans un boitier bien ventilés, on peut en utiliser une très puissante. ===Un PC avec plusieurs GPU : la commutation de GPU=== De nos jours, il y a de très fortes chances que votre ordinateur intègre plusieurs cartes graphique, peu importe que ce soit un PC portable ou fixe. Tous les PC ont une carte graphique intégrée, de faible performance, qui consomme peu d'énergie/électricité. Et si je dis presque tous, c'est parce que tous les processeurs commerciaux modernes incorporent une carte graphique intégrée. Le marché du processeur grand public est ainsi, seuls quelques processeurs dédiés aux serveurs n'ont pas de carte graphique intégrée. Et en plus de la carte intégrée, une bonne partie des PC intègrent aussi soit une carte dédiée, soit une carte soudée. Soudée sur les PC portables, dédiée sur les PC fixe. Dans le passé, il était possible de mettre plusieurs cartes graphiques dédiées dans un même PC, mais avec des conditions drastiques. ATI/AMD et NVIDIA avaient ajouté des fonctionnalités de multi-GPU, qui permettaient à deux GPU de travailler ensemble, afin de presque doubler les performances. Mais cela ne marchait qu'avec deux GPU NVIDIA ou deux GPU ATI/AMD, utiliser deux GPU de deux marques différentes ne marchait pas. Un chapitre entier sera dédié à ces techniques, mais nous n'en parlerons pas ici, car elles sont tombées en désuétude, aucun GPU grand public ne supporte ces technologies. S'il y a deux cartes graphiques, cela ne signifie pas que les deux sont utilisées en même temps. En effet, selon les circonstances, le PC va privilégier l'une ou l'autre. Dans les années 2010, le choix se faisait dans le BIOS : une des deux carte graphique était désactivée pour de bon, typiquement la carte intégrée. Les PC avec une carte dédiée désactivaient la carte intégrée dans le processeur, pour éviter tout conflit entre les deux cartes. De nos jours, les deux sont utilisables, juste pas en même temps. Le système d'exploitation, Windows ou linux, utilise la carte intégrée, soit sur la carte dédiée, suivant les besoins. La carte dédiée est utilisée quand on a besoin de performance, mais elle consomme beaucoup d'énergie/électricité et chauffe plus. La carte graphique intégrée fait l'inverse : ses performances sont basses, mais elle consomme très peu et chauffe moins. La carte dédiée est donc utilisée quand on a besoin de performance, l'intégrée est utilisée quand elle suffit, afin de faire des économies. Prenons l'exemple d'un jeu vidéo : un jeu ancien et peu gourmand sera exécuté sur la carte intégrée, alors qu'un jeu récent/gourmand sera exécuté sur la carte dédiée. Le rendu du bureau de Windows/linux est réalisé par la carte graphique intégrée, pour économiser de l'énergie. Prenons un PC fixe avec deux cartes graphiques, une intégrée et une dédiée. En général, il y a deux connecteurs pour l'écran, un qui est relié à la carte graphique intégrée, un autre qui est sur la carte dédiée proprement dite. Suivant là où vous brancherez l'écran, vous n'utiliserez pas la même carte graphique. Le système d'exploitation se charge d'envoyer les images à afficher à la carte graphique adéquate. Sur un PC portable ''gaming'', les choses sont différentes. Il n'y a qu'un seul connecteur pour l'écran, pas deux. Et dans ce cas, il y a deux possibilités. La première est la plus simple : une seule carte graphique est connectée à l'écran, généralement la carte intégrée. Si la carte dédiée est utilisée, les images qu'elle calcule sont envoyées à la carte intégrée pour ensuite être affichées à l'écran. On passe par un intermédiaire, mais le câblage est plus simple. L'autre solution fait le compromis inverse. Les deux cartes graphiques sont reliées à ce connecteur, par l'intermédiaire d'un circuit multiplexeur. Le circuit multiplexeur reçoit les images à afficher de la part des deux cartes graphiques et choisit l'une d'entre elle. C'est la solution la plus performante, car la carte dédiée peut afficher directement ses images à l'écran, sans avoir à les envoyer à la carte intégrée. Mais elle complexifie le câblage et demande d'ajouter un circuit multiplexeur, ce qui n'est pas gratuit. ==Les cartes d'affichage et leur architecture== Vous vous demandez comment est-ce possible qu'une carte graphique soit soudée ou intégrée dans un processeur. La raison est que les trois types de cartes graphiques sont très similaires, elles sont composées des mêmes types de composants, ce qu'il y a à l'intérieur est globalement le même, comme on va le voir dans ce qui suit. Au tout début de l'informatique, le rendu graphique était pris en charge par le processeur. Il calculait l'image à afficher et l'envoyait à l'écran, pixel par pixel. Le problème est que le processeur devait se synchroniser avec l'écran, pour envoyer les pixels au bon moment. Pour simplifier la vie des programmeurs, les fabricants de matériel ont inventé des cartes vidéo. Avec celles-ci, le processeur calcule l'image à envoyer à l'écran et la transmet à la carte d'affichage, sans avoir à se synchroniser avec l'écran. L'avantage est que le processeur n'a pas à se synchroniser avec l'écran, juste à envoyer l'image à une carte d'affichage. Les cartes d'affichage ne géraient pas le rendu 3D. Le processeur calculait une image, la copiait dans la mémoire vidéo, puis la carte d'affichage l'envoyait à l'écran au bon moment. Il n'y avait pas de circuits de calcul graphique, ni de circuits de décodage vidéo. Juste de quoi afficher une image à l'écran. Et mine de rien, il est intéressant d'étudier de telles cartes graphiques anciennes. De telles cartes graphiques sont ce que j'ai décidé d'appeler des '''cartes d'affichage'''. ===L'intérieur d'une carte d'affichage=== Une carte d'affichage contient plusieurs sous-circuits, chacun dédié à une fonction précise. * La '''mémoire vidéo''' est une mémoire RAM intégrée à la carte graphique, qui a des fonctions multiples. * L''''interface écran''', ou ''Display interface'', regroupe les connecteurs et tous les circuits permettant d'envoyer l'image à l'écran. * Le '''circuit d'interface avec le bus''' existe uniquement sur les cartes dédiées et éventuellement sur quelques cartes soudées. Il s'occupe des transmissions sur le bus PCI/AGP/PCI-Express, le connecteur qui relie la carte mère et la carte graphique. * Un circuit de contrôle qui commande le tout, appelé le '''''Video Display Controler'''''. [[File:Carte d'affichage - architecture.png|centre|vignette|upright=2|Carte d'affichage - architecture.]] La mémoire vidéo mémorise l'image à afficher, les deux circuits d'interfaçage permettent à la carte d'affichage de communiquer respectivement avec l'écran et le reste de l'ordinateur, le ''Video Display Controler'' commande les autres circuits. Le ''Video Display Controler'' sert de chef d'orchestre pour un orchestre dont les autres circuits seraient les musiciens. Le circuit de contrôle était appelé autrefois le CRTC, car il commandait des écrans dit CRT, mais ce n'est plus d'actualité de nos jours. La carte graphique communique via un bus, un vulgaire tas de fils qui connectent la carte graphique à la carte mère. Les premières cartes graphiques utilisaient un bus nommé ISA, qui fût rapidement remplacé par le bus PCI, plus rapide, lui-même remplacé par le bus AGP, puis le bus PCI-Express. Ce bus est géré par un contrôleur de bus, un circuit qui se charge d'envoyer ou de réceptionner les données sur le bus. Les circuits de communication avec le bus permettent à l'ordinateur de communiquer avec la carte graphique, via le bus PCI-Express, AGP, PCI ou autre. Il contient quelques registres dans lesquels le processeur pourra écrire ou lire, afin de lui envoyer des ordres du style : j'envoie une donnée, transmission terminée, je ne suis pas prêt à recevoir les données que tu veux m'envoyer, etc. Il y a peu à dire sur ce circuit, aussi nous allons nous concentrer sur les autres circuits. Le circuit d'interfaçage écran est au minimum un circuit d’interfaçage électrique se contente de convertir les signaux de la carte graphique en signaux que l'on peut envoyer à l'écran. Il s'occupe notamment de convertir les tensions et courants : si l'écran demande des signaux de 5 Volts mais que la carte graphique fonctionne avec du 3,3 Volt, il y a une conversion à faire. De même, le circuit d'interfaçage électrique peut s'occuper de la conversion des signaux numériques vers de l'analogique. L'écran peut avoir une entrée analogique, surtout s'il est assez ancien. Les anciens écrans CRT ne comprenaient que des données analogiques et pas le binaire, alors que c'est l'inverse pour la carte graphique, ce qui fait que le circuit d'interfaçage devait faire la conversion. La conversion était réalisée par un circuit qui traduit des données numériques (ici, du binaire) en données analogiques : le '''convertisseur numérique-analogique''' ou DAC (''Digital-to-Analogue Converter''). Au tout début, le circuit d’interfaçage était un DAC combiné avec des circuits annexes, ce qu'on appelle un RAMDAC (''Random Access Memory Digital-to-Analog Converter''). De nos jours, les écrans comprennent le binaire sous réserve qu'il soit codé suivant le standard adapté et les cartes graphiques n'ont plus besoin de RAMDAC. Il y a peu à dire sur les circuits d'interfaçage. Leur conception et leur fonctionnement dépendent beaucoup du standard utilisé. Sans compter qu'expliquer leur fonctionnement demande de faire de l'électronique pure et dure, ce qui est rarement agréable pour le commun des mortels. Par contre, étudier le circuit de contrôle et la mémoire vidéo est beaucoup plus intéressant. Plusieurs chapitres seront dédiés à leur fonctionnement. Mais parlons maintenant des GPU modernes et passons à la section suivante. ===Un historique rapide des cartes d’affichage=== Les cartes d'affichages sont opposées aux cartes accélératrices 2D et 3D, qui permettent de décharger le processeur d'une partie du rendu 2D/3D. Pour cela, elles intègrent des circuits spécialisés. Vous imaginez peut-être que les cartes d'affichage sont apparues en premier, puis qu'elles ont gagné en puissance et en fonctionnalités pour devenir d'abord des cartes accélératrices 2D, puis des cartes 3D. C'est une suite assez logique, intuitive. Et ce n'est pas du tout ce qui s'est passé ! Les cartes d'affichage pures, sans rendu 2D, sont une invention des premiers PC. Elles sont arrivées alors que les consoles de jeu avaient déjà des cartes hybrides entre carte d'affichage et cartes de rendu 2D depuis une bonne décennie. Sur les consoles de jeu ou les microordinateurs anciens, il n'y avait pas de cartes d'affichage séparée. A la place, le système vidéo d'un ordinateur était un ensemble de circuits soudés sur la carte mère. Les consoles de jeu, ainsi que les premiers micro-ordinateurs, avaient une configuration fixée une fois pour toute et n'étaient pas upgradables. Mais avec l'arrivée de l'IBM PC, les cartes d’affichages se sont séparées de la carte mère. Leurs composants étaient soudés sur une carte qu'on pouvait clipser et détacher de la carte mère si besoin. Et c'est ainsi que l'on peut actuellement changer la carte graphique d'un PC, alors que ce n'est pas le cas sur une console de jeu. La différence entre les deux se limite cependant à cela. Les composant d'une carte d'affichage ou d'une console de jeu sont globalement les mêmes. Aussi, dans ce qui suit, nous parlerons de carte d'affichage pour désigner cet ensemble de circuits, peu importe qu'il soit soudé à la carte mère ou placé sur une carte d’affichage séparée. C'est un abus de langage qu'on ne retrouvera que dans ce cours. ===Les différents types de cartes d'affichage=== Dans la suite du cours, nous allons voir que toutes les cartes d'affichage ne fonctionnent pas de la même manière. Et ces différences font qu'on peut les classer en plusieurs types distincts. Leur classement s'explique par un fait assez simple : une image prend beaucoup de mémoire ! Par exemple, prenons le cas d'une image en niveaux de gris d'une résolution de 320 par 240 pixels, chaque pixel étant codé sur un octet. L'image prend alors 76800 octets, soit environ 76 kiloctets. Mine de rien, cela fait beaucoup de mémoire ! Et si on ajoute le support de la couleur, cela triple, voire quadruple la taille de l'image. Les cartes graphiques récentes ont assez de mémoire pour stocker l'image à afficher. Une partie de la mémoire vidéo est utilisée pour mémoriser l'image à afficher. La portion en question s'appelle le ''framebuffer'', '''tampon d'image''' en français. Il s'agit là d'une solution très simple, mais qui demande une mémoire vidéo de grande taille. Les systèmes récents peuvent se le permettre, mais les tout premiers ordinateurs n'avaient pas assez de mémoire vidéo. Les cartes d'affichages devaient se débrouiller avec peu de mémoire, impossible de mémoriser l'image à afficher entièrement. Pour compenser cela, les cartes d'affichage anciennes utilisaient diverses optimisations assez intéressantes. La première d'entre elle utilise pour cela le fonctionnement des anciens écrans CRT, qui affichaient l'image ligne par ligne. Pour rappel, l'image a afficher à l'écran a une certaine résolution : 320 pixels pour 240 pixels, par exemple. Pour l'écran CRT, l'image est composée de plusieurs lignes. Par exemple, pour une résolution de 640 par 480, l'image est découpée en 480 lignes, chacune faisant 640 pixels de long. L'écran est conçu pour qu'on lui envoie les lignes les unes après les autres, avec une petite pause entre l'affichage/envoi de deux lignes. Précisons que les écrans LCD ont abandonné ce mode de fonctionnement. L'idée est alors la suivante : la mémoire vidéo ne mémorise que la ligne en cours d'affichage par l'écran. Le processeur met à jour la mémoire vidéo entre l'affichage de deux lignes. La mémoire vidéo n'est alors pas un tampon d'image, mais un '''tampon de ligne'''. Le défaut de cette technique est qu'elle demande que le processeur et la carte d'affichage soient synchronisés, de manière à ce que les lignes soient mises à jour au bon moment. L'avantage est que la quantité de mémoire vidéo nécessaire est divisée par un facteur 100, voire plus, égal à la résolution verticale (le nombre de lignes). Une autre méthode, appelée le '''rendu en tiles''', est formellement une technique de compression d'image particulière. L'image à afficher est stockée sous un format compressé en mémoire vidéo, mais est décompressée pixel par pixel lors de l'affichage. Il nous est difficile de décrire cette technique maintenant, mais un chapitre entier sera dédié à cette technique. Le chapitre en question abordera une technique similaire, appelée le rendu en mode texte, qui servira d'introduction propédeutique. Le rendu en tiles et l'usage d'un tampon ligne sont deux optimisations complémentaires. Il est ainsi possible d'utiliser soit l'une, soit l'autre, soit les deux. En clair, cela donne quatre types de cartes d'affichage distincts : * les cartes d'affichage à tampon d'image ; * les cartes à tampon d'images en rendu à tiles ; * les cartes d'affichage à tampon de ligne ; * les cartes d'affichage à tampon de ligne en rendu à tiles. {|class="wikitable" |- ! ! Rendu normal ! Rendu à tile |- ! Tampon d'image | Cartes graphiques post-années 90, standard VGA sur PC | Consoles de jeu 8 bits et 16 bits, standards CGA, MGA |- ! Tampon de ligne | Consoles de jeu ATARI 2600 et postérieures | Console de jeu néo-géo |} Lez prochains chapitres porteront surtout sur les cartes d'affichages à tampon d'image, plus simples à, expliquer. Deux chapitres seront dédiés respectivement aux cartes à rendu en tile, et aux cartes à tampon de ligne. ==Les cartes graphiques actuelles sont très complexes== Les cartes graphiques actuelles sont des cartes d'affichage améliorées auxquelles on a ajouté des circuits annexes, afin de leur donner des capacités de calcul pour le rendu 2D et/ou 3D, mais elles n'en restent pas moins des cartes d'affichages. La seule différence est que le processeur n’envoie pas une image à la mémoire vidéo, mais que l'image à afficher est calculée par la carte graphique 2D/3D. Les calculs autrefois effectués sur le CPU sont donc déportés sur la carte graphique. Si vous analysez une carte graphique récente, vous verrez que les circuits des cartes d'affichage sont toujours là, bien que noyés dans des circuits de rendu 2D/3D. On retrouve une mémoire vidéo, une interface écran, un circuit d'interface avec le bus, un ''Video Display Controler''. L'interface écran est par contre fusionnée avec le ''Video Display Controler''. Mais à ces circuits d'affichage, sont ajoutés un '''GPU''' (''Graphic Processing Unit''), qui s'occupe du rendu 3D, du rendu 2D, mais aussi d'autres fonctions comme du décodage de fichiers vidéos. [[File:Architecture d'une carte graphique avec un GPU.png|centre|vignette|upright=2|Architecture d'une carte graphique avec un GPU]] ===L'intérieur d'un GPU=== Le GPU est un composant assez complexe, surtout sur les cartes graphiques modernes. Il regroupe plusieurs circuits aux fonctions distinctes. * Un '''''Video Display controler''''' est toujours présent, mais ne sera pas représenté dans ce qui suit. * Des '''circuit de rendu 2D''' séparés peuvent être présents, mais sont la plupart du temps intégrés au VDC. * Les '''circuits de rendu 3D''' s'occupent du rendu 3D. * Les '''circuits de décodage vidéo''', pour améliorer la performance du visionnage de vidéos. Les trois circuits précédents sont gouvernés par un '''processeur de commande''', un circuit assez difficile à décrire. Pour le moment, disons qu'il s'occupe de répartir le travail entre les différents circuits précédents. Le processeur de commande reçoit du travail à faire, envoyé par le CPU via le bus, et le redistribue dans les trois circuits précédents. Par exemple, si on lui envoie une vidéo encodée en H264, il envoie le tout au circuit vidéo. De plus, il le configure pour qu'il la décode correctement : il dit au circuit que c'est une vidéo encodée en H264, afin que le circuit sache comment la décoder. Ce genre de configuration est aussi présente sur les circuits de rendu 2D et 3D, bien qu'elle soit plus compliquée. [[File:Microarchitecture simplifiée d'un GPU.png|centre|vignette|upright=2|Microarchitecture simplifiée d'un GPU]] Un GPU contient aussi un contrôleur mémoire, qui est une interface entre le GPU et la mémoire vidéo. Interface électrique, car GPU et mémoire n'utilisent pas les mêmes tensions et qu'en plus, leur interconnexion demande de gérer pas mal de détails purement électriques. Mais aussi interface de communication, car communiquer entre mémoire vidéo et GPU demande de faire pas mal de manipulations, comme gérer l'adressage et bien d'autres choses qu'on ne peut pas encore détailler ici. Un GPU contient aussi d'autres circuits annexes, comme des circuits pour gérer la consommation électrique, un BIOS vidéo, etc. L'interface écran et l'interface avec le bus sont parfois intégrées au GPU. [[File:Generic block diagram of a GPU.svg|centre|vignette|upright=3|Architecture d'une carte graphique moderne.]] ===Un historique simplifié des pipelines 2D/3D/vidéo=== Avant les années 90, les cartes graphiques des ordinateurs personnels et des consoles de jeux se résumaient à des circuits d'accélération 2D, elles n'avaient pas de décodeurs vidéos ou de circuits de rendu 3D. C'est dans les années 90 qu'elles ont commencé à incorporer des circuits d'accélération 3D. Puis, après les années 2000-2010, elles ont commencé à intégrer des circuits de décodage vidéo, aux alentours des années 2010. En parallèle, les circuits de rendu 2D ont progressivement été réduits puis abandonnés. Les circuits de rendu 2D sont des circuits qui ne sont pas programmables, mais qu'on peut configurer. On dit aussi que ce sont des '''circuits fixes'''. Ils sont opposés aux circuits programmables, basés sur des processeurs. Les circuits de rendu 3D étaient initialement des circuits fixes eux aussi, mais sont devenus de plus en plus programmables avec le temps. Les GPU d'après les années 2000 utilisent un mélange de circuits programmables et fixes assez variable. Nous reviendrons là-dessus dans un chapitre dédié. [[File:Microarchitecture globale d'un GPU.png|centre|vignette|upright=2|Microarchitecture globale d'un GPU]] Pour les circuits de décodage vidéo, les choses sont assez complexes. Initialement, ils s'agissait de circuits fixes, qu'on pouvait programmer. Un GPU de ce type est illustré ci-dessus. Mais de nos jours, les calculs de décodage vidéo sont réalisés sur les processeurs de shaders. Les circuits de rendu 3D et de décodage vidéo ont chacun des circuits fixes dédiés, mais partagent des processeurs. [[File:GPU avec processeurs de shaders partagés entre rendu 3D et décodage vidéo.png|centre|vignette|upright=2|GPU avec processeurs de shaders partagés entre rendu 3D et décodage vidéo]] Les cinq prochains chapitres vont parler des cartes d'affichage et des cartes accélératrices 2D, les deux étant fortement liées. C'est seulement dans les chapitres qui suivront que nous parlerons des cartes 3D. Les cartes 3D sont composées d'une carte d'affichage à laquelle on a rajouté des circuits de calcul, ce qui fait qu'il est préférable de faire ainsi : on voit ce qui est commun entre les deux d'abord, avant de voir le rendu 3D ensuite. De plus, le rendu 3D est plus complexe que l'affichage d'une image à l'écran, ce qui fait qu'il vaut mieux voir cela après. {{NavChapitre | book=Les cartes graphiques | next=Le Video Display Controler | nextText=Le Video Display Controler }}{{autocat}} 7pa865hjed7f3q92ny7njzkeovwzmqh 745910 745909 2025-07-04T11:53:18Z Mewtow 31375 /* Un PC avec plusieurs GPU : la commutation de GPU */ 745910 wikitext text/x-wiki Les cartes graphiques sont des cartes qui communiquent avec l'écran, pour y afficher des images. Les cartes graphiques modernes incorporent aussi des circuits de calcul pour accélérer du rendu 2D ou 3D. Dans ce chapitre, nous allons faire une introduction et expliquer ce qu'est une carte graphique et surtout : nous allons voir ce qu'il y a à l'intérieur, du moins dans les grandes lignes. ==Les cartes graphiques dédiées, intégrées et soudées== Vous avez sans doute déjà démonté votre PC pour en changer la carte graphique, vous savez sans doute à quoi elle ressemble. Sur les PC modernes, il s'agit d'un composant séparé, qu'on branche sur la carte mère, sur un port spécialisé. Du moins, c'est le cas si vous avez un PC fixe assez puissant. Mais il y a deux autres possibilités. [[File:PX7800 GTX (557505323).jpg|centre|vignette|Carte graphique dédiée PX 7800 GTX I]] La première est celle où la carte graphique est directement intégrée dans le processeur de la machine ! C'est quelque chose qui se fait depuis les années 2000-2010, avec l'amélioration de la technologie et la miniaturisation des transistors. Il est possible de mettre tellement de transistors sur une puce de silicium que les concepteurs de processeur en ont profité pour mettre une carte graphique peut puissante dans le processeur. Une autre possibilité, surtout utilisée sur les consoles de jeu et les PC portables, est celle où la carte graphique est composée de circuits soudés à la carte mère. Pour résumer, il faut distinguer trois types de cartes graphiques différentes : * Les '''cartes graphiques dédiées''', séparées dans une carte d'extension qu'on doit connecter à la carte mère via un connecteur dédié. * Les '''cartes graphiques intégrées''', qui font partie du processeur. * Les '''cartes graphiques soudées''' à la carte mère. Vous avez sans doute vu qu'il y a une grande différence de performance entre une carte graphique dédiée et une carte graphique intégrée. La raison est simplement que les cartes graphiques intégrées ont moins de transistors à leur disposition, ce qui fait qu'elles contiennent moins de circuits de calcul. Les cartes graphiques dédiées et soudées n'ont pas de différences de performances notables. Les cartes soudées des PC portables sont généralement moins performantes car il faut éviter que le PC chauffe trop, vu que la dissipation thermique est moins bonne avec un PC portable (moins de gros ventilos), ce qui demande d'utiliser une carte graphique moins puissante. Mais les cartes soudées des consoles de jeu n'ont pas ce problème : elles sont dans un boitier bien ventilés, on peut en utiliser une très puissante. ===Un PC avec plusieurs GPU : la commutation de GPU=== De nos jours, il y a de très fortes chances que votre ordinateur intègre plusieurs cartes graphique, peu importe que ce soit un PC portable ou fixe. Tous les PC ont une carte graphique intégrée, de faible performance, qui consomme peu d'énergie/électricité. Et si je dis presque tous, c'est parce que tous les processeurs commerciaux modernes incorporent une carte graphique intégrée. Le marché du processeur grand public est ainsi, seuls quelques processeurs dédiés aux serveurs n'ont pas de carte graphique intégrée. Et en plus de la carte intégrée, une bonne partie des PC intègrent aussi soit une carte dédiée, soit une carte soudée. Soudée sur les PC portables, dédiée sur les PC fixe. Dans le passé, il était possible de mettre plusieurs cartes graphiques dédiées dans un même PC, mais avec des conditions drastiques. ATI/AMD et NVIDIA avaient ajouté des fonctionnalités de multi-GPU, qui permettaient à deux GPU de travailler ensemble, afin de presque doubler les performances. Mais cela ne marchait qu'avec deux GPU NVIDIA ou deux GPU ATI/AMD, utiliser deux GPU de deux marques différentes ne marchait pas. Un chapitre entier sera dédié à ces techniques, mais nous n'en parlerons pas ici, car elles sont tombées en désuétude, aucun GPU grand public ne supporte ces technologies. S'il y a deux cartes graphiques, cela ne signifie pas que les deux sont utilisées en même temps. En effet, selon les circonstances, le PC va privilégier l'une ou l'autre. Dans les années 2010, le choix se faisait dans le BIOS : une des deux carte graphique était désactivée pour de bon, typiquement la carte intégrée. Les PC avec une carte dédiée désactivaient la carte intégrée dans le processeur, pour éviter tout conflit entre les deux cartes. De nos jours, les deux sont utilisables, juste pas en même temps. Le système d'exploitation, Windows ou linux, utilise la carte intégrée, soit sur la carte dédiée, suivant les besoins. La carte dédiée est utilisée quand on a besoin de performance, mais elle consomme beaucoup d'énergie/électricité et chauffe plus. La carte graphique intégrée fait l'inverse : ses performances sont basses, mais elle consomme très peu et chauffe moins. La carte dédiée est donc utilisée quand on a besoin de performance, l'intégrée est utilisée quand elle suffit, afin de faire des économies. Prenons l'exemple d'un jeu vidéo : un jeu ancien et peu gourmand sera exécuté sur la carte intégrée, alors qu'un jeu récent/gourmand sera exécuté sur la carte dédiée. Le rendu du bureau de Windows/linux est réalisé par la carte graphique intégrée, pour économiser de l'énergie. [[File:Rendering Process.png|centre|vignette|upright=2|Rendering Process]] Prenons un PC fixe avec deux cartes graphiques, une intégrée et une dédiée. En général, il y a deux connecteurs pour l'écran, un qui est relié à la carte graphique intégrée, un autre qui est sur la carte dédiée proprement dite. Suivant là où vous brancherez l'écran, vous n'utiliserez pas la même carte graphique. Le système d'exploitation se charge d'envoyer les images à afficher à la carte graphique adéquate. Sur un PC portable ''gaming'', les choses sont différentes. Il n'y a qu'un seul connecteur pour l'écran, pas deux. Et dans ce cas, il y a deux possibilités. La première est la plus simple : une seule carte graphique est connectée à l'écran, généralement la carte intégrée. Si la carte dédiée est utilisée, les images qu'elle calcule sont envoyées à la carte intégrée pour ensuite être affichées à l'écran. On passe par un intermédiaire, mais le câblage est plus simple. L'autre solution fait le compromis inverse. Les deux cartes graphiques sont reliées à ce connecteur, par l'intermédiaire d'un circuit multiplexeur. Le circuit multiplexeur reçoit les images à afficher de la part des deux cartes graphiques et choisit l'une d'entre elle. C'est la solution la plus performante, car la carte dédiée peut afficher directement ses images à l'écran, sans avoir à les envoyer à la carte intégrée. Mais elle complexifie le câblage et demande d'ajouter un circuit multiplexeur, ce qui n'est pas gratuit. ==Les cartes d'affichage et leur architecture== Vous vous demandez comment est-ce possible qu'une carte graphique soit soudée ou intégrée dans un processeur. La raison est que les trois types de cartes graphiques sont très similaires, elles sont composées des mêmes types de composants, ce qu'il y a à l'intérieur est globalement le même, comme on va le voir dans ce qui suit. Au tout début de l'informatique, le rendu graphique était pris en charge par le processeur. Il calculait l'image à afficher et l'envoyait à l'écran, pixel par pixel. Le problème est que le processeur devait se synchroniser avec l'écran, pour envoyer les pixels au bon moment. Pour simplifier la vie des programmeurs, les fabricants de matériel ont inventé des cartes vidéo. Avec celles-ci, le processeur calcule l'image à envoyer à l'écran et la transmet à la carte d'affichage, sans avoir à se synchroniser avec l'écran. L'avantage est que le processeur n'a pas à se synchroniser avec l'écran, juste à envoyer l'image à une carte d'affichage. Les cartes d'affichage ne géraient pas le rendu 3D. Le processeur calculait une image, la copiait dans la mémoire vidéo, puis la carte d'affichage l'envoyait à l'écran au bon moment. Il n'y avait pas de circuits de calcul graphique, ni de circuits de décodage vidéo. Juste de quoi afficher une image à l'écran. Et mine de rien, il est intéressant d'étudier de telles cartes graphiques anciennes. De telles cartes graphiques sont ce que j'ai décidé d'appeler des '''cartes d'affichage'''. ===L'intérieur d'une carte d'affichage=== Une carte d'affichage contient plusieurs sous-circuits, chacun dédié à une fonction précise. * La '''mémoire vidéo''' est une mémoire RAM intégrée à la carte graphique, qui a des fonctions multiples. * L''''interface écran''', ou ''Display interface'', regroupe les connecteurs et tous les circuits permettant d'envoyer l'image à l'écran. * Le '''circuit d'interface avec le bus''' existe uniquement sur les cartes dédiées et éventuellement sur quelques cartes soudées. Il s'occupe des transmissions sur le bus PCI/AGP/PCI-Express, le connecteur qui relie la carte mère et la carte graphique. * Un circuit de contrôle qui commande le tout, appelé le '''''Video Display Controler'''''. [[File:Carte d'affichage - architecture.png|centre|vignette|upright=2|Carte d'affichage - architecture.]] La mémoire vidéo mémorise l'image à afficher, les deux circuits d'interfaçage permettent à la carte d'affichage de communiquer respectivement avec l'écran et le reste de l'ordinateur, le ''Video Display Controler'' commande les autres circuits. Le ''Video Display Controler'' sert de chef d'orchestre pour un orchestre dont les autres circuits seraient les musiciens. Le circuit de contrôle était appelé autrefois le CRTC, car il commandait des écrans dit CRT, mais ce n'est plus d'actualité de nos jours. La carte graphique communique via un bus, un vulgaire tas de fils qui connectent la carte graphique à la carte mère. Les premières cartes graphiques utilisaient un bus nommé ISA, qui fût rapidement remplacé par le bus PCI, plus rapide, lui-même remplacé par le bus AGP, puis le bus PCI-Express. Ce bus est géré par un contrôleur de bus, un circuit qui se charge d'envoyer ou de réceptionner les données sur le bus. Les circuits de communication avec le bus permettent à l'ordinateur de communiquer avec la carte graphique, via le bus PCI-Express, AGP, PCI ou autre. Il contient quelques registres dans lesquels le processeur pourra écrire ou lire, afin de lui envoyer des ordres du style : j'envoie une donnée, transmission terminée, je ne suis pas prêt à recevoir les données que tu veux m'envoyer, etc. Il y a peu à dire sur ce circuit, aussi nous allons nous concentrer sur les autres circuits. Le circuit d'interfaçage écran est au minimum un circuit d’interfaçage électrique se contente de convertir les signaux de la carte graphique en signaux que l'on peut envoyer à l'écran. Il s'occupe notamment de convertir les tensions et courants : si l'écran demande des signaux de 5 Volts mais que la carte graphique fonctionne avec du 3,3 Volt, il y a une conversion à faire. De même, le circuit d'interfaçage électrique peut s'occuper de la conversion des signaux numériques vers de l'analogique. L'écran peut avoir une entrée analogique, surtout s'il est assez ancien. Les anciens écrans CRT ne comprenaient que des données analogiques et pas le binaire, alors que c'est l'inverse pour la carte graphique, ce qui fait que le circuit d'interfaçage devait faire la conversion. La conversion était réalisée par un circuit qui traduit des données numériques (ici, du binaire) en données analogiques : le '''convertisseur numérique-analogique''' ou DAC (''Digital-to-Analogue Converter''). Au tout début, le circuit d’interfaçage était un DAC combiné avec des circuits annexes, ce qu'on appelle un RAMDAC (''Random Access Memory Digital-to-Analog Converter''). De nos jours, les écrans comprennent le binaire sous réserve qu'il soit codé suivant le standard adapté et les cartes graphiques n'ont plus besoin de RAMDAC. Il y a peu à dire sur les circuits d'interfaçage. Leur conception et leur fonctionnement dépendent beaucoup du standard utilisé. Sans compter qu'expliquer leur fonctionnement demande de faire de l'électronique pure et dure, ce qui est rarement agréable pour le commun des mortels. Par contre, étudier le circuit de contrôle et la mémoire vidéo est beaucoup plus intéressant. Plusieurs chapitres seront dédiés à leur fonctionnement. Mais parlons maintenant des GPU modernes et passons à la section suivante. ===Un historique rapide des cartes d’affichage=== Les cartes d'affichages sont opposées aux cartes accélératrices 2D et 3D, qui permettent de décharger le processeur d'une partie du rendu 2D/3D. Pour cela, elles intègrent des circuits spécialisés. Vous imaginez peut-être que les cartes d'affichage sont apparues en premier, puis qu'elles ont gagné en puissance et en fonctionnalités pour devenir d'abord des cartes accélératrices 2D, puis des cartes 3D. C'est une suite assez logique, intuitive. Et ce n'est pas du tout ce qui s'est passé ! Les cartes d'affichage pures, sans rendu 2D, sont une invention des premiers PC. Elles sont arrivées alors que les consoles de jeu avaient déjà des cartes hybrides entre carte d'affichage et cartes de rendu 2D depuis une bonne décennie. Sur les consoles de jeu ou les microordinateurs anciens, il n'y avait pas de cartes d'affichage séparée. A la place, le système vidéo d'un ordinateur était un ensemble de circuits soudés sur la carte mère. Les consoles de jeu, ainsi que les premiers micro-ordinateurs, avaient une configuration fixée une fois pour toute et n'étaient pas upgradables. Mais avec l'arrivée de l'IBM PC, les cartes d’affichages se sont séparées de la carte mère. Leurs composants étaient soudés sur une carte qu'on pouvait clipser et détacher de la carte mère si besoin. Et c'est ainsi que l'on peut actuellement changer la carte graphique d'un PC, alors que ce n'est pas le cas sur une console de jeu. La différence entre les deux se limite cependant à cela. Les composant d'une carte d'affichage ou d'une console de jeu sont globalement les mêmes. Aussi, dans ce qui suit, nous parlerons de carte d'affichage pour désigner cet ensemble de circuits, peu importe qu'il soit soudé à la carte mère ou placé sur une carte d’affichage séparée. C'est un abus de langage qu'on ne retrouvera que dans ce cours. ===Les différents types de cartes d'affichage=== Dans la suite du cours, nous allons voir que toutes les cartes d'affichage ne fonctionnent pas de la même manière. Et ces différences font qu'on peut les classer en plusieurs types distincts. Leur classement s'explique par un fait assez simple : une image prend beaucoup de mémoire ! Par exemple, prenons le cas d'une image en niveaux de gris d'une résolution de 320 par 240 pixels, chaque pixel étant codé sur un octet. L'image prend alors 76800 octets, soit environ 76 kiloctets. Mine de rien, cela fait beaucoup de mémoire ! Et si on ajoute le support de la couleur, cela triple, voire quadruple la taille de l'image. Les cartes graphiques récentes ont assez de mémoire pour stocker l'image à afficher. Une partie de la mémoire vidéo est utilisée pour mémoriser l'image à afficher. La portion en question s'appelle le ''framebuffer'', '''tampon d'image''' en français. Il s'agit là d'une solution très simple, mais qui demande une mémoire vidéo de grande taille. Les systèmes récents peuvent se le permettre, mais les tout premiers ordinateurs n'avaient pas assez de mémoire vidéo. Les cartes d'affichages devaient se débrouiller avec peu de mémoire, impossible de mémoriser l'image à afficher entièrement. Pour compenser cela, les cartes d'affichage anciennes utilisaient diverses optimisations assez intéressantes. La première d'entre elle utilise pour cela le fonctionnement des anciens écrans CRT, qui affichaient l'image ligne par ligne. Pour rappel, l'image a afficher à l'écran a une certaine résolution : 320 pixels pour 240 pixels, par exemple. Pour l'écran CRT, l'image est composée de plusieurs lignes. Par exemple, pour une résolution de 640 par 480, l'image est découpée en 480 lignes, chacune faisant 640 pixels de long. L'écran est conçu pour qu'on lui envoie les lignes les unes après les autres, avec une petite pause entre l'affichage/envoi de deux lignes. Précisons que les écrans LCD ont abandonné ce mode de fonctionnement. L'idée est alors la suivante : la mémoire vidéo ne mémorise que la ligne en cours d'affichage par l'écran. Le processeur met à jour la mémoire vidéo entre l'affichage de deux lignes. La mémoire vidéo n'est alors pas un tampon d'image, mais un '''tampon de ligne'''. Le défaut de cette technique est qu'elle demande que le processeur et la carte d'affichage soient synchronisés, de manière à ce que les lignes soient mises à jour au bon moment. L'avantage est que la quantité de mémoire vidéo nécessaire est divisée par un facteur 100, voire plus, égal à la résolution verticale (le nombre de lignes). Une autre méthode, appelée le '''rendu en tiles''', est formellement une technique de compression d'image particulière. L'image à afficher est stockée sous un format compressé en mémoire vidéo, mais est décompressée pixel par pixel lors de l'affichage. Il nous est difficile de décrire cette technique maintenant, mais un chapitre entier sera dédié à cette technique. Le chapitre en question abordera une technique similaire, appelée le rendu en mode texte, qui servira d'introduction propédeutique. Le rendu en tiles et l'usage d'un tampon ligne sont deux optimisations complémentaires. Il est ainsi possible d'utiliser soit l'une, soit l'autre, soit les deux. En clair, cela donne quatre types de cartes d'affichage distincts : * les cartes d'affichage à tampon d'image ; * les cartes à tampon d'images en rendu à tiles ; * les cartes d'affichage à tampon de ligne ; * les cartes d'affichage à tampon de ligne en rendu à tiles. {|class="wikitable" |- ! ! Rendu normal ! Rendu à tile |- ! Tampon d'image | Cartes graphiques post-années 90, standard VGA sur PC | Consoles de jeu 8 bits et 16 bits, standards CGA, MGA |- ! Tampon de ligne | Consoles de jeu ATARI 2600 et postérieures | Console de jeu néo-géo |} Lez prochains chapitres porteront surtout sur les cartes d'affichages à tampon d'image, plus simples à, expliquer. Deux chapitres seront dédiés respectivement aux cartes à rendu en tile, et aux cartes à tampon de ligne. ==Les cartes graphiques actuelles sont très complexes== Les cartes graphiques actuelles sont des cartes d'affichage améliorées auxquelles on a ajouté des circuits annexes, afin de leur donner des capacités de calcul pour le rendu 2D et/ou 3D, mais elles n'en restent pas moins des cartes d'affichages. La seule différence est que le processeur n’envoie pas une image à la mémoire vidéo, mais que l'image à afficher est calculée par la carte graphique 2D/3D. Les calculs autrefois effectués sur le CPU sont donc déportés sur la carte graphique. Si vous analysez une carte graphique récente, vous verrez que les circuits des cartes d'affichage sont toujours là, bien que noyés dans des circuits de rendu 2D/3D. On retrouve une mémoire vidéo, une interface écran, un circuit d'interface avec le bus, un ''Video Display Controler''. L'interface écran est par contre fusionnée avec le ''Video Display Controler''. Mais à ces circuits d'affichage, sont ajoutés un '''GPU''' (''Graphic Processing Unit''), qui s'occupe du rendu 3D, du rendu 2D, mais aussi d'autres fonctions comme du décodage de fichiers vidéos. [[File:Architecture d'une carte graphique avec un GPU.png|centre|vignette|upright=2|Architecture d'une carte graphique avec un GPU]] ===L'intérieur d'un GPU=== Le GPU est un composant assez complexe, surtout sur les cartes graphiques modernes. Il regroupe plusieurs circuits aux fonctions distinctes. * Un '''''Video Display controler''''' est toujours présent, mais ne sera pas représenté dans ce qui suit. * Des '''circuit de rendu 2D''' séparés peuvent être présents, mais sont la plupart du temps intégrés au VDC. * Les '''circuits de rendu 3D''' s'occupent du rendu 3D. * Les '''circuits de décodage vidéo''', pour améliorer la performance du visionnage de vidéos. Les trois circuits précédents sont gouvernés par un '''processeur de commande''', un circuit assez difficile à décrire. Pour le moment, disons qu'il s'occupe de répartir le travail entre les différents circuits précédents. Le processeur de commande reçoit du travail à faire, envoyé par le CPU via le bus, et le redistribue dans les trois circuits précédents. Par exemple, si on lui envoie une vidéo encodée en H264, il envoie le tout au circuit vidéo. De plus, il le configure pour qu'il la décode correctement : il dit au circuit que c'est une vidéo encodée en H264, afin que le circuit sache comment la décoder. Ce genre de configuration est aussi présente sur les circuits de rendu 2D et 3D, bien qu'elle soit plus compliquée. [[File:Microarchitecture simplifiée d'un GPU.png|centre|vignette|upright=2|Microarchitecture simplifiée d'un GPU]] Un GPU contient aussi un contrôleur mémoire, qui est une interface entre le GPU et la mémoire vidéo. Interface électrique, car GPU et mémoire n'utilisent pas les mêmes tensions et qu'en plus, leur interconnexion demande de gérer pas mal de détails purement électriques. Mais aussi interface de communication, car communiquer entre mémoire vidéo et GPU demande de faire pas mal de manipulations, comme gérer l'adressage et bien d'autres choses qu'on ne peut pas encore détailler ici. Un GPU contient aussi d'autres circuits annexes, comme des circuits pour gérer la consommation électrique, un BIOS vidéo, etc. L'interface écran et l'interface avec le bus sont parfois intégrées au GPU. [[File:Generic block diagram of a GPU.svg|centre|vignette|upright=3|Architecture d'une carte graphique moderne.]] ===Un historique simplifié des pipelines 2D/3D/vidéo=== Avant les années 90, les cartes graphiques des ordinateurs personnels et des consoles de jeux se résumaient à des circuits d'accélération 2D, elles n'avaient pas de décodeurs vidéos ou de circuits de rendu 3D. C'est dans les années 90 qu'elles ont commencé à incorporer des circuits d'accélération 3D. Puis, après les années 2000-2010, elles ont commencé à intégrer des circuits de décodage vidéo, aux alentours des années 2010. En parallèle, les circuits de rendu 2D ont progressivement été réduits puis abandonnés. Les circuits de rendu 2D sont des circuits qui ne sont pas programmables, mais qu'on peut configurer. On dit aussi que ce sont des '''circuits fixes'''. Ils sont opposés aux circuits programmables, basés sur des processeurs. Les circuits de rendu 3D étaient initialement des circuits fixes eux aussi, mais sont devenus de plus en plus programmables avec le temps. Les GPU d'après les années 2000 utilisent un mélange de circuits programmables et fixes assez variable. Nous reviendrons là-dessus dans un chapitre dédié. [[File:Microarchitecture globale d'un GPU.png|centre|vignette|upright=2|Microarchitecture globale d'un GPU]] Pour les circuits de décodage vidéo, les choses sont assez complexes. Initialement, ils s'agissait de circuits fixes, qu'on pouvait programmer. Un GPU de ce type est illustré ci-dessus. Mais de nos jours, les calculs de décodage vidéo sont réalisés sur les processeurs de shaders. Les circuits de rendu 3D et de décodage vidéo ont chacun des circuits fixes dédiés, mais partagent des processeurs. [[File:GPU avec processeurs de shaders partagés entre rendu 3D et décodage vidéo.png|centre|vignette|upright=2|GPU avec processeurs de shaders partagés entre rendu 3D et décodage vidéo]] Les cinq prochains chapitres vont parler des cartes d'affichage et des cartes accélératrices 2D, les deux étant fortement liées. C'est seulement dans les chapitres qui suivront que nous parlerons des cartes 3D. Les cartes 3D sont composées d'une carte d'affichage à laquelle on a rajouté des circuits de calcul, ce qui fait qu'il est préférable de faire ainsi : on voit ce qui est commun entre les deux d'abord, avant de voir le rendu 3D ensuite. De plus, le rendu 3D est plus complexe que l'affichage d'une image à l'écran, ce qui fait qu'il vaut mieux voir cela après. {{NavChapitre | book=Les cartes graphiques | next=Le Video Display Controler | nextText=Le Video Display Controler }}{{autocat}} in0zp14ikkaowti0pgewuse2ob6qy5j Fonctionnement d'un ordinateur/Le modèle mémoire : alignement et boutisme 0 69028 745875 740990 2025-07-03T17:02:26Z Mewtow 31375 /* L'alignement mémoire */ 745875 wikitext text/x-wiki Dans ce chapitre, on va parler de l'''endianess'' du processeur et de son alignement mémoire. Concrètement, on va s'intéresser à la façon dont le processeur repartit en mémoire les octets des données qu'il manipule. Ces deux paramètres sont sûrement déjà connus de ceux qui ont une expérience de la programmation assez conséquente. Les autres apprendront ce que c'est dans ce chapitre. Pour simplifier, ils sont à prendre en compte quand on échange des données entre registres et mémoire RAM. ==La différence entre mots et bytes== Avant toute chose, nous allons reparler rapidement de la différence entre un byte et un mot. Les deux termes sont généralement polysémiques, avec plusieurs sens. Aussi, définir ce qu'est un mot est assez compliqué. Voyons les différents sens de ce terme, chacun étant utile dans un contexte particulier. Dans les chapitres précédents, nous avons parlé des mots mémoire, à savoir des blocs de mémoire dont le nombre de bits correspond à la largeur du bus mémoire. Le premier sens possible est donc la quantité de données que l'on peut transférer entre CPU et RAM en un seul cycle d'horloge. Il s'agit d'une définition basée sur les transferts réels entre processeur et mémoire. Le terme que nous avons utilisé pour cette définition est : '''mot mémoire'''. Remarquez la subtile différence entre les termes "mot" et "mot mémoire" : le second terme indique bien qu'il s'agit de quelque de lié à la mémoire, pas le premier. Les deux ne sont pas confondre, et nous allons voir pourquoi. La définition précédente ne permet pas de définir ce qu'est un byte et un mot, vu que la distinction se fait au niveau du processeur, au niveau du jeu d'instruction. Précisément, elle intervient au niveau des instructions d'accès mémoire, éventuellement de certaines opérations de traitement de données. Dans ce qui va suivre, nous allons faire la différence entre les architectures à mot, à byte, et à chaines de caractères. Voyons dans le détail ces histoires de mots, de bytes, et autres. ===Les architectures à adressage par mot=== Au tout début de l'informatique, sur les anciens ordinateurs datant d'avant les années 80, les processeurs géraient qu'une seule taille pour les données. Par exemple, de tels processeurs ne géraient que des données de 8 bits, pas autre chose. Les données en question était des '''mots'''. Aux tout début de l'informatique, certaines machines utilisaient des mots de 3, 4, 5, 6 7, 13, 17, 23, 36 ou 48 bits. Pour donner quelques exemples, l'ordinateur ERA 1103 utilisait des mots de 36-bits, tout comme le PDP-10, et ne gérait pas d'autre taille pour les données : c'était 36 bits pour tout le monde. Les processeurs en question ne disposaient que d'une seule instruction de lecture/écriture, qui lisait/écrivait des mots entiers. On pouvait ainsi lire ou écrire des paquets de 3, 4, 5, 6 7, 13, 17, 23, 36 ou 48 bits. Les registres du processeur avaient généralement la même taille qu'un mot, ce qui fait que les processeurs de l'époque avaient des registres de 4, 8, 12, 24, 26, 28, 31, 36, 48, voire 60 bits. Les mots en question sont en théorie à distinguer des mots mémoire, mais ce n'est pas souvent le cas en pratique. Les architectures à adressage par mot faisaient en sorte qu'un mot soit de la même taille qu'un mot mémoire. La mémoire était donc découpée en mots, chacun avait sa propre adresse. Par exemple, une mémoire de 64 kilo-mots contenait 65 536 mots, chacun contenant autant de bits qu'un mot. Les mots faisaient tous la même taille, qui variait suivant la mémoire ou le processeur utilisé. Chaque mot avait sa propre adresse, ce qui fait qu'on parlait d''''adressage par mot'''. Il n'y avait qu'une seule unité d'adressage, ce qui fait que le byte et le mot étaient la même chose sur de telles architectures. La distinction entre byte et mot est apparue après, sur des ordinateurs/processeurs différents. ===Les architectures à adressage par byte=== Par la suite, des processeurs ont permis d'adresser des données plus petites qu'un mot. Les processeurs en question disposent de plusieurs instructions de lecture/écriture, qui manipulent des blocs de mémoire de taille différente. Par exemple, il peut avoir une instruction de lecture pour lire 8 bits, une autre pour lire 16 bits, une autre 32, etc. Une autre possibilité est celle où le processeur dispose d'une instruction de lecture, qu'on peut configurer suivant qu'on veuille lire/écrire un octet, deux, quatre, huit. Dans ce cas, on peut faire une distinction entre '''''byte''''' et '''mot''' : le byte est la plus petite donnée, le mot est la plus grande. Par exemple, un processeur disposant d'instruction d'accès mémoire capables de lire/écrire 8 ou 16 bits sont dans ce cas. Le byte fait alors 8 bits, le mot en fait 16. La séparation entre byte et mot peut parfois se compléter avec des tailles intermédiaires. Par exemple, prenons un processeur qui dispose d'une instruction de lecture capable de lire soit 8 bits, soit 16 bits, soit 32 bits, soit 64 bits. Dans ce cas, le byte vaut 8 bits, le mot en fait 64, les autres tailles sont des intermédiaires. Pour résumer, un mot est la plus grande unité adressable par le processeur, un byte est la plus petite. En général, le byte fait 8 bits, un octet. Mais ça n'a pas toujours été le cas, pas mal de jeux d'instructions font exception. L'exemple le plus parlant est celui des processeurs décimaux, qui utilisaient des entiers codés en BCD mais ne géraient pas les entiers codés en binaire normal. De tels processeurs encodaient des nombres sous la forme d'une suite de chiffres décimaux, codés en BCD sur 4 bits. Ils avaient des bytes de 4 bits, voire de 5/6 bits pour les ordinateurs qui ajoutaient un bit de parité/ECC par chiffre décimal. D'autres architectures avaient un byte de 3 à 7 bits. La taille d'un mot mémoire est de plusieurs bytes : un mot mémoire contient un nombre entier de bytes. La norme actuelle est d'utiliser des bytes d'un octet (8 bits), avec des mots contenant plusieurs octets. Le nombre d'octets dans un mot est généralement une puissance de deux pour simplifier les calculs. Cette règle souffre évidemment d'exceptions, mais l'usage de mots qui ne sont pas des puissances de 2 posent quelques problèmes techniques en termes d’adressage, comme on le verra plus bas. Sur de telles architectures, il y a une adresse mémoire par byte, et non par mot, ce qui fait qu'on parle d''''adressage par byte'''. Tous les ordinateurs modernes utilisent l'adressage par byte. Concrètement, sur les processeurs modernes, chaque octet de la mémoire a sa propre adresse, peu importe la taille du mot utilisé par le processeur. Par exemple, les anciens processeurs x86 32 bits et les processeurs x86 64 bits utilisent tous le même système d'adressage, où chaque octet a sa propre adresse, la seule différence est que les adresses sont plus nombreuses. Avec un adressage par mot, on aurait eu autant d'adresses qu'avant, mais les mots seraient passés de 32 à 64 bits en passant au 64 bits. Les registres font encore une fois la même taille qu'un mot, bien qu'il existe quelques rares exceptions. Les processeurs à adressage par byte ont souvent plusieurs instructions de lecture/écriture, chacune pour une taille précise. Pour rendre cela plus concret, prenons le cas de l'instruction de lecture. Il y a au minimum une instruction de lecture qui lit un byte en mémoire, une autre qui lit un mot complet. Il y a souvent des instructions pour les tailles intermédiaires. Par exemple, un processeur 64 bit a des instructions pour lire 8 bits, une autre pour lire 16 bits, une autre pour en lire 32, et enfin une pour lire 64 bits. Idem pour les instructions d'écriture, et les autres instructions d'accès mémoire. ===Les architectures à adressage par mot de type hybrides=== Il a existé des architectures adressées par mot qui géraient des bytes, mais sans pour autant leur donner des adresses. Leur idée était que les transferts entre CPU et mémoire se faisaient par mots, mais les instructions de lecture/écriture pouvaient sélectionner un byte dans le mot. Une instruction d'accès mémoire devait alors préciser deux choses : l'adresse du mot à lire/écrire, et la position du byte dans le mot adressé. Par exemple, on pouvait demander à lire le mot à l'adresse 0x5F, et de récupérer uniquement le byte numéro 6. Il s'agit d'architectures adressables par mot car l'adresse identifie un mot, pas un byte. Les bytes en question n'avaient pas d'adresses en eux-mêmes, il n'y avait pas d'adressage par byte. La sélection des bytes se faisait dans le processeur : le processeur lisait des mots entiers, avant que le hardware du processeur sélectionne automatiquement le byte voulu. D'ailleurs, aucune de ces architectures ne supportait de mode d'adressage base+index ou base+offset pour sélectionner des bytes dans un mot. Elles supportaient de tels modes d'adressage pour un mot, pas pour les bytes. Pour faire la différence, nous parlerons de pseudo-byte dans ce qui suit, pour bien préciser que ce ne sont pas de vrais bytes. Un exemple est le PDP-6 et le PDP-10, qui avaient des instructions de lecture/écriture de ce type. Elles prenaient trois informations : l'adresse d'un mot, la position du pseudo-byte dans le mot, et enfin la taille d'un pseudo-byte ! L'adressage était donc très flexible, car on pouvait configurer la taille du pseudo-byte. Outre l'instruction de lecture LDB et celle d'écriture DPB, d'autres instructions permettaient de manipuler des pseudo-bytes. L'instruction IBP incrémentait le numéro du pseudo-byte, par exemple. ===Les architectures à mot de taille variable=== D'autres architectures codaient leurs nombres en utilisant un nombre variable de bytes ! Dit autrement, elles avaient des mots de taille variable, d'où leur nom d''''architectures à mots de taille variable'''. Il s'agit d'architectures qui codaient les nombres par des chaines de caractères terminées par un byte de terminaison. La grande majorité étaient des architectures décimales, à savoir des ordinateurs qui utilisaient des nombres encodés en BCD ou dans un encodage similaire. Les nombres étaient codés en décimal, mais chaque chiffre était encodé en binaire sur quelques bits, généralement 4 à 6 bits. Les bytes stockaient chacun un caractère, qui était utilisé pour encoder soit un chiffre décimal, soit un autre symbole comme un byte de terminaison. Un caractère faisait plus de 4 bits, vu qu'il fallait au minimum coder les chiffres BCD et des symboles supplémentaires. La taille d'un caractère était généralement de 5/6 bits. Un exemple est celui des IBM 1400 series, qui utilisaient des chaines de caractères séparées par deux bytes : un byte de ''wordmark'' au début, et un byte de ''record mark'' à la fin. Les caractères étaient des chiffres codés en BCD, chaque caractère était codé sur 6 bits. Les calculs se faisaient chiffre par chiffre, au rythme d'un chiffre utilisé comme opérande par cycle d'horloge. Le processeur passait automatiquement d'un chiffre au suivant pour chaque opérande. Chaque caractère/chiffre avait sa propre adresse, ce qui fait l'architecture est techniquement adressable par byte, alors que les mots correspondaient aux nombres de taille variable. ===La comparaison entre l'adressage par mot et par byte=== Plus haut, nous avons vu deux types d'adressage : par mot et par byte. Avec la première, ce sont les mots qui ont des adresses. Les bytes n'existent pas forcément sur de telles architectures. Si une gestion des bytes est présente, les instructions de lecture/écriture utilisent des adresses pour les mots, couplé à la position du byte dans le mot. Les lectures/écritures se font pas mots entiers. À l'opposé, sur les architectures adressées par byte, une adresse correspond à un byte et non à un mot. Les deux techniques font que l'usage des adresses est différent. Entre une adresse par mot et une par byte, le nombre d'adresse n'est pas le même à capacité mémoire égale. Prenons un exemple assez simple, où l'on compare deux processeurs. Les deux ont des mots mémoire de 32 bits, pour simplifier la comparaison. Le premier processeur gère des bytes de 8 bits, et chacun a sa propre adresse, ce qui fait que c'est un adressage par byte qui est utilisé. Le second ne gère pas les bytes mais seulement des mots de 32 bits, ce qui fait que c'est un adressage par mot qui est utilisé. Dans les deux cas, la mémoire n'est pas organisée de la même manière. Prenons une mémoire de 24 octets pour l'exemple, soit 24/4 = 6 mots de 4 octets. Le premier processeur aura une adresse par byte, soit 24 adresses, et ce sera pareil pour la mémoire, qui utilisera une case mémoire par byte. Le second processeur n'aura que 6 adresses : une par mot. La mémoire a des cases mémoire qui contiennent un mot entier, soit 32 bits, 4 octets. [[File:Byte and word addressing.png|centre|vignette|upright=2|Adressage par mot et par Byte.]] L'avantage de l'adressage par mot est que l'on peut adresser plus de mémoire pour un nombre d'adresses égal. Si on a un processeur qui gère des adresses de 16 bits, on peut adresser 2^16 = 65 536 adresses. Avec un mot mémoire de 4 bytes d'un octet chacun, on peut adresser : soit 65 536 bytes/octets, soit 65 536mots et donc 65 536 × 4 octets. L'adressage par mot permet donc d'adresser plus de mémoire avec les mêmes adresses. Une autre manière de voir les choses est qu'une architecture à adressage par byte va utiliser beaucoup plus d'adresses qu'une architecture par mot, à capacité mémoire égale. L'avantage des architectures à adressage par byte est que l'on peut plus facilement modifier des données de petite taille. Par exemple, imaginons qu'un programmeur manipule du texte, avec des caractères codés sur un octet. S'il veut remplacer les lettres majuscules par des minuscules, il doit changer chaque lettre indépendamment des autres, l'une après l'autre. Avec un adressage par mot, il doit lire un mot entier, modifier chaque octet en utilisant des opérations de masquage, puis écrire le mot final. Avec un adressage par byte, il peut lire chaque byte indépendamment, le modifier sans recourir à des opérations de masquage, puis écrire le résultat. Le tout est plus simple avec l'adressage par byte : pas besoin d'opérations de masquage ! Par contre, les architectures à adressage par byte ont de nombreux défauts. Le fait qu'un mot contienne plusieurs octets/bytes a de nombreuses conséquences, desquelles naissent les contraintes d'alignement, de boutisme et autres. Dans ce qui suit, nous allons étudier les défauts des architectures adressables par byte, et allons laisser de côté les architectures adressables par mot. La raison est que toutes les architectures modernes sont adressables par byte, les seules architectures adressables par mot étant de très vieux ordinateurs aujourd'hui disparus. ==Le boutisme : une spécificité de l'adressage par byte== Le premier problème lié à l'adressage par byte est lié au fait que l'on a plusieurs bytes par mot : dans quel ordre placer les bytes dans un mot ? On peut introduire le tout par une analogie avec les langues humaines : certaines s’écrivent de gauche à droite et d'autres de droite à gauche. Dans un ordinateur, c'est pareil avec les bytes/octets des mots mémoire : on peut les écrire soit de gauche à droite, soit de droite à gauche. Quand on veut parler de cet ordre d'écriture, on parle de '''boutisme''' (''endianness''). Dans ce qui suit, nous allons partir du principe que le byte fait un octet, mais gardez dans un coin de votre tête que ce n'a pas toujours été le cas. Les explications qui vont suivre restent valide peu importe la taille du byte. ===Les différents types de boutisme=== Les deux types de boutisme les plus simples sont le gros-boutisme et le petit-boutisme. Sur les '''processeurs gros-boutistes''', la donnée est stockée des adresses les plus faibles vers les adresses plus grande. Pour rendre cela plus clair, prenons un entier qui prend plusieurs octets et qui est stocké entre deux adresses. L'octet de poids fort de l'entier est stocké dans l'adresse la plus faible, et inversement pour le poids faible qui est stocké dans l'adresse la plus grande. Sur les '''processeurs petit-boutistes''', c'est l'inverse : l'octet de poids faible de notre donnée est stocké dans la case mémoire ayant l'adresse la plus faible. La donnée est donc stockée dans l'ordre inverse pour les octets. Certains processeurs sont un peu plus souples : ils laissent le choix du boutisme. Sur ces processeurs, on peut configurer le boutisme en modifiant un bit dans un registre du processeur : il faut mettre ce bit à 1 pour du petit-boutiste, et à 0 pour du gros-boutiste, par exemple. Ces processeurs sont dits '''bi-boutistes'''. {| |[[File:Big-Endian-fr.svg|class=transparent|Gros-boutisme.]] |[[File:Little-Endian-fr.svg|class=transparent|Petit-boutisme.]] |} Petit et gros-boutisme ont pour particularité que la taille des mots ne change pas vraiment l'organisation des octets. Peu importe la taille d'un mot, celui-ci se lit toujours de gauche à droite, ou de droite à gauche. Cela n’apparaît pas avec les techniques de boutismes plus compliquées. [[File:Big-endian little-endian.jpg|centre|vignette|upright=2.5|Comparaison entre ''big-endian'' et ''little-endian'', pour des tailles de 16 et 32 bits.]] [[File:Comparaison entre boutisme avec et sans inversion de mots mémoire.jpg|vignette|Comparaison entre un nombre codé en gros-boutiste pur, et un nombre gros-boutiste dont les octets sont rangés dans un groupe en petit-boutiste. Le nombre en question est 0x 0A 0B 0C 0D, en hexadécimal, le premier mot mémoire étant indiqué en jaune, le second en blanc.]] Certains processeurs ont des boutismes plus compliqués, où chaque mot mémoire est découpé en plusieurs groupes d'octets. Il faut alors prendre en compte le boutisme des octets dans le groupe, mais aussi le boutisme des groupes eux-mêmes. On distingue ainsi un boutisme inter-groupe (le boutisme des groupes eux-même) et un boutisme intra-groupe (l'ordre des octets dans chaque groupe), tout deux pouvant être gros-boutiste ou petit-boutiste. Si l'ordre intra-groupe est identique à l'ordre inter-groupe, alors on retrouve du gros- ou petit-boutiste normal. Mais les choses changent si jamais l'ordre inter-groupe et intra-groupe sont différents. Dans ces conditions, on doit préciser un ordre d’inversion des mots mémoire (''byte-swap''), qui précise si les octets doivent être inversés dans un mot mémoire processeur, en plus de préciser si l'ordre des mots mémoire est petit- ou gros-boutiste. ===Avantages, inconvénients et usage=== Le choix entre petit boutisme et gros boutisme est généralement une simple affaire de convention. Il n'y a pas d'avantage vraiment probant pour l'une ou l'autre de ces deux méthodes, juste quelques avantages ou inconvénients mineurs. Dans les faits, il y a autant d'architectures petit- que de gros-boutistes, la plupart des architectures récentes étant bi-boutistes. Précisons que le jeu d'instruction x86 est de type petit-boutiste. Si on quitte le domaine des jeu d'instruction, les protocoles réseaux et les formats de fichiers imposent un boutisme particulier. Les protocoles réseaux actuels (TCP-IP) sont de type gros-boutiste, ce qui impose de convertir les données réseaux avant de les utiliser sur les PC modernes. Et au passage, si le gros-boutisme est utilisé dans les protocoles réseau, alors que le petit-boutisme est roi sur le x86, c'est pour des raisons pratiques, que nous allons aborder ci-dessous. Le gros-boutisme est très facile à lire pour les humains. Les nombres en gros-boutistes se lisent de droite à gauche, comme il est d'usage dans les langues indo-européennes, alors que les nombres en petit boutistes se lisent dans l'ordre inverse de lecture. Pour la lecture en hexadécimal, il faut inverser l'ordre des octets, mais il faut garder l'ordre des chiffres dans chaque octet. Par exemple, le nombre 0x015665 (87 653 en décimal) se lit 0x015665 en gros-boutiste, mais 0x655601 en petit-boutiste. Et je ne vous raconte pas ce que cela donne avec un ''byte-swap''... Cette différence pose problème quand on doit lire des fichiers, du code machine ou des paquets réseau, avec un éditeur hexadécimal. Alors certes, la plupart des professionnels lisent directement les données en passant par des outils d'analyse qui se chargent d'afficher les nombres en gros-boutiste, voire en décimal. Un professionnel a à sa disposition du désassembleur pour le code machine, des analyseurs de paquets pour les paquets réseau, des décodeurs de fichiers pour les fichiers, des analyseurs de ''dump'' mémoire pour l'analyse de la mémoire, etc. Cependant, le gros-boutisme reste un avantage quand on utilise un éditeur hexadécimal, quel que soit l'usage. En conséquence, le gros-boutiste a été historiquement pas mal utilisé dans les protocoles réseaux et les formats de fichiers. Par contre, cet avantage de lecture a dû faire face à divers désavantages pour les architectures de processeur. Le petit-boutisme peut avoir des avantages sur les architectures qui gèrent des données de taille intermédiaires entre le byte et le mot. C'est le cas sur le x86, où l'on peut décider de lire des données de 8, 16, 32, ou 64 bits à partir d'une adresse mémoire. Avec le petit-boutisme, on s'assure qu'une lecture charge bien la même valeur, le même nombre. Par exemple, imaginons que je stocke le nombre 0x 14 25 36 48 sur un mot mémoire, en petit-boutiste. En petit-boutiste, une opération de lecture reverra soit les 8 bits de poids faible (0x 48), soit les 16 bits de poids faible (0x 36 48), soit le nombre complet. Ce ne serait pas le cas en gros-boutiste, où les lectures reverraient respectivement 0x 14, 0x 14 25 et 0x 14 25 36 48. Avec le gros-boutisme, de telles opérations de lecture n'ont pas vraiment de sens. En soit, cet avantage est assez limité et n'est utile que pour les compilateurs et les programmeurs en assembleur. Un autre avantage est un gain de performance pour certaines opérations. Les instructions en question sont les opérations où on doit additionner d'opérandes codées sur plusieurs octets; sur un processeur qui fait les calculs octet par octet. En clair, le processeur dispose d'instructions de calcul qui additionnent des nombres de 16, 32 ou 64 bit, voire plus. Mais à l'intérieur du processeur, les calculs sont faits octets par octets, l'unité de calcul ne pouvant qu'additionner deux nombres de 8 bits à la fois. Dans ce cas, le petit-boutisme garantit que l'addition des octets se fait dans le bon ordre, en commençant par les octets de poids faible pour progresser vers les octets de poids fort. En gros-boutisme, les choses sont beaucoup plus compliquées... Pour résumer, les avantages et inconvénients de chaque boutisme sont mineurs. Le gain en performance est nul sur les architectures modernes, qui ont des unités de calcul capables de faire des additions multi-octets. L'usage d'opérations de lecture de taille variable est aujourd'hui tombé en désuétude, vu que cela ne sert pas à grand chose et complexifie le jeu d'instruction. Enfin, l'avantage de lecture n'est utile que dans situations tellement rares qu'on peut légitimement questionner son statut d'avantage. En bref, les différentes formes de boutisme se valent. ==L'implémentation de l'adressage par byte au niveau de la mémoire RAM/ROM== Avant de poursuivre, rappelons que la notion de byte est avant tout liée au jeu d'instruction, mais qu'elle ne dit rien du bus mémoire ! Il est parfaitement possible d'utiliser un bus mémoire d'une taille différente de celle du byte ou du mot. La largeur du bus mémoire, la taille d'un mot, et la taille d'un byte, ne sont pas forcément corrélées. Néanmoins, deux cas classiques sont les plus courants. ===Les architectures avec une mémoire adressable par byte=== Le premier est celui où le bus mémoire transmet un byte à la fois. En clair, la largeur du bus mémoire est celle du byte. Le moindre accès mémoire se fait byte par byte, donc en plusieurs cycles d'horloge. Par exemple, sur un processeur 64 bits, la lecture d'un mot complet se fera octet par octet, ce qui demandera 8 cycles d'horloge, cycles d'horloge mémoire qui plus est. Ce qui explique le désavantage de cette méthode : la performance est assez mauvaise. La performance dépend de plus de la taille des données lue/écrites. On prend moins de temps à lire une donnée courte qu'une donnée longue. L'avantage est qu'on peut lire ou écrire un mot, peu importe son adresse. Pour donner un exemple, je peux parfaitement lire une donnée de 16 bits localisée à l'adresse 4, puis lire une autre donnée de 16 bits localisée à l'adresse 5 sans aucun problème. En conséquence, il n'y a pas de contraintes d'alignements et les problèmes que nous allons aborder dans la suite n'existent pas. [[File:Chargement d'une donnée sur un processeur sans contraitnes d'alignement.jpg|centre|vignette|upright=2|Chargement d'une donnée sur un processeur sans contraintes d'alignement.]] ===Les architectures avec une mémoire adressable par mot=== Pour éviter d'avoir des performances désastreuses, on utilise une autre solution : le bus mémoire a la largeur nécessaire pour lire un mot entier. Le processeur peut charger un mot mémoire entier dans ses registres, en un seul accès mémoire. Et pour lire des données plus petites qu'un mot mémoire, le processeur charge un mot complet, mais ignore les octets en trop. [[File:Exemple du chargement d'un octet dans un registre de trois octets.jpg|centre|vignette|upright=2|Exemple du chargement d'un octet dans un registre de trois octets.]] Il y a alors confusion entre un mot au sens du jeu d'instruction, et un mot mémoire. Pour rappel, une donnée qui a la même taille que le bus de données est appelée un mot mémoire. Mais dans ce cas, l'adressage de la mémoire et du CPU ne sont pas compatibles : le processeur utilise une adresse par byte, la mémoire une adresse par mot ! Tout se passe comme si la mémoire était découpée en blocs de la taille d'un mot. La capacité de la mémoire reste inchangée, ce qui fait que le nombre d'adresses utilisables diminue : il n'y a plus besoin que d'une adresse par mot mémoire et non par octet. Il faut donc faire une sorte d'interface entre les deux. [[File:Chargement d'une donnée sur un processeur avec contraintes d'alignement.jpg|centre|vignette|upright=2|Chargement d'une donnée sur un processeur avec contraintes d'alignement.]] Par convention, l'adresse d'un mot est l'adresse de son octet de poids faible. Les autres octets du mot ne sont pas adressables par la mémoire. Par exemple, si on prend un mot de 8 octets, on est certain qu'une adresse sur 8 disparaîtra. L'adresse du mot est utilisée pour communiquer avec la mémoire, mais cela ne signifie pas que l'adresse des octets est inutile au-delà du calcul de l'adresse du mot. En effet, l'accès à un octet précis demande de déterminer la position de l'octet dans le mot à partir de l'adresse du octet. Prenons un processeur ayant des mots de 4 octets et répertorions les adresses utilisables. Le premier mot contient les octets d'adresse 0, 1, 2 et 3. L'adresse zéro est l'adresse de l'octet de poids faible et sert donc d'adresse au premier mot, les autres sont inutilisables sur le bus mémoire. Le second mot contient les adresses 4, 5, 6 et 7, l'adresse 4 est l'adresse du mot, les autres sont inutilisables. Et ainsi de suite. Si on fait une liste exhaustive des adresses valides et invalides, on remarque que seules les adresses multiples de 4 sont utilisables. Et ceux qui sont encore plus observateurs remarqueront que 4 est la taille d'un mot. Dans l'exemple précédent, les adresses utilisables sont multiples de la taille d'un mot. Sachez que cela fonctionne quelle que soit la taille du mot. Si N est la taille d'un mot, alors seules les adresses multiples de N seront utilisables. Avec ce résultat, on peut trouver une procédure qui nous donne l'adresse d'un mot à partir de l'adresse d'un octet. Si un mot contient N bytes, alors l'adresse du mot se calcule en divisant l'adresse du byte par N. La position du byte dans le mot est quant à elle le reste de cette division. Un reste de 0 nous dit que l'octet est le premier du mot, un reste de 1 nous dit qu'il est le second, etc. [[File:Adresse d'un mot avec alignement mémoire strict.png|centre|vignette|upright=2|Adresse d'un mot avec alignement mémoire strict.]] Le processeur peut donc adresser la mémoire RAM en traduisant les adresses des octets en adresses de mot. Il lui suffit de faire une division pour cela. Il conserve aussi le reste de la division dans un registre pour sélectionner l'octet une fois la lecture terminée. Un accès mémoire se fait donc comme suit : il reçoit l'adresse à lire, il calcule l'adresse du mot, effectue la lecture, reçoit le mot à lire, et utilise le reste pour sélectionner l'octet final si besoin. La dernière étape est facultative et n'est présente que si on lit une donnée plus petite qu'un mot. La division est une opération assez complexe, mais il y a moyen de ruser. L'idée est de faire en sorte que N soit une puissance de deux. La division se traduit alors par un vulgaire décalage vers la droite, le calcul du reste pas une simple opération de masquage. C'est la raison pour laquelle les processeurs actuels utilisent des mots de 1, 2, 4, 8 octets. Sans cela, les accès mémoire seraient bien plus lents. De plus, cela permet d'économiser des fils sur le bus d'adresse. Si la taille d'un mot est égale à <math>2^{n}</math>, seules les adresses multiples de <math>2^{n}</math> seront utilisables. Or, ces adresses se reconnaissent facilement : leurs n bits de poids faibles valent zéro. On n'a donc pas besoin de câbler les fils correspondant à ces bits de poids faible. ==L'alignement mémoire== Dans la section précédente, nous avons évoqué le cas où un processeur à adressage par byte est couplé à une mémoire adressable par mot. Sur de telles architectures, des problèmes surviennent quand les lectures/écritures se font par mots entiers. Le processeur fournit l'adresse d'un byte, mais lit un mot entier à partir de ce byte. Par exemple, prenons une lecture d'un mot complet : celle-ci précise l'adresse d'un byte. Sur un CPU 64 bits, le processeur lit alors 64 bits d'un coup à partir de l'adresse du byte. Et cela peut poser quelques problèmes, dont la résolution demande de respecter des restrictions sur la place de chaque mot en mémoire, restrictions résumées sous le nom d''''alignement mémoire'''. ===L'exemple sur les processeurs 16 bits=== Pour faire comprendre ce qu'est l'alignement mémoire, nous allons prendre l'exemple d'un processeur 16 bits connecté à une mémoire de 16 bits, via un bus mémoire de 16 bits. Le processeur utilisant l'adressage par byte, chaque octet de la mémoire a sa propre adresse. Par contre, le processeur lit et écrit des paquets de 16 bits, soit deux octets. Un groupe de deux octets est appelé, pour rappel, un '''doublet'''. Pour la mémoire, les octets sont regroupés en groupes de deux, en '''doublets mémoire'''. Pour la mémoire, un doublet mémoire a une adresse unique. Et cela ne colle pas avec l'adressage par byte utilisé par le processeur, il y a une différence entre les adresses du processeur et celles de la mémoire. Il y a une adresse par doublet pour la mémoire, une adresse par octet pour le processeur. L'adresse mémoire a donc un bit de moins que l'adresse processeur. Pour faire la distinction, nous parlerons d'''adresse mémoire'' et d'''adresse processeur''. Lorsque le processeur lit un doublet, il lit le premier octet à une adresse processeur et l'octet suivant dans l'adresse processeur suivante. Les adresses processeur sont donc regroupées par groupes de deux : l'adresse 0 et 1 adressent toutes deux le premier doublet, l'adresse 2 et 3 adressent le second doublet, etc. Un doublet est donc identifié par deux adresses processeur : une '''adresse paire''' et une '''adresse impaire'''. Nous allons partir du principe que l'octet de poids faible est dans l'adresse paire, l'octet de poids fort dans l'adresse impaire. Les règles de boutisme autorise de faire l'inverse, mais ce n'est pas le choix le plus intuitif. L'alignement mémoire dit quoi faire lorsque le processeur veut lire/écrire 16 bits à une adresse impaire. S'il veut lire 16 bits à une adresse impaire, les deux octets seront dans des doublets mémoire différents. Le premier sera l'octet de poids fort d'un doublet, l'autre sera l'octet de poids faible du doublet suivant. Le doublet que le processeur veut lire/écrire est à cheval sur deux doublets mémoire. Et le processeur ne gère pas cette situation naturellement. L'alignement mémoire strict n'autorise que les accès mémoire à des adresses mémoires paires. Tout accès à une adresse mémoire impaire lève une exception matérielle, signe que c'est une erreur matérielle. Par contre, les adresses paires sont autorisées car une adresse paire identifie un doublet mémoire, que le processeur peut lire/écrire en une seule fois, à travers le bus mémoire. Le processeur gère donc uniquement des lectures/écritures de doublet, au sens de doublet mémoire. Une amélioration autorise les lectures/écritures d'un octet unique. Le processeur peut demander à lire ou écrire un seul octet, mais la mémoire fournira deux octets et le processeur devra n'en conserver qu'un. Dans le cas le plus simple, seuls les octets à une adresse paire sont accessibles : l'octet de poids fort d'un doublet n'est pas accesible seul. Le processeur lit un doublet entier dans la mémoire et masque l'octet de poids fort, chargé en trop. Dans un cas plus évolué, les octets à une adresse impaire sont adressables. Dans ce cas, le processeur lit un doublet, déplace l'octet de poids fort dans l'octet de poids faible, et masque l'octet inutile. Dans tous les cas, le processeur ne lit/écrit qu'un doublet à la fois et sélectionne les octets demandés. Sans alignement mémoire, on peut lire/écrire 16 bits à partir d'une adresse paire comme impaire, les deux sont autorisées. Pour cela, le processeur doit gérer les lectures/écritures de 16 bits à des adresses impaires. Vu que les 16 bits demandés sont à cheval sur deux doublets mémoire, le processeur doit lire les deux doublets mémoire, sélectionner les octets adéquats, et les concaténer pour obtenir les 16 bits finaux. ===L'alignement mémoire des données=== Imaginons le cas particulier suivant : je dispose d'un processeur utilisant des mots de 4 octets. Je dispose aussi d'un programme qui doit manipuler un caractère stocké sur 1 octet, un entier de 4 octets et une donnée de deux octets. Mais un problème se pose : le programme qui manipule ces données a été programmé par quelqu'un qui n'était pas au courant de ces histoire d'alignement, et il a répartit mes données un peu n'importe comment. Supposons que cet entier soit stocké à une adresse non-multiple de 4. Par exemple : {|class=wikitable |- !Adresse !Octet 4 !Octet 3 !Octet 2 !Octet 1 |- |0x 0000 0000 |Caractère |Entier |Entier |Entier |- |0x 0000 0004 |Entier |Donnée |Donnée |- |0x 0000 0008 | | | | |} La lecture ou écriture du caractère ne pose pas de problème, vu qu'il ne fait qu'un seul byte. Pour la donnée de 2 octets, c'est la même chose, car elle tient toute entière dans un mot mémoire. La lire demande de lire le mot et de masquer les octets inutiles. Mais pour l'entier, ça ne marche pas car il est à cheval sur deux mots ! On dit que l'entier n'est pas aligné en mémoire. En conséquence, impossible de le charger en une seule fois La situation est gérée différemment suivant le processeur. Sur certains processeurs, la donnée est chargée en deux fois : c'est légèrement plus lent que la charger en une seule fois, mais ça passe. On dit que le processeur gère des accès mémoire non-alignés. D'autres processeurs ne gérent pas ce genre d'accès mémoire et les traitent comme une erreur, similaire à une division par zéro, et lève une exception matérielle. Si on est chanceux, la routine d'exception charge la donnée en deux fois. Mais sur d'autres processeurs, le programme responsable de cet accès mémoire en dehors des clous se fait sauvagement planter. Par exemple, essayez de manipuler une donnée qui n'est pas "alignée" dans un mot de 16 octets avec une instruction SSE, vous aurez droit à un joli petit crash ! Pour éviter ce genre de choses, les compilateurs utilisés pour des langages de haut niveau préfèrent rajouter des données inutiles (on dit aussi du bourrage) de façon à ce que chaque donnée soit bien alignée sur le bon nombre d'octets. En reprenant notre exemple du dessus, et en notant le bourrage X, on obtiendrait ceci : {|class=wikitable |- !Adresse !Octet 4 !Octet 3 !Octet 2 !Octet 1 |- |0x 0000 0000 |Caractère |X |X |X |- |0x 0000 0004 |Entier |Entier |Entier |Entier |- |0x 0000 0008 |Donnée |Donnée |X |X |} Comme vous le voyez, de la mémoire est gâchée inutilement. Et quand on sait que de la mémoire cache est gâchée ainsi, ça peut jouer un peu sur les performances. Il y a cependant des situations dans lesquelles rajouter du bourrage est une bonne chose et permet des gains en performances assez abominables (une sombre histoire de cache dans les architectures multiprocesseurs ou multi-cœurs, mais je n'en dit pas plus). L'alignement mémoire se gère dans certains langages (comme le C, le C++ ou l'ADA), en gérant l'ordre de déclaration des variables. Essayez toujours de déclarer vos variables de façon à remplir un mot intégralement ou le plus possible. Renseignez-vous sur le bourrage, et essayez de savoir quelle est la taille des données en regardant la norme de vos langages. ===L'alignement des instructions en mémoire=== Les instructions ont toute une certaine taille, et elles peuvent être de taille fixe (toutes les instructions font X octets), ou de taille variable (le nombre d'octets dépend de l'instruction). Dans les deux cas, le processeur peut incorporer des contraintes sur l'alignement des instructions, au même titre que les contraintes d'alignement sur les données vues précédemment. Pour les instructions de taille fixe, les instructions sont placées à des adresses précises. Par exemple, prenons des instructions de 8 octets. La première instruction prend les 8 premiers octets de la mémoire, la seconde prend les 8 octets suivants, etc. En faisant cela, l'adresse d'une instruction est toujours un multiple de 8. Et on peut généraliser pour toute instruction de taille fixe : si elle fait X octets, son adresse est un multiple de X. Généralement, on prend X une puissance de deux pour simplifier beaucoup de choses. Notamment, cela permet de simplifier le ''program counter'' : quelques bits de poids faible deviennent inutiles. Par exemple, si on prend des instructions de 4 octets, les adresses des instructions sont des multiples de 4, donc les deux bits de poids faible de l'adresse sont toujours 00 et ne sont pas intégrés dans le ''program counter''. Le ''program counter'' est alors plus court de deux bits. Idem avec des instructions de 8 octets qui font économiser 3 bits, ou avec des instructions de 16 octets qui font économiser 4 bits. Les instructions de taille variable ne sont généralement pas alignées. Sur certains processeurs, les instructions n'ont pas de contraintes d'alignement du tout. Leur chargement est donc plus compliqué et demande des méthodes précises qui seront vues dans le chapitre sur l'unité de chargement du processeur. Évidemment, le chargement d'instructions non-alignées est donc plus lent. En conséquence, même si le processeur supporte des instructions non-alignées, les compilateurs ont tendance à aligner les instructions comme les données, sur la taille d'un mot mémoire, afin de gagner en performance. Sur d'autres processeurs, les instructions doivent être alignées. Dans le cas le plus simple, les instructions doivent être alignées sur un mot mémoire, elles doivent respecter les mêmes contraintes d'alignement que les données. Elles peuvent être plus courtes ou plus longues qu'un mot, mais elles doivent commencer à la première adresse d'un mot mémoire. D'autres architectures ont des contraintes d'alignement bizarres. Par exemple, les premiers processeurs x86 16 bits imposaient des instructions alignées sur 16 bits et cette contrainte est restée sur les processeurs 32 bits. Que ce soit pour des instructions de taille fixe ou variables, les circuits de chargement des instructions et les circuits d'accès mémoire ne sont pas les mêmes, ce qui fait que leurs contraintes d'alignement peuvent être différentes. On peut avoir quatre possibilités : des instructions non-alignées et des données alignées, l'inverse, les deux qui sont alignées, les deux qui ne sont pas alignées. Par exemple, il se peut qu'un processeur accepte des données non-alignées, mais ne gère pas des instructions non-alignées ! Le cas le plus simple, fréquent sur les architectures RISC, est d'avoir des instructions et données alignées de la même manière. Les architectures CISC utilisent souvent des contraintes d'alignement, avec généralement des instructions de taille variables non-alignées, mais des données alignées. Les deux dernières possibilités ne sont presque jamais utilisées. De plus, sur les processeurs où les deux sont alignés, on peut avoir un alignement différent pour les données et les instructions. Par exemple, pour un processeur qui utilise des instructions de 8 octets, mais des données de 4 octets. Les différences d'alignements posent une contrainte sur l'économie des bits sur le bus d'adresse. Il faut alors regarder ce qui se passe sur l'alignement des données. Par exemple, pour un processeur qui utilise des instructions de 8 octets, mais des données de 4 octets, on ne pourra économiser que deux bits, pour respecter l'alignement des données. Ou encore, sur un processeur avec des instructions alignées sur 8 octets, mais des données non-alignées, on ne pourra rien économiser. Un cas particulier est celui de l'Intel iAPX 432, dont les instructions étaient non-alignées au niveau des bits ! Leur taille variable faisait que la taille des instructions n'était pas un multiple d'octets. Il était possible d'avoir des instructions larges de 23 bits, d'autres de 41 bits, ou toute autre valeur non-divisible par 8. Un octet pouvait contenir des morceaux de deux instructions, à cheval sur l'octet. Ce comportement fort peu pratique faisait que l'implémentation de l'unité d"e chargement était complexe. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres du processeur | prevText=Les registres du processeur | next=Les modes d'adressage | nextText=Les modes d'adressage }} </noinclude> jq5alzsypjbaxhtuwf3mccn4077phe6 745876 745875 2025-07-03T17:04:14Z Mewtow 31375 /* L'exemple sur les processeurs 16 bits */ 745876 wikitext text/x-wiki Dans ce chapitre, on va parler de l'''endianess'' du processeur et de son alignement mémoire. Concrètement, on va s'intéresser à la façon dont le processeur repartit en mémoire les octets des données qu'il manipule. Ces deux paramètres sont sûrement déjà connus de ceux qui ont une expérience de la programmation assez conséquente. Les autres apprendront ce que c'est dans ce chapitre. Pour simplifier, ils sont à prendre en compte quand on échange des données entre registres et mémoire RAM. ==La différence entre mots et bytes== Avant toute chose, nous allons reparler rapidement de la différence entre un byte et un mot. Les deux termes sont généralement polysémiques, avec plusieurs sens. Aussi, définir ce qu'est un mot est assez compliqué. Voyons les différents sens de ce terme, chacun étant utile dans un contexte particulier. Dans les chapitres précédents, nous avons parlé des mots mémoire, à savoir des blocs de mémoire dont le nombre de bits correspond à la largeur du bus mémoire. Le premier sens possible est donc la quantité de données que l'on peut transférer entre CPU et RAM en un seul cycle d'horloge. Il s'agit d'une définition basée sur les transferts réels entre processeur et mémoire. Le terme que nous avons utilisé pour cette définition est : '''mot mémoire'''. Remarquez la subtile différence entre les termes "mot" et "mot mémoire" : le second terme indique bien qu'il s'agit de quelque de lié à la mémoire, pas le premier. Les deux ne sont pas confondre, et nous allons voir pourquoi. La définition précédente ne permet pas de définir ce qu'est un byte et un mot, vu que la distinction se fait au niveau du processeur, au niveau du jeu d'instruction. Précisément, elle intervient au niveau des instructions d'accès mémoire, éventuellement de certaines opérations de traitement de données. Dans ce qui va suivre, nous allons faire la différence entre les architectures à mot, à byte, et à chaines de caractères. Voyons dans le détail ces histoires de mots, de bytes, et autres. ===Les architectures à adressage par mot=== Au tout début de l'informatique, sur les anciens ordinateurs datant d'avant les années 80, les processeurs géraient qu'une seule taille pour les données. Par exemple, de tels processeurs ne géraient que des données de 8 bits, pas autre chose. Les données en question était des '''mots'''. Aux tout début de l'informatique, certaines machines utilisaient des mots de 3, 4, 5, 6 7, 13, 17, 23, 36 ou 48 bits. Pour donner quelques exemples, l'ordinateur ERA 1103 utilisait des mots de 36-bits, tout comme le PDP-10, et ne gérait pas d'autre taille pour les données : c'était 36 bits pour tout le monde. Les processeurs en question ne disposaient que d'une seule instruction de lecture/écriture, qui lisait/écrivait des mots entiers. On pouvait ainsi lire ou écrire des paquets de 3, 4, 5, 6 7, 13, 17, 23, 36 ou 48 bits. Les registres du processeur avaient généralement la même taille qu'un mot, ce qui fait que les processeurs de l'époque avaient des registres de 4, 8, 12, 24, 26, 28, 31, 36, 48, voire 60 bits. Les mots en question sont en théorie à distinguer des mots mémoire, mais ce n'est pas souvent le cas en pratique. Les architectures à adressage par mot faisaient en sorte qu'un mot soit de la même taille qu'un mot mémoire. La mémoire était donc découpée en mots, chacun avait sa propre adresse. Par exemple, une mémoire de 64 kilo-mots contenait 65 536 mots, chacun contenant autant de bits qu'un mot. Les mots faisaient tous la même taille, qui variait suivant la mémoire ou le processeur utilisé. Chaque mot avait sa propre adresse, ce qui fait qu'on parlait d''''adressage par mot'''. Il n'y avait qu'une seule unité d'adressage, ce qui fait que le byte et le mot étaient la même chose sur de telles architectures. La distinction entre byte et mot est apparue après, sur des ordinateurs/processeurs différents. ===Les architectures à adressage par byte=== Par la suite, des processeurs ont permis d'adresser des données plus petites qu'un mot. Les processeurs en question disposent de plusieurs instructions de lecture/écriture, qui manipulent des blocs de mémoire de taille différente. Par exemple, il peut avoir une instruction de lecture pour lire 8 bits, une autre pour lire 16 bits, une autre 32, etc. Une autre possibilité est celle où le processeur dispose d'une instruction de lecture, qu'on peut configurer suivant qu'on veuille lire/écrire un octet, deux, quatre, huit. Dans ce cas, on peut faire une distinction entre '''''byte''''' et '''mot''' : le byte est la plus petite donnée, le mot est la plus grande. Par exemple, un processeur disposant d'instruction d'accès mémoire capables de lire/écrire 8 ou 16 bits sont dans ce cas. Le byte fait alors 8 bits, le mot en fait 16. La séparation entre byte et mot peut parfois se compléter avec des tailles intermédiaires. Par exemple, prenons un processeur qui dispose d'une instruction de lecture capable de lire soit 8 bits, soit 16 bits, soit 32 bits, soit 64 bits. Dans ce cas, le byte vaut 8 bits, le mot en fait 64, les autres tailles sont des intermédiaires. Pour résumer, un mot est la plus grande unité adressable par le processeur, un byte est la plus petite. En général, le byte fait 8 bits, un octet. Mais ça n'a pas toujours été le cas, pas mal de jeux d'instructions font exception. L'exemple le plus parlant est celui des processeurs décimaux, qui utilisaient des entiers codés en BCD mais ne géraient pas les entiers codés en binaire normal. De tels processeurs encodaient des nombres sous la forme d'une suite de chiffres décimaux, codés en BCD sur 4 bits. Ils avaient des bytes de 4 bits, voire de 5/6 bits pour les ordinateurs qui ajoutaient un bit de parité/ECC par chiffre décimal. D'autres architectures avaient un byte de 3 à 7 bits. La taille d'un mot mémoire est de plusieurs bytes : un mot mémoire contient un nombre entier de bytes. La norme actuelle est d'utiliser des bytes d'un octet (8 bits), avec des mots contenant plusieurs octets. Le nombre d'octets dans un mot est généralement une puissance de deux pour simplifier les calculs. Cette règle souffre évidemment d'exceptions, mais l'usage de mots qui ne sont pas des puissances de 2 posent quelques problèmes techniques en termes d’adressage, comme on le verra plus bas. Sur de telles architectures, il y a une adresse mémoire par byte, et non par mot, ce qui fait qu'on parle d''''adressage par byte'''. Tous les ordinateurs modernes utilisent l'adressage par byte. Concrètement, sur les processeurs modernes, chaque octet de la mémoire a sa propre adresse, peu importe la taille du mot utilisé par le processeur. Par exemple, les anciens processeurs x86 32 bits et les processeurs x86 64 bits utilisent tous le même système d'adressage, où chaque octet a sa propre adresse, la seule différence est que les adresses sont plus nombreuses. Avec un adressage par mot, on aurait eu autant d'adresses qu'avant, mais les mots seraient passés de 32 à 64 bits en passant au 64 bits. Les registres font encore une fois la même taille qu'un mot, bien qu'il existe quelques rares exceptions. Les processeurs à adressage par byte ont souvent plusieurs instructions de lecture/écriture, chacune pour une taille précise. Pour rendre cela plus concret, prenons le cas de l'instruction de lecture. Il y a au minimum une instruction de lecture qui lit un byte en mémoire, une autre qui lit un mot complet. Il y a souvent des instructions pour les tailles intermédiaires. Par exemple, un processeur 64 bit a des instructions pour lire 8 bits, une autre pour lire 16 bits, une autre pour en lire 32, et enfin une pour lire 64 bits. Idem pour les instructions d'écriture, et les autres instructions d'accès mémoire. ===Les architectures à adressage par mot de type hybrides=== Il a existé des architectures adressées par mot qui géraient des bytes, mais sans pour autant leur donner des adresses. Leur idée était que les transferts entre CPU et mémoire se faisaient par mots, mais les instructions de lecture/écriture pouvaient sélectionner un byte dans le mot. Une instruction d'accès mémoire devait alors préciser deux choses : l'adresse du mot à lire/écrire, et la position du byte dans le mot adressé. Par exemple, on pouvait demander à lire le mot à l'adresse 0x5F, et de récupérer uniquement le byte numéro 6. Il s'agit d'architectures adressables par mot car l'adresse identifie un mot, pas un byte. Les bytes en question n'avaient pas d'adresses en eux-mêmes, il n'y avait pas d'adressage par byte. La sélection des bytes se faisait dans le processeur : le processeur lisait des mots entiers, avant que le hardware du processeur sélectionne automatiquement le byte voulu. D'ailleurs, aucune de ces architectures ne supportait de mode d'adressage base+index ou base+offset pour sélectionner des bytes dans un mot. Elles supportaient de tels modes d'adressage pour un mot, pas pour les bytes. Pour faire la différence, nous parlerons de pseudo-byte dans ce qui suit, pour bien préciser que ce ne sont pas de vrais bytes. Un exemple est le PDP-6 et le PDP-10, qui avaient des instructions de lecture/écriture de ce type. Elles prenaient trois informations : l'adresse d'un mot, la position du pseudo-byte dans le mot, et enfin la taille d'un pseudo-byte ! L'adressage était donc très flexible, car on pouvait configurer la taille du pseudo-byte. Outre l'instruction de lecture LDB et celle d'écriture DPB, d'autres instructions permettaient de manipuler des pseudo-bytes. L'instruction IBP incrémentait le numéro du pseudo-byte, par exemple. ===Les architectures à mot de taille variable=== D'autres architectures codaient leurs nombres en utilisant un nombre variable de bytes ! Dit autrement, elles avaient des mots de taille variable, d'où leur nom d''''architectures à mots de taille variable'''. Il s'agit d'architectures qui codaient les nombres par des chaines de caractères terminées par un byte de terminaison. La grande majorité étaient des architectures décimales, à savoir des ordinateurs qui utilisaient des nombres encodés en BCD ou dans un encodage similaire. Les nombres étaient codés en décimal, mais chaque chiffre était encodé en binaire sur quelques bits, généralement 4 à 6 bits. Les bytes stockaient chacun un caractère, qui était utilisé pour encoder soit un chiffre décimal, soit un autre symbole comme un byte de terminaison. Un caractère faisait plus de 4 bits, vu qu'il fallait au minimum coder les chiffres BCD et des symboles supplémentaires. La taille d'un caractère était généralement de 5/6 bits. Un exemple est celui des IBM 1400 series, qui utilisaient des chaines de caractères séparées par deux bytes : un byte de ''wordmark'' au début, et un byte de ''record mark'' à la fin. Les caractères étaient des chiffres codés en BCD, chaque caractère était codé sur 6 bits. Les calculs se faisaient chiffre par chiffre, au rythme d'un chiffre utilisé comme opérande par cycle d'horloge. Le processeur passait automatiquement d'un chiffre au suivant pour chaque opérande. Chaque caractère/chiffre avait sa propre adresse, ce qui fait l'architecture est techniquement adressable par byte, alors que les mots correspondaient aux nombres de taille variable. ===La comparaison entre l'adressage par mot et par byte=== Plus haut, nous avons vu deux types d'adressage : par mot et par byte. Avec la première, ce sont les mots qui ont des adresses. Les bytes n'existent pas forcément sur de telles architectures. Si une gestion des bytes est présente, les instructions de lecture/écriture utilisent des adresses pour les mots, couplé à la position du byte dans le mot. Les lectures/écritures se font pas mots entiers. À l'opposé, sur les architectures adressées par byte, une adresse correspond à un byte et non à un mot. Les deux techniques font que l'usage des adresses est différent. Entre une adresse par mot et une par byte, le nombre d'adresse n'est pas le même à capacité mémoire égale. Prenons un exemple assez simple, où l'on compare deux processeurs. Les deux ont des mots mémoire de 32 bits, pour simplifier la comparaison. Le premier processeur gère des bytes de 8 bits, et chacun a sa propre adresse, ce qui fait que c'est un adressage par byte qui est utilisé. Le second ne gère pas les bytes mais seulement des mots de 32 bits, ce qui fait que c'est un adressage par mot qui est utilisé. Dans les deux cas, la mémoire n'est pas organisée de la même manière. Prenons une mémoire de 24 octets pour l'exemple, soit 24/4 = 6 mots de 4 octets. Le premier processeur aura une adresse par byte, soit 24 adresses, et ce sera pareil pour la mémoire, qui utilisera une case mémoire par byte. Le second processeur n'aura que 6 adresses : une par mot. La mémoire a des cases mémoire qui contiennent un mot entier, soit 32 bits, 4 octets. [[File:Byte and word addressing.png|centre|vignette|upright=2|Adressage par mot et par Byte.]] L'avantage de l'adressage par mot est que l'on peut adresser plus de mémoire pour un nombre d'adresses égal. Si on a un processeur qui gère des adresses de 16 bits, on peut adresser 2^16 = 65 536 adresses. Avec un mot mémoire de 4 bytes d'un octet chacun, on peut adresser : soit 65 536 bytes/octets, soit 65 536mots et donc 65 536 × 4 octets. L'adressage par mot permet donc d'adresser plus de mémoire avec les mêmes adresses. Une autre manière de voir les choses est qu'une architecture à adressage par byte va utiliser beaucoup plus d'adresses qu'une architecture par mot, à capacité mémoire égale. L'avantage des architectures à adressage par byte est que l'on peut plus facilement modifier des données de petite taille. Par exemple, imaginons qu'un programmeur manipule du texte, avec des caractères codés sur un octet. S'il veut remplacer les lettres majuscules par des minuscules, il doit changer chaque lettre indépendamment des autres, l'une après l'autre. Avec un adressage par mot, il doit lire un mot entier, modifier chaque octet en utilisant des opérations de masquage, puis écrire le mot final. Avec un adressage par byte, il peut lire chaque byte indépendamment, le modifier sans recourir à des opérations de masquage, puis écrire le résultat. Le tout est plus simple avec l'adressage par byte : pas besoin d'opérations de masquage ! Par contre, les architectures à adressage par byte ont de nombreux défauts. Le fait qu'un mot contienne plusieurs octets/bytes a de nombreuses conséquences, desquelles naissent les contraintes d'alignement, de boutisme et autres. Dans ce qui suit, nous allons étudier les défauts des architectures adressables par byte, et allons laisser de côté les architectures adressables par mot. La raison est que toutes les architectures modernes sont adressables par byte, les seules architectures adressables par mot étant de très vieux ordinateurs aujourd'hui disparus. ==Le boutisme : une spécificité de l'adressage par byte== Le premier problème lié à l'adressage par byte est lié au fait que l'on a plusieurs bytes par mot : dans quel ordre placer les bytes dans un mot ? On peut introduire le tout par une analogie avec les langues humaines : certaines s’écrivent de gauche à droite et d'autres de droite à gauche. Dans un ordinateur, c'est pareil avec les bytes/octets des mots mémoire : on peut les écrire soit de gauche à droite, soit de droite à gauche. Quand on veut parler de cet ordre d'écriture, on parle de '''boutisme''' (''endianness''). Dans ce qui suit, nous allons partir du principe que le byte fait un octet, mais gardez dans un coin de votre tête que ce n'a pas toujours été le cas. Les explications qui vont suivre restent valide peu importe la taille du byte. ===Les différents types de boutisme=== Les deux types de boutisme les plus simples sont le gros-boutisme et le petit-boutisme. Sur les '''processeurs gros-boutistes''', la donnée est stockée des adresses les plus faibles vers les adresses plus grande. Pour rendre cela plus clair, prenons un entier qui prend plusieurs octets et qui est stocké entre deux adresses. L'octet de poids fort de l'entier est stocké dans l'adresse la plus faible, et inversement pour le poids faible qui est stocké dans l'adresse la plus grande. Sur les '''processeurs petit-boutistes''', c'est l'inverse : l'octet de poids faible de notre donnée est stocké dans la case mémoire ayant l'adresse la plus faible. La donnée est donc stockée dans l'ordre inverse pour les octets. Certains processeurs sont un peu plus souples : ils laissent le choix du boutisme. Sur ces processeurs, on peut configurer le boutisme en modifiant un bit dans un registre du processeur : il faut mettre ce bit à 1 pour du petit-boutiste, et à 0 pour du gros-boutiste, par exemple. Ces processeurs sont dits '''bi-boutistes'''. {| |[[File:Big-Endian-fr.svg|class=transparent|Gros-boutisme.]] |[[File:Little-Endian-fr.svg|class=transparent|Petit-boutisme.]] |} Petit et gros-boutisme ont pour particularité que la taille des mots ne change pas vraiment l'organisation des octets. Peu importe la taille d'un mot, celui-ci se lit toujours de gauche à droite, ou de droite à gauche. Cela n’apparaît pas avec les techniques de boutismes plus compliquées. [[File:Big-endian little-endian.jpg|centre|vignette|upright=2.5|Comparaison entre ''big-endian'' et ''little-endian'', pour des tailles de 16 et 32 bits.]] [[File:Comparaison entre boutisme avec et sans inversion de mots mémoire.jpg|vignette|Comparaison entre un nombre codé en gros-boutiste pur, et un nombre gros-boutiste dont les octets sont rangés dans un groupe en petit-boutiste. Le nombre en question est 0x 0A 0B 0C 0D, en hexadécimal, le premier mot mémoire étant indiqué en jaune, le second en blanc.]] Certains processeurs ont des boutismes plus compliqués, où chaque mot mémoire est découpé en plusieurs groupes d'octets. Il faut alors prendre en compte le boutisme des octets dans le groupe, mais aussi le boutisme des groupes eux-mêmes. On distingue ainsi un boutisme inter-groupe (le boutisme des groupes eux-même) et un boutisme intra-groupe (l'ordre des octets dans chaque groupe), tout deux pouvant être gros-boutiste ou petit-boutiste. Si l'ordre intra-groupe est identique à l'ordre inter-groupe, alors on retrouve du gros- ou petit-boutiste normal. Mais les choses changent si jamais l'ordre inter-groupe et intra-groupe sont différents. Dans ces conditions, on doit préciser un ordre d’inversion des mots mémoire (''byte-swap''), qui précise si les octets doivent être inversés dans un mot mémoire processeur, en plus de préciser si l'ordre des mots mémoire est petit- ou gros-boutiste. ===Avantages, inconvénients et usage=== Le choix entre petit boutisme et gros boutisme est généralement une simple affaire de convention. Il n'y a pas d'avantage vraiment probant pour l'une ou l'autre de ces deux méthodes, juste quelques avantages ou inconvénients mineurs. Dans les faits, il y a autant d'architectures petit- que de gros-boutistes, la plupart des architectures récentes étant bi-boutistes. Précisons que le jeu d'instruction x86 est de type petit-boutiste. Si on quitte le domaine des jeu d'instruction, les protocoles réseaux et les formats de fichiers imposent un boutisme particulier. Les protocoles réseaux actuels (TCP-IP) sont de type gros-boutiste, ce qui impose de convertir les données réseaux avant de les utiliser sur les PC modernes. Et au passage, si le gros-boutisme est utilisé dans les protocoles réseau, alors que le petit-boutisme est roi sur le x86, c'est pour des raisons pratiques, que nous allons aborder ci-dessous. Le gros-boutisme est très facile à lire pour les humains. Les nombres en gros-boutistes se lisent de droite à gauche, comme il est d'usage dans les langues indo-européennes, alors que les nombres en petit boutistes se lisent dans l'ordre inverse de lecture. Pour la lecture en hexadécimal, il faut inverser l'ordre des octets, mais il faut garder l'ordre des chiffres dans chaque octet. Par exemple, le nombre 0x015665 (87 653 en décimal) se lit 0x015665 en gros-boutiste, mais 0x655601 en petit-boutiste. Et je ne vous raconte pas ce que cela donne avec un ''byte-swap''... Cette différence pose problème quand on doit lire des fichiers, du code machine ou des paquets réseau, avec un éditeur hexadécimal. Alors certes, la plupart des professionnels lisent directement les données en passant par des outils d'analyse qui se chargent d'afficher les nombres en gros-boutiste, voire en décimal. Un professionnel a à sa disposition du désassembleur pour le code machine, des analyseurs de paquets pour les paquets réseau, des décodeurs de fichiers pour les fichiers, des analyseurs de ''dump'' mémoire pour l'analyse de la mémoire, etc. Cependant, le gros-boutisme reste un avantage quand on utilise un éditeur hexadécimal, quel que soit l'usage. En conséquence, le gros-boutiste a été historiquement pas mal utilisé dans les protocoles réseaux et les formats de fichiers. Par contre, cet avantage de lecture a dû faire face à divers désavantages pour les architectures de processeur. Le petit-boutisme peut avoir des avantages sur les architectures qui gèrent des données de taille intermédiaires entre le byte et le mot. C'est le cas sur le x86, où l'on peut décider de lire des données de 8, 16, 32, ou 64 bits à partir d'une adresse mémoire. Avec le petit-boutisme, on s'assure qu'une lecture charge bien la même valeur, le même nombre. Par exemple, imaginons que je stocke le nombre 0x 14 25 36 48 sur un mot mémoire, en petit-boutiste. En petit-boutiste, une opération de lecture reverra soit les 8 bits de poids faible (0x 48), soit les 16 bits de poids faible (0x 36 48), soit le nombre complet. Ce ne serait pas le cas en gros-boutiste, où les lectures reverraient respectivement 0x 14, 0x 14 25 et 0x 14 25 36 48. Avec le gros-boutisme, de telles opérations de lecture n'ont pas vraiment de sens. En soit, cet avantage est assez limité et n'est utile que pour les compilateurs et les programmeurs en assembleur. Un autre avantage est un gain de performance pour certaines opérations. Les instructions en question sont les opérations où on doit additionner d'opérandes codées sur plusieurs octets; sur un processeur qui fait les calculs octet par octet. En clair, le processeur dispose d'instructions de calcul qui additionnent des nombres de 16, 32 ou 64 bit, voire plus. Mais à l'intérieur du processeur, les calculs sont faits octets par octets, l'unité de calcul ne pouvant qu'additionner deux nombres de 8 bits à la fois. Dans ce cas, le petit-boutisme garantit que l'addition des octets se fait dans le bon ordre, en commençant par les octets de poids faible pour progresser vers les octets de poids fort. En gros-boutisme, les choses sont beaucoup plus compliquées... Pour résumer, les avantages et inconvénients de chaque boutisme sont mineurs. Le gain en performance est nul sur les architectures modernes, qui ont des unités de calcul capables de faire des additions multi-octets. L'usage d'opérations de lecture de taille variable est aujourd'hui tombé en désuétude, vu que cela ne sert pas à grand chose et complexifie le jeu d'instruction. Enfin, l'avantage de lecture n'est utile que dans situations tellement rares qu'on peut légitimement questionner son statut d'avantage. En bref, les différentes formes de boutisme se valent. ==L'implémentation de l'adressage par byte au niveau de la mémoire RAM/ROM== Avant de poursuivre, rappelons que la notion de byte est avant tout liée au jeu d'instruction, mais qu'elle ne dit rien du bus mémoire ! Il est parfaitement possible d'utiliser un bus mémoire d'une taille différente de celle du byte ou du mot. La largeur du bus mémoire, la taille d'un mot, et la taille d'un byte, ne sont pas forcément corrélées. Néanmoins, deux cas classiques sont les plus courants. ===Les architectures avec une mémoire adressable par byte=== Le premier est celui où le bus mémoire transmet un byte à la fois. En clair, la largeur du bus mémoire est celle du byte. Le moindre accès mémoire se fait byte par byte, donc en plusieurs cycles d'horloge. Par exemple, sur un processeur 64 bits, la lecture d'un mot complet se fera octet par octet, ce qui demandera 8 cycles d'horloge, cycles d'horloge mémoire qui plus est. Ce qui explique le désavantage de cette méthode : la performance est assez mauvaise. La performance dépend de plus de la taille des données lue/écrites. On prend moins de temps à lire une donnée courte qu'une donnée longue. L'avantage est qu'on peut lire ou écrire un mot, peu importe son adresse. Pour donner un exemple, je peux parfaitement lire une donnée de 16 bits localisée à l'adresse 4, puis lire une autre donnée de 16 bits localisée à l'adresse 5 sans aucun problème. En conséquence, il n'y a pas de contraintes d'alignements et les problèmes que nous allons aborder dans la suite n'existent pas. [[File:Chargement d'une donnée sur un processeur sans contraitnes d'alignement.jpg|centre|vignette|upright=2|Chargement d'une donnée sur un processeur sans contraintes d'alignement.]] ===Les architectures avec une mémoire adressable par mot=== Pour éviter d'avoir des performances désastreuses, on utilise une autre solution : le bus mémoire a la largeur nécessaire pour lire un mot entier. Le processeur peut charger un mot mémoire entier dans ses registres, en un seul accès mémoire. Et pour lire des données plus petites qu'un mot mémoire, le processeur charge un mot complet, mais ignore les octets en trop. [[File:Exemple du chargement d'un octet dans un registre de trois octets.jpg|centre|vignette|upright=2|Exemple du chargement d'un octet dans un registre de trois octets.]] Il y a alors confusion entre un mot au sens du jeu d'instruction, et un mot mémoire. Pour rappel, une donnée qui a la même taille que le bus de données est appelée un mot mémoire. Mais dans ce cas, l'adressage de la mémoire et du CPU ne sont pas compatibles : le processeur utilise une adresse par byte, la mémoire une adresse par mot ! Tout se passe comme si la mémoire était découpée en blocs de la taille d'un mot. La capacité de la mémoire reste inchangée, ce qui fait que le nombre d'adresses utilisables diminue : il n'y a plus besoin que d'une adresse par mot mémoire et non par octet. Il faut donc faire une sorte d'interface entre les deux. [[File:Chargement d'une donnée sur un processeur avec contraintes d'alignement.jpg|centre|vignette|upright=2|Chargement d'une donnée sur un processeur avec contraintes d'alignement.]] Par convention, l'adresse d'un mot est l'adresse de son octet de poids faible. Les autres octets du mot ne sont pas adressables par la mémoire. Par exemple, si on prend un mot de 8 octets, on est certain qu'une adresse sur 8 disparaîtra. L'adresse du mot est utilisée pour communiquer avec la mémoire, mais cela ne signifie pas que l'adresse des octets est inutile au-delà du calcul de l'adresse du mot. En effet, l'accès à un octet précis demande de déterminer la position de l'octet dans le mot à partir de l'adresse du octet. Prenons un processeur ayant des mots de 4 octets et répertorions les adresses utilisables. Le premier mot contient les octets d'adresse 0, 1, 2 et 3. L'adresse zéro est l'adresse de l'octet de poids faible et sert donc d'adresse au premier mot, les autres sont inutilisables sur le bus mémoire. Le second mot contient les adresses 4, 5, 6 et 7, l'adresse 4 est l'adresse du mot, les autres sont inutilisables. Et ainsi de suite. Si on fait une liste exhaustive des adresses valides et invalides, on remarque que seules les adresses multiples de 4 sont utilisables. Et ceux qui sont encore plus observateurs remarqueront que 4 est la taille d'un mot. Dans l'exemple précédent, les adresses utilisables sont multiples de la taille d'un mot. Sachez que cela fonctionne quelle que soit la taille du mot. Si N est la taille d'un mot, alors seules les adresses multiples de N seront utilisables. Avec ce résultat, on peut trouver une procédure qui nous donne l'adresse d'un mot à partir de l'adresse d'un octet. Si un mot contient N bytes, alors l'adresse du mot se calcule en divisant l'adresse du byte par N. La position du byte dans le mot est quant à elle le reste de cette division. Un reste de 0 nous dit que l'octet est le premier du mot, un reste de 1 nous dit qu'il est le second, etc. [[File:Adresse d'un mot avec alignement mémoire strict.png|centre|vignette|upright=2|Adresse d'un mot avec alignement mémoire strict.]] Le processeur peut donc adresser la mémoire RAM en traduisant les adresses des octets en adresses de mot. Il lui suffit de faire une division pour cela. Il conserve aussi le reste de la division dans un registre pour sélectionner l'octet une fois la lecture terminée. Un accès mémoire se fait donc comme suit : il reçoit l'adresse à lire, il calcule l'adresse du mot, effectue la lecture, reçoit le mot à lire, et utilise le reste pour sélectionner l'octet final si besoin. La dernière étape est facultative et n'est présente que si on lit une donnée plus petite qu'un mot. La division est une opération assez complexe, mais il y a moyen de ruser. L'idée est de faire en sorte que N soit une puissance de deux. La division se traduit alors par un vulgaire décalage vers la droite, le calcul du reste pas une simple opération de masquage. C'est la raison pour laquelle les processeurs actuels utilisent des mots de 1, 2, 4, 8 octets. Sans cela, les accès mémoire seraient bien plus lents. De plus, cela permet d'économiser des fils sur le bus d'adresse. Si la taille d'un mot est égale à <math>2^{n}</math>, seules les adresses multiples de <math>2^{n}</math> seront utilisables. Or, ces adresses se reconnaissent facilement : leurs n bits de poids faibles valent zéro. On n'a donc pas besoin de câbler les fils correspondant à ces bits de poids faible. ==L'alignement mémoire== Dans la section précédente, nous avons évoqué le cas où un processeur à adressage par byte est couplé à une mémoire adressable par mot. Sur de telles architectures, des problèmes surviennent quand les lectures/écritures se font par mots entiers. Le processeur fournit l'adresse d'un byte, mais lit un mot entier à partir de ce byte. Par exemple, prenons une lecture d'un mot complet : celle-ci précise l'adresse d'un byte. Sur un CPU 64 bits, le processeur lit alors 64 bits d'un coup à partir de l'adresse du byte. Et cela peut poser quelques problèmes, dont la résolution demande de respecter des restrictions sur la place de chaque mot en mémoire, restrictions résumées sous le nom d''''alignement mémoire'''. ===L'exemple sur les processeurs 16 bits=== Pour faire comprendre ce qu'est l'alignement mémoire, nous allons prendre l'exemple d'un processeur 16 bits connecté à une mémoire de 16 bits, via un bus mémoire de 16 bits. Le processeur utilisant l'adressage par byte, chaque octet de la mémoire a sa propre adresse. Par contre, le processeur lit et écrit des paquets de 16 bits, soit deux octets. Un groupe de deux octets est appelé, pour rappel, un '''doublet'''. Pour la mémoire, les octets sont regroupés en groupes de deux, en '''doublets mémoire'''. Pour la mémoire, un doublet mémoire a une adresse unique. Et cela ne colle pas avec l'adressage par byte utilisé par le processeur, il y a une différence entre les adresses du processeur et celles de la mémoire. Il y a une adresse par doublet pour la mémoire, une adresse par octet pour le processeur. L'adresse mémoire a donc un bit de moins que l'adresse processeur. Pour faire la distinction, nous parlerons d'''adresse mémoire'' et d'''adresse processeur''. Lorsque le processeur lit un doublet, il lit le premier octet à une adresse processeur et l'octet suivant dans l'adresse processeur suivante. Les adresses processeur sont donc regroupées par groupes de deux : l'adresse 0 et 1 adressent toutes deux le premier doublet, l'adresse 2 et 3 adressent le second doublet, etc. Un doublet est donc identifié par deux adresses processeur : une '''adresse paire''' et une '''adresse impaire'''. Nous allons partir du principe que l'octet de poids faible est dans l'adresse paire, l'octet de poids fort dans l'adresse impaire. Les règles de boutisme autorise de faire l'inverse, mais ce n'est pas le choix le plus intuitif. L'alignement mémoire dit quoi faire lorsque le processeur veut lire/écrire 16 bits à une adresse impaire. S'il veut lire 16 bits à une adresse impaire, les deux octets seront dans des doublets mémoire différents. Le premier sera l'octet de poids fort d'un doublet, l'autre sera l'octet de poids faible du doublet suivant. Le doublet que le processeur veut lire/écrire est à cheval sur deux doublets mémoire. Et le processeur ne gère pas cette situation naturellement. L'alignement mémoire strict n'autorise que les accès mémoire à des adresses mémoires paires. Tout accès à une adresse mémoire impaire lève une exception matérielle, signe que c'est une erreur matérielle. Par contre, les adresses paires sont autorisées car une adresse paire identifie un doublet mémoire, que le processeur peut lire/écrire en une seule fois, à travers le bus mémoire. Le processeur gère donc uniquement des lectures/écritures de doublet, au sens de doublet mémoire. Sans alignement mémoire, on peut lire/écrire 16 bits à partir d'une adresse paire comme impaire, les deux sont autorisées. Pour cela, le processeur doit gérer les lectures/écritures de 16 bits à des adresses impaires. Vu que les 16 bits demandés sont à cheval sur deux doublets mémoire, le processeur doit lire les deux doublets mémoire, sélectionner les octets adéquats, et les concaténer pour obtenir les 16 bits finaux. Il faut noter que dans une interprétation stricte de l'alignement mémoire, le processeur peut lire/écrire un octet unique, mais seulement s'il est à une adresse paire. Le processeur peut demander à lire ou écrire un seul octet, mais la mémoire fournira deux octets et le processeur devra n'en conserver qu'un. Dans le cas le plus simple, seuls les octets à une adresse paire sont accessibles : l'octet de poids fort d'un doublet n'est pas accesible seul. Le processeur lit un doublet entier dans la mémoire et masque l'octet de poids fort, chargé en trop. Dans un cas plus évolué, les octets à une adresse impaire sont adressables. Dans ce cas, le processeur lit un doublet, déplace l'octet de poids fort dans l'octet de poids faible, et masque l'octet inutile. Dans tous les cas, le processeur ne lit/écrit qu'un doublet à la fois et sélectionne les octets demandés. ===L'alignement mémoire des données=== Imaginons le cas particulier suivant : je dispose d'un processeur utilisant des mots de 4 octets. Je dispose aussi d'un programme qui doit manipuler un caractère stocké sur 1 octet, un entier de 4 octets et une donnée de deux octets. Mais un problème se pose : le programme qui manipule ces données a été programmé par quelqu'un qui n'était pas au courant de ces histoire d'alignement, et il a répartit mes données un peu n'importe comment. Supposons que cet entier soit stocké à une adresse non-multiple de 4. Par exemple : {|class=wikitable |- !Adresse !Octet 4 !Octet 3 !Octet 2 !Octet 1 |- |0x 0000 0000 |Caractère |Entier |Entier |Entier |- |0x 0000 0004 |Entier |Donnée |Donnée |- |0x 0000 0008 | | | | |} La lecture ou écriture du caractère ne pose pas de problème, vu qu'il ne fait qu'un seul byte. Pour la donnée de 2 octets, c'est la même chose, car elle tient toute entière dans un mot mémoire. La lire demande de lire le mot et de masquer les octets inutiles. Mais pour l'entier, ça ne marche pas car il est à cheval sur deux mots ! On dit que l'entier n'est pas aligné en mémoire. En conséquence, impossible de le charger en une seule fois La situation est gérée différemment suivant le processeur. Sur certains processeurs, la donnée est chargée en deux fois : c'est légèrement plus lent que la charger en une seule fois, mais ça passe. On dit que le processeur gère des accès mémoire non-alignés. D'autres processeurs ne gérent pas ce genre d'accès mémoire et les traitent comme une erreur, similaire à une division par zéro, et lève une exception matérielle. Si on est chanceux, la routine d'exception charge la donnée en deux fois. Mais sur d'autres processeurs, le programme responsable de cet accès mémoire en dehors des clous se fait sauvagement planter. Par exemple, essayez de manipuler une donnée qui n'est pas "alignée" dans un mot de 16 octets avec une instruction SSE, vous aurez droit à un joli petit crash ! Pour éviter ce genre de choses, les compilateurs utilisés pour des langages de haut niveau préfèrent rajouter des données inutiles (on dit aussi du bourrage) de façon à ce que chaque donnée soit bien alignée sur le bon nombre d'octets. En reprenant notre exemple du dessus, et en notant le bourrage X, on obtiendrait ceci : {|class=wikitable |- !Adresse !Octet 4 !Octet 3 !Octet 2 !Octet 1 |- |0x 0000 0000 |Caractère |X |X |X |- |0x 0000 0004 |Entier |Entier |Entier |Entier |- |0x 0000 0008 |Donnée |Donnée |X |X |} Comme vous le voyez, de la mémoire est gâchée inutilement. Et quand on sait que de la mémoire cache est gâchée ainsi, ça peut jouer un peu sur les performances. Il y a cependant des situations dans lesquelles rajouter du bourrage est une bonne chose et permet des gains en performances assez abominables (une sombre histoire de cache dans les architectures multiprocesseurs ou multi-cœurs, mais je n'en dit pas plus). L'alignement mémoire se gère dans certains langages (comme le C, le C++ ou l'ADA), en gérant l'ordre de déclaration des variables. Essayez toujours de déclarer vos variables de façon à remplir un mot intégralement ou le plus possible. Renseignez-vous sur le bourrage, et essayez de savoir quelle est la taille des données en regardant la norme de vos langages. ===L'alignement des instructions en mémoire=== Les instructions ont toute une certaine taille, et elles peuvent être de taille fixe (toutes les instructions font X octets), ou de taille variable (le nombre d'octets dépend de l'instruction). Dans les deux cas, le processeur peut incorporer des contraintes sur l'alignement des instructions, au même titre que les contraintes d'alignement sur les données vues précédemment. Pour les instructions de taille fixe, les instructions sont placées à des adresses précises. Par exemple, prenons des instructions de 8 octets. La première instruction prend les 8 premiers octets de la mémoire, la seconde prend les 8 octets suivants, etc. En faisant cela, l'adresse d'une instruction est toujours un multiple de 8. Et on peut généraliser pour toute instruction de taille fixe : si elle fait X octets, son adresse est un multiple de X. Généralement, on prend X une puissance de deux pour simplifier beaucoup de choses. Notamment, cela permet de simplifier le ''program counter'' : quelques bits de poids faible deviennent inutiles. Par exemple, si on prend des instructions de 4 octets, les adresses des instructions sont des multiples de 4, donc les deux bits de poids faible de l'adresse sont toujours 00 et ne sont pas intégrés dans le ''program counter''. Le ''program counter'' est alors plus court de deux bits. Idem avec des instructions de 8 octets qui font économiser 3 bits, ou avec des instructions de 16 octets qui font économiser 4 bits. Les instructions de taille variable ne sont généralement pas alignées. Sur certains processeurs, les instructions n'ont pas de contraintes d'alignement du tout. Leur chargement est donc plus compliqué et demande des méthodes précises qui seront vues dans le chapitre sur l'unité de chargement du processeur. Évidemment, le chargement d'instructions non-alignées est donc plus lent. En conséquence, même si le processeur supporte des instructions non-alignées, les compilateurs ont tendance à aligner les instructions comme les données, sur la taille d'un mot mémoire, afin de gagner en performance. Sur d'autres processeurs, les instructions doivent être alignées. Dans le cas le plus simple, les instructions doivent être alignées sur un mot mémoire, elles doivent respecter les mêmes contraintes d'alignement que les données. Elles peuvent être plus courtes ou plus longues qu'un mot, mais elles doivent commencer à la première adresse d'un mot mémoire. D'autres architectures ont des contraintes d'alignement bizarres. Par exemple, les premiers processeurs x86 16 bits imposaient des instructions alignées sur 16 bits et cette contrainte est restée sur les processeurs 32 bits. Que ce soit pour des instructions de taille fixe ou variables, les circuits de chargement des instructions et les circuits d'accès mémoire ne sont pas les mêmes, ce qui fait que leurs contraintes d'alignement peuvent être différentes. On peut avoir quatre possibilités : des instructions non-alignées et des données alignées, l'inverse, les deux qui sont alignées, les deux qui ne sont pas alignées. Par exemple, il se peut qu'un processeur accepte des données non-alignées, mais ne gère pas des instructions non-alignées ! Le cas le plus simple, fréquent sur les architectures RISC, est d'avoir des instructions et données alignées de la même manière. Les architectures CISC utilisent souvent des contraintes d'alignement, avec généralement des instructions de taille variables non-alignées, mais des données alignées. Les deux dernières possibilités ne sont presque jamais utilisées. De plus, sur les processeurs où les deux sont alignés, on peut avoir un alignement différent pour les données et les instructions. Par exemple, pour un processeur qui utilise des instructions de 8 octets, mais des données de 4 octets. Les différences d'alignements posent une contrainte sur l'économie des bits sur le bus d'adresse. Il faut alors regarder ce qui se passe sur l'alignement des données. Par exemple, pour un processeur qui utilise des instructions de 8 octets, mais des données de 4 octets, on ne pourra économiser que deux bits, pour respecter l'alignement des données. Ou encore, sur un processeur avec des instructions alignées sur 8 octets, mais des données non-alignées, on ne pourra rien économiser. Un cas particulier est celui de l'Intel iAPX 432, dont les instructions étaient non-alignées au niveau des bits ! Leur taille variable faisait que la taille des instructions n'était pas un multiple d'octets. Il était possible d'avoir des instructions larges de 23 bits, d'autres de 41 bits, ou toute autre valeur non-divisible par 8. Un octet pouvait contenir des morceaux de deux instructions, à cheval sur l'octet. Ce comportement fort peu pratique faisait que l'implémentation de l'unité d"e chargement était complexe. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres du processeur | prevText=Les registres du processeur | next=Les modes d'adressage | nextText=Les modes d'adressage }} </noinclude> kdqr89egdnr9tg01irf8pzy8c8lglmr 745877 745876 2025-07-03T17:10:24Z Mewtow 31375 /* L'alignement mémoire des données */ 745877 wikitext text/x-wiki Dans ce chapitre, on va parler de l'''endianess'' du processeur et de son alignement mémoire. Concrètement, on va s'intéresser à la façon dont le processeur repartit en mémoire les octets des données qu'il manipule. Ces deux paramètres sont sûrement déjà connus de ceux qui ont une expérience de la programmation assez conséquente. Les autres apprendront ce que c'est dans ce chapitre. Pour simplifier, ils sont à prendre en compte quand on échange des données entre registres et mémoire RAM. ==La différence entre mots et bytes== Avant toute chose, nous allons reparler rapidement de la différence entre un byte et un mot. Les deux termes sont généralement polysémiques, avec plusieurs sens. Aussi, définir ce qu'est un mot est assez compliqué. Voyons les différents sens de ce terme, chacun étant utile dans un contexte particulier. Dans les chapitres précédents, nous avons parlé des mots mémoire, à savoir des blocs de mémoire dont le nombre de bits correspond à la largeur du bus mémoire. Le premier sens possible est donc la quantité de données que l'on peut transférer entre CPU et RAM en un seul cycle d'horloge. Il s'agit d'une définition basée sur les transferts réels entre processeur et mémoire. Le terme que nous avons utilisé pour cette définition est : '''mot mémoire'''. Remarquez la subtile différence entre les termes "mot" et "mot mémoire" : le second terme indique bien qu'il s'agit de quelque de lié à la mémoire, pas le premier. Les deux ne sont pas confondre, et nous allons voir pourquoi. La définition précédente ne permet pas de définir ce qu'est un byte et un mot, vu que la distinction se fait au niveau du processeur, au niveau du jeu d'instruction. Précisément, elle intervient au niveau des instructions d'accès mémoire, éventuellement de certaines opérations de traitement de données. Dans ce qui va suivre, nous allons faire la différence entre les architectures à mot, à byte, et à chaines de caractères. Voyons dans le détail ces histoires de mots, de bytes, et autres. ===Les architectures à adressage par mot=== Au tout début de l'informatique, sur les anciens ordinateurs datant d'avant les années 80, les processeurs géraient qu'une seule taille pour les données. Par exemple, de tels processeurs ne géraient que des données de 8 bits, pas autre chose. Les données en question était des '''mots'''. Aux tout début de l'informatique, certaines machines utilisaient des mots de 3, 4, 5, 6 7, 13, 17, 23, 36 ou 48 bits. Pour donner quelques exemples, l'ordinateur ERA 1103 utilisait des mots de 36-bits, tout comme le PDP-10, et ne gérait pas d'autre taille pour les données : c'était 36 bits pour tout le monde. Les processeurs en question ne disposaient que d'une seule instruction de lecture/écriture, qui lisait/écrivait des mots entiers. On pouvait ainsi lire ou écrire des paquets de 3, 4, 5, 6 7, 13, 17, 23, 36 ou 48 bits. Les registres du processeur avaient généralement la même taille qu'un mot, ce qui fait que les processeurs de l'époque avaient des registres de 4, 8, 12, 24, 26, 28, 31, 36, 48, voire 60 bits. Les mots en question sont en théorie à distinguer des mots mémoire, mais ce n'est pas souvent le cas en pratique. Les architectures à adressage par mot faisaient en sorte qu'un mot soit de la même taille qu'un mot mémoire. La mémoire était donc découpée en mots, chacun avait sa propre adresse. Par exemple, une mémoire de 64 kilo-mots contenait 65 536 mots, chacun contenant autant de bits qu'un mot. Les mots faisaient tous la même taille, qui variait suivant la mémoire ou le processeur utilisé. Chaque mot avait sa propre adresse, ce qui fait qu'on parlait d''''adressage par mot'''. Il n'y avait qu'une seule unité d'adressage, ce qui fait que le byte et le mot étaient la même chose sur de telles architectures. La distinction entre byte et mot est apparue après, sur des ordinateurs/processeurs différents. ===Les architectures à adressage par byte=== Par la suite, des processeurs ont permis d'adresser des données plus petites qu'un mot. Les processeurs en question disposent de plusieurs instructions de lecture/écriture, qui manipulent des blocs de mémoire de taille différente. Par exemple, il peut avoir une instruction de lecture pour lire 8 bits, une autre pour lire 16 bits, une autre 32, etc. Une autre possibilité est celle où le processeur dispose d'une instruction de lecture, qu'on peut configurer suivant qu'on veuille lire/écrire un octet, deux, quatre, huit. Dans ce cas, on peut faire une distinction entre '''''byte''''' et '''mot''' : le byte est la plus petite donnée, le mot est la plus grande. Par exemple, un processeur disposant d'instruction d'accès mémoire capables de lire/écrire 8 ou 16 bits sont dans ce cas. Le byte fait alors 8 bits, le mot en fait 16. La séparation entre byte et mot peut parfois se compléter avec des tailles intermédiaires. Par exemple, prenons un processeur qui dispose d'une instruction de lecture capable de lire soit 8 bits, soit 16 bits, soit 32 bits, soit 64 bits. Dans ce cas, le byte vaut 8 bits, le mot en fait 64, les autres tailles sont des intermédiaires. Pour résumer, un mot est la plus grande unité adressable par le processeur, un byte est la plus petite. En général, le byte fait 8 bits, un octet. Mais ça n'a pas toujours été le cas, pas mal de jeux d'instructions font exception. L'exemple le plus parlant est celui des processeurs décimaux, qui utilisaient des entiers codés en BCD mais ne géraient pas les entiers codés en binaire normal. De tels processeurs encodaient des nombres sous la forme d'une suite de chiffres décimaux, codés en BCD sur 4 bits. Ils avaient des bytes de 4 bits, voire de 5/6 bits pour les ordinateurs qui ajoutaient un bit de parité/ECC par chiffre décimal. D'autres architectures avaient un byte de 3 à 7 bits. La taille d'un mot mémoire est de plusieurs bytes : un mot mémoire contient un nombre entier de bytes. La norme actuelle est d'utiliser des bytes d'un octet (8 bits), avec des mots contenant plusieurs octets. Le nombre d'octets dans un mot est généralement une puissance de deux pour simplifier les calculs. Cette règle souffre évidemment d'exceptions, mais l'usage de mots qui ne sont pas des puissances de 2 posent quelques problèmes techniques en termes d’adressage, comme on le verra plus bas. Sur de telles architectures, il y a une adresse mémoire par byte, et non par mot, ce qui fait qu'on parle d''''adressage par byte'''. Tous les ordinateurs modernes utilisent l'adressage par byte. Concrètement, sur les processeurs modernes, chaque octet de la mémoire a sa propre adresse, peu importe la taille du mot utilisé par le processeur. Par exemple, les anciens processeurs x86 32 bits et les processeurs x86 64 bits utilisent tous le même système d'adressage, où chaque octet a sa propre adresse, la seule différence est que les adresses sont plus nombreuses. Avec un adressage par mot, on aurait eu autant d'adresses qu'avant, mais les mots seraient passés de 32 à 64 bits en passant au 64 bits. Les registres font encore une fois la même taille qu'un mot, bien qu'il existe quelques rares exceptions. Les processeurs à adressage par byte ont souvent plusieurs instructions de lecture/écriture, chacune pour une taille précise. Pour rendre cela plus concret, prenons le cas de l'instruction de lecture. Il y a au minimum une instruction de lecture qui lit un byte en mémoire, une autre qui lit un mot complet. Il y a souvent des instructions pour les tailles intermédiaires. Par exemple, un processeur 64 bit a des instructions pour lire 8 bits, une autre pour lire 16 bits, une autre pour en lire 32, et enfin une pour lire 64 bits. Idem pour les instructions d'écriture, et les autres instructions d'accès mémoire. ===Les architectures à adressage par mot de type hybrides=== Il a existé des architectures adressées par mot qui géraient des bytes, mais sans pour autant leur donner des adresses. Leur idée était que les transferts entre CPU et mémoire se faisaient par mots, mais les instructions de lecture/écriture pouvaient sélectionner un byte dans le mot. Une instruction d'accès mémoire devait alors préciser deux choses : l'adresse du mot à lire/écrire, et la position du byte dans le mot adressé. Par exemple, on pouvait demander à lire le mot à l'adresse 0x5F, et de récupérer uniquement le byte numéro 6. Il s'agit d'architectures adressables par mot car l'adresse identifie un mot, pas un byte. Les bytes en question n'avaient pas d'adresses en eux-mêmes, il n'y avait pas d'adressage par byte. La sélection des bytes se faisait dans le processeur : le processeur lisait des mots entiers, avant que le hardware du processeur sélectionne automatiquement le byte voulu. D'ailleurs, aucune de ces architectures ne supportait de mode d'adressage base+index ou base+offset pour sélectionner des bytes dans un mot. Elles supportaient de tels modes d'adressage pour un mot, pas pour les bytes. Pour faire la différence, nous parlerons de pseudo-byte dans ce qui suit, pour bien préciser que ce ne sont pas de vrais bytes. Un exemple est le PDP-6 et le PDP-10, qui avaient des instructions de lecture/écriture de ce type. Elles prenaient trois informations : l'adresse d'un mot, la position du pseudo-byte dans le mot, et enfin la taille d'un pseudo-byte ! L'adressage était donc très flexible, car on pouvait configurer la taille du pseudo-byte. Outre l'instruction de lecture LDB et celle d'écriture DPB, d'autres instructions permettaient de manipuler des pseudo-bytes. L'instruction IBP incrémentait le numéro du pseudo-byte, par exemple. ===Les architectures à mot de taille variable=== D'autres architectures codaient leurs nombres en utilisant un nombre variable de bytes ! Dit autrement, elles avaient des mots de taille variable, d'où leur nom d''''architectures à mots de taille variable'''. Il s'agit d'architectures qui codaient les nombres par des chaines de caractères terminées par un byte de terminaison. La grande majorité étaient des architectures décimales, à savoir des ordinateurs qui utilisaient des nombres encodés en BCD ou dans un encodage similaire. Les nombres étaient codés en décimal, mais chaque chiffre était encodé en binaire sur quelques bits, généralement 4 à 6 bits. Les bytes stockaient chacun un caractère, qui était utilisé pour encoder soit un chiffre décimal, soit un autre symbole comme un byte de terminaison. Un caractère faisait plus de 4 bits, vu qu'il fallait au minimum coder les chiffres BCD et des symboles supplémentaires. La taille d'un caractère était généralement de 5/6 bits. Un exemple est celui des IBM 1400 series, qui utilisaient des chaines de caractères séparées par deux bytes : un byte de ''wordmark'' au début, et un byte de ''record mark'' à la fin. Les caractères étaient des chiffres codés en BCD, chaque caractère était codé sur 6 bits. Les calculs se faisaient chiffre par chiffre, au rythme d'un chiffre utilisé comme opérande par cycle d'horloge. Le processeur passait automatiquement d'un chiffre au suivant pour chaque opérande. Chaque caractère/chiffre avait sa propre adresse, ce qui fait l'architecture est techniquement adressable par byte, alors que les mots correspondaient aux nombres de taille variable. ===La comparaison entre l'adressage par mot et par byte=== Plus haut, nous avons vu deux types d'adressage : par mot et par byte. Avec la première, ce sont les mots qui ont des adresses. Les bytes n'existent pas forcément sur de telles architectures. Si une gestion des bytes est présente, les instructions de lecture/écriture utilisent des adresses pour les mots, couplé à la position du byte dans le mot. Les lectures/écritures se font pas mots entiers. À l'opposé, sur les architectures adressées par byte, une adresse correspond à un byte et non à un mot. Les deux techniques font que l'usage des adresses est différent. Entre une adresse par mot et une par byte, le nombre d'adresse n'est pas le même à capacité mémoire égale. Prenons un exemple assez simple, où l'on compare deux processeurs. Les deux ont des mots mémoire de 32 bits, pour simplifier la comparaison. Le premier processeur gère des bytes de 8 bits, et chacun a sa propre adresse, ce qui fait que c'est un adressage par byte qui est utilisé. Le second ne gère pas les bytes mais seulement des mots de 32 bits, ce qui fait que c'est un adressage par mot qui est utilisé. Dans les deux cas, la mémoire n'est pas organisée de la même manière. Prenons une mémoire de 24 octets pour l'exemple, soit 24/4 = 6 mots de 4 octets. Le premier processeur aura une adresse par byte, soit 24 adresses, et ce sera pareil pour la mémoire, qui utilisera une case mémoire par byte. Le second processeur n'aura que 6 adresses : une par mot. La mémoire a des cases mémoire qui contiennent un mot entier, soit 32 bits, 4 octets. [[File:Byte and word addressing.png|centre|vignette|upright=2|Adressage par mot et par Byte.]] L'avantage de l'adressage par mot est que l'on peut adresser plus de mémoire pour un nombre d'adresses égal. Si on a un processeur qui gère des adresses de 16 bits, on peut adresser 2^16 = 65 536 adresses. Avec un mot mémoire de 4 bytes d'un octet chacun, on peut adresser : soit 65 536 bytes/octets, soit 65 536mots et donc 65 536 × 4 octets. L'adressage par mot permet donc d'adresser plus de mémoire avec les mêmes adresses. Une autre manière de voir les choses est qu'une architecture à adressage par byte va utiliser beaucoup plus d'adresses qu'une architecture par mot, à capacité mémoire égale. L'avantage des architectures à adressage par byte est que l'on peut plus facilement modifier des données de petite taille. Par exemple, imaginons qu'un programmeur manipule du texte, avec des caractères codés sur un octet. S'il veut remplacer les lettres majuscules par des minuscules, il doit changer chaque lettre indépendamment des autres, l'une après l'autre. Avec un adressage par mot, il doit lire un mot entier, modifier chaque octet en utilisant des opérations de masquage, puis écrire le mot final. Avec un adressage par byte, il peut lire chaque byte indépendamment, le modifier sans recourir à des opérations de masquage, puis écrire le résultat. Le tout est plus simple avec l'adressage par byte : pas besoin d'opérations de masquage ! Par contre, les architectures à adressage par byte ont de nombreux défauts. Le fait qu'un mot contienne plusieurs octets/bytes a de nombreuses conséquences, desquelles naissent les contraintes d'alignement, de boutisme et autres. Dans ce qui suit, nous allons étudier les défauts des architectures adressables par byte, et allons laisser de côté les architectures adressables par mot. La raison est que toutes les architectures modernes sont adressables par byte, les seules architectures adressables par mot étant de très vieux ordinateurs aujourd'hui disparus. ==Le boutisme : une spécificité de l'adressage par byte== Le premier problème lié à l'adressage par byte est lié au fait que l'on a plusieurs bytes par mot : dans quel ordre placer les bytes dans un mot ? On peut introduire le tout par une analogie avec les langues humaines : certaines s’écrivent de gauche à droite et d'autres de droite à gauche. Dans un ordinateur, c'est pareil avec les bytes/octets des mots mémoire : on peut les écrire soit de gauche à droite, soit de droite à gauche. Quand on veut parler de cet ordre d'écriture, on parle de '''boutisme''' (''endianness''). Dans ce qui suit, nous allons partir du principe que le byte fait un octet, mais gardez dans un coin de votre tête que ce n'a pas toujours été le cas. Les explications qui vont suivre restent valide peu importe la taille du byte. ===Les différents types de boutisme=== Les deux types de boutisme les plus simples sont le gros-boutisme et le petit-boutisme. Sur les '''processeurs gros-boutistes''', la donnée est stockée des adresses les plus faibles vers les adresses plus grande. Pour rendre cela plus clair, prenons un entier qui prend plusieurs octets et qui est stocké entre deux adresses. L'octet de poids fort de l'entier est stocké dans l'adresse la plus faible, et inversement pour le poids faible qui est stocké dans l'adresse la plus grande. Sur les '''processeurs petit-boutistes''', c'est l'inverse : l'octet de poids faible de notre donnée est stocké dans la case mémoire ayant l'adresse la plus faible. La donnée est donc stockée dans l'ordre inverse pour les octets. Certains processeurs sont un peu plus souples : ils laissent le choix du boutisme. Sur ces processeurs, on peut configurer le boutisme en modifiant un bit dans un registre du processeur : il faut mettre ce bit à 1 pour du petit-boutiste, et à 0 pour du gros-boutiste, par exemple. Ces processeurs sont dits '''bi-boutistes'''. {| |[[File:Big-Endian-fr.svg|class=transparent|Gros-boutisme.]] |[[File:Little-Endian-fr.svg|class=transparent|Petit-boutisme.]] |} Petit et gros-boutisme ont pour particularité que la taille des mots ne change pas vraiment l'organisation des octets. Peu importe la taille d'un mot, celui-ci se lit toujours de gauche à droite, ou de droite à gauche. Cela n’apparaît pas avec les techniques de boutismes plus compliquées. [[File:Big-endian little-endian.jpg|centre|vignette|upright=2.5|Comparaison entre ''big-endian'' et ''little-endian'', pour des tailles de 16 et 32 bits.]] [[File:Comparaison entre boutisme avec et sans inversion de mots mémoire.jpg|vignette|Comparaison entre un nombre codé en gros-boutiste pur, et un nombre gros-boutiste dont les octets sont rangés dans un groupe en petit-boutiste. Le nombre en question est 0x 0A 0B 0C 0D, en hexadécimal, le premier mot mémoire étant indiqué en jaune, le second en blanc.]] Certains processeurs ont des boutismes plus compliqués, où chaque mot mémoire est découpé en plusieurs groupes d'octets. Il faut alors prendre en compte le boutisme des octets dans le groupe, mais aussi le boutisme des groupes eux-mêmes. On distingue ainsi un boutisme inter-groupe (le boutisme des groupes eux-même) et un boutisme intra-groupe (l'ordre des octets dans chaque groupe), tout deux pouvant être gros-boutiste ou petit-boutiste. Si l'ordre intra-groupe est identique à l'ordre inter-groupe, alors on retrouve du gros- ou petit-boutiste normal. Mais les choses changent si jamais l'ordre inter-groupe et intra-groupe sont différents. Dans ces conditions, on doit préciser un ordre d’inversion des mots mémoire (''byte-swap''), qui précise si les octets doivent être inversés dans un mot mémoire processeur, en plus de préciser si l'ordre des mots mémoire est petit- ou gros-boutiste. ===Avantages, inconvénients et usage=== Le choix entre petit boutisme et gros boutisme est généralement une simple affaire de convention. Il n'y a pas d'avantage vraiment probant pour l'une ou l'autre de ces deux méthodes, juste quelques avantages ou inconvénients mineurs. Dans les faits, il y a autant d'architectures petit- que de gros-boutistes, la plupart des architectures récentes étant bi-boutistes. Précisons que le jeu d'instruction x86 est de type petit-boutiste. Si on quitte le domaine des jeu d'instruction, les protocoles réseaux et les formats de fichiers imposent un boutisme particulier. Les protocoles réseaux actuels (TCP-IP) sont de type gros-boutiste, ce qui impose de convertir les données réseaux avant de les utiliser sur les PC modernes. Et au passage, si le gros-boutisme est utilisé dans les protocoles réseau, alors que le petit-boutisme est roi sur le x86, c'est pour des raisons pratiques, que nous allons aborder ci-dessous. Le gros-boutisme est très facile à lire pour les humains. Les nombres en gros-boutistes se lisent de droite à gauche, comme il est d'usage dans les langues indo-européennes, alors que les nombres en petit boutistes se lisent dans l'ordre inverse de lecture. Pour la lecture en hexadécimal, il faut inverser l'ordre des octets, mais il faut garder l'ordre des chiffres dans chaque octet. Par exemple, le nombre 0x015665 (87 653 en décimal) se lit 0x015665 en gros-boutiste, mais 0x655601 en petit-boutiste. Et je ne vous raconte pas ce que cela donne avec un ''byte-swap''... Cette différence pose problème quand on doit lire des fichiers, du code machine ou des paquets réseau, avec un éditeur hexadécimal. Alors certes, la plupart des professionnels lisent directement les données en passant par des outils d'analyse qui se chargent d'afficher les nombres en gros-boutiste, voire en décimal. Un professionnel a à sa disposition du désassembleur pour le code machine, des analyseurs de paquets pour les paquets réseau, des décodeurs de fichiers pour les fichiers, des analyseurs de ''dump'' mémoire pour l'analyse de la mémoire, etc. Cependant, le gros-boutisme reste un avantage quand on utilise un éditeur hexadécimal, quel que soit l'usage. En conséquence, le gros-boutiste a été historiquement pas mal utilisé dans les protocoles réseaux et les formats de fichiers. Par contre, cet avantage de lecture a dû faire face à divers désavantages pour les architectures de processeur. Le petit-boutisme peut avoir des avantages sur les architectures qui gèrent des données de taille intermédiaires entre le byte et le mot. C'est le cas sur le x86, où l'on peut décider de lire des données de 8, 16, 32, ou 64 bits à partir d'une adresse mémoire. Avec le petit-boutisme, on s'assure qu'une lecture charge bien la même valeur, le même nombre. Par exemple, imaginons que je stocke le nombre 0x 14 25 36 48 sur un mot mémoire, en petit-boutiste. En petit-boutiste, une opération de lecture reverra soit les 8 bits de poids faible (0x 48), soit les 16 bits de poids faible (0x 36 48), soit le nombre complet. Ce ne serait pas le cas en gros-boutiste, où les lectures reverraient respectivement 0x 14, 0x 14 25 et 0x 14 25 36 48. Avec le gros-boutisme, de telles opérations de lecture n'ont pas vraiment de sens. En soit, cet avantage est assez limité et n'est utile que pour les compilateurs et les programmeurs en assembleur. Un autre avantage est un gain de performance pour certaines opérations. Les instructions en question sont les opérations où on doit additionner d'opérandes codées sur plusieurs octets; sur un processeur qui fait les calculs octet par octet. En clair, le processeur dispose d'instructions de calcul qui additionnent des nombres de 16, 32 ou 64 bit, voire plus. Mais à l'intérieur du processeur, les calculs sont faits octets par octets, l'unité de calcul ne pouvant qu'additionner deux nombres de 8 bits à la fois. Dans ce cas, le petit-boutisme garantit que l'addition des octets se fait dans le bon ordre, en commençant par les octets de poids faible pour progresser vers les octets de poids fort. En gros-boutisme, les choses sont beaucoup plus compliquées... Pour résumer, les avantages et inconvénients de chaque boutisme sont mineurs. Le gain en performance est nul sur les architectures modernes, qui ont des unités de calcul capables de faire des additions multi-octets. L'usage d'opérations de lecture de taille variable est aujourd'hui tombé en désuétude, vu que cela ne sert pas à grand chose et complexifie le jeu d'instruction. Enfin, l'avantage de lecture n'est utile que dans situations tellement rares qu'on peut légitimement questionner son statut d'avantage. En bref, les différentes formes de boutisme se valent. ==L'implémentation de l'adressage par byte au niveau de la mémoire RAM/ROM== Avant de poursuivre, rappelons que la notion de byte est avant tout liée au jeu d'instruction, mais qu'elle ne dit rien du bus mémoire ! Il est parfaitement possible d'utiliser un bus mémoire d'une taille différente de celle du byte ou du mot. La largeur du bus mémoire, la taille d'un mot, et la taille d'un byte, ne sont pas forcément corrélées. Néanmoins, deux cas classiques sont les plus courants. ===Les architectures avec une mémoire adressable par byte=== Le premier est celui où le bus mémoire transmet un byte à la fois. En clair, la largeur du bus mémoire est celle du byte. Le moindre accès mémoire se fait byte par byte, donc en plusieurs cycles d'horloge. Par exemple, sur un processeur 64 bits, la lecture d'un mot complet se fera octet par octet, ce qui demandera 8 cycles d'horloge, cycles d'horloge mémoire qui plus est. Ce qui explique le désavantage de cette méthode : la performance est assez mauvaise. La performance dépend de plus de la taille des données lue/écrites. On prend moins de temps à lire une donnée courte qu'une donnée longue. L'avantage est qu'on peut lire ou écrire un mot, peu importe son adresse. Pour donner un exemple, je peux parfaitement lire une donnée de 16 bits localisée à l'adresse 4, puis lire une autre donnée de 16 bits localisée à l'adresse 5 sans aucun problème. En conséquence, il n'y a pas de contraintes d'alignements et les problèmes que nous allons aborder dans la suite n'existent pas. [[File:Chargement d'une donnée sur un processeur sans contraitnes d'alignement.jpg|centre|vignette|upright=2|Chargement d'une donnée sur un processeur sans contraintes d'alignement.]] ===Les architectures avec une mémoire adressable par mot=== Pour éviter d'avoir des performances désastreuses, on utilise une autre solution : le bus mémoire a la largeur nécessaire pour lire un mot entier. Le processeur peut charger un mot mémoire entier dans ses registres, en un seul accès mémoire. Et pour lire des données plus petites qu'un mot mémoire, le processeur charge un mot complet, mais ignore les octets en trop. [[File:Exemple du chargement d'un octet dans un registre de trois octets.jpg|centre|vignette|upright=2|Exemple du chargement d'un octet dans un registre de trois octets.]] Il y a alors confusion entre un mot au sens du jeu d'instruction, et un mot mémoire. Pour rappel, une donnée qui a la même taille que le bus de données est appelée un mot mémoire. Mais dans ce cas, l'adressage de la mémoire et du CPU ne sont pas compatibles : le processeur utilise une adresse par byte, la mémoire une adresse par mot ! Tout se passe comme si la mémoire était découpée en blocs de la taille d'un mot. La capacité de la mémoire reste inchangée, ce qui fait que le nombre d'adresses utilisables diminue : il n'y a plus besoin que d'une adresse par mot mémoire et non par octet. Il faut donc faire une sorte d'interface entre les deux. [[File:Chargement d'une donnée sur un processeur avec contraintes d'alignement.jpg|centre|vignette|upright=2|Chargement d'une donnée sur un processeur avec contraintes d'alignement.]] Par convention, l'adresse d'un mot est l'adresse de son octet de poids faible. Les autres octets du mot ne sont pas adressables par la mémoire. Par exemple, si on prend un mot de 8 octets, on est certain qu'une adresse sur 8 disparaîtra. L'adresse du mot est utilisée pour communiquer avec la mémoire, mais cela ne signifie pas que l'adresse des octets est inutile au-delà du calcul de l'adresse du mot. En effet, l'accès à un octet précis demande de déterminer la position de l'octet dans le mot à partir de l'adresse du octet. Prenons un processeur ayant des mots de 4 octets et répertorions les adresses utilisables. Le premier mot contient les octets d'adresse 0, 1, 2 et 3. L'adresse zéro est l'adresse de l'octet de poids faible et sert donc d'adresse au premier mot, les autres sont inutilisables sur le bus mémoire. Le second mot contient les adresses 4, 5, 6 et 7, l'adresse 4 est l'adresse du mot, les autres sont inutilisables. Et ainsi de suite. Si on fait une liste exhaustive des adresses valides et invalides, on remarque que seules les adresses multiples de 4 sont utilisables. Et ceux qui sont encore plus observateurs remarqueront que 4 est la taille d'un mot. Dans l'exemple précédent, les adresses utilisables sont multiples de la taille d'un mot. Sachez que cela fonctionne quelle que soit la taille du mot. Si N est la taille d'un mot, alors seules les adresses multiples de N seront utilisables. Avec ce résultat, on peut trouver une procédure qui nous donne l'adresse d'un mot à partir de l'adresse d'un octet. Si un mot contient N bytes, alors l'adresse du mot se calcule en divisant l'adresse du byte par N. La position du byte dans le mot est quant à elle le reste de cette division. Un reste de 0 nous dit que l'octet est le premier du mot, un reste de 1 nous dit qu'il est le second, etc. [[File:Adresse d'un mot avec alignement mémoire strict.png|centre|vignette|upright=2|Adresse d'un mot avec alignement mémoire strict.]] Le processeur peut donc adresser la mémoire RAM en traduisant les adresses des octets en adresses de mot. Il lui suffit de faire une division pour cela. Il conserve aussi le reste de la division dans un registre pour sélectionner l'octet une fois la lecture terminée. Un accès mémoire se fait donc comme suit : il reçoit l'adresse à lire, il calcule l'adresse du mot, effectue la lecture, reçoit le mot à lire, et utilise le reste pour sélectionner l'octet final si besoin. La dernière étape est facultative et n'est présente que si on lit une donnée plus petite qu'un mot. La division est une opération assez complexe, mais il y a moyen de ruser. L'idée est de faire en sorte que N soit une puissance de deux. La division se traduit alors par un vulgaire décalage vers la droite, le calcul du reste pas une simple opération de masquage. C'est la raison pour laquelle les processeurs actuels utilisent des mots de 1, 2, 4, 8 octets. Sans cela, les accès mémoire seraient bien plus lents. De plus, cela permet d'économiser des fils sur le bus d'adresse. Si la taille d'un mot est égale à <math>2^{n}</math>, seules les adresses multiples de <math>2^{n}</math> seront utilisables. Or, ces adresses se reconnaissent facilement : leurs n bits de poids faibles valent zéro. On n'a donc pas besoin de câbler les fils correspondant à ces bits de poids faible. ==L'alignement mémoire== Dans la section précédente, nous avons évoqué le cas où un processeur à adressage par byte est couplé à une mémoire adressable par mot. Sur de telles architectures, des problèmes surviennent quand les lectures/écritures se font par mots entiers. Le processeur fournit l'adresse d'un byte, mais lit un mot entier à partir de ce byte. Par exemple, prenons une lecture d'un mot complet : celle-ci précise l'adresse d'un byte. Sur un CPU 64 bits, le processeur lit alors 64 bits d'un coup à partir de l'adresse du byte. Et cela peut poser quelques problèmes, dont la résolution demande de respecter des restrictions sur la place de chaque mot en mémoire, restrictions résumées sous le nom d''''alignement mémoire'''. ===L'exemple sur les processeurs 16 bits=== Pour faire comprendre ce qu'est l'alignement mémoire, nous allons prendre l'exemple d'un processeur 16 bits connecté à une mémoire de 16 bits, via un bus mémoire de 16 bits. Le processeur utilisant l'adressage par byte, chaque octet de la mémoire a sa propre adresse. Par contre, le processeur lit et écrit des paquets de 16 bits, soit deux octets. Un groupe de deux octets est appelé, pour rappel, un '''doublet'''. Pour la mémoire, les octets sont regroupés en groupes de deux, en '''doublets mémoire'''. Pour la mémoire, un doublet mémoire a une adresse unique. Et cela ne colle pas avec l'adressage par byte utilisé par le processeur, il y a une différence entre les adresses du processeur et celles de la mémoire. Il y a une adresse par doublet pour la mémoire, une adresse par octet pour le processeur. L'adresse mémoire a donc un bit de moins que l'adresse processeur. Pour faire la distinction, nous parlerons d'''adresse mémoire'' et d'''adresse processeur''. Lorsque le processeur lit un doublet, il lit le premier octet à une adresse processeur et l'octet suivant dans l'adresse processeur suivante. Les adresses processeur sont donc regroupées par groupes de deux : l'adresse 0 et 1 adressent toutes deux le premier doublet, l'adresse 2 et 3 adressent le second doublet, etc. Un doublet est donc identifié par deux adresses processeur : une '''adresse paire''' et une '''adresse impaire'''. Nous allons partir du principe que l'octet de poids faible est dans l'adresse paire, l'octet de poids fort dans l'adresse impaire. Les règles de boutisme autorise de faire l'inverse, mais ce n'est pas le choix le plus intuitif. L'alignement mémoire dit quoi faire lorsque le processeur veut lire/écrire 16 bits à une adresse impaire. S'il veut lire 16 bits à une adresse impaire, les deux octets seront dans des doublets mémoire différents. Le premier sera l'octet de poids fort d'un doublet, l'autre sera l'octet de poids faible du doublet suivant. Le doublet que le processeur veut lire/écrire est à cheval sur deux doublets mémoire. Et le processeur ne gère pas cette situation naturellement. L'alignement mémoire strict n'autorise que les accès mémoire à des adresses mémoires paires. Tout accès à une adresse mémoire impaire lève une exception matérielle, signe que c'est une erreur matérielle. Par contre, les adresses paires sont autorisées car une adresse paire identifie un doublet mémoire, que le processeur peut lire/écrire en une seule fois, à travers le bus mémoire. Le processeur gère donc uniquement des lectures/écritures de doublet, au sens de doublet mémoire. Sans alignement mémoire, on peut lire/écrire 16 bits à partir d'une adresse paire comme impaire, les deux sont autorisées. Pour cela, le processeur doit gérer les lectures/écritures de 16 bits à des adresses impaires. Vu que les 16 bits demandés sont à cheval sur deux doublets mémoire, le processeur doit lire les deux doublets mémoire, sélectionner les octets adéquats, et les concaténer pour obtenir les 16 bits finaux. Il faut noter que dans une interprétation stricte de l'alignement mémoire, le processeur peut lire/écrire un octet unique, mais seulement s'il est à une adresse paire. Le processeur peut demander à lire ou écrire un seul octet, mais la mémoire fournira deux octets et le processeur devra n'en conserver qu'un. Dans le cas le plus simple, seuls les octets à une adresse paire sont accessibles : l'octet de poids fort d'un doublet n'est pas accesible seul. Le processeur lit un doublet entier dans la mémoire et masque l'octet de poids fort, chargé en trop. Dans un cas plus évolué, les octets à une adresse impaire sont adressables. Dans ce cas, le processeur lit un doublet, déplace l'octet de poids fort dans l'octet de poids faible, et masque l'octet inutile. Dans tous les cas, le processeur ne lit/écrit qu'un doublet à la fois et sélectionne les octets demandés. ===L'alignement mémoire des données=== L'exemple précédent nous a montré ce qu'il en était sur les processeurs 16 bits. Mais pour généraliser le concept, nous allons voir le cas des processeurs 32 bits et plus. Nous venons de voir que l'alignement mémoire sur 16 bits impose des contraintes quant à l'adressage de la mémoire, en empêchant de lire des données qui sont à cheval sur deux doublets. Sur 32 bits, c'est la même chose, mais avec des quadruplets (des groupes de 4 octets, soit 32 bits) : impossible de lire des données si elles sont à cheval sur deux quadruplets mémoire. Sur 64 bits, c'est la même chose, mais avec des octuplets de 8 octets/ 64 bits : impossible de lire des données si elles sont à cheval sur deux octuplets mémoire. La différence, c'est que la situation peut se présenter même si on ne lit pas 32/64 bits. Imaginons le cas particulier suivant : je dispose d'un processeur utilisant des mots de 4 octets. Je dispose aussi d'un programme qui doit manipuler un caractère stocké sur 1 octet, un entier de 4 octets et une donnée de deux octets. Mais un problème se pose : le programme qui manipule ces données a été programmé par quelqu'un qui n'était pas au courant de ces histoire d'alignement, et il a répartit mes données un peu n'importe comment. Supposons que cet entier soit stocké à une adresse non-multiple de 4. Par exemple : {|class=wikitable |- !Adresse !Octet 4 !Octet 3 !Octet 2 !Octet 1 |- |0x 0000 0000 |Caractère |Entier |Entier |Entier |- |0x 0000 0004 |Entier |Donnée |Donnée |- |0x 0000 0008 | | | | |} La lecture ou écriture du caractère ne pose pas de problème, vu qu'il ne fait qu'un seul byte. Pour la donnée de 2 octets, c'est la même chose, car elle tient toute entière dans un mot mémoire. La lire demande de lire le mot et de masquer les octets inutiles. Mais pour l'entier, ça ne marche pas car il est à cheval sur deux mots ! On dit que l'entier n'est pas aligné en mémoire. En conséquence, impossible de le charger en une seule fois Pour résumer, avec un bus mémoire de 32 bits, le problème peut survenir si le processeur veut lire 32 bits, mais aussi 16 bits. Si on veut lire 16 bits, mais que le premier octet est dans un quadruplet, et l'autre octet dans un autre quadruplet, l'alignement mémoire intervient. Idem si on veut lire 4 octets, mais que les 3 premiers sont dans un quadruplet, pas le dernier. Tout cela est plus facile à comprendre avec un exemple. La situation est gérée différemment suivant le processeur. Sur certains processeurs, la donnée est chargée en deux fois : c'est légèrement plus lent que la charger en une seule fois, mais ça passe. On dit que le processeur gère des accès mémoire non-alignés. D'autres processeurs ne gérent pas ce genre d'accès mémoire et les traitent comme une erreur, similaire à une division par zéro, et lève une exception matérielle. Si on est chanceux, la routine d'exception charge la donnée en deux fois. Mais sur d'autres processeurs, le programme responsable de cet accès mémoire en dehors des clous se fait sauvagement planter. Par exemple, essayez de manipuler une donnée qui n'est pas "alignée" dans un mot de 16 octets avec une instruction SSE, vous aurez droit à un joli petit crash ! Pour éviter ce genre de choses, les compilateurs utilisés pour des langages de haut niveau préfèrent rajouter des données inutiles (on dit aussi du bourrage) de façon à ce que chaque donnée soit bien alignée sur le bon nombre d'octets. En reprenant notre exemple du dessus, et en notant le bourrage X, on obtiendrait ceci : {|class=wikitable |- !Adresse !Octet 4 !Octet 3 !Octet 2 !Octet 1 |- |0x 0000 0000 |Caractère |X |X |X |- |0x 0000 0004 |Entier |Entier |Entier |Entier |- |0x 0000 0008 |Donnée |Donnée |X |X |} Comme vous le voyez, de la mémoire est gâchée inutilement. Et quand on sait que de la mémoire cache est gâchée ainsi, ça peut jouer un peu sur les performances. Il y a cependant des situations dans lesquelles rajouter du bourrage est une bonne chose et permet des gains en performances assez abominables (une sombre histoire de cache dans les architectures multiprocesseurs ou multi-cœurs, mais je n'en dit pas plus). L'alignement mémoire se gère dans certains langages (comme le C, le C++ ou l'ADA), en gérant l'ordre de déclaration des variables. Essayez toujours de déclarer vos variables de façon à remplir un mot intégralement ou le plus possible. Renseignez-vous sur le bourrage, et essayez de savoir quelle est la taille des données en regardant la norme de vos langages. ===L'alignement des instructions en mémoire=== Les instructions ont toute une certaine taille, et elles peuvent être de taille fixe (toutes les instructions font X octets), ou de taille variable (le nombre d'octets dépend de l'instruction). Dans les deux cas, le processeur peut incorporer des contraintes sur l'alignement des instructions, au même titre que les contraintes d'alignement sur les données vues précédemment. Pour les instructions de taille fixe, les instructions sont placées à des adresses précises. Par exemple, prenons des instructions de 8 octets. La première instruction prend les 8 premiers octets de la mémoire, la seconde prend les 8 octets suivants, etc. En faisant cela, l'adresse d'une instruction est toujours un multiple de 8. Et on peut généraliser pour toute instruction de taille fixe : si elle fait X octets, son adresse est un multiple de X. Généralement, on prend X une puissance de deux pour simplifier beaucoup de choses. Notamment, cela permet de simplifier le ''program counter'' : quelques bits de poids faible deviennent inutiles. Par exemple, si on prend des instructions de 4 octets, les adresses des instructions sont des multiples de 4, donc les deux bits de poids faible de l'adresse sont toujours 00 et ne sont pas intégrés dans le ''program counter''. Le ''program counter'' est alors plus court de deux bits. Idem avec des instructions de 8 octets qui font économiser 3 bits, ou avec des instructions de 16 octets qui font économiser 4 bits. Les instructions de taille variable ne sont généralement pas alignées. Sur certains processeurs, les instructions n'ont pas de contraintes d'alignement du tout. Leur chargement est donc plus compliqué et demande des méthodes précises qui seront vues dans le chapitre sur l'unité de chargement du processeur. Évidemment, le chargement d'instructions non-alignées est donc plus lent. En conséquence, même si le processeur supporte des instructions non-alignées, les compilateurs ont tendance à aligner les instructions comme les données, sur la taille d'un mot mémoire, afin de gagner en performance. Sur d'autres processeurs, les instructions doivent être alignées. Dans le cas le plus simple, les instructions doivent être alignées sur un mot mémoire, elles doivent respecter les mêmes contraintes d'alignement que les données. Elles peuvent être plus courtes ou plus longues qu'un mot, mais elles doivent commencer à la première adresse d'un mot mémoire. D'autres architectures ont des contraintes d'alignement bizarres. Par exemple, les premiers processeurs x86 16 bits imposaient des instructions alignées sur 16 bits et cette contrainte est restée sur les processeurs 32 bits. Que ce soit pour des instructions de taille fixe ou variables, les circuits de chargement des instructions et les circuits d'accès mémoire ne sont pas les mêmes, ce qui fait que leurs contraintes d'alignement peuvent être différentes. On peut avoir quatre possibilités : des instructions non-alignées et des données alignées, l'inverse, les deux qui sont alignées, les deux qui ne sont pas alignées. Par exemple, il se peut qu'un processeur accepte des données non-alignées, mais ne gère pas des instructions non-alignées ! Le cas le plus simple, fréquent sur les architectures RISC, est d'avoir des instructions et données alignées de la même manière. Les architectures CISC utilisent souvent des contraintes d'alignement, avec généralement des instructions de taille variables non-alignées, mais des données alignées. Les deux dernières possibilités ne sont presque jamais utilisées. De plus, sur les processeurs où les deux sont alignés, on peut avoir un alignement différent pour les données et les instructions. Par exemple, pour un processeur qui utilise des instructions de 8 octets, mais des données de 4 octets. Les différences d'alignements posent une contrainte sur l'économie des bits sur le bus d'adresse. Il faut alors regarder ce qui se passe sur l'alignement des données. Par exemple, pour un processeur qui utilise des instructions de 8 octets, mais des données de 4 octets, on ne pourra économiser que deux bits, pour respecter l'alignement des données. Ou encore, sur un processeur avec des instructions alignées sur 8 octets, mais des données non-alignées, on ne pourra rien économiser. Un cas particulier est celui de l'Intel iAPX 432, dont les instructions étaient non-alignées au niveau des bits ! Leur taille variable faisait que la taille des instructions n'était pas un multiple d'octets. Il était possible d'avoir des instructions larges de 23 bits, d'autres de 41 bits, ou toute autre valeur non-divisible par 8. Un octet pouvait contenir des morceaux de deux instructions, à cheval sur l'octet. Ce comportement fort peu pratique faisait que l'implémentation de l'unité d"e chargement était complexe. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres du processeur | prevText=Les registres du processeur | next=Les modes d'adressage | nextText=Les modes d'adressage }} </noinclude> io1ky6cx6o36420yse9kmq0928v571w 745878 745877 2025-07-03T17:10:47Z Mewtow 31375 /* L'exemple sur les processeurs 16 bits */ 745878 wikitext text/x-wiki Dans ce chapitre, on va parler de l'''endianess'' du processeur et de son alignement mémoire. Concrètement, on va s'intéresser à la façon dont le processeur repartit en mémoire les octets des données qu'il manipule. Ces deux paramètres sont sûrement déjà connus de ceux qui ont une expérience de la programmation assez conséquente. Les autres apprendront ce que c'est dans ce chapitre. Pour simplifier, ils sont à prendre en compte quand on échange des données entre registres et mémoire RAM. ==La différence entre mots et bytes== Avant toute chose, nous allons reparler rapidement de la différence entre un byte et un mot. Les deux termes sont généralement polysémiques, avec plusieurs sens. Aussi, définir ce qu'est un mot est assez compliqué. Voyons les différents sens de ce terme, chacun étant utile dans un contexte particulier. Dans les chapitres précédents, nous avons parlé des mots mémoire, à savoir des blocs de mémoire dont le nombre de bits correspond à la largeur du bus mémoire. Le premier sens possible est donc la quantité de données que l'on peut transférer entre CPU et RAM en un seul cycle d'horloge. Il s'agit d'une définition basée sur les transferts réels entre processeur et mémoire. Le terme que nous avons utilisé pour cette définition est : '''mot mémoire'''. Remarquez la subtile différence entre les termes "mot" et "mot mémoire" : le second terme indique bien qu'il s'agit de quelque de lié à la mémoire, pas le premier. Les deux ne sont pas confondre, et nous allons voir pourquoi. La définition précédente ne permet pas de définir ce qu'est un byte et un mot, vu que la distinction se fait au niveau du processeur, au niveau du jeu d'instruction. Précisément, elle intervient au niveau des instructions d'accès mémoire, éventuellement de certaines opérations de traitement de données. Dans ce qui va suivre, nous allons faire la différence entre les architectures à mot, à byte, et à chaines de caractères. Voyons dans le détail ces histoires de mots, de bytes, et autres. ===Les architectures à adressage par mot=== Au tout début de l'informatique, sur les anciens ordinateurs datant d'avant les années 80, les processeurs géraient qu'une seule taille pour les données. Par exemple, de tels processeurs ne géraient que des données de 8 bits, pas autre chose. Les données en question était des '''mots'''. Aux tout début de l'informatique, certaines machines utilisaient des mots de 3, 4, 5, 6 7, 13, 17, 23, 36 ou 48 bits. Pour donner quelques exemples, l'ordinateur ERA 1103 utilisait des mots de 36-bits, tout comme le PDP-10, et ne gérait pas d'autre taille pour les données : c'était 36 bits pour tout le monde. Les processeurs en question ne disposaient que d'une seule instruction de lecture/écriture, qui lisait/écrivait des mots entiers. On pouvait ainsi lire ou écrire des paquets de 3, 4, 5, 6 7, 13, 17, 23, 36 ou 48 bits. Les registres du processeur avaient généralement la même taille qu'un mot, ce qui fait que les processeurs de l'époque avaient des registres de 4, 8, 12, 24, 26, 28, 31, 36, 48, voire 60 bits. Les mots en question sont en théorie à distinguer des mots mémoire, mais ce n'est pas souvent le cas en pratique. Les architectures à adressage par mot faisaient en sorte qu'un mot soit de la même taille qu'un mot mémoire. La mémoire était donc découpée en mots, chacun avait sa propre adresse. Par exemple, une mémoire de 64 kilo-mots contenait 65 536 mots, chacun contenant autant de bits qu'un mot. Les mots faisaient tous la même taille, qui variait suivant la mémoire ou le processeur utilisé. Chaque mot avait sa propre adresse, ce qui fait qu'on parlait d''''adressage par mot'''. Il n'y avait qu'une seule unité d'adressage, ce qui fait que le byte et le mot étaient la même chose sur de telles architectures. La distinction entre byte et mot est apparue après, sur des ordinateurs/processeurs différents. ===Les architectures à adressage par byte=== Par la suite, des processeurs ont permis d'adresser des données plus petites qu'un mot. Les processeurs en question disposent de plusieurs instructions de lecture/écriture, qui manipulent des blocs de mémoire de taille différente. Par exemple, il peut avoir une instruction de lecture pour lire 8 bits, une autre pour lire 16 bits, une autre 32, etc. Une autre possibilité est celle où le processeur dispose d'une instruction de lecture, qu'on peut configurer suivant qu'on veuille lire/écrire un octet, deux, quatre, huit. Dans ce cas, on peut faire une distinction entre '''''byte''''' et '''mot''' : le byte est la plus petite donnée, le mot est la plus grande. Par exemple, un processeur disposant d'instruction d'accès mémoire capables de lire/écrire 8 ou 16 bits sont dans ce cas. Le byte fait alors 8 bits, le mot en fait 16. La séparation entre byte et mot peut parfois se compléter avec des tailles intermédiaires. Par exemple, prenons un processeur qui dispose d'une instruction de lecture capable de lire soit 8 bits, soit 16 bits, soit 32 bits, soit 64 bits. Dans ce cas, le byte vaut 8 bits, le mot en fait 64, les autres tailles sont des intermédiaires. Pour résumer, un mot est la plus grande unité adressable par le processeur, un byte est la plus petite. En général, le byte fait 8 bits, un octet. Mais ça n'a pas toujours été le cas, pas mal de jeux d'instructions font exception. L'exemple le plus parlant est celui des processeurs décimaux, qui utilisaient des entiers codés en BCD mais ne géraient pas les entiers codés en binaire normal. De tels processeurs encodaient des nombres sous la forme d'une suite de chiffres décimaux, codés en BCD sur 4 bits. Ils avaient des bytes de 4 bits, voire de 5/6 bits pour les ordinateurs qui ajoutaient un bit de parité/ECC par chiffre décimal. D'autres architectures avaient un byte de 3 à 7 bits. La taille d'un mot mémoire est de plusieurs bytes : un mot mémoire contient un nombre entier de bytes. La norme actuelle est d'utiliser des bytes d'un octet (8 bits), avec des mots contenant plusieurs octets. Le nombre d'octets dans un mot est généralement une puissance de deux pour simplifier les calculs. Cette règle souffre évidemment d'exceptions, mais l'usage de mots qui ne sont pas des puissances de 2 posent quelques problèmes techniques en termes d’adressage, comme on le verra plus bas. Sur de telles architectures, il y a une adresse mémoire par byte, et non par mot, ce qui fait qu'on parle d''''adressage par byte'''. Tous les ordinateurs modernes utilisent l'adressage par byte. Concrètement, sur les processeurs modernes, chaque octet de la mémoire a sa propre adresse, peu importe la taille du mot utilisé par le processeur. Par exemple, les anciens processeurs x86 32 bits et les processeurs x86 64 bits utilisent tous le même système d'adressage, où chaque octet a sa propre adresse, la seule différence est que les adresses sont plus nombreuses. Avec un adressage par mot, on aurait eu autant d'adresses qu'avant, mais les mots seraient passés de 32 à 64 bits en passant au 64 bits. Les registres font encore une fois la même taille qu'un mot, bien qu'il existe quelques rares exceptions. Les processeurs à adressage par byte ont souvent plusieurs instructions de lecture/écriture, chacune pour une taille précise. Pour rendre cela plus concret, prenons le cas de l'instruction de lecture. Il y a au minimum une instruction de lecture qui lit un byte en mémoire, une autre qui lit un mot complet. Il y a souvent des instructions pour les tailles intermédiaires. Par exemple, un processeur 64 bit a des instructions pour lire 8 bits, une autre pour lire 16 bits, une autre pour en lire 32, et enfin une pour lire 64 bits. Idem pour les instructions d'écriture, et les autres instructions d'accès mémoire. ===Les architectures à adressage par mot de type hybrides=== Il a existé des architectures adressées par mot qui géraient des bytes, mais sans pour autant leur donner des adresses. Leur idée était que les transferts entre CPU et mémoire se faisaient par mots, mais les instructions de lecture/écriture pouvaient sélectionner un byte dans le mot. Une instruction d'accès mémoire devait alors préciser deux choses : l'adresse du mot à lire/écrire, et la position du byte dans le mot adressé. Par exemple, on pouvait demander à lire le mot à l'adresse 0x5F, et de récupérer uniquement le byte numéro 6. Il s'agit d'architectures adressables par mot car l'adresse identifie un mot, pas un byte. Les bytes en question n'avaient pas d'adresses en eux-mêmes, il n'y avait pas d'adressage par byte. La sélection des bytes se faisait dans le processeur : le processeur lisait des mots entiers, avant que le hardware du processeur sélectionne automatiquement le byte voulu. D'ailleurs, aucune de ces architectures ne supportait de mode d'adressage base+index ou base+offset pour sélectionner des bytes dans un mot. Elles supportaient de tels modes d'adressage pour un mot, pas pour les bytes. Pour faire la différence, nous parlerons de pseudo-byte dans ce qui suit, pour bien préciser que ce ne sont pas de vrais bytes. Un exemple est le PDP-6 et le PDP-10, qui avaient des instructions de lecture/écriture de ce type. Elles prenaient trois informations : l'adresse d'un mot, la position du pseudo-byte dans le mot, et enfin la taille d'un pseudo-byte ! L'adressage était donc très flexible, car on pouvait configurer la taille du pseudo-byte. Outre l'instruction de lecture LDB et celle d'écriture DPB, d'autres instructions permettaient de manipuler des pseudo-bytes. L'instruction IBP incrémentait le numéro du pseudo-byte, par exemple. ===Les architectures à mot de taille variable=== D'autres architectures codaient leurs nombres en utilisant un nombre variable de bytes ! Dit autrement, elles avaient des mots de taille variable, d'où leur nom d''''architectures à mots de taille variable'''. Il s'agit d'architectures qui codaient les nombres par des chaines de caractères terminées par un byte de terminaison. La grande majorité étaient des architectures décimales, à savoir des ordinateurs qui utilisaient des nombres encodés en BCD ou dans un encodage similaire. Les nombres étaient codés en décimal, mais chaque chiffre était encodé en binaire sur quelques bits, généralement 4 à 6 bits. Les bytes stockaient chacun un caractère, qui était utilisé pour encoder soit un chiffre décimal, soit un autre symbole comme un byte de terminaison. Un caractère faisait plus de 4 bits, vu qu'il fallait au minimum coder les chiffres BCD et des symboles supplémentaires. La taille d'un caractère était généralement de 5/6 bits. Un exemple est celui des IBM 1400 series, qui utilisaient des chaines de caractères séparées par deux bytes : un byte de ''wordmark'' au début, et un byte de ''record mark'' à la fin. Les caractères étaient des chiffres codés en BCD, chaque caractère était codé sur 6 bits. Les calculs se faisaient chiffre par chiffre, au rythme d'un chiffre utilisé comme opérande par cycle d'horloge. Le processeur passait automatiquement d'un chiffre au suivant pour chaque opérande. Chaque caractère/chiffre avait sa propre adresse, ce qui fait l'architecture est techniquement adressable par byte, alors que les mots correspondaient aux nombres de taille variable. ===La comparaison entre l'adressage par mot et par byte=== Plus haut, nous avons vu deux types d'adressage : par mot et par byte. Avec la première, ce sont les mots qui ont des adresses. Les bytes n'existent pas forcément sur de telles architectures. Si une gestion des bytes est présente, les instructions de lecture/écriture utilisent des adresses pour les mots, couplé à la position du byte dans le mot. Les lectures/écritures se font pas mots entiers. À l'opposé, sur les architectures adressées par byte, une adresse correspond à un byte et non à un mot. Les deux techniques font que l'usage des adresses est différent. Entre une adresse par mot et une par byte, le nombre d'adresse n'est pas le même à capacité mémoire égale. Prenons un exemple assez simple, où l'on compare deux processeurs. Les deux ont des mots mémoire de 32 bits, pour simplifier la comparaison. Le premier processeur gère des bytes de 8 bits, et chacun a sa propre adresse, ce qui fait que c'est un adressage par byte qui est utilisé. Le second ne gère pas les bytes mais seulement des mots de 32 bits, ce qui fait que c'est un adressage par mot qui est utilisé. Dans les deux cas, la mémoire n'est pas organisée de la même manière. Prenons une mémoire de 24 octets pour l'exemple, soit 24/4 = 6 mots de 4 octets. Le premier processeur aura une adresse par byte, soit 24 adresses, et ce sera pareil pour la mémoire, qui utilisera une case mémoire par byte. Le second processeur n'aura que 6 adresses : une par mot. La mémoire a des cases mémoire qui contiennent un mot entier, soit 32 bits, 4 octets. [[File:Byte and word addressing.png|centre|vignette|upright=2|Adressage par mot et par Byte.]] L'avantage de l'adressage par mot est que l'on peut adresser plus de mémoire pour un nombre d'adresses égal. Si on a un processeur qui gère des adresses de 16 bits, on peut adresser 2^16 = 65 536 adresses. Avec un mot mémoire de 4 bytes d'un octet chacun, on peut adresser : soit 65 536 bytes/octets, soit 65 536mots et donc 65 536 × 4 octets. L'adressage par mot permet donc d'adresser plus de mémoire avec les mêmes adresses. Une autre manière de voir les choses est qu'une architecture à adressage par byte va utiliser beaucoup plus d'adresses qu'une architecture par mot, à capacité mémoire égale. L'avantage des architectures à adressage par byte est que l'on peut plus facilement modifier des données de petite taille. Par exemple, imaginons qu'un programmeur manipule du texte, avec des caractères codés sur un octet. S'il veut remplacer les lettres majuscules par des minuscules, il doit changer chaque lettre indépendamment des autres, l'une après l'autre. Avec un adressage par mot, il doit lire un mot entier, modifier chaque octet en utilisant des opérations de masquage, puis écrire le mot final. Avec un adressage par byte, il peut lire chaque byte indépendamment, le modifier sans recourir à des opérations de masquage, puis écrire le résultat. Le tout est plus simple avec l'adressage par byte : pas besoin d'opérations de masquage ! Par contre, les architectures à adressage par byte ont de nombreux défauts. Le fait qu'un mot contienne plusieurs octets/bytes a de nombreuses conséquences, desquelles naissent les contraintes d'alignement, de boutisme et autres. Dans ce qui suit, nous allons étudier les défauts des architectures adressables par byte, et allons laisser de côté les architectures adressables par mot. La raison est que toutes les architectures modernes sont adressables par byte, les seules architectures adressables par mot étant de très vieux ordinateurs aujourd'hui disparus. ==Le boutisme : une spécificité de l'adressage par byte== Le premier problème lié à l'adressage par byte est lié au fait que l'on a plusieurs bytes par mot : dans quel ordre placer les bytes dans un mot ? On peut introduire le tout par une analogie avec les langues humaines : certaines s’écrivent de gauche à droite et d'autres de droite à gauche. Dans un ordinateur, c'est pareil avec les bytes/octets des mots mémoire : on peut les écrire soit de gauche à droite, soit de droite à gauche. Quand on veut parler de cet ordre d'écriture, on parle de '''boutisme''' (''endianness''). Dans ce qui suit, nous allons partir du principe que le byte fait un octet, mais gardez dans un coin de votre tête que ce n'a pas toujours été le cas. Les explications qui vont suivre restent valide peu importe la taille du byte. ===Les différents types de boutisme=== Les deux types de boutisme les plus simples sont le gros-boutisme et le petit-boutisme. Sur les '''processeurs gros-boutistes''', la donnée est stockée des adresses les plus faibles vers les adresses plus grande. Pour rendre cela plus clair, prenons un entier qui prend plusieurs octets et qui est stocké entre deux adresses. L'octet de poids fort de l'entier est stocké dans l'adresse la plus faible, et inversement pour le poids faible qui est stocké dans l'adresse la plus grande. Sur les '''processeurs petit-boutistes''', c'est l'inverse : l'octet de poids faible de notre donnée est stocké dans la case mémoire ayant l'adresse la plus faible. La donnée est donc stockée dans l'ordre inverse pour les octets. Certains processeurs sont un peu plus souples : ils laissent le choix du boutisme. Sur ces processeurs, on peut configurer le boutisme en modifiant un bit dans un registre du processeur : il faut mettre ce bit à 1 pour du petit-boutiste, et à 0 pour du gros-boutiste, par exemple. Ces processeurs sont dits '''bi-boutistes'''. {| |[[File:Big-Endian-fr.svg|class=transparent|Gros-boutisme.]] |[[File:Little-Endian-fr.svg|class=transparent|Petit-boutisme.]] |} Petit et gros-boutisme ont pour particularité que la taille des mots ne change pas vraiment l'organisation des octets. Peu importe la taille d'un mot, celui-ci se lit toujours de gauche à droite, ou de droite à gauche. Cela n’apparaît pas avec les techniques de boutismes plus compliquées. [[File:Big-endian little-endian.jpg|centre|vignette|upright=2.5|Comparaison entre ''big-endian'' et ''little-endian'', pour des tailles de 16 et 32 bits.]] [[File:Comparaison entre boutisme avec et sans inversion de mots mémoire.jpg|vignette|Comparaison entre un nombre codé en gros-boutiste pur, et un nombre gros-boutiste dont les octets sont rangés dans un groupe en petit-boutiste. Le nombre en question est 0x 0A 0B 0C 0D, en hexadécimal, le premier mot mémoire étant indiqué en jaune, le second en blanc.]] Certains processeurs ont des boutismes plus compliqués, où chaque mot mémoire est découpé en plusieurs groupes d'octets. Il faut alors prendre en compte le boutisme des octets dans le groupe, mais aussi le boutisme des groupes eux-mêmes. On distingue ainsi un boutisme inter-groupe (le boutisme des groupes eux-même) et un boutisme intra-groupe (l'ordre des octets dans chaque groupe), tout deux pouvant être gros-boutiste ou petit-boutiste. Si l'ordre intra-groupe est identique à l'ordre inter-groupe, alors on retrouve du gros- ou petit-boutiste normal. Mais les choses changent si jamais l'ordre inter-groupe et intra-groupe sont différents. Dans ces conditions, on doit préciser un ordre d’inversion des mots mémoire (''byte-swap''), qui précise si les octets doivent être inversés dans un mot mémoire processeur, en plus de préciser si l'ordre des mots mémoire est petit- ou gros-boutiste. ===Avantages, inconvénients et usage=== Le choix entre petit boutisme et gros boutisme est généralement une simple affaire de convention. Il n'y a pas d'avantage vraiment probant pour l'une ou l'autre de ces deux méthodes, juste quelques avantages ou inconvénients mineurs. Dans les faits, il y a autant d'architectures petit- que de gros-boutistes, la plupart des architectures récentes étant bi-boutistes. Précisons que le jeu d'instruction x86 est de type petit-boutiste. Si on quitte le domaine des jeu d'instruction, les protocoles réseaux et les formats de fichiers imposent un boutisme particulier. Les protocoles réseaux actuels (TCP-IP) sont de type gros-boutiste, ce qui impose de convertir les données réseaux avant de les utiliser sur les PC modernes. Et au passage, si le gros-boutisme est utilisé dans les protocoles réseau, alors que le petit-boutisme est roi sur le x86, c'est pour des raisons pratiques, que nous allons aborder ci-dessous. Le gros-boutisme est très facile à lire pour les humains. Les nombres en gros-boutistes se lisent de droite à gauche, comme il est d'usage dans les langues indo-européennes, alors que les nombres en petit boutistes se lisent dans l'ordre inverse de lecture. Pour la lecture en hexadécimal, il faut inverser l'ordre des octets, mais il faut garder l'ordre des chiffres dans chaque octet. Par exemple, le nombre 0x015665 (87 653 en décimal) se lit 0x015665 en gros-boutiste, mais 0x655601 en petit-boutiste. Et je ne vous raconte pas ce que cela donne avec un ''byte-swap''... Cette différence pose problème quand on doit lire des fichiers, du code machine ou des paquets réseau, avec un éditeur hexadécimal. Alors certes, la plupart des professionnels lisent directement les données en passant par des outils d'analyse qui se chargent d'afficher les nombres en gros-boutiste, voire en décimal. Un professionnel a à sa disposition du désassembleur pour le code machine, des analyseurs de paquets pour les paquets réseau, des décodeurs de fichiers pour les fichiers, des analyseurs de ''dump'' mémoire pour l'analyse de la mémoire, etc. Cependant, le gros-boutisme reste un avantage quand on utilise un éditeur hexadécimal, quel que soit l'usage. En conséquence, le gros-boutiste a été historiquement pas mal utilisé dans les protocoles réseaux et les formats de fichiers. Par contre, cet avantage de lecture a dû faire face à divers désavantages pour les architectures de processeur. Le petit-boutisme peut avoir des avantages sur les architectures qui gèrent des données de taille intermédiaires entre le byte et le mot. C'est le cas sur le x86, où l'on peut décider de lire des données de 8, 16, 32, ou 64 bits à partir d'une adresse mémoire. Avec le petit-boutisme, on s'assure qu'une lecture charge bien la même valeur, le même nombre. Par exemple, imaginons que je stocke le nombre 0x 14 25 36 48 sur un mot mémoire, en petit-boutiste. En petit-boutiste, une opération de lecture reverra soit les 8 bits de poids faible (0x 48), soit les 16 bits de poids faible (0x 36 48), soit le nombre complet. Ce ne serait pas le cas en gros-boutiste, où les lectures reverraient respectivement 0x 14, 0x 14 25 et 0x 14 25 36 48. Avec le gros-boutisme, de telles opérations de lecture n'ont pas vraiment de sens. En soit, cet avantage est assez limité et n'est utile que pour les compilateurs et les programmeurs en assembleur. Un autre avantage est un gain de performance pour certaines opérations. Les instructions en question sont les opérations où on doit additionner d'opérandes codées sur plusieurs octets; sur un processeur qui fait les calculs octet par octet. En clair, le processeur dispose d'instructions de calcul qui additionnent des nombres de 16, 32 ou 64 bit, voire plus. Mais à l'intérieur du processeur, les calculs sont faits octets par octets, l'unité de calcul ne pouvant qu'additionner deux nombres de 8 bits à la fois. Dans ce cas, le petit-boutisme garantit que l'addition des octets se fait dans le bon ordre, en commençant par les octets de poids faible pour progresser vers les octets de poids fort. En gros-boutisme, les choses sont beaucoup plus compliquées... Pour résumer, les avantages et inconvénients de chaque boutisme sont mineurs. Le gain en performance est nul sur les architectures modernes, qui ont des unités de calcul capables de faire des additions multi-octets. L'usage d'opérations de lecture de taille variable est aujourd'hui tombé en désuétude, vu que cela ne sert pas à grand chose et complexifie le jeu d'instruction. Enfin, l'avantage de lecture n'est utile que dans situations tellement rares qu'on peut légitimement questionner son statut d'avantage. En bref, les différentes formes de boutisme se valent. ==L'implémentation de l'adressage par byte au niveau de la mémoire RAM/ROM== Avant de poursuivre, rappelons que la notion de byte est avant tout liée au jeu d'instruction, mais qu'elle ne dit rien du bus mémoire ! Il est parfaitement possible d'utiliser un bus mémoire d'une taille différente de celle du byte ou du mot. La largeur du bus mémoire, la taille d'un mot, et la taille d'un byte, ne sont pas forcément corrélées. Néanmoins, deux cas classiques sont les plus courants. ===Les architectures avec une mémoire adressable par byte=== Le premier est celui où le bus mémoire transmet un byte à la fois. En clair, la largeur du bus mémoire est celle du byte. Le moindre accès mémoire se fait byte par byte, donc en plusieurs cycles d'horloge. Par exemple, sur un processeur 64 bits, la lecture d'un mot complet se fera octet par octet, ce qui demandera 8 cycles d'horloge, cycles d'horloge mémoire qui plus est. Ce qui explique le désavantage de cette méthode : la performance est assez mauvaise. La performance dépend de plus de la taille des données lue/écrites. On prend moins de temps à lire une donnée courte qu'une donnée longue. L'avantage est qu'on peut lire ou écrire un mot, peu importe son adresse. Pour donner un exemple, je peux parfaitement lire une donnée de 16 bits localisée à l'adresse 4, puis lire une autre donnée de 16 bits localisée à l'adresse 5 sans aucun problème. En conséquence, il n'y a pas de contraintes d'alignements et les problèmes que nous allons aborder dans la suite n'existent pas. [[File:Chargement d'une donnée sur un processeur sans contraitnes d'alignement.jpg|centre|vignette|upright=2|Chargement d'une donnée sur un processeur sans contraintes d'alignement.]] ===Les architectures avec une mémoire adressable par mot=== Pour éviter d'avoir des performances désastreuses, on utilise une autre solution : le bus mémoire a la largeur nécessaire pour lire un mot entier. Le processeur peut charger un mot mémoire entier dans ses registres, en un seul accès mémoire. Et pour lire des données plus petites qu'un mot mémoire, le processeur charge un mot complet, mais ignore les octets en trop. [[File:Exemple du chargement d'un octet dans un registre de trois octets.jpg|centre|vignette|upright=2|Exemple du chargement d'un octet dans un registre de trois octets.]] Il y a alors confusion entre un mot au sens du jeu d'instruction, et un mot mémoire. Pour rappel, une donnée qui a la même taille que le bus de données est appelée un mot mémoire. Mais dans ce cas, l'adressage de la mémoire et du CPU ne sont pas compatibles : le processeur utilise une adresse par byte, la mémoire une adresse par mot ! Tout se passe comme si la mémoire était découpée en blocs de la taille d'un mot. La capacité de la mémoire reste inchangée, ce qui fait que le nombre d'adresses utilisables diminue : il n'y a plus besoin que d'une adresse par mot mémoire et non par octet. Il faut donc faire une sorte d'interface entre les deux. [[File:Chargement d'une donnée sur un processeur avec contraintes d'alignement.jpg|centre|vignette|upright=2|Chargement d'une donnée sur un processeur avec contraintes d'alignement.]] Par convention, l'adresse d'un mot est l'adresse de son octet de poids faible. Les autres octets du mot ne sont pas adressables par la mémoire. Par exemple, si on prend un mot de 8 octets, on est certain qu'une adresse sur 8 disparaîtra. L'adresse du mot est utilisée pour communiquer avec la mémoire, mais cela ne signifie pas que l'adresse des octets est inutile au-delà du calcul de l'adresse du mot. En effet, l'accès à un octet précis demande de déterminer la position de l'octet dans le mot à partir de l'adresse du octet. Prenons un processeur ayant des mots de 4 octets et répertorions les adresses utilisables. Le premier mot contient les octets d'adresse 0, 1, 2 et 3. L'adresse zéro est l'adresse de l'octet de poids faible et sert donc d'adresse au premier mot, les autres sont inutilisables sur le bus mémoire. Le second mot contient les adresses 4, 5, 6 et 7, l'adresse 4 est l'adresse du mot, les autres sont inutilisables. Et ainsi de suite. Si on fait une liste exhaustive des adresses valides et invalides, on remarque que seules les adresses multiples de 4 sont utilisables. Et ceux qui sont encore plus observateurs remarqueront que 4 est la taille d'un mot. Dans l'exemple précédent, les adresses utilisables sont multiples de la taille d'un mot. Sachez que cela fonctionne quelle que soit la taille du mot. Si N est la taille d'un mot, alors seules les adresses multiples de N seront utilisables. Avec ce résultat, on peut trouver une procédure qui nous donne l'adresse d'un mot à partir de l'adresse d'un octet. Si un mot contient N bytes, alors l'adresse du mot se calcule en divisant l'adresse du byte par N. La position du byte dans le mot est quant à elle le reste de cette division. Un reste de 0 nous dit que l'octet est le premier du mot, un reste de 1 nous dit qu'il est le second, etc. [[File:Adresse d'un mot avec alignement mémoire strict.png|centre|vignette|upright=2|Adresse d'un mot avec alignement mémoire strict.]] Le processeur peut donc adresser la mémoire RAM en traduisant les adresses des octets en adresses de mot. Il lui suffit de faire une division pour cela. Il conserve aussi le reste de la division dans un registre pour sélectionner l'octet une fois la lecture terminée. Un accès mémoire se fait donc comme suit : il reçoit l'adresse à lire, il calcule l'adresse du mot, effectue la lecture, reçoit le mot à lire, et utilise le reste pour sélectionner l'octet final si besoin. La dernière étape est facultative et n'est présente que si on lit une donnée plus petite qu'un mot. La division est une opération assez complexe, mais il y a moyen de ruser. L'idée est de faire en sorte que N soit une puissance de deux. La division se traduit alors par un vulgaire décalage vers la droite, le calcul du reste pas une simple opération de masquage. C'est la raison pour laquelle les processeurs actuels utilisent des mots de 1, 2, 4, 8 octets. Sans cela, les accès mémoire seraient bien plus lents. De plus, cela permet d'économiser des fils sur le bus d'adresse. Si la taille d'un mot est égale à <math>2^{n}</math>, seules les adresses multiples de <math>2^{n}</math> seront utilisables. Or, ces adresses se reconnaissent facilement : leurs n bits de poids faibles valent zéro. On n'a donc pas besoin de câbler les fils correspondant à ces bits de poids faible. ==L'alignement mémoire== Dans la section précédente, nous avons évoqué le cas où un processeur à adressage par byte est couplé à une mémoire adressable par mot. Sur de telles architectures, des problèmes surviennent quand les lectures/écritures se font par mots entiers. Le processeur fournit l'adresse d'un byte, mais lit un mot entier à partir de ce byte. Par exemple, prenons une lecture d'un mot complet : celle-ci précise l'adresse d'un byte. Sur un CPU 64 bits, le processeur lit alors 64 bits d'un coup à partir de l'adresse du byte. Et cela peut poser quelques problèmes, dont la résolution demande de respecter des restrictions sur la place de chaque mot en mémoire, restrictions résumées sous le nom d''''alignement mémoire'''. ===L'exemple sur les processeurs 16 bits=== Pour faire comprendre ce qu'est l'alignement mémoire, nous allons prendre l'exemple d'un processeur 16 bits connecté à une mémoire de 16 bits, via un bus mémoire de 16 bits. Le processeur utilisant l'adressage par byte, chaque octet de la mémoire a sa propre adresse. Par contre, le processeur lit et écrit des paquets de 16 bits, soit deux octets. Un groupe de deux octets est appelé, pour rappel, un '''doublet'''. Pour la mémoire, les octets sont regroupés en groupes de deux, en '''doublets mémoire'''. Pour la mémoire, un doublet mémoire a une adresse unique. Et cela ne colle pas avec l'adressage par byte utilisé par le processeur, il y a une différence entre les adresses du processeur et celles de la mémoire. Il y a une adresse par doublet pour la mémoire, une adresse par octet pour le processeur. L'adresse mémoire a donc un bit de moins que l'adresse processeur. Pour faire la distinction, nous utiliserons les termes : ''adresse mémoire'' et ''adresse processeur''. Lorsque le processeur lit un doublet, il lit le premier octet à une adresse processeur et l'octet suivant dans l'adresse processeur suivante. Les adresses processeur sont donc regroupées par groupes de deux : l'adresse 0 et 1 adressent toutes deux le premier doublet, l'adresse 2 et 3 adressent le second doublet, etc. Un doublet est donc identifié par deux adresses processeur : une '''adresse paire''' et une '''adresse impaire'''. Nous allons partir du principe que l'octet de poids faible est dans l'adresse paire, l'octet de poids fort dans l'adresse impaire. Les règles de boutisme autorise de faire l'inverse, mais ce n'est pas le choix le plus intuitif. L'alignement mémoire dit quoi faire lorsque le processeur veut lire/écrire 16 bits à une adresse impaire. S'il veut lire 16 bits à une adresse impaire, les deux octets seront dans des doublets mémoire différents. Le premier sera l'octet de poids fort d'un doublet, l'autre sera l'octet de poids faible du doublet suivant. Le doublet que le processeur veut lire/écrire est à cheval sur deux doublets mémoire. Et le processeur ne gère pas cette situation naturellement. L'alignement mémoire strict n'autorise que les accès mémoire à des adresses mémoires paires. Tout accès à une adresse mémoire impaire lève une exception matérielle, signe que c'est une erreur matérielle. Par contre, les adresses paires sont autorisées car une adresse paire identifie un doublet mémoire, que le processeur peut lire/écrire en une seule fois, à travers le bus mémoire. Le processeur gère donc uniquement des lectures/écritures de doublet, au sens de doublet mémoire. Sans alignement mémoire, on peut lire/écrire 16 bits à partir d'une adresse paire comme impaire, les deux sont autorisées. Pour cela, le processeur doit gérer les lectures/écritures de 16 bits à des adresses impaires. Vu que les 16 bits demandés sont à cheval sur deux doublets mémoire, le processeur doit lire les deux doublets mémoire, sélectionner les octets adéquats, et les concaténer pour obtenir les 16 bits finaux. Il faut noter que dans une interprétation stricte de l'alignement mémoire, le processeur peut lire/écrire un octet unique, mais seulement s'il est à une adresse paire. Le processeur peut demander à lire ou écrire un seul octet, mais la mémoire fournira deux octets et le processeur devra n'en conserver qu'un. Dans le cas le plus simple, seuls les octets à une adresse paire sont accessibles : l'octet de poids fort d'un doublet n'est pas accesible seul. Le processeur lit un doublet entier dans la mémoire et masque l'octet de poids fort, chargé en trop. Dans un cas plus évolué, les octets à une adresse impaire sont adressables. Dans ce cas, le processeur lit un doublet, déplace l'octet de poids fort dans l'octet de poids faible, et masque l'octet inutile. Dans tous les cas, le processeur ne lit/écrit qu'un doublet à la fois et sélectionne les octets demandés. ===L'alignement mémoire des données=== L'exemple précédent nous a montré ce qu'il en était sur les processeurs 16 bits. Mais pour généraliser le concept, nous allons voir le cas des processeurs 32 bits et plus. Nous venons de voir que l'alignement mémoire sur 16 bits impose des contraintes quant à l'adressage de la mémoire, en empêchant de lire des données qui sont à cheval sur deux doublets. Sur 32 bits, c'est la même chose, mais avec des quadruplets (des groupes de 4 octets, soit 32 bits) : impossible de lire des données si elles sont à cheval sur deux quadruplets mémoire. Sur 64 bits, c'est la même chose, mais avec des octuplets de 8 octets/ 64 bits : impossible de lire des données si elles sont à cheval sur deux octuplets mémoire. La différence, c'est que la situation peut se présenter même si on ne lit pas 32/64 bits. Imaginons le cas particulier suivant : je dispose d'un processeur utilisant des mots de 4 octets. Je dispose aussi d'un programme qui doit manipuler un caractère stocké sur 1 octet, un entier de 4 octets et une donnée de deux octets. Mais un problème se pose : le programme qui manipule ces données a été programmé par quelqu'un qui n'était pas au courant de ces histoire d'alignement, et il a répartit mes données un peu n'importe comment. Supposons que cet entier soit stocké à une adresse non-multiple de 4. Par exemple : {|class=wikitable |- !Adresse !Octet 4 !Octet 3 !Octet 2 !Octet 1 |- |0x 0000 0000 |Caractère |Entier |Entier |Entier |- |0x 0000 0004 |Entier |Donnée |Donnée |- |0x 0000 0008 | | | | |} La lecture ou écriture du caractère ne pose pas de problème, vu qu'il ne fait qu'un seul byte. Pour la donnée de 2 octets, c'est la même chose, car elle tient toute entière dans un mot mémoire. La lire demande de lire le mot et de masquer les octets inutiles. Mais pour l'entier, ça ne marche pas car il est à cheval sur deux mots ! On dit que l'entier n'est pas aligné en mémoire. En conséquence, impossible de le charger en une seule fois Pour résumer, avec un bus mémoire de 32 bits, le problème peut survenir si le processeur veut lire 32 bits, mais aussi 16 bits. Si on veut lire 16 bits, mais que le premier octet est dans un quadruplet, et l'autre octet dans un autre quadruplet, l'alignement mémoire intervient. Idem si on veut lire 4 octets, mais que les 3 premiers sont dans un quadruplet, pas le dernier. Tout cela est plus facile à comprendre avec un exemple. La situation est gérée différemment suivant le processeur. Sur certains processeurs, la donnée est chargée en deux fois : c'est légèrement plus lent que la charger en une seule fois, mais ça passe. On dit que le processeur gère des accès mémoire non-alignés. D'autres processeurs ne gérent pas ce genre d'accès mémoire et les traitent comme une erreur, similaire à une division par zéro, et lève une exception matérielle. Si on est chanceux, la routine d'exception charge la donnée en deux fois. Mais sur d'autres processeurs, le programme responsable de cet accès mémoire en dehors des clous se fait sauvagement planter. Par exemple, essayez de manipuler une donnée qui n'est pas "alignée" dans un mot de 16 octets avec une instruction SSE, vous aurez droit à un joli petit crash ! Pour éviter ce genre de choses, les compilateurs utilisés pour des langages de haut niveau préfèrent rajouter des données inutiles (on dit aussi du bourrage) de façon à ce que chaque donnée soit bien alignée sur le bon nombre d'octets. En reprenant notre exemple du dessus, et en notant le bourrage X, on obtiendrait ceci : {|class=wikitable |- !Adresse !Octet 4 !Octet 3 !Octet 2 !Octet 1 |- |0x 0000 0000 |Caractère |X |X |X |- |0x 0000 0004 |Entier |Entier |Entier |Entier |- |0x 0000 0008 |Donnée |Donnée |X |X |} Comme vous le voyez, de la mémoire est gâchée inutilement. Et quand on sait que de la mémoire cache est gâchée ainsi, ça peut jouer un peu sur les performances. Il y a cependant des situations dans lesquelles rajouter du bourrage est une bonne chose et permet des gains en performances assez abominables (une sombre histoire de cache dans les architectures multiprocesseurs ou multi-cœurs, mais je n'en dit pas plus). L'alignement mémoire se gère dans certains langages (comme le C, le C++ ou l'ADA), en gérant l'ordre de déclaration des variables. Essayez toujours de déclarer vos variables de façon à remplir un mot intégralement ou le plus possible. Renseignez-vous sur le bourrage, et essayez de savoir quelle est la taille des données en regardant la norme de vos langages. ===L'alignement des instructions en mémoire=== Les instructions ont toute une certaine taille, et elles peuvent être de taille fixe (toutes les instructions font X octets), ou de taille variable (le nombre d'octets dépend de l'instruction). Dans les deux cas, le processeur peut incorporer des contraintes sur l'alignement des instructions, au même titre que les contraintes d'alignement sur les données vues précédemment. Pour les instructions de taille fixe, les instructions sont placées à des adresses précises. Par exemple, prenons des instructions de 8 octets. La première instruction prend les 8 premiers octets de la mémoire, la seconde prend les 8 octets suivants, etc. En faisant cela, l'adresse d'une instruction est toujours un multiple de 8. Et on peut généraliser pour toute instruction de taille fixe : si elle fait X octets, son adresse est un multiple de X. Généralement, on prend X une puissance de deux pour simplifier beaucoup de choses. Notamment, cela permet de simplifier le ''program counter'' : quelques bits de poids faible deviennent inutiles. Par exemple, si on prend des instructions de 4 octets, les adresses des instructions sont des multiples de 4, donc les deux bits de poids faible de l'adresse sont toujours 00 et ne sont pas intégrés dans le ''program counter''. Le ''program counter'' est alors plus court de deux bits. Idem avec des instructions de 8 octets qui font économiser 3 bits, ou avec des instructions de 16 octets qui font économiser 4 bits. Les instructions de taille variable ne sont généralement pas alignées. Sur certains processeurs, les instructions n'ont pas de contraintes d'alignement du tout. Leur chargement est donc plus compliqué et demande des méthodes précises qui seront vues dans le chapitre sur l'unité de chargement du processeur. Évidemment, le chargement d'instructions non-alignées est donc plus lent. En conséquence, même si le processeur supporte des instructions non-alignées, les compilateurs ont tendance à aligner les instructions comme les données, sur la taille d'un mot mémoire, afin de gagner en performance. Sur d'autres processeurs, les instructions doivent être alignées. Dans le cas le plus simple, les instructions doivent être alignées sur un mot mémoire, elles doivent respecter les mêmes contraintes d'alignement que les données. Elles peuvent être plus courtes ou plus longues qu'un mot, mais elles doivent commencer à la première adresse d'un mot mémoire. D'autres architectures ont des contraintes d'alignement bizarres. Par exemple, les premiers processeurs x86 16 bits imposaient des instructions alignées sur 16 bits et cette contrainte est restée sur les processeurs 32 bits. Que ce soit pour des instructions de taille fixe ou variables, les circuits de chargement des instructions et les circuits d'accès mémoire ne sont pas les mêmes, ce qui fait que leurs contraintes d'alignement peuvent être différentes. On peut avoir quatre possibilités : des instructions non-alignées et des données alignées, l'inverse, les deux qui sont alignées, les deux qui ne sont pas alignées. Par exemple, il se peut qu'un processeur accepte des données non-alignées, mais ne gère pas des instructions non-alignées ! Le cas le plus simple, fréquent sur les architectures RISC, est d'avoir des instructions et données alignées de la même manière. Les architectures CISC utilisent souvent des contraintes d'alignement, avec généralement des instructions de taille variables non-alignées, mais des données alignées. Les deux dernières possibilités ne sont presque jamais utilisées. De plus, sur les processeurs où les deux sont alignés, on peut avoir un alignement différent pour les données et les instructions. Par exemple, pour un processeur qui utilise des instructions de 8 octets, mais des données de 4 octets. Les différences d'alignements posent une contrainte sur l'économie des bits sur le bus d'adresse. Il faut alors regarder ce qui se passe sur l'alignement des données. Par exemple, pour un processeur qui utilise des instructions de 8 octets, mais des données de 4 octets, on ne pourra économiser que deux bits, pour respecter l'alignement des données. Ou encore, sur un processeur avec des instructions alignées sur 8 octets, mais des données non-alignées, on ne pourra rien économiser. Un cas particulier est celui de l'Intel iAPX 432, dont les instructions étaient non-alignées au niveau des bits ! Leur taille variable faisait que la taille des instructions n'était pas un multiple d'octets. Il était possible d'avoir des instructions larges de 23 bits, d'autres de 41 bits, ou toute autre valeur non-divisible par 8. Un octet pouvait contenir des morceaux de deux instructions, à cheval sur l'octet. Ce comportement fort peu pratique faisait que l'implémentation de l'unité d"e chargement était complexe. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres du processeur | prevText=Les registres du processeur | next=Les modes d'adressage | nextText=Les modes d'adressage }} </noinclude> 2ril3xnhzbx2qntf7n7e7ktc07uy63u 745879 745878 2025-07-03T18:10:59Z Mewtow 31375 /* L'exemple sur les processeurs 16 bits */ 745879 wikitext text/x-wiki Dans ce chapitre, on va parler de l'''endianess'' du processeur et de son alignement mémoire. Concrètement, on va s'intéresser à la façon dont le processeur repartit en mémoire les octets des données qu'il manipule. Ces deux paramètres sont sûrement déjà connus de ceux qui ont une expérience de la programmation assez conséquente. Les autres apprendront ce que c'est dans ce chapitre. Pour simplifier, ils sont à prendre en compte quand on échange des données entre registres et mémoire RAM. ==La différence entre mots et bytes== Avant toute chose, nous allons reparler rapidement de la différence entre un byte et un mot. Les deux termes sont généralement polysémiques, avec plusieurs sens. Aussi, définir ce qu'est un mot est assez compliqué. Voyons les différents sens de ce terme, chacun étant utile dans un contexte particulier. Dans les chapitres précédents, nous avons parlé des mots mémoire, à savoir des blocs de mémoire dont le nombre de bits correspond à la largeur du bus mémoire. Le premier sens possible est donc la quantité de données que l'on peut transférer entre CPU et RAM en un seul cycle d'horloge. Il s'agit d'une définition basée sur les transferts réels entre processeur et mémoire. Le terme que nous avons utilisé pour cette définition est : '''mot mémoire'''. Remarquez la subtile différence entre les termes "mot" et "mot mémoire" : le second terme indique bien qu'il s'agit de quelque de lié à la mémoire, pas le premier. Les deux ne sont pas confondre, et nous allons voir pourquoi. La définition précédente ne permet pas de définir ce qu'est un byte et un mot, vu que la distinction se fait au niveau du processeur, au niveau du jeu d'instruction. Précisément, elle intervient au niveau des instructions d'accès mémoire, éventuellement de certaines opérations de traitement de données. Dans ce qui va suivre, nous allons faire la différence entre les architectures à mot, à byte, et à chaines de caractères. Voyons dans le détail ces histoires de mots, de bytes, et autres. ===Les architectures à adressage par mot=== Au tout début de l'informatique, sur les anciens ordinateurs datant d'avant les années 80, les processeurs géraient qu'une seule taille pour les données. Par exemple, de tels processeurs ne géraient que des données de 8 bits, pas autre chose. Les données en question était des '''mots'''. Aux tout début de l'informatique, certaines machines utilisaient des mots de 3, 4, 5, 6 7, 13, 17, 23, 36 ou 48 bits. Pour donner quelques exemples, l'ordinateur ERA 1103 utilisait des mots de 36-bits, tout comme le PDP-10, et ne gérait pas d'autre taille pour les données : c'était 36 bits pour tout le monde. Les processeurs en question ne disposaient que d'une seule instruction de lecture/écriture, qui lisait/écrivait des mots entiers. On pouvait ainsi lire ou écrire des paquets de 3, 4, 5, 6 7, 13, 17, 23, 36 ou 48 bits. Les registres du processeur avaient généralement la même taille qu'un mot, ce qui fait que les processeurs de l'époque avaient des registres de 4, 8, 12, 24, 26, 28, 31, 36, 48, voire 60 bits. Les mots en question sont en théorie à distinguer des mots mémoire, mais ce n'est pas souvent le cas en pratique. Les architectures à adressage par mot faisaient en sorte qu'un mot soit de la même taille qu'un mot mémoire. La mémoire était donc découpée en mots, chacun avait sa propre adresse. Par exemple, une mémoire de 64 kilo-mots contenait 65 536 mots, chacun contenant autant de bits qu'un mot. Les mots faisaient tous la même taille, qui variait suivant la mémoire ou le processeur utilisé. Chaque mot avait sa propre adresse, ce qui fait qu'on parlait d''''adressage par mot'''. Il n'y avait qu'une seule unité d'adressage, ce qui fait que le byte et le mot étaient la même chose sur de telles architectures. La distinction entre byte et mot est apparue après, sur des ordinateurs/processeurs différents. ===Les architectures à adressage par byte=== Par la suite, des processeurs ont permis d'adresser des données plus petites qu'un mot. Les processeurs en question disposent de plusieurs instructions de lecture/écriture, qui manipulent des blocs de mémoire de taille différente. Par exemple, il peut avoir une instruction de lecture pour lire 8 bits, une autre pour lire 16 bits, une autre 32, etc. Une autre possibilité est celle où le processeur dispose d'une instruction de lecture, qu'on peut configurer suivant qu'on veuille lire/écrire un octet, deux, quatre, huit. Dans ce cas, on peut faire une distinction entre '''''byte''''' et '''mot''' : le byte est la plus petite donnée, le mot est la plus grande. Par exemple, un processeur disposant d'instruction d'accès mémoire capables de lire/écrire 8 ou 16 bits sont dans ce cas. Le byte fait alors 8 bits, le mot en fait 16. La séparation entre byte et mot peut parfois se compléter avec des tailles intermédiaires. Par exemple, prenons un processeur qui dispose d'une instruction de lecture capable de lire soit 8 bits, soit 16 bits, soit 32 bits, soit 64 bits. Dans ce cas, le byte vaut 8 bits, le mot en fait 64, les autres tailles sont des intermédiaires. Pour résumer, un mot est la plus grande unité adressable par le processeur, un byte est la plus petite. En général, le byte fait 8 bits, un octet. Mais ça n'a pas toujours été le cas, pas mal de jeux d'instructions font exception. L'exemple le plus parlant est celui des processeurs décimaux, qui utilisaient des entiers codés en BCD mais ne géraient pas les entiers codés en binaire normal. De tels processeurs encodaient des nombres sous la forme d'une suite de chiffres décimaux, codés en BCD sur 4 bits. Ils avaient des bytes de 4 bits, voire de 5/6 bits pour les ordinateurs qui ajoutaient un bit de parité/ECC par chiffre décimal. D'autres architectures avaient un byte de 3 à 7 bits. La taille d'un mot mémoire est de plusieurs bytes : un mot mémoire contient un nombre entier de bytes. La norme actuelle est d'utiliser des bytes d'un octet (8 bits), avec des mots contenant plusieurs octets. Le nombre d'octets dans un mot est généralement une puissance de deux pour simplifier les calculs. Cette règle souffre évidemment d'exceptions, mais l'usage de mots qui ne sont pas des puissances de 2 posent quelques problèmes techniques en termes d’adressage, comme on le verra plus bas. Sur de telles architectures, il y a une adresse mémoire par byte, et non par mot, ce qui fait qu'on parle d''''adressage par byte'''. Tous les ordinateurs modernes utilisent l'adressage par byte. Concrètement, sur les processeurs modernes, chaque octet de la mémoire a sa propre adresse, peu importe la taille du mot utilisé par le processeur. Par exemple, les anciens processeurs x86 32 bits et les processeurs x86 64 bits utilisent tous le même système d'adressage, où chaque octet a sa propre adresse, la seule différence est que les adresses sont plus nombreuses. Avec un adressage par mot, on aurait eu autant d'adresses qu'avant, mais les mots seraient passés de 32 à 64 bits en passant au 64 bits. Les registres font encore une fois la même taille qu'un mot, bien qu'il existe quelques rares exceptions. Les processeurs à adressage par byte ont souvent plusieurs instructions de lecture/écriture, chacune pour une taille précise. Pour rendre cela plus concret, prenons le cas de l'instruction de lecture. Il y a au minimum une instruction de lecture qui lit un byte en mémoire, une autre qui lit un mot complet. Il y a souvent des instructions pour les tailles intermédiaires. Par exemple, un processeur 64 bit a des instructions pour lire 8 bits, une autre pour lire 16 bits, une autre pour en lire 32, et enfin une pour lire 64 bits. Idem pour les instructions d'écriture, et les autres instructions d'accès mémoire. ===Les architectures à adressage par mot de type hybrides=== Il a existé des architectures adressées par mot qui géraient des bytes, mais sans pour autant leur donner des adresses. Leur idée était que les transferts entre CPU et mémoire se faisaient par mots, mais les instructions de lecture/écriture pouvaient sélectionner un byte dans le mot. Une instruction d'accès mémoire devait alors préciser deux choses : l'adresse du mot à lire/écrire, et la position du byte dans le mot adressé. Par exemple, on pouvait demander à lire le mot à l'adresse 0x5F, et de récupérer uniquement le byte numéro 6. Il s'agit d'architectures adressables par mot car l'adresse identifie un mot, pas un byte. Les bytes en question n'avaient pas d'adresses en eux-mêmes, il n'y avait pas d'adressage par byte. La sélection des bytes se faisait dans le processeur : le processeur lisait des mots entiers, avant que le hardware du processeur sélectionne automatiquement le byte voulu. D'ailleurs, aucune de ces architectures ne supportait de mode d'adressage base+index ou base+offset pour sélectionner des bytes dans un mot. Elles supportaient de tels modes d'adressage pour un mot, pas pour les bytes. Pour faire la différence, nous parlerons de pseudo-byte dans ce qui suit, pour bien préciser que ce ne sont pas de vrais bytes. Un exemple est le PDP-6 et le PDP-10, qui avaient des instructions de lecture/écriture de ce type. Elles prenaient trois informations : l'adresse d'un mot, la position du pseudo-byte dans le mot, et enfin la taille d'un pseudo-byte ! L'adressage était donc très flexible, car on pouvait configurer la taille du pseudo-byte. Outre l'instruction de lecture LDB et celle d'écriture DPB, d'autres instructions permettaient de manipuler des pseudo-bytes. L'instruction IBP incrémentait le numéro du pseudo-byte, par exemple. ===Les architectures à mot de taille variable=== D'autres architectures codaient leurs nombres en utilisant un nombre variable de bytes ! Dit autrement, elles avaient des mots de taille variable, d'où leur nom d''''architectures à mots de taille variable'''. Il s'agit d'architectures qui codaient les nombres par des chaines de caractères terminées par un byte de terminaison. La grande majorité étaient des architectures décimales, à savoir des ordinateurs qui utilisaient des nombres encodés en BCD ou dans un encodage similaire. Les nombres étaient codés en décimal, mais chaque chiffre était encodé en binaire sur quelques bits, généralement 4 à 6 bits. Les bytes stockaient chacun un caractère, qui était utilisé pour encoder soit un chiffre décimal, soit un autre symbole comme un byte de terminaison. Un caractère faisait plus de 4 bits, vu qu'il fallait au minimum coder les chiffres BCD et des symboles supplémentaires. La taille d'un caractère était généralement de 5/6 bits. Un exemple est celui des IBM 1400 series, qui utilisaient des chaines de caractères séparées par deux bytes : un byte de ''wordmark'' au début, et un byte de ''record mark'' à la fin. Les caractères étaient des chiffres codés en BCD, chaque caractère était codé sur 6 bits. Les calculs se faisaient chiffre par chiffre, au rythme d'un chiffre utilisé comme opérande par cycle d'horloge. Le processeur passait automatiquement d'un chiffre au suivant pour chaque opérande. Chaque caractère/chiffre avait sa propre adresse, ce qui fait l'architecture est techniquement adressable par byte, alors que les mots correspondaient aux nombres de taille variable. ===La comparaison entre l'adressage par mot et par byte=== Plus haut, nous avons vu deux types d'adressage : par mot et par byte. Avec la première, ce sont les mots qui ont des adresses. Les bytes n'existent pas forcément sur de telles architectures. Si une gestion des bytes est présente, les instructions de lecture/écriture utilisent des adresses pour les mots, couplé à la position du byte dans le mot. Les lectures/écritures se font pas mots entiers. À l'opposé, sur les architectures adressées par byte, une adresse correspond à un byte et non à un mot. Les deux techniques font que l'usage des adresses est différent. Entre une adresse par mot et une par byte, le nombre d'adresse n'est pas le même à capacité mémoire égale. Prenons un exemple assez simple, où l'on compare deux processeurs. Les deux ont des mots mémoire de 32 bits, pour simplifier la comparaison. Le premier processeur gère des bytes de 8 bits, et chacun a sa propre adresse, ce qui fait que c'est un adressage par byte qui est utilisé. Le second ne gère pas les bytes mais seulement des mots de 32 bits, ce qui fait que c'est un adressage par mot qui est utilisé. Dans les deux cas, la mémoire n'est pas organisée de la même manière. Prenons une mémoire de 24 octets pour l'exemple, soit 24/4 = 6 mots de 4 octets. Le premier processeur aura une adresse par byte, soit 24 adresses, et ce sera pareil pour la mémoire, qui utilisera une case mémoire par byte. Le second processeur n'aura que 6 adresses : une par mot. La mémoire a des cases mémoire qui contiennent un mot entier, soit 32 bits, 4 octets. [[File:Byte and word addressing.png|centre|vignette|upright=2|Adressage par mot et par Byte.]] L'avantage de l'adressage par mot est que l'on peut adresser plus de mémoire pour un nombre d'adresses égal. Si on a un processeur qui gère des adresses de 16 bits, on peut adresser 2^16 = 65 536 adresses. Avec un mot mémoire de 4 bytes d'un octet chacun, on peut adresser : soit 65 536 bytes/octets, soit 65 536mots et donc 65 536 × 4 octets. L'adressage par mot permet donc d'adresser plus de mémoire avec les mêmes adresses. Une autre manière de voir les choses est qu'une architecture à adressage par byte va utiliser beaucoup plus d'adresses qu'une architecture par mot, à capacité mémoire égale. L'avantage des architectures à adressage par byte est que l'on peut plus facilement modifier des données de petite taille. Par exemple, imaginons qu'un programmeur manipule du texte, avec des caractères codés sur un octet. S'il veut remplacer les lettres majuscules par des minuscules, il doit changer chaque lettre indépendamment des autres, l'une après l'autre. Avec un adressage par mot, il doit lire un mot entier, modifier chaque octet en utilisant des opérations de masquage, puis écrire le mot final. Avec un adressage par byte, il peut lire chaque byte indépendamment, le modifier sans recourir à des opérations de masquage, puis écrire le résultat. Le tout est plus simple avec l'adressage par byte : pas besoin d'opérations de masquage ! Par contre, les architectures à adressage par byte ont de nombreux défauts. Le fait qu'un mot contienne plusieurs octets/bytes a de nombreuses conséquences, desquelles naissent les contraintes d'alignement, de boutisme et autres. Dans ce qui suit, nous allons étudier les défauts des architectures adressables par byte, et allons laisser de côté les architectures adressables par mot. La raison est que toutes les architectures modernes sont adressables par byte, les seules architectures adressables par mot étant de très vieux ordinateurs aujourd'hui disparus. ==Le boutisme : une spécificité de l'adressage par byte== Le premier problème lié à l'adressage par byte est lié au fait que l'on a plusieurs bytes par mot : dans quel ordre placer les bytes dans un mot ? On peut introduire le tout par une analogie avec les langues humaines : certaines s’écrivent de gauche à droite et d'autres de droite à gauche. Dans un ordinateur, c'est pareil avec les bytes/octets des mots mémoire : on peut les écrire soit de gauche à droite, soit de droite à gauche. Quand on veut parler de cet ordre d'écriture, on parle de '''boutisme''' (''endianness''). Dans ce qui suit, nous allons partir du principe que le byte fait un octet, mais gardez dans un coin de votre tête que ce n'a pas toujours été le cas. Les explications qui vont suivre restent valide peu importe la taille du byte. ===Les différents types de boutisme=== Les deux types de boutisme les plus simples sont le gros-boutisme et le petit-boutisme. Sur les '''processeurs gros-boutistes''', la donnée est stockée des adresses les plus faibles vers les adresses plus grande. Pour rendre cela plus clair, prenons un entier qui prend plusieurs octets et qui est stocké entre deux adresses. L'octet de poids fort de l'entier est stocké dans l'adresse la plus faible, et inversement pour le poids faible qui est stocké dans l'adresse la plus grande. Sur les '''processeurs petit-boutistes''', c'est l'inverse : l'octet de poids faible de notre donnée est stocké dans la case mémoire ayant l'adresse la plus faible. La donnée est donc stockée dans l'ordre inverse pour les octets. Certains processeurs sont un peu plus souples : ils laissent le choix du boutisme. Sur ces processeurs, on peut configurer le boutisme en modifiant un bit dans un registre du processeur : il faut mettre ce bit à 1 pour du petit-boutiste, et à 0 pour du gros-boutiste, par exemple. Ces processeurs sont dits '''bi-boutistes'''. {| |[[File:Big-Endian-fr.svg|class=transparent|Gros-boutisme.]] |[[File:Little-Endian-fr.svg|class=transparent|Petit-boutisme.]] |} Petit et gros-boutisme ont pour particularité que la taille des mots ne change pas vraiment l'organisation des octets. Peu importe la taille d'un mot, celui-ci se lit toujours de gauche à droite, ou de droite à gauche. Cela n’apparaît pas avec les techniques de boutismes plus compliquées. [[File:Big-endian little-endian.jpg|centre|vignette|upright=2.5|Comparaison entre ''big-endian'' et ''little-endian'', pour des tailles de 16 et 32 bits.]] [[File:Comparaison entre boutisme avec et sans inversion de mots mémoire.jpg|vignette|Comparaison entre un nombre codé en gros-boutiste pur, et un nombre gros-boutiste dont les octets sont rangés dans un groupe en petit-boutiste. Le nombre en question est 0x 0A 0B 0C 0D, en hexadécimal, le premier mot mémoire étant indiqué en jaune, le second en blanc.]] Certains processeurs ont des boutismes plus compliqués, où chaque mot mémoire est découpé en plusieurs groupes d'octets. Il faut alors prendre en compte le boutisme des octets dans le groupe, mais aussi le boutisme des groupes eux-mêmes. On distingue ainsi un boutisme inter-groupe (le boutisme des groupes eux-même) et un boutisme intra-groupe (l'ordre des octets dans chaque groupe), tout deux pouvant être gros-boutiste ou petit-boutiste. Si l'ordre intra-groupe est identique à l'ordre inter-groupe, alors on retrouve du gros- ou petit-boutiste normal. Mais les choses changent si jamais l'ordre inter-groupe et intra-groupe sont différents. Dans ces conditions, on doit préciser un ordre d’inversion des mots mémoire (''byte-swap''), qui précise si les octets doivent être inversés dans un mot mémoire processeur, en plus de préciser si l'ordre des mots mémoire est petit- ou gros-boutiste. ===Avantages, inconvénients et usage=== Le choix entre petit boutisme et gros boutisme est généralement une simple affaire de convention. Il n'y a pas d'avantage vraiment probant pour l'une ou l'autre de ces deux méthodes, juste quelques avantages ou inconvénients mineurs. Dans les faits, il y a autant d'architectures petit- que de gros-boutistes, la plupart des architectures récentes étant bi-boutistes. Précisons que le jeu d'instruction x86 est de type petit-boutiste. Si on quitte le domaine des jeu d'instruction, les protocoles réseaux et les formats de fichiers imposent un boutisme particulier. Les protocoles réseaux actuels (TCP-IP) sont de type gros-boutiste, ce qui impose de convertir les données réseaux avant de les utiliser sur les PC modernes. Et au passage, si le gros-boutisme est utilisé dans les protocoles réseau, alors que le petit-boutisme est roi sur le x86, c'est pour des raisons pratiques, que nous allons aborder ci-dessous. Le gros-boutisme est très facile à lire pour les humains. Les nombres en gros-boutistes se lisent de droite à gauche, comme il est d'usage dans les langues indo-européennes, alors que les nombres en petit boutistes se lisent dans l'ordre inverse de lecture. Pour la lecture en hexadécimal, il faut inverser l'ordre des octets, mais il faut garder l'ordre des chiffres dans chaque octet. Par exemple, le nombre 0x015665 (87 653 en décimal) se lit 0x015665 en gros-boutiste, mais 0x655601 en petit-boutiste. Et je ne vous raconte pas ce que cela donne avec un ''byte-swap''... Cette différence pose problème quand on doit lire des fichiers, du code machine ou des paquets réseau, avec un éditeur hexadécimal. Alors certes, la plupart des professionnels lisent directement les données en passant par des outils d'analyse qui se chargent d'afficher les nombres en gros-boutiste, voire en décimal. Un professionnel a à sa disposition du désassembleur pour le code machine, des analyseurs de paquets pour les paquets réseau, des décodeurs de fichiers pour les fichiers, des analyseurs de ''dump'' mémoire pour l'analyse de la mémoire, etc. Cependant, le gros-boutisme reste un avantage quand on utilise un éditeur hexadécimal, quel que soit l'usage. En conséquence, le gros-boutiste a été historiquement pas mal utilisé dans les protocoles réseaux et les formats de fichiers. Par contre, cet avantage de lecture a dû faire face à divers désavantages pour les architectures de processeur. Le petit-boutisme peut avoir des avantages sur les architectures qui gèrent des données de taille intermédiaires entre le byte et le mot. C'est le cas sur le x86, où l'on peut décider de lire des données de 8, 16, 32, ou 64 bits à partir d'une adresse mémoire. Avec le petit-boutisme, on s'assure qu'une lecture charge bien la même valeur, le même nombre. Par exemple, imaginons que je stocke le nombre 0x 14 25 36 48 sur un mot mémoire, en petit-boutiste. En petit-boutiste, une opération de lecture reverra soit les 8 bits de poids faible (0x 48), soit les 16 bits de poids faible (0x 36 48), soit le nombre complet. Ce ne serait pas le cas en gros-boutiste, où les lectures reverraient respectivement 0x 14, 0x 14 25 et 0x 14 25 36 48. Avec le gros-boutisme, de telles opérations de lecture n'ont pas vraiment de sens. En soit, cet avantage est assez limité et n'est utile que pour les compilateurs et les programmeurs en assembleur. Un autre avantage est un gain de performance pour certaines opérations. Les instructions en question sont les opérations où on doit additionner d'opérandes codées sur plusieurs octets; sur un processeur qui fait les calculs octet par octet. En clair, le processeur dispose d'instructions de calcul qui additionnent des nombres de 16, 32 ou 64 bit, voire plus. Mais à l'intérieur du processeur, les calculs sont faits octets par octets, l'unité de calcul ne pouvant qu'additionner deux nombres de 8 bits à la fois. Dans ce cas, le petit-boutisme garantit que l'addition des octets se fait dans le bon ordre, en commençant par les octets de poids faible pour progresser vers les octets de poids fort. En gros-boutisme, les choses sont beaucoup plus compliquées... Pour résumer, les avantages et inconvénients de chaque boutisme sont mineurs. Le gain en performance est nul sur les architectures modernes, qui ont des unités de calcul capables de faire des additions multi-octets. L'usage d'opérations de lecture de taille variable est aujourd'hui tombé en désuétude, vu que cela ne sert pas à grand chose et complexifie le jeu d'instruction. Enfin, l'avantage de lecture n'est utile que dans situations tellement rares qu'on peut légitimement questionner son statut d'avantage. En bref, les différentes formes de boutisme se valent. ==L'implémentation de l'adressage par byte au niveau de la mémoire RAM/ROM== Avant de poursuivre, rappelons que la notion de byte est avant tout liée au jeu d'instruction, mais qu'elle ne dit rien du bus mémoire ! Il est parfaitement possible d'utiliser un bus mémoire d'une taille différente de celle du byte ou du mot. La largeur du bus mémoire, la taille d'un mot, et la taille d'un byte, ne sont pas forcément corrélées. Néanmoins, deux cas classiques sont les plus courants. ===Les architectures avec une mémoire adressable par byte=== Le premier est celui où le bus mémoire transmet un byte à la fois. En clair, la largeur du bus mémoire est celle du byte. Le moindre accès mémoire se fait byte par byte, donc en plusieurs cycles d'horloge. Par exemple, sur un processeur 64 bits, la lecture d'un mot complet se fera octet par octet, ce qui demandera 8 cycles d'horloge, cycles d'horloge mémoire qui plus est. Ce qui explique le désavantage de cette méthode : la performance est assez mauvaise. La performance dépend de plus de la taille des données lue/écrites. On prend moins de temps à lire une donnée courte qu'une donnée longue. L'avantage est qu'on peut lire ou écrire un mot, peu importe son adresse. Pour donner un exemple, je peux parfaitement lire une donnée de 16 bits localisée à l'adresse 4, puis lire une autre donnée de 16 bits localisée à l'adresse 5 sans aucun problème. En conséquence, il n'y a pas de contraintes d'alignements et les problèmes que nous allons aborder dans la suite n'existent pas. [[File:Chargement d'une donnée sur un processeur sans contraitnes d'alignement.jpg|centre|vignette|upright=2|Chargement d'une donnée sur un processeur sans contraintes d'alignement.]] ===Les architectures avec une mémoire adressable par mot=== Pour éviter d'avoir des performances désastreuses, on utilise une autre solution : le bus mémoire a la largeur nécessaire pour lire un mot entier. Le processeur peut charger un mot mémoire entier dans ses registres, en un seul accès mémoire. Et pour lire des données plus petites qu'un mot mémoire, le processeur charge un mot complet, mais ignore les octets en trop. [[File:Exemple du chargement d'un octet dans un registre de trois octets.jpg|centre|vignette|upright=2|Exemple du chargement d'un octet dans un registre de trois octets.]] Il y a alors confusion entre un mot au sens du jeu d'instruction, et un mot mémoire. Pour rappel, une donnée qui a la même taille que le bus de données est appelée un mot mémoire. Mais dans ce cas, l'adressage de la mémoire et du CPU ne sont pas compatibles : le processeur utilise une adresse par byte, la mémoire une adresse par mot ! Tout se passe comme si la mémoire était découpée en blocs de la taille d'un mot. La capacité de la mémoire reste inchangée, ce qui fait que le nombre d'adresses utilisables diminue : il n'y a plus besoin que d'une adresse par mot mémoire et non par octet. Il faut donc faire une sorte d'interface entre les deux. [[File:Chargement d'une donnée sur un processeur avec contraintes d'alignement.jpg|centre|vignette|upright=2|Chargement d'une donnée sur un processeur avec contraintes d'alignement.]] Par convention, l'adresse d'un mot est l'adresse de son octet de poids faible. Les autres octets du mot ne sont pas adressables par la mémoire. Par exemple, si on prend un mot de 8 octets, on est certain qu'une adresse sur 8 disparaîtra. L'adresse du mot est utilisée pour communiquer avec la mémoire, mais cela ne signifie pas que l'adresse des octets est inutile au-delà du calcul de l'adresse du mot. En effet, l'accès à un octet précis demande de déterminer la position de l'octet dans le mot à partir de l'adresse du octet. Prenons un processeur ayant des mots de 4 octets et répertorions les adresses utilisables. Le premier mot contient les octets d'adresse 0, 1, 2 et 3. L'adresse zéro est l'adresse de l'octet de poids faible et sert donc d'adresse au premier mot, les autres sont inutilisables sur le bus mémoire. Le second mot contient les adresses 4, 5, 6 et 7, l'adresse 4 est l'adresse du mot, les autres sont inutilisables. Et ainsi de suite. Si on fait une liste exhaustive des adresses valides et invalides, on remarque que seules les adresses multiples de 4 sont utilisables. Et ceux qui sont encore plus observateurs remarqueront que 4 est la taille d'un mot. Dans l'exemple précédent, les adresses utilisables sont multiples de la taille d'un mot. Sachez que cela fonctionne quelle que soit la taille du mot. Si N est la taille d'un mot, alors seules les adresses multiples de N seront utilisables. Avec ce résultat, on peut trouver une procédure qui nous donne l'adresse d'un mot à partir de l'adresse d'un octet. Si un mot contient N bytes, alors l'adresse du mot se calcule en divisant l'adresse du byte par N. La position du byte dans le mot est quant à elle le reste de cette division. Un reste de 0 nous dit que l'octet est le premier du mot, un reste de 1 nous dit qu'il est le second, etc. [[File:Adresse d'un mot avec alignement mémoire strict.png|centre|vignette|upright=2|Adresse d'un mot avec alignement mémoire strict.]] Le processeur peut donc adresser la mémoire RAM en traduisant les adresses des octets en adresses de mot. Il lui suffit de faire une division pour cela. Il conserve aussi le reste de la division dans un registre pour sélectionner l'octet une fois la lecture terminée. Un accès mémoire se fait donc comme suit : il reçoit l'adresse à lire, il calcule l'adresse du mot, effectue la lecture, reçoit le mot à lire, et utilise le reste pour sélectionner l'octet final si besoin. La dernière étape est facultative et n'est présente que si on lit une donnée plus petite qu'un mot. La division est une opération assez complexe, mais il y a moyen de ruser. L'idée est de faire en sorte que N soit une puissance de deux. La division se traduit alors par un vulgaire décalage vers la droite, le calcul du reste pas une simple opération de masquage. C'est la raison pour laquelle les processeurs actuels utilisent des mots de 1, 2, 4, 8 octets. Sans cela, les accès mémoire seraient bien plus lents. De plus, cela permet d'économiser des fils sur le bus d'adresse. Si la taille d'un mot est égale à <math>2^{n}</math>, seules les adresses multiples de <math>2^{n}</math> seront utilisables. Or, ces adresses se reconnaissent facilement : leurs n bits de poids faibles valent zéro. On n'a donc pas besoin de câbler les fils correspondant à ces bits de poids faible. ==L'alignement mémoire== Dans la section précédente, nous avons évoqué le cas où un processeur à adressage par byte est couplé à une mémoire adressable par mot. Sur de telles architectures, des problèmes surviennent quand les lectures/écritures se font par mots entiers. Le processeur fournit l'adresse d'un byte, mais lit un mot entier à partir de ce byte. Par exemple, prenons une lecture d'un mot complet : celle-ci précise l'adresse d'un byte. Sur un CPU 64 bits, le processeur lit alors 64 bits d'un coup à partir de l'adresse du byte. Et cela peut poser quelques problèmes, dont la résolution demande de respecter des restrictions sur la place de chaque mot en mémoire, restrictions résumées sous le nom d''''alignement mémoire'''. ===L'exemple sur les processeurs 16 bits=== Pour faire comprendre ce qu'est l'alignement mémoire, nous allons prendre l'exemple d'un processeur 16 bits connecté à une mémoire de 16 bits, via un bus mémoire de 16 bits. Le processeur utilisant l'adressage par byte, chaque octet de la mémoire a sa propre adresse. Par contre, le processeur lit et écrit des paquets de 16 bits, soit deux octets. Un groupe de deux octets est appelé, pour rappel, un '''doublet'''. Pour la mémoire, les octets sont regroupés en groupes de deux, en '''doublets mémoire'''. Pour la mémoire, un doublet mémoire a une adresse unique. Et cela ne colle pas avec l'adressage par byte utilisé par le processeur, il y a une différence entre les adresses du processeur et celles de la mémoire. Il y a une adresse par doublet pour la mémoire, une adresse par octet pour le processeur. L'adresse mémoire a donc un bit de moins que l'adresse processeur. Pour faire la distinction, nous utiliserons les termes : ''adresse mémoire'' et ''adresse processeur''. Lorsque le processeur lit un doublet, il lit le premier octet à une adresse processeur et l'octet suivant dans l'adresse processeur suivante. Les adresses processeur sont donc regroupées par groupes de deux : l'adresse 0 et 1 adressent toutes deux le premier doublet, l'adresse 2 et 3 adressent le second doublet, etc. Un doublet est donc identifié par deux adresses processeur : une '''adresse paire''' et une '''adresse impaire'''. Nous allons partir du principe que l'octet de poids faible est dans l'adresse paire, l'octet de poids fort dans l'adresse impaire. Les règles de boutisme autorise de faire l'inverse, mais ce n'est pas le choix le plus intuitif. L'alignement mémoire dit quoi faire lorsque le processeur veut lire/écrire 16 bits à une adresse impaire. S'il veut lire 16 bits à une adresse impaire, les deux octets seront dans des doublets mémoire différents. Le premier sera l'octet de poids fort d'un doublet, l'autre sera l'octet de poids faible du doublet suivant. Le doublet que le processeur veut lire/écrire est à cheval sur deux doublets mémoire. Et le processeur ne gère pas cette situation naturellement. [[File:Alignement mémoire sur 16 bits.png|centre|vignette|upright=2|Alignement mémoire sur 16 bits]] L'alignement mémoire strict n'autorise que les accès mémoire à des adresses mémoires paires. Tout accès à une adresse mémoire impaire lève une exception matérielle, signe que c'est une erreur matérielle. Par contre, les adresses paires sont autorisées car une adresse paire identifie un doublet mémoire, que le processeur peut lire/écrire en une seule fois, à travers le bus mémoire. Le processeur gère donc uniquement des lectures/écritures de doublet, au sens de doublet mémoire. Sans alignement mémoire, on peut lire/écrire 16 bits à partir d'une adresse paire comme impaire, les deux sont autorisées. Pour cela, le processeur doit gérer les lectures/écritures de 16 bits à des adresses impaires. Vu que les 16 bits demandés sont à cheval sur deux doublets mémoire, le processeur doit lire les deux doublets mémoire, sélectionner les octets adéquats, et les concaténer pour obtenir les 16 bits finaux. Il faut noter que dans une interprétation stricte de l'alignement mémoire, le processeur peut lire/écrire un octet unique, mais seulement s'il est à une adresse paire. Le processeur peut demander à lire ou écrire un seul octet, mais la mémoire fournira deux octets et le processeur devra n'en conserver qu'un. Dans le cas le plus simple, seuls les octets à une adresse paire sont accessibles : l'octet de poids fort d'un doublet n'est pas accesible seul. Le processeur lit un doublet entier dans la mémoire et masque l'octet de poids fort, chargé en trop. Dans un cas plus évolué, les octets à une adresse impaire sont adressables. Dans ce cas, le processeur lit un doublet, déplace l'octet de poids fort dans l'octet de poids faible, et masque l'octet inutile. Dans tous les cas, le processeur ne lit/écrit qu'un doublet à la fois et sélectionne les octets demandés. ===L'alignement mémoire des données=== L'exemple précédent nous a montré ce qu'il en était sur les processeurs 16 bits. Mais pour généraliser le concept, nous allons voir le cas des processeurs 32 bits et plus. Nous venons de voir que l'alignement mémoire sur 16 bits impose des contraintes quant à l'adressage de la mémoire, en empêchant de lire des données qui sont à cheval sur deux doublets. Sur 32 bits, c'est la même chose, mais avec des quadruplets (des groupes de 4 octets, soit 32 bits) : impossible de lire des données si elles sont à cheval sur deux quadruplets mémoire. Sur 64 bits, c'est la même chose, mais avec des octuplets de 8 octets/ 64 bits : impossible de lire des données si elles sont à cheval sur deux octuplets mémoire. La différence, c'est que la situation peut se présenter même si on ne lit pas 32/64 bits. Imaginons le cas particulier suivant : je dispose d'un processeur utilisant des mots de 4 octets. Je dispose aussi d'un programme qui doit manipuler un caractère stocké sur 1 octet, un entier de 4 octets et une donnée de deux octets. Mais un problème se pose : le programme qui manipule ces données a été programmé par quelqu'un qui n'était pas au courant de ces histoire d'alignement, et il a répartit mes données un peu n'importe comment. Supposons que cet entier soit stocké à une adresse non-multiple de 4. Par exemple : {|class=wikitable |- !Adresse !Octet 4 !Octet 3 !Octet 2 !Octet 1 |- |0x 0000 0000 |Caractère |Entier |Entier |Entier |- |0x 0000 0004 |Entier |Donnée |Donnée |- |0x 0000 0008 | | | | |} La lecture ou écriture du caractère ne pose pas de problème, vu qu'il ne fait qu'un seul byte. Pour la donnée de 2 octets, c'est la même chose, car elle tient toute entière dans un mot mémoire. La lire demande de lire le mot et de masquer les octets inutiles. Mais pour l'entier, ça ne marche pas car il est à cheval sur deux mots ! On dit que l'entier n'est pas aligné en mémoire. En conséquence, impossible de le charger en une seule fois Pour résumer, avec un bus mémoire de 32 bits, le problème peut survenir si le processeur veut lire 32 bits, mais aussi 16 bits. Si on veut lire 16 bits, mais que le premier octet est dans un quadruplet, et l'autre octet dans un autre quadruplet, l'alignement mémoire intervient. Idem si on veut lire 4 octets, mais que les 3 premiers sont dans un quadruplet, pas le dernier. Tout cela est plus facile à comprendre avec un exemple. La situation est gérée différemment suivant le processeur. Sur certains processeurs, la donnée est chargée en deux fois : c'est légèrement plus lent que la charger en une seule fois, mais ça passe. On dit que le processeur gère des accès mémoire non-alignés. D'autres processeurs ne gérent pas ce genre d'accès mémoire et les traitent comme une erreur, similaire à une division par zéro, et lève une exception matérielle. Si on est chanceux, la routine d'exception charge la donnée en deux fois. Mais sur d'autres processeurs, le programme responsable de cet accès mémoire en dehors des clous se fait sauvagement planter. Par exemple, essayez de manipuler une donnée qui n'est pas "alignée" dans un mot de 16 octets avec une instruction SSE, vous aurez droit à un joli petit crash ! Pour éviter ce genre de choses, les compilateurs utilisés pour des langages de haut niveau préfèrent rajouter des données inutiles (on dit aussi du bourrage) de façon à ce que chaque donnée soit bien alignée sur le bon nombre d'octets. En reprenant notre exemple du dessus, et en notant le bourrage X, on obtiendrait ceci : {|class=wikitable |- !Adresse !Octet 4 !Octet 3 !Octet 2 !Octet 1 |- |0x 0000 0000 |Caractère |X |X |X |- |0x 0000 0004 |Entier |Entier |Entier |Entier |- |0x 0000 0008 |Donnée |Donnée |X |X |} Comme vous le voyez, de la mémoire est gâchée inutilement. Et quand on sait que de la mémoire cache est gâchée ainsi, ça peut jouer un peu sur les performances. Il y a cependant des situations dans lesquelles rajouter du bourrage est une bonne chose et permet des gains en performances assez abominables (une sombre histoire de cache dans les architectures multiprocesseurs ou multi-cœurs, mais je n'en dit pas plus). L'alignement mémoire se gère dans certains langages (comme le C, le C++ ou l'ADA), en gérant l'ordre de déclaration des variables. Essayez toujours de déclarer vos variables de façon à remplir un mot intégralement ou le plus possible. Renseignez-vous sur le bourrage, et essayez de savoir quelle est la taille des données en regardant la norme de vos langages. ===L'alignement des instructions en mémoire=== Les instructions ont toute une certaine taille, et elles peuvent être de taille fixe (toutes les instructions font X octets), ou de taille variable (le nombre d'octets dépend de l'instruction). Dans les deux cas, le processeur peut incorporer des contraintes sur l'alignement des instructions, au même titre que les contraintes d'alignement sur les données vues précédemment. Pour les instructions de taille fixe, les instructions sont placées à des adresses précises. Par exemple, prenons des instructions de 8 octets. La première instruction prend les 8 premiers octets de la mémoire, la seconde prend les 8 octets suivants, etc. En faisant cela, l'adresse d'une instruction est toujours un multiple de 8. Et on peut généraliser pour toute instruction de taille fixe : si elle fait X octets, son adresse est un multiple de X. Généralement, on prend X une puissance de deux pour simplifier beaucoup de choses. Notamment, cela permet de simplifier le ''program counter'' : quelques bits de poids faible deviennent inutiles. Par exemple, si on prend des instructions de 4 octets, les adresses des instructions sont des multiples de 4, donc les deux bits de poids faible de l'adresse sont toujours 00 et ne sont pas intégrés dans le ''program counter''. Le ''program counter'' est alors plus court de deux bits. Idem avec des instructions de 8 octets qui font économiser 3 bits, ou avec des instructions de 16 octets qui font économiser 4 bits. Les instructions de taille variable ne sont généralement pas alignées. Sur certains processeurs, les instructions n'ont pas de contraintes d'alignement du tout. Leur chargement est donc plus compliqué et demande des méthodes précises qui seront vues dans le chapitre sur l'unité de chargement du processeur. Évidemment, le chargement d'instructions non-alignées est donc plus lent. En conséquence, même si le processeur supporte des instructions non-alignées, les compilateurs ont tendance à aligner les instructions comme les données, sur la taille d'un mot mémoire, afin de gagner en performance. Sur d'autres processeurs, les instructions doivent être alignées. Dans le cas le plus simple, les instructions doivent être alignées sur un mot mémoire, elles doivent respecter les mêmes contraintes d'alignement que les données. Elles peuvent être plus courtes ou plus longues qu'un mot, mais elles doivent commencer à la première adresse d'un mot mémoire. D'autres architectures ont des contraintes d'alignement bizarres. Par exemple, les premiers processeurs x86 16 bits imposaient des instructions alignées sur 16 bits et cette contrainte est restée sur les processeurs 32 bits. Que ce soit pour des instructions de taille fixe ou variables, les circuits de chargement des instructions et les circuits d'accès mémoire ne sont pas les mêmes, ce qui fait que leurs contraintes d'alignement peuvent être différentes. On peut avoir quatre possibilités : des instructions non-alignées et des données alignées, l'inverse, les deux qui sont alignées, les deux qui ne sont pas alignées. Par exemple, il se peut qu'un processeur accepte des données non-alignées, mais ne gère pas des instructions non-alignées ! Le cas le plus simple, fréquent sur les architectures RISC, est d'avoir des instructions et données alignées de la même manière. Les architectures CISC utilisent souvent des contraintes d'alignement, avec généralement des instructions de taille variables non-alignées, mais des données alignées. Les deux dernières possibilités ne sont presque jamais utilisées. De plus, sur les processeurs où les deux sont alignés, on peut avoir un alignement différent pour les données et les instructions. Par exemple, pour un processeur qui utilise des instructions de 8 octets, mais des données de 4 octets. Les différences d'alignements posent une contrainte sur l'économie des bits sur le bus d'adresse. Il faut alors regarder ce qui se passe sur l'alignement des données. Par exemple, pour un processeur qui utilise des instructions de 8 octets, mais des données de 4 octets, on ne pourra économiser que deux bits, pour respecter l'alignement des données. Ou encore, sur un processeur avec des instructions alignées sur 8 octets, mais des données non-alignées, on ne pourra rien économiser. Un cas particulier est celui de l'Intel iAPX 432, dont les instructions étaient non-alignées au niveau des bits ! Leur taille variable faisait que la taille des instructions n'était pas un multiple d'octets. Il était possible d'avoir des instructions larges de 23 bits, d'autres de 41 bits, ou toute autre valeur non-divisible par 8. Un octet pouvait contenir des morceaux de deux instructions, à cheval sur l'octet. Ce comportement fort peu pratique faisait que l'implémentation de l'unité d"e chargement était complexe. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres du processeur | prevText=Les registres du processeur | next=Les modes d'adressage | nextText=Les modes d'adressage }} </noinclude> nfdd5ccrliqpsjr6kg9kltka6tsz2jv 745880 745879 2025-07-03T18:11:45Z Mewtow 31375 /* L'exemple sur les processeurs 16 bits */ 745880 wikitext text/x-wiki Dans ce chapitre, on va parler de l'''endianess'' du processeur et de son alignement mémoire. Concrètement, on va s'intéresser à la façon dont le processeur repartit en mémoire les octets des données qu'il manipule. Ces deux paramètres sont sûrement déjà connus de ceux qui ont une expérience de la programmation assez conséquente. Les autres apprendront ce que c'est dans ce chapitre. Pour simplifier, ils sont à prendre en compte quand on échange des données entre registres et mémoire RAM. ==La différence entre mots et bytes== Avant toute chose, nous allons reparler rapidement de la différence entre un byte et un mot. Les deux termes sont généralement polysémiques, avec plusieurs sens. Aussi, définir ce qu'est un mot est assez compliqué. Voyons les différents sens de ce terme, chacun étant utile dans un contexte particulier. Dans les chapitres précédents, nous avons parlé des mots mémoire, à savoir des blocs de mémoire dont le nombre de bits correspond à la largeur du bus mémoire. Le premier sens possible est donc la quantité de données que l'on peut transférer entre CPU et RAM en un seul cycle d'horloge. Il s'agit d'une définition basée sur les transferts réels entre processeur et mémoire. Le terme que nous avons utilisé pour cette définition est : '''mot mémoire'''. Remarquez la subtile différence entre les termes "mot" et "mot mémoire" : le second terme indique bien qu'il s'agit de quelque de lié à la mémoire, pas le premier. Les deux ne sont pas confondre, et nous allons voir pourquoi. La définition précédente ne permet pas de définir ce qu'est un byte et un mot, vu que la distinction se fait au niveau du processeur, au niveau du jeu d'instruction. Précisément, elle intervient au niveau des instructions d'accès mémoire, éventuellement de certaines opérations de traitement de données. Dans ce qui va suivre, nous allons faire la différence entre les architectures à mot, à byte, et à chaines de caractères. Voyons dans le détail ces histoires de mots, de bytes, et autres. ===Les architectures à adressage par mot=== Au tout début de l'informatique, sur les anciens ordinateurs datant d'avant les années 80, les processeurs géraient qu'une seule taille pour les données. Par exemple, de tels processeurs ne géraient que des données de 8 bits, pas autre chose. Les données en question était des '''mots'''. Aux tout début de l'informatique, certaines machines utilisaient des mots de 3, 4, 5, 6 7, 13, 17, 23, 36 ou 48 bits. Pour donner quelques exemples, l'ordinateur ERA 1103 utilisait des mots de 36-bits, tout comme le PDP-10, et ne gérait pas d'autre taille pour les données : c'était 36 bits pour tout le monde. Les processeurs en question ne disposaient que d'une seule instruction de lecture/écriture, qui lisait/écrivait des mots entiers. On pouvait ainsi lire ou écrire des paquets de 3, 4, 5, 6 7, 13, 17, 23, 36 ou 48 bits. Les registres du processeur avaient généralement la même taille qu'un mot, ce qui fait que les processeurs de l'époque avaient des registres de 4, 8, 12, 24, 26, 28, 31, 36, 48, voire 60 bits. Les mots en question sont en théorie à distinguer des mots mémoire, mais ce n'est pas souvent le cas en pratique. Les architectures à adressage par mot faisaient en sorte qu'un mot soit de la même taille qu'un mot mémoire. La mémoire était donc découpée en mots, chacun avait sa propre adresse. Par exemple, une mémoire de 64 kilo-mots contenait 65 536 mots, chacun contenant autant de bits qu'un mot. Les mots faisaient tous la même taille, qui variait suivant la mémoire ou le processeur utilisé. Chaque mot avait sa propre adresse, ce qui fait qu'on parlait d''''adressage par mot'''. Il n'y avait qu'une seule unité d'adressage, ce qui fait que le byte et le mot étaient la même chose sur de telles architectures. La distinction entre byte et mot est apparue après, sur des ordinateurs/processeurs différents. ===Les architectures à adressage par byte=== Par la suite, des processeurs ont permis d'adresser des données plus petites qu'un mot. Les processeurs en question disposent de plusieurs instructions de lecture/écriture, qui manipulent des blocs de mémoire de taille différente. Par exemple, il peut avoir une instruction de lecture pour lire 8 bits, une autre pour lire 16 bits, une autre 32, etc. Une autre possibilité est celle où le processeur dispose d'une instruction de lecture, qu'on peut configurer suivant qu'on veuille lire/écrire un octet, deux, quatre, huit. Dans ce cas, on peut faire une distinction entre '''''byte''''' et '''mot''' : le byte est la plus petite donnée, le mot est la plus grande. Par exemple, un processeur disposant d'instruction d'accès mémoire capables de lire/écrire 8 ou 16 bits sont dans ce cas. Le byte fait alors 8 bits, le mot en fait 16. La séparation entre byte et mot peut parfois se compléter avec des tailles intermédiaires. Par exemple, prenons un processeur qui dispose d'une instruction de lecture capable de lire soit 8 bits, soit 16 bits, soit 32 bits, soit 64 bits. Dans ce cas, le byte vaut 8 bits, le mot en fait 64, les autres tailles sont des intermédiaires. Pour résumer, un mot est la plus grande unité adressable par le processeur, un byte est la plus petite. En général, le byte fait 8 bits, un octet. Mais ça n'a pas toujours été le cas, pas mal de jeux d'instructions font exception. L'exemple le plus parlant est celui des processeurs décimaux, qui utilisaient des entiers codés en BCD mais ne géraient pas les entiers codés en binaire normal. De tels processeurs encodaient des nombres sous la forme d'une suite de chiffres décimaux, codés en BCD sur 4 bits. Ils avaient des bytes de 4 bits, voire de 5/6 bits pour les ordinateurs qui ajoutaient un bit de parité/ECC par chiffre décimal. D'autres architectures avaient un byte de 3 à 7 bits. La taille d'un mot mémoire est de plusieurs bytes : un mot mémoire contient un nombre entier de bytes. La norme actuelle est d'utiliser des bytes d'un octet (8 bits), avec des mots contenant plusieurs octets. Le nombre d'octets dans un mot est généralement une puissance de deux pour simplifier les calculs. Cette règle souffre évidemment d'exceptions, mais l'usage de mots qui ne sont pas des puissances de 2 posent quelques problèmes techniques en termes d’adressage, comme on le verra plus bas. Sur de telles architectures, il y a une adresse mémoire par byte, et non par mot, ce qui fait qu'on parle d''''adressage par byte'''. Tous les ordinateurs modernes utilisent l'adressage par byte. Concrètement, sur les processeurs modernes, chaque octet de la mémoire a sa propre adresse, peu importe la taille du mot utilisé par le processeur. Par exemple, les anciens processeurs x86 32 bits et les processeurs x86 64 bits utilisent tous le même système d'adressage, où chaque octet a sa propre adresse, la seule différence est que les adresses sont plus nombreuses. Avec un adressage par mot, on aurait eu autant d'adresses qu'avant, mais les mots seraient passés de 32 à 64 bits en passant au 64 bits. Les registres font encore une fois la même taille qu'un mot, bien qu'il existe quelques rares exceptions. Les processeurs à adressage par byte ont souvent plusieurs instructions de lecture/écriture, chacune pour une taille précise. Pour rendre cela plus concret, prenons le cas de l'instruction de lecture. Il y a au minimum une instruction de lecture qui lit un byte en mémoire, une autre qui lit un mot complet. Il y a souvent des instructions pour les tailles intermédiaires. Par exemple, un processeur 64 bit a des instructions pour lire 8 bits, une autre pour lire 16 bits, une autre pour en lire 32, et enfin une pour lire 64 bits. Idem pour les instructions d'écriture, et les autres instructions d'accès mémoire. ===Les architectures à adressage par mot de type hybrides=== Il a existé des architectures adressées par mot qui géraient des bytes, mais sans pour autant leur donner des adresses. Leur idée était que les transferts entre CPU et mémoire se faisaient par mots, mais les instructions de lecture/écriture pouvaient sélectionner un byte dans le mot. Une instruction d'accès mémoire devait alors préciser deux choses : l'adresse du mot à lire/écrire, et la position du byte dans le mot adressé. Par exemple, on pouvait demander à lire le mot à l'adresse 0x5F, et de récupérer uniquement le byte numéro 6. Il s'agit d'architectures adressables par mot car l'adresse identifie un mot, pas un byte. Les bytes en question n'avaient pas d'adresses en eux-mêmes, il n'y avait pas d'adressage par byte. La sélection des bytes se faisait dans le processeur : le processeur lisait des mots entiers, avant que le hardware du processeur sélectionne automatiquement le byte voulu. D'ailleurs, aucune de ces architectures ne supportait de mode d'adressage base+index ou base+offset pour sélectionner des bytes dans un mot. Elles supportaient de tels modes d'adressage pour un mot, pas pour les bytes. Pour faire la différence, nous parlerons de pseudo-byte dans ce qui suit, pour bien préciser que ce ne sont pas de vrais bytes. Un exemple est le PDP-6 et le PDP-10, qui avaient des instructions de lecture/écriture de ce type. Elles prenaient trois informations : l'adresse d'un mot, la position du pseudo-byte dans le mot, et enfin la taille d'un pseudo-byte ! L'adressage était donc très flexible, car on pouvait configurer la taille du pseudo-byte. Outre l'instruction de lecture LDB et celle d'écriture DPB, d'autres instructions permettaient de manipuler des pseudo-bytes. L'instruction IBP incrémentait le numéro du pseudo-byte, par exemple. ===Les architectures à mot de taille variable=== D'autres architectures codaient leurs nombres en utilisant un nombre variable de bytes ! Dit autrement, elles avaient des mots de taille variable, d'où leur nom d''''architectures à mots de taille variable'''. Il s'agit d'architectures qui codaient les nombres par des chaines de caractères terminées par un byte de terminaison. La grande majorité étaient des architectures décimales, à savoir des ordinateurs qui utilisaient des nombres encodés en BCD ou dans un encodage similaire. Les nombres étaient codés en décimal, mais chaque chiffre était encodé en binaire sur quelques bits, généralement 4 à 6 bits. Les bytes stockaient chacun un caractère, qui était utilisé pour encoder soit un chiffre décimal, soit un autre symbole comme un byte de terminaison. Un caractère faisait plus de 4 bits, vu qu'il fallait au minimum coder les chiffres BCD et des symboles supplémentaires. La taille d'un caractère était généralement de 5/6 bits. Un exemple est celui des IBM 1400 series, qui utilisaient des chaines de caractères séparées par deux bytes : un byte de ''wordmark'' au début, et un byte de ''record mark'' à la fin. Les caractères étaient des chiffres codés en BCD, chaque caractère était codé sur 6 bits. Les calculs se faisaient chiffre par chiffre, au rythme d'un chiffre utilisé comme opérande par cycle d'horloge. Le processeur passait automatiquement d'un chiffre au suivant pour chaque opérande. Chaque caractère/chiffre avait sa propre adresse, ce qui fait l'architecture est techniquement adressable par byte, alors que les mots correspondaient aux nombres de taille variable. ===La comparaison entre l'adressage par mot et par byte=== Plus haut, nous avons vu deux types d'adressage : par mot et par byte. Avec la première, ce sont les mots qui ont des adresses. Les bytes n'existent pas forcément sur de telles architectures. Si une gestion des bytes est présente, les instructions de lecture/écriture utilisent des adresses pour les mots, couplé à la position du byte dans le mot. Les lectures/écritures se font pas mots entiers. À l'opposé, sur les architectures adressées par byte, une adresse correspond à un byte et non à un mot. Les deux techniques font que l'usage des adresses est différent. Entre une adresse par mot et une par byte, le nombre d'adresse n'est pas le même à capacité mémoire égale. Prenons un exemple assez simple, où l'on compare deux processeurs. Les deux ont des mots mémoire de 32 bits, pour simplifier la comparaison. Le premier processeur gère des bytes de 8 bits, et chacun a sa propre adresse, ce qui fait que c'est un adressage par byte qui est utilisé. Le second ne gère pas les bytes mais seulement des mots de 32 bits, ce qui fait que c'est un adressage par mot qui est utilisé. Dans les deux cas, la mémoire n'est pas organisée de la même manière. Prenons une mémoire de 24 octets pour l'exemple, soit 24/4 = 6 mots de 4 octets. Le premier processeur aura une adresse par byte, soit 24 adresses, et ce sera pareil pour la mémoire, qui utilisera une case mémoire par byte. Le second processeur n'aura que 6 adresses : une par mot. La mémoire a des cases mémoire qui contiennent un mot entier, soit 32 bits, 4 octets. [[File:Byte and word addressing.png|centre|vignette|upright=2|Adressage par mot et par Byte.]] L'avantage de l'adressage par mot est que l'on peut adresser plus de mémoire pour un nombre d'adresses égal. Si on a un processeur qui gère des adresses de 16 bits, on peut adresser 2^16 = 65 536 adresses. Avec un mot mémoire de 4 bytes d'un octet chacun, on peut adresser : soit 65 536 bytes/octets, soit 65 536mots et donc 65 536 × 4 octets. L'adressage par mot permet donc d'adresser plus de mémoire avec les mêmes adresses. Une autre manière de voir les choses est qu'une architecture à adressage par byte va utiliser beaucoup plus d'adresses qu'une architecture par mot, à capacité mémoire égale. L'avantage des architectures à adressage par byte est que l'on peut plus facilement modifier des données de petite taille. Par exemple, imaginons qu'un programmeur manipule du texte, avec des caractères codés sur un octet. S'il veut remplacer les lettres majuscules par des minuscules, il doit changer chaque lettre indépendamment des autres, l'une après l'autre. Avec un adressage par mot, il doit lire un mot entier, modifier chaque octet en utilisant des opérations de masquage, puis écrire le mot final. Avec un adressage par byte, il peut lire chaque byte indépendamment, le modifier sans recourir à des opérations de masquage, puis écrire le résultat. Le tout est plus simple avec l'adressage par byte : pas besoin d'opérations de masquage ! Par contre, les architectures à adressage par byte ont de nombreux défauts. Le fait qu'un mot contienne plusieurs octets/bytes a de nombreuses conséquences, desquelles naissent les contraintes d'alignement, de boutisme et autres. Dans ce qui suit, nous allons étudier les défauts des architectures adressables par byte, et allons laisser de côté les architectures adressables par mot. La raison est que toutes les architectures modernes sont adressables par byte, les seules architectures adressables par mot étant de très vieux ordinateurs aujourd'hui disparus. ==Le boutisme : une spécificité de l'adressage par byte== Le premier problème lié à l'adressage par byte est lié au fait que l'on a plusieurs bytes par mot : dans quel ordre placer les bytes dans un mot ? On peut introduire le tout par une analogie avec les langues humaines : certaines s’écrivent de gauche à droite et d'autres de droite à gauche. Dans un ordinateur, c'est pareil avec les bytes/octets des mots mémoire : on peut les écrire soit de gauche à droite, soit de droite à gauche. Quand on veut parler de cet ordre d'écriture, on parle de '''boutisme''' (''endianness''). Dans ce qui suit, nous allons partir du principe que le byte fait un octet, mais gardez dans un coin de votre tête que ce n'a pas toujours été le cas. Les explications qui vont suivre restent valide peu importe la taille du byte. ===Les différents types de boutisme=== Les deux types de boutisme les plus simples sont le gros-boutisme et le petit-boutisme. Sur les '''processeurs gros-boutistes''', la donnée est stockée des adresses les plus faibles vers les adresses plus grande. Pour rendre cela plus clair, prenons un entier qui prend plusieurs octets et qui est stocké entre deux adresses. L'octet de poids fort de l'entier est stocké dans l'adresse la plus faible, et inversement pour le poids faible qui est stocké dans l'adresse la plus grande. Sur les '''processeurs petit-boutistes''', c'est l'inverse : l'octet de poids faible de notre donnée est stocké dans la case mémoire ayant l'adresse la plus faible. La donnée est donc stockée dans l'ordre inverse pour les octets. Certains processeurs sont un peu plus souples : ils laissent le choix du boutisme. Sur ces processeurs, on peut configurer le boutisme en modifiant un bit dans un registre du processeur : il faut mettre ce bit à 1 pour du petit-boutiste, et à 0 pour du gros-boutiste, par exemple. Ces processeurs sont dits '''bi-boutistes'''. {| |[[File:Big-Endian-fr.svg|class=transparent|Gros-boutisme.]] |[[File:Little-Endian-fr.svg|class=transparent|Petit-boutisme.]] |} Petit et gros-boutisme ont pour particularité que la taille des mots ne change pas vraiment l'organisation des octets. Peu importe la taille d'un mot, celui-ci se lit toujours de gauche à droite, ou de droite à gauche. Cela n’apparaît pas avec les techniques de boutismes plus compliquées. [[File:Big-endian little-endian.jpg|centre|vignette|upright=2.5|Comparaison entre ''big-endian'' et ''little-endian'', pour des tailles de 16 et 32 bits.]] [[File:Comparaison entre boutisme avec et sans inversion de mots mémoire.jpg|vignette|Comparaison entre un nombre codé en gros-boutiste pur, et un nombre gros-boutiste dont les octets sont rangés dans un groupe en petit-boutiste. Le nombre en question est 0x 0A 0B 0C 0D, en hexadécimal, le premier mot mémoire étant indiqué en jaune, le second en blanc.]] Certains processeurs ont des boutismes plus compliqués, où chaque mot mémoire est découpé en plusieurs groupes d'octets. Il faut alors prendre en compte le boutisme des octets dans le groupe, mais aussi le boutisme des groupes eux-mêmes. On distingue ainsi un boutisme inter-groupe (le boutisme des groupes eux-même) et un boutisme intra-groupe (l'ordre des octets dans chaque groupe), tout deux pouvant être gros-boutiste ou petit-boutiste. Si l'ordre intra-groupe est identique à l'ordre inter-groupe, alors on retrouve du gros- ou petit-boutiste normal. Mais les choses changent si jamais l'ordre inter-groupe et intra-groupe sont différents. Dans ces conditions, on doit préciser un ordre d’inversion des mots mémoire (''byte-swap''), qui précise si les octets doivent être inversés dans un mot mémoire processeur, en plus de préciser si l'ordre des mots mémoire est petit- ou gros-boutiste. ===Avantages, inconvénients et usage=== Le choix entre petit boutisme et gros boutisme est généralement une simple affaire de convention. Il n'y a pas d'avantage vraiment probant pour l'une ou l'autre de ces deux méthodes, juste quelques avantages ou inconvénients mineurs. Dans les faits, il y a autant d'architectures petit- que de gros-boutistes, la plupart des architectures récentes étant bi-boutistes. Précisons que le jeu d'instruction x86 est de type petit-boutiste. Si on quitte le domaine des jeu d'instruction, les protocoles réseaux et les formats de fichiers imposent un boutisme particulier. Les protocoles réseaux actuels (TCP-IP) sont de type gros-boutiste, ce qui impose de convertir les données réseaux avant de les utiliser sur les PC modernes. Et au passage, si le gros-boutisme est utilisé dans les protocoles réseau, alors que le petit-boutisme est roi sur le x86, c'est pour des raisons pratiques, que nous allons aborder ci-dessous. Le gros-boutisme est très facile à lire pour les humains. Les nombres en gros-boutistes se lisent de droite à gauche, comme il est d'usage dans les langues indo-européennes, alors que les nombres en petit boutistes se lisent dans l'ordre inverse de lecture. Pour la lecture en hexadécimal, il faut inverser l'ordre des octets, mais il faut garder l'ordre des chiffres dans chaque octet. Par exemple, le nombre 0x015665 (87 653 en décimal) se lit 0x015665 en gros-boutiste, mais 0x655601 en petit-boutiste. Et je ne vous raconte pas ce que cela donne avec un ''byte-swap''... Cette différence pose problème quand on doit lire des fichiers, du code machine ou des paquets réseau, avec un éditeur hexadécimal. Alors certes, la plupart des professionnels lisent directement les données en passant par des outils d'analyse qui se chargent d'afficher les nombres en gros-boutiste, voire en décimal. Un professionnel a à sa disposition du désassembleur pour le code machine, des analyseurs de paquets pour les paquets réseau, des décodeurs de fichiers pour les fichiers, des analyseurs de ''dump'' mémoire pour l'analyse de la mémoire, etc. Cependant, le gros-boutisme reste un avantage quand on utilise un éditeur hexadécimal, quel que soit l'usage. En conséquence, le gros-boutiste a été historiquement pas mal utilisé dans les protocoles réseaux et les formats de fichiers. Par contre, cet avantage de lecture a dû faire face à divers désavantages pour les architectures de processeur. Le petit-boutisme peut avoir des avantages sur les architectures qui gèrent des données de taille intermédiaires entre le byte et le mot. C'est le cas sur le x86, où l'on peut décider de lire des données de 8, 16, 32, ou 64 bits à partir d'une adresse mémoire. Avec le petit-boutisme, on s'assure qu'une lecture charge bien la même valeur, le même nombre. Par exemple, imaginons que je stocke le nombre 0x 14 25 36 48 sur un mot mémoire, en petit-boutiste. En petit-boutiste, une opération de lecture reverra soit les 8 bits de poids faible (0x 48), soit les 16 bits de poids faible (0x 36 48), soit le nombre complet. Ce ne serait pas le cas en gros-boutiste, où les lectures reverraient respectivement 0x 14, 0x 14 25 et 0x 14 25 36 48. Avec le gros-boutisme, de telles opérations de lecture n'ont pas vraiment de sens. En soit, cet avantage est assez limité et n'est utile que pour les compilateurs et les programmeurs en assembleur. Un autre avantage est un gain de performance pour certaines opérations. Les instructions en question sont les opérations où on doit additionner d'opérandes codées sur plusieurs octets; sur un processeur qui fait les calculs octet par octet. En clair, le processeur dispose d'instructions de calcul qui additionnent des nombres de 16, 32 ou 64 bit, voire plus. Mais à l'intérieur du processeur, les calculs sont faits octets par octets, l'unité de calcul ne pouvant qu'additionner deux nombres de 8 bits à la fois. Dans ce cas, le petit-boutisme garantit que l'addition des octets se fait dans le bon ordre, en commençant par les octets de poids faible pour progresser vers les octets de poids fort. En gros-boutisme, les choses sont beaucoup plus compliquées... Pour résumer, les avantages et inconvénients de chaque boutisme sont mineurs. Le gain en performance est nul sur les architectures modernes, qui ont des unités de calcul capables de faire des additions multi-octets. L'usage d'opérations de lecture de taille variable est aujourd'hui tombé en désuétude, vu que cela ne sert pas à grand chose et complexifie le jeu d'instruction. Enfin, l'avantage de lecture n'est utile que dans situations tellement rares qu'on peut légitimement questionner son statut d'avantage. En bref, les différentes formes de boutisme se valent. ==L'implémentation de l'adressage par byte au niveau de la mémoire RAM/ROM== Avant de poursuivre, rappelons que la notion de byte est avant tout liée au jeu d'instruction, mais qu'elle ne dit rien du bus mémoire ! Il est parfaitement possible d'utiliser un bus mémoire d'une taille différente de celle du byte ou du mot. La largeur du bus mémoire, la taille d'un mot, et la taille d'un byte, ne sont pas forcément corrélées. Néanmoins, deux cas classiques sont les plus courants. ===Les architectures avec une mémoire adressable par byte=== Le premier est celui où le bus mémoire transmet un byte à la fois. En clair, la largeur du bus mémoire est celle du byte. Le moindre accès mémoire se fait byte par byte, donc en plusieurs cycles d'horloge. Par exemple, sur un processeur 64 bits, la lecture d'un mot complet se fera octet par octet, ce qui demandera 8 cycles d'horloge, cycles d'horloge mémoire qui plus est. Ce qui explique le désavantage de cette méthode : la performance est assez mauvaise. La performance dépend de plus de la taille des données lue/écrites. On prend moins de temps à lire une donnée courte qu'une donnée longue. L'avantage est qu'on peut lire ou écrire un mot, peu importe son adresse. Pour donner un exemple, je peux parfaitement lire une donnée de 16 bits localisée à l'adresse 4, puis lire une autre donnée de 16 bits localisée à l'adresse 5 sans aucun problème. En conséquence, il n'y a pas de contraintes d'alignements et les problèmes que nous allons aborder dans la suite n'existent pas. [[File:Chargement d'une donnée sur un processeur sans contraitnes d'alignement.jpg|centre|vignette|upright=2|Chargement d'une donnée sur un processeur sans contraintes d'alignement.]] ===Les architectures avec une mémoire adressable par mot=== Pour éviter d'avoir des performances désastreuses, on utilise une autre solution : le bus mémoire a la largeur nécessaire pour lire un mot entier. Le processeur peut charger un mot mémoire entier dans ses registres, en un seul accès mémoire. Et pour lire des données plus petites qu'un mot mémoire, le processeur charge un mot complet, mais ignore les octets en trop. [[File:Exemple du chargement d'un octet dans un registre de trois octets.jpg|centre|vignette|upright=2|Exemple du chargement d'un octet dans un registre de trois octets.]] Il y a alors confusion entre un mot au sens du jeu d'instruction, et un mot mémoire. Pour rappel, une donnée qui a la même taille que le bus de données est appelée un mot mémoire. Mais dans ce cas, l'adressage de la mémoire et du CPU ne sont pas compatibles : le processeur utilise une adresse par byte, la mémoire une adresse par mot ! Tout se passe comme si la mémoire était découpée en blocs de la taille d'un mot. La capacité de la mémoire reste inchangée, ce qui fait que le nombre d'adresses utilisables diminue : il n'y a plus besoin que d'une adresse par mot mémoire et non par octet. Il faut donc faire une sorte d'interface entre les deux. [[File:Chargement d'une donnée sur un processeur avec contraintes d'alignement.jpg|centre|vignette|upright=2|Chargement d'une donnée sur un processeur avec contraintes d'alignement.]] Par convention, l'adresse d'un mot est l'adresse de son octet de poids faible. Les autres octets du mot ne sont pas adressables par la mémoire. Par exemple, si on prend un mot de 8 octets, on est certain qu'une adresse sur 8 disparaîtra. L'adresse du mot est utilisée pour communiquer avec la mémoire, mais cela ne signifie pas que l'adresse des octets est inutile au-delà du calcul de l'adresse du mot. En effet, l'accès à un octet précis demande de déterminer la position de l'octet dans le mot à partir de l'adresse du octet. Prenons un processeur ayant des mots de 4 octets et répertorions les adresses utilisables. Le premier mot contient les octets d'adresse 0, 1, 2 et 3. L'adresse zéro est l'adresse de l'octet de poids faible et sert donc d'adresse au premier mot, les autres sont inutilisables sur le bus mémoire. Le second mot contient les adresses 4, 5, 6 et 7, l'adresse 4 est l'adresse du mot, les autres sont inutilisables. Et ainsi de suite. Si on fait une liste exhaustive des adresses valides et invalides, on remarque que seules les adresses multiples de 4 sont utilisables. Et ceux qui sont encore plus observateurs remarqueront que 4 est la taille d'un mot. Dans l'exemple précédent, les adresses utilisables sont multiples de la taille d'un mot. Sachez que cela fonctionne quelle que soit la taille du mot. Si N est la taille d'un mot, alors seules les adresses multiples de N seront utilisables. Avec ce résultat, on peut trouver une procédure qui nous donne l'adresse d'un mot à partir de l'adresse d'un octet. Si un mot contient N bytes, alors l'adresse du mot se calcule en divisant l'adresse du byte par N. La position du byte dans le mot est quant à elle le reste de cette division. Un reste de 0 nous dit que l'octet est le premier du mot, un reste de 1 nous dit qu'il est le second, etc. [[File:Adresse d'un mot avec alignement mémoire strict.png|centre|vignette|upright=2|Adresse d'un mot avec alignement mémoire strict.]] Le processeur peut donc adresser la mémoire RAM en traduisant les adresses des octets en adresses de mot. Il lui suffit de faire une division pour cela. Il conserve aussi le reste de la division dans un registre pour sélectionner l'octet une fois la lecture terminée. Un accès mémoire se fait donc comme suit : il reçoit l'adresse à lire, il calcule l'adresse du mot, effectue la lecture, reçoit le mot à lire, et utilise le reste pour sélectionner l'octet final si besoin. La dernière étape est facultative et n'est présente que si on lit une donnée plus petite qu'un mot. La division est une opération assez complexe, mais il y a moyen de ruser. L'idée est de faire en sorte que N soit une puissance de deux. La division se traduit alors par un vulgaire décalage vers la droite, le calcul du reste pas une simple opération de masquage. C'est la raison pour laquelle les processeurs actuels utilisent des mots de 1, 2, 4, 8 octets. Sans cela, les accès mémoire seraient bien plus lents. De plus, cela permet d'économiser des fils sur le bus d'adresse. Si la taille d'un mot est égale à <math>2^{n}</math>, seules les adresses multiples de <math>2^{n}</math> seront utilisables. Or, ces adresses se reconnaissent facilement : leurs n bits de poids faibles valent zéro. On n'a donc pas besoin de câbler les fils correspondant à ces bits de poids faible. ==L'alignement mémoire== Dans la section précédente, nous avons évoqué le cas où un processeur à adressage par byte est couplé à une mémoire adressable par mot. Sur de telles architectures, des problèmes surviennent quand les lectures/écritures se font par mots entiers. Le processeur fournit l'adresse d'un byte, mais lit un mot entier à partir de ce byte. Par exemple, prenons une lecture d'un mot complet : celle-ci précise l'adresse d'un byte. Sur un CPU 64 bits, le processeur lit alors 64 bits d'un coup à partir de l'adresse du byte. Et cela peut poser quelques problèmes, dont la résolution demande de respecter des restrictions sur la place de chaque mot en mémoire, restrictions résumées sous le nom d''''alignement mémoire'''. ===L'exemple sur les processeurs 16 bits=== Pour faire comprendre ce qu'est l'alignement mémoire, nous allons prendre l'exemple d'un processeur 16 bits connecté à une mémoire de 16 bits, via un bus mémoire de 16 bits. Le processeur utilisant l'adressage par byte, chaque octet de la mémoire a sa propre adresse. Par contre, le processeur lit et écrit des paquets de 16 bits, soit deux octets. Un groupe de deux octets est appelé, pour rappel, un '''doublet'''. Pour la mémoire, les octets sont regroupés en groupes de deux, en '''doublets mémoire'''. Pour la mémoire, un doublet mémoire a une adresse unique. Et cela ne colle pas avec l'adressage par byte utilisé par le processeur, il y a une différence entre les adresses du processeur et celles de la mémoire. Il y a une adresse par doublet pour la mémoire, une adresse par octet pour le processeur. L'adresse mémoire a donc un bit de moins que l'adresse processeur. Pour faire la distinction, nous utiliserons les termes : ''adresse mémoire'' et ''adresse processeur''. Lorsque le processeur lit un doublet, il lit le premier octet à une adresse processeur et l'octet suivant dans l'adresse processeur suivante. Les adresses processeur sont donc regroupées par groupes de deux : l'adresse 0 et 1 adressent toutes deux le premier doublet, l'adresse 2 et 3 adressent le second doublet, etc. Un doublet est donc identifié par deux adresses processeur : une '''adresse paire''' et une '''adresse impaire'''. Nous allons partir du principe que l'octet de poids faible est dans l'adresse paire, l'octet de poids fort dans l'adresse impaire. Les règles de boutisme autorise de faire l'inverse, mais ce n'est pas le choix le plus intuitif. L'alignement mémoire dit quoi faire lorsque le processeur veut lire/écrire 16 bits à une adresse impaire. S'il veut lire 16 bits à une adresse impaire, les deux octets seront dans des doublets mémoire différents. Le premier sera l'octet de poids fort d'un doublet, l'autre sera l'octet de poids faible du doublet suivant. Le doublet que le processeur veut lire/écrire est à cheval sur deux doublets mémoire. Et le processeur ne gère pas cette situation naturellement. [[File:Alignement mémoire sur 16 bits.png|centre|vignette|upright=2|Alignement mémoire sur 16 bits]] Pour résoudre ce problème, il y a deux solutions : imposer l'alignement mémoire, supporter les accès non-alignés. L'alignement mémoire strict n'autorise que les accès mémoire à des adresses mémoires paires. Tout accès à une adresse mémoire impaire lève une exception matérielle, signe que c'est une erreur matérielle. Par contre, les adresses paires sont autorisées car une adresse paire identifie un doublet mémoire, que le processeur peut lire/écrire en une seule fois, à travers le bus mémoire. Le processeur gère donc uniquement des lectures/écritures de doublet, au sens de doublet mémoire. Sans alignement mémoire, on peut lire/écrire 16 bits à partir d'une adresse paire comme impaire, les deux sont autorisées. Pour cela, le processeur doit gérer les lectures/écritures de 16 bits à des adresses impaires. Vu que les 16 bits demandés sont à cheval sur deux doublets mémoire, le processeur doit lire les deux doublets mémoire, sélectionner les octets adéquats, et les concaténer pour obtenir les 16 bits finaux. Il faut noter que dans une interprétation stricte de l'alignement mémoire, le processeur peut lire/écrire un octet unique, mais seulement s'il est à une adresse paire. Le processeur peut demander à lire ou écrire un seul octet, mais la mémoire fournira deux octets et le processeur devra n'en conserver qu'un. Dans le cas le plus simple, seuls les octets à une adresse paire sont accessibles : l'octet de poids fort d'un doublet n'est pas accesible seul. Le processeur lit un doublet entier dans la mémoire et masque l'octet de poids fort, chargé en trop. Dans un cas plus évolué, les octets à une adresse impaire sont adressables. Dans ce cas, le processeur lit un doublet, déplace l'octet de poids fort dans l'octet de poids faible, et masque l'octet inutile. Dans tous les cas, le processeur ne lit/écrit qu'un doublet à la fois et sélectionne les octets demandés. ===L'alignement mémoire des données=== L'exemple précédent nous a montré ce qu'il en était sur les processeurs 16 bits. Mais pour généraliser le concept, nous allons voir le cas des processeurs 32 bits et plus. Nous venons de voir que l'alignement mémoire sur 16 bits impose des contraintes quant à l'adressage de la mémoire, en empêchant de lire des données qui sont à cheval sur deux doublets. Sur 32 bits, c'est la même chose, mais avec des quadruplets (des groupes de 4 octets, soit 32 bits) : impossible de lire des données si elles sont à cheval sur deux quadruplets mémoire. Sur 64 bits, c'est la même chose, mais avec des octuplets de 8 octets/ 64 bits : impossible de lire des données si elles sont à cheval sur deux octuplets mémoire. La différence, c'est que la situation peut se présenter même si on ne lit pas 32/64 bits. Imaginons le cas particulier suivant : je dispose d'un processeur utilisant des mots de 4 octets. Je dispose aussi d'un programme qui doit manipuler un caractère stocké sur 1 octet, un entier de 4 octets et une donnée de deux octets. Mais un problème se pose : le programme qui manipule ces données a été programmé par quelqu'un qui n'était pas au courant de ces histoire d'alignement, et il a répartit mes données un peu n'importe comment. Supposons que cet entier soit stocké à une adresse non-multiple de 4. Par exemple : {|class=wikitable |- !Adresse !Octet 4 !Octet 3 !Octet 2 !Octet 1 |- |0x 0000 0000 |Caractère |Entier |Entier |Entier |- |0x 0000 0004 |Entier |Donnée |Donnée |- |0x 0000 0008 | | | | |} La lecture ou écriture du caractère ne pose pas de problème, vu qu'il ne fait qu'un seul byte. Pour la donnée de 2 octets, c'est la même chose, car elle tient toute entière dans un mot mémoire. La lire demande de lire le mot et de masquer les octets inutiles. Mais pour l'entier, ça ne marche pas car il est à cheval sur deux mots ! On dit que l'entier n'est pas aligné en mémoire. En conséquence, impossible de le charger en une seule fois Pour résumer, avec un bus mémoire de 32 bits, le problème peut survenir si le processeur veut lire 32 bits, mais aussi 16 bits. Si on veut lire 16 bits, mais que le premier octet est dans un quadruplet, et l'autre octet dans un autre quadruplet, l'alignement mémoire intervient. Idem si on veut lire 4 octets, mais que les 3 premiers sont dans un quadruplet, pas le dernier. Tout cela est plus facile à comprendre avec un exemple. La situation est gérée différemment suivant le processeur. Sur certains processeurs, la donnée est chargée en deux fois : c'est légèrement plus lent que la charger en une seule fois, mais ça passe. On dit que le processeur gère des accès mémoire non-alignés. D'autres processeurs ne gérent pas ce genre d'accès mémoire et les traitent comme une erreur, similaire à une division par zéro, et lève une exception matérielle. Si on est chanceux, la routine d'exception charge la donnée en deux fois. Mais sur d'autres processeurs, le programme responsable de cet accès mémoire en dehors des clous se fait sauvagement planter. Par exemple, essayez de manipuler une donnée qui n'est pas "alignée" dans un mot de 16 octets avec une instruction SSE, vous aurez droit à un joli petit crash ! Pour éviter ce genre de choses, les compilateurs utilisés pour des langages de haut niveau préfèrent rajouter des données inutiles (on dit aussi du bourrage) de façon à ce que chaque donnée soit bien alignée sur le bon nombre d'octets. En reprenant notre exemple du dessus, et en notant le bourrage X, on obtiendrait ceci : {|class=wikitable |- !Adresse !Octet 4 !Octet 3 !Octet 2 !Octet 1 |- |0x 0000 0000 |Caractère |X |X |X |- |0x 0000 0004 |Entier |Entier |Entier |Entier |- |0x 0000 0008 |Donnée |Donnée |X |X |} Comme vous le voyez, de la mémoire est gâchée inutilement. Et quand on sait que de la mémoire cache est gâchée ainsi, ça peut jouer un peu sur les performances. Il y a cependant des situations dans lesquelles rajouter du bourrage est une bonne chose et permet des gains en performances assez abominables (une sombre histoire de cache dans les architectures multiprocesseurs ou multi-cœurs, mais je n'en dit pas plus). L'alignement mémoire se gère dans certains langages (comme le C, le C++ ou l'ADA), en gérant l'ordre de déclaration des variables. Essayez toujours de déclarer vos variables de façon à remplir un mot intégralement ou le plus possible. Renseignez-vous sur le bourrage, et essayez de savoir quelle est la taille des données en regardant la norme de vos langages. ===L'alignement des instructions en mémoire=== Les instructions ont toute une certaine taille, et elles peuvent être de taille fixe (toutes les instructions font X octets), ou de taille variable (le nombre d'octets dépend de l'instruction). Dans les deux cas, le processeur peut incorporer des contraintes sur l'alignement des instructions, au même titre que les contraintes d'alignement sur les données vues précédemment. Pour les instructions de taille fixe, les instructions sont placées à des adresses précises. Par exemple, prenons des instructions de 8 octets. La première instruction prend les 8 premiers octets de la mémoire, la seconde prend les 8 octets suivants, etc. En faisant cela, l'adresse d'une instruction est toujours un multiple de 8. Et on peut généraliser pour toute instruction de taille fixe : si elle fait X octets, son adresse est un multiple de X. Généralement, on prend X une puissance de deux pour simplifier beaucoup de choses. Notamment, cela permet de simplifier le ''program counter'' : quelques bits de poids faible deviennent inutiles. Par exemple, si on prend des instructions de 4 octets, les adresses des instructions sont des multiples de 4, donc les deux bits de poids faible de l'adresse sont toujours 00 et ne sont pas intégrés dans le ''program counter''. Le ''program counter'' est alors plus court de deux bits. Idem avec des instructions de 8 octets qui font économiser 3 bits, ou avec des instructions de 16 octets qui font économiser 4 bits. Les instructions de taille variable ne sont généralement pas alignées. Sur certains processeurs, les instructions n'ont pas de contraintes d'alignement du tout. Leur chargement est donc plus compliqué et demande des méthodes précises qui seront vues dans le chapitre sur l'unité de chargement du processeur. Évidemment, le chargement d'instructions non-alignées est donc plus lent. En conséquence, même si le processeur supporte des instructions non-alignées, les compilateurs ont tendance à aligner les instructions comme les données, sur la taille d'un mot mémoire, afin de gagner en performance. Sur d'autres processeurs, les instructions doivent être alignées. Dans le cas le plus simple, les instructions doivent être alignées sur un mot mémoire, elles doivent respecter les mêmes contraintes d'alignement que les données. Elles peuvent être plus courtes ou plus longues qu'un mot, mais elles doivent commencer à la première adresse d'un mot mémoire. D'autres architectures ont des contraintes d'alignement bizarres. Par exemple, les premiers processeurs x86 16 bits imposaient des instructions alignées sur 16 bits et cette contrainte est restée sur les processeurs 32 bits. Que ce soit pour des instructions de taille fixe ou variables, les circuits de chargement des instructions et les circuits d'accès mémoire ne sont pas les mêmes, ce qui fait que leurs contraintes d'alignement peuvent être différentes. On peut avoir quatre possibilités : des instructions non-alignées et des données alignées, l'inverse, les deux qui sont alignées, les deux qui ne sont pas alignées. Par exemple, il se peut qu'un processeur accepte des données non-alignées, mais ne gère pas des instructions non-alignées ! Le cas le plus simple, fréquent sur les architectures RISC, est d'avoir des instructions et données alignées de la même manière. Les architectures CISC utilisent souvent des contraintes d'alignement, avec généralement des instructions de taille variables non-alignées, mais des données alignées. Les deux dernières possibilités ne sont presque jamais utilisées. De plus, sur les processeurs où les deux sont alignés, on peut avoir un alignement différent pour les données et les instructions. Par exemple, pour un processeur qui utilise des instructions de 8 octets, mais des données de 4 octets. Les différences d'alignements posent une contrainte sur l'économie des bits sur le bus d'adresse. Il faut alors regarder ce qui se passe sur l'alignement des données. Par exemple, pour un processeur qui utilise des instructions de 8 octets, mais des données de 4 octets, on ne pourra économiser que deux bits, pour respecter l'alignement des données. Ou encore, sur un processeur avec des instructions alignées sur 8 octets, mais des données non-alignées, on ne pourra rien économiser. Un cas particulier est celui de l'Intel iAPX 432, dont les instructions étaient non-alignées au niveau des bits ! Leur taille variable faisait que la taille des instructions n'était pas un multiple d'octets. Il était possible d'avoir des instructions larges de 23 bits, d'autres de 41 bits, ou toute autre valeur non-divisible par 8. Un octet pouvait contenir des morceaux de deux instructions, à cheval sur l'octet. Ce comportement fort peu pratique faisait que l'implémentation de l'unité d"e chargement était complexe. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres du processeur | prevText=Les registres du processeur | next=Les modes d'adressage | nextText=Les modes d'adressage }} </noinclude> pwy2c7ffxidy8wq8vid7vzb3tpo7bup 745881 745880 2025-07-03T18:13:16Z Mewtow 31375 /* L'exemple sur les processeurs 16 bits */ 745881 wikitext text/x-wiki Dans ce chapitre, on va parler de l'''endianess'' du processeur et de son alignement mémoire. Concrètement, on va s'intéresser à la façon dont le processeur repartit en mémoire les octets des données qu'il manipule. Ces deux paramètres sont sûrement déjà connus de ceux qui ont une expérience de la programmation assez conséquente. Les autres apprendront ce que c'est dans ce chapitre. Pour simplifier, ils sont à prendre en compte quand on échange des données entre registres et mémoire RAM. ==La différence entre mots et bytes== Avant toute chose, nous allons reparler rapidement de la différence entre un byte et un mot. Les deux termes sont généralement polysémiques, avec plusieurs sens. Aussi, définir ce qu'est un mot est assez compliqué. Voyons les différents sens de ce terme, chacun étant utile dans un contexte particulier. Dans les chapitres précédents, nous avons parlé des mots mémoire, à savoir des blocs de mémoire dont le nombre de bits correspond à la largeur du bus mémoire. Le premier sens possible est donc la quantité de données que l'on peut transférer entre CPU et RAM en un seul cycle d'horloge. Il s'agit d'une définition basée sur les transferts réels entre processeur et mémoire. Le terme que nous avons utilisé pour cette définition est : '''mot mémoire'''. Remarquez la subtile différence entre les termes "mot" et "mot mémoire" : le second terme indique bien qu'il s'agit de quelque de lié à la mémoire, pas le premier. Les deux ne sont pas confondre, et nous allons voir pourquoi. La définition précédente ne permet pas de définir ce qu'est un byte et un mot, vu que la distinction se fait au niveau du processeur, au niveau du jeu d'instruction. Précisément, elle intervient au niveau des instructions d'accès mémoire, éventuellement de certaines opérations de traitement de données. Dans ce qui va suivre, nous allons faire la différence entre les architectures à mot, à byte, et à chaines de caractères. Voyons dans le détail ces histoires de mots, de bytes, et autres. ===Les architectures à adressage par mot=== Au tout début de l'informatique, sur les anciens ordinateurs datant d'avant les années 80, les processeurs géraient qu'une seule taille pour les données. Par exemple, de tels processeurs ne géraient que des données de 8 bits, pas autre chose. Les données en question était des '''mots'''. Aux tout début de l'informatique, certaines machines utilisaient des mots de 3, 4, 5, 6 7, 13, 17, 23, 36 ou 48 bits. Pour donner quelques exemples, l'ordinateur ERA 1103 utilisait des mots de 36-bits, tout comme le PDP-10, et ne gérait pas d'autre taille pour les données : c'était 36 bits pour tout le monde. Les processeurs en question ne disposaient que d'une seule instruction de lecture/écriture, qui lisait/écrivait des mots entiers. On pouvait ainsi lire ou écrire des paquets de 3, 4, 5, 6 7, 13, 17, 23, 36 ou 48 bits. Les registres du processeur avaient généralement la même taille qu'un mot, ce qui fait que les processeurs de l'époque avaient des registres de 4, 8, 12, 24, 26, 28, 31, 36, 48, voire 60 bits. Les mots en question sont en théorie à distinguer des mots mémoire, mais ce n'est pas souvent le cas en pratique. Les architectures à adressage par mot faisaient en sorte qu'un mot soit de la même taille qu'un mot mémoire. La mémoire était donc découpée en mots, chacun avait sa propre adresse. Par exemple, une mémoire de 64 kilo-mots contenait 65 536 mots, chacun contenant autant de bits qu'un mot. Les mots faisaient tous la même taille, qui variait suivant la mémoire ou le processeur utilisé. Chaque mot avait sa propre adresse, ce qui fait qu'on parlait d''''adressage par mot'''. Il n'y avait qu'une seule unité d'adressage, ce qui fait que le byte et le mot étaient la même chose sur de telles architectures. La distinction entre byte et mot est apparue après, sur des ordinateurs/processeurs différents. ===Les architectures à adressage par byte=== Par la suite, des processeurs ont permis d'adresser des données plus petites qu'un mot. Les processeurs en question disposent de plusieurs instructions de lecture/écriture, qui manipulent des blocs de mémoire de taille différente. Par exemple, il peut avoir une instruction de lecture pour lire 8 bits, une autre pour lire 16 bits, une autre 32, etc. Une autre possibilité est celle où le processeur dispose d'une instruction de lecture, qu'on peut configurer suivant qu'on veuille lire/écrire un octet, deux, quatre, huit. Dans ce cas, on peut faire une distinction entre '''''byte''''' et '''mot''' : le byte est la plus petite donnée, le mot est la plus grande. Par exemple, un processeur disposant d'instruction d'accès mémoire capables de lire/écrire 8 ou 16 bits sont dans ce cas. Le byte fait alors 8 bits, le mot en fait 16. La séparation entre byte et mot peut parfois se compléter avec des tailles intermédiaires. Par exemple, prenons un processeur qui dispose d'une instruction de lecture capable de lire soit 8 bits, soit 16 bits, soit 32 bits, soit 64 bits. Dans ce cas, le byte vaut 8 bits, le mot en fait 64, les autres tailles sont des intermédiaires. Pour résumer, un mot est la plus grande unité adressable par le processeur, un byte est la plus petite. En général, le byte fait 8 bits, un octet. Mais ça n'a pas toujours été le cas, pas mal de jeux d'instructions font exception. L'exemple le plus parlant est celui des processeurs décimaux, qui utilisaient des entiers codés en BCD mais ne géraient pas les entiers codés en binaire normal. De tels processeurs encodaient des nombres sous la forme d'une suite de chiffres décimaux, codés en BCD sur 4 bits. Ils avaient des bytes de 4 bits, voire de 5/6 bits pour les ordinateurs qui ajoutaient un bit de parité/ECC par chiffre décimal. D'autres architectures avaient un byte de 3 à 7 bits. La taille d'un mot mémoire est de plusieurs bytes : un mot mémoire contient un nombre entier de bytes. La norme actuelle est d'utiliser des bytes d'un octet (8 bits), avec des mots contenant plusieurs octets. Le nombre d'octets dans un mot est généralement une puissance de deux pour simplifier les calculs. Cette règle souffre évidemment d'exceptions, mais l'usage de mots qui ne sont pas des puissances de 2 posent quelques problèmes techniques en termes d’adressage, comme on le verra plus bas. Sur de telles architectures, il y a une adresse mémoire par byte, et non par mot, ce qui fait qu'on parle d''''adressage par byte'''. Tous les ordinateurs modernes utilisent l'adressage par byte. Concrètement, sur les processeurs modernes, chaque octet de la mémoire a sa propre adresse, peu importe la taille du mot utilisé par le processeur. Par exemple, les anciens processeurs x86 32 bits et les processeurs x86 64 bits utilisent tous le même système d'adressage, où chaque octet a sa propre adresse, la seule différence est que les adresses sont plus nombreuses. Avec un adressage par mot, on aurait eu autant d'adresses qu'avant, mais les mots seraient passés de 32 à 64 bits en passant au 64 bits. Les registres font encore une fois la même taille qu'un mot, bien qu'il existe quelques rares exceptions. Les processeurs à adressage par byte ont souvent plusieurs instructions de lecture/écriture, chacune pour une taille précise. Pour rendre cela plus concret, prenons le cas de l'instruction de lecture. Il y a au minimum une instruction de lecture qui lit un byte en mémoire, une autre qui lit un mot complet. Il y a souvent des instructions pour les tailles intermédiaires. Par exemple, un processeur 64 bit a des instructions pour lire 8 bits, une autre pour lire 16 bits, une autre pour en lire 32, et enfin une pour lire 64 bits. Idem pour les instructions d'écriture, et les autres instructions d'accès mémoire. ===Les architectures à adressage par mot de type hybrides=== Il a existé des architectures adressées par mot qui géraient des bytes, mais sans pour autant leur donner des adresses. Leur idée était que les transferts entre CPU et mémoire se faisaient par mots, mais les instructions de lecture/écriture pouvaient sélectionner un byte dans le mot. Une instruction d'accès mémoire devait alors préciser deux choses : l'adresse du mot à lire/écrire, et la position du byte dans le mot adressé. Par exemple, on pouvait demander à lire le mot à l'adresse 0x5F, et de récupérer uniquement le byte numéro 6. Il s'agit d'architectures adressables par mot car l'adresse identifie un mot, pas un byte. Les bytes en question n'avaient pas d'adresses en eux-mêmes, il n'y avait pas d'adressage par byte. La sélection des bytes se faisait dans le processeur : le processeur lisait des mots entiers, avant que le hardware du processeur sélectionne automatiquement le byte voulu. D'ailleurs, aucune de ces architectures ne supportait de mode d'adressage base+index ou base+offset pour sélectionner des bytes dans un mot. Elles supportaient de tels modes d'adressage pour un mot, pas pour les bytes. Pour faire la différence, nous parlerons de pseudo-byte dans ce qui suit, pour bien préciser que ce ne sont pas de vrais bytes. Un exemple est le PDP-6 et le PDP-10, qui avaient des instructions de lecture/écriture de ce type. Elles prenaient trois informations : l'adresse d'un mot, la position du pseudo-byte dans le mot, et enfin la taille d'un pseudo-byte ! L'adressage était donc très flexible, car on pouvait configurer la taille du pseudo-byte. Outre l'instruction de lecture LDB et celle d'écriture DPB, d'autres instructions permettaient de manipuler des pseudo-bytes. L'instruction IBP incrémentait le numéro du pseudo-byte, par exemple. ===Les architectures à mot de taille variable=== D'autres architectures codaient leurs nombres en utilisant un nombre variable de bytes ! Dit autrement, elles avaient des mots de taille variable, d'où leur nom d''''architectures à mots de taille variable'''. Il s'agit d'architectures qui codaient les nombres par des chaines de caractères terminées par un byte de terminaison. La grande majorité étaient des architectures décimales, à savoir des ordinateurs qui utilisaient des nombres encodés en BCD ou dans un encodage similaire. Les nombres étaient codés en décimal, mais chaque chiffre était encodé en binaire sur quelques bits, généralement 4 à 6 bits. Les bytes stockaient chacun un caractère, qui était utilisé pour encoder soit un chiffre décimal, soit un autre symbole comme un byte de terminaison. Un caractère faisait plus de 4 bits, vu qu'il fallait au minimum coder les chiffres BCD et des symboles supplémentaires. La taille d'un caractère était généralement de 5/6 bits. Un exemple est celui des IBM 1400 series, qui utilisaient des chaines de caractères séparées par deux bytes : un byte de ''wordmark'' au début, et un byte de ''record mark'' à la fin. Les caractères étaient des chiffres codés en BCD, chaque caractère était codé sur 6 bits. Les calculs se faisaient chiffre par chiffre, au rythme d'un chiffre utilisé comme opérande par cycle d'horloge. Le processeur passait automatiquement d'un chiffre au suivant pour chaque opérande. Chaque caractère/chiffre avait sa propre adresse, ce qui fait l'architecture est techniquement adressable par byte, alors que les mots correspondaient aux nombres de taille variable. ===La comparaison entre l'adressage par mot et par byte=== Plus haut, nous avons vu deux types d'adressage : par mot et par byte. Avec la première, ce sont les mots qui ont des adresses. Les bytes n'existent pas forcément sur de telles architectures. Si une gestion des bytes est présente, les instructions de lecture/écriture utilisent des adresses pour les mots, couplé à la position du byte dans le mot. Les lectures/écritures se font pas mots entiers. À l'opposé, sur les architectures adressées par byte, une adresse correspond à un byte et non à un mot. Les deux techniques font que l'usage des adresses est différent. Entre une adresse par mot et une par byte, le nombre d'adresse n'est pas le même à capacité mémoire égale. Prenons un exemple assez simple, où l'on compare deux processeurs. Les deux ont des mots mémoire de 32 bits, pour simplifier la comparaison. Le premier processeur gère des bytes de 8 bits, et chacun a sa propre adresse, ce qui fait que c'est un adressage par byte qui est utilisé. Le second ne gère pas les bytes mais seulement des mots de 32 bits, ce qui fait que c'est un adressage par mot qui est utilisé. Dans les deux cas, la mémoire n'est pas organisée de la même manière. Prenons une mémoire de 24 octets pour l'exemple, soit 24/4 = 6 mots de 4 octets. Le premier processeur aura une adresse par byte, soit 24 adresses, et ce sera pareil pour la mémoire, qui utilisera une case mémoire par byte. Le second processeur n'aura que 6 adresses : une par mot. La mémoire a des cases mémoire qui contiennent un mot entier, soit 32 bits, 4 octets. [[File:Byte and word addressing.png|centre|vignette|upright=2|Adressage par mot et par Byte.]] L'avantage de l'adressage par mot est que l'on peut adresser plus de mémoire pour un nombre d'adresses égal. Si on a un processeur qui gère des adresses de 16 bits, on peut adresser 2^16 = 65 536 adresses. Avec un mot mémoire de 4 bytes d'un octet chacun, on peut adresser : soit 65 536 bytes/octets, soit 65 536mots et donc 65 536 × 4 octets. L'adressage par mot permet donc d'adresser plus de mémoire avec les mêmes adresses. Une autre manière de voir les choses est qu'une architecture à adressage par byte va utiliser beaucoup plus d'adresses qu'une architecture par mot, à capacité mémoire égale. L'avantage des architectures à adressage par byte est que l'on peut plus facilement modifier des données de petite taille. Par exemple, imaginons qu'un programmeur manipule du texte, avec des caractères codés sur un octet. S'il veut remplacer les lettres majuscules par des minuscules, il doit changer chaque lettre indépendamment des autres, l'une après l'autre. Avec un adressage par mot, il doit lire un mot entier, modifier chaque octet en utilisant des opérations de masquage, puis écrire le mot final. Avec un adressage par byte, il peut lire chaque byte indépendamment, le modifier sans recourir à des opérations de masquage, puis écrire le résultat. Le tout est plus simple avec l'adressage par byte : pas besoin d'opérations de masquage ! Par contre, les architectures à adressage par byte ont de nombreux défauts. Le fait qu'un mot contienne plusieurs octets/bytes a de nombreuses conséquences, desquelles naissent les contraintes d'alignement, de boutisme et autres. Dans ce qui suit, nous allons étudier les défauts des architectures adressables par byte, et allons laisser de côté les architectures adressables par mot. La raison est que toutes les architectures modernes sont adressables par byte, les seules architectures adressables par mot étant de très vieux ordinateurs aujourd'hui disparus. ==Le boutisme : une spécificité de l'adressage par byte== Le premier problème lié à l'adressage par byte est lié au fait que l'on a plusieurs bytes par mot : dans quel ordre placer les bytes dans un mot ? On peut introduire le tout par une analogie avec les langues humaines : certaines s’écrivent de gauche à droite et d'autres de droite à gauche. Dans un ordinateur, c'est pareil avec les bytes/octets des mots mémoire : on peut les écrire soit de gauche à droite, soit de droite à gauche. Quand on veut parler de cet ordre d'écriture, on parle de '''boutisme''' (''endianness''). Dans ce qui suit, nous allons partir du principe que le byte fait un octet, mais gardez dans un coin de votre tête que ce n'a pas toujours été le cas. Les explications qui vont suivre restent valide peu importe la taille du byte. ===Les différents types de boutisme=== Les deux types de boutisme les plus simples sont le gros-boutisme et le petit-boutisme. Sur les '''processeurs gros-boutistes''', la donnée est stockée des adresses les plus faibles vers les adresses plus grande. Pour rendre cela plus clair, prenons un entier qui prend plusieurs octets et qui est stocké entre deux adresses. L'octet de poids fort de l'entier est stocké dans l'adresse la plus faible, et inversement pour le poids faible qui est stocké dans l'adresse la plus grande. Sur les '''processeurs petit-boutistes''', c'est l'inverse : l'octet de poids faible de notre donnée est stocké dans la case mémoire ayant l'adresse la plus faible. La donnée est donc stockée dans l'ordre inverse pour les octets. Certains processeurs sont un peu plus souples : ils laissent le choix du boutisme. Sur ces processeurs, on peut configurer le boutisme en modifiant un bit dans un registre du processeur : il faut mettre ce bit à 1 pour du petit-boutiste, et à 0 pour du gros-boutiste, par exemple. Ces processeurs sont dits '''bi-boutistes'''. {| |[[File:Big-Endian-fr.svg|class=transparent|Gros-boutisme.]] |[[File:Little-Endian-fr.svg|class=transparent|Petit-boutisme.]] |} Petit et gros-boutisme ont pour particularité que la taille des mots ne change pas vraiment l'organisation des octets. Peu importe la taille d'un mot, celui-ci se lit toujours de gauche à droite, ou de droite à gauche. Cela n’apparaît pas avec les techniques de boutismes plus compliquées. [[File:Big-endian little-endian.jpg|centre|vignette|upright=2.5|Comparaison entre ''big-endian'' et ''little-endian'', pour des tailles de 16 et 32 bits.]] [[File:Comparaison entre boutisme avec et sans inversion de mots mémoire.jpg|vignette|Comparaison entre un nombre codé en gros-boutiste pur, et un nombre gros-boutiste dont les octets sont rangés dans un groupe en petit-boutiste. Le nombre en question est 0x 0A 0B 0C 0D, en hexadécimal, le premier mot mémoire étant indiqué en jaune, le second en blanc.]] Certains processeurs ont des boutismes plus compliqués, où chaque mot mémoire est découpé en plusieurs groupes d'octets. Il faut alors prendre en compte le boutisme des octets dans le groupe, mais aussi le boutisme des groupes eux-mêmes. On distingue ainsi un boutisme inter-groupe (le boutisme des groupes eux-même) et un boutisme intra-groupe (l'ordre des octets dans chaque groupe), tout deux pouvant être gros-boutiste ou petit-boutiste. Si l'ordre intra-groupe est identique à l'ordre inter-groupe, alors on retrouve du gros- ou petit-boutiste normal. Mais les choses changent si jamais l'ordre inter-groupe et intra-groupe sont différents. Dans ces conditions, on doit préciser un ordre d’inversion des mots mémoire (''byte-swap''), qui précise si les octets doivent être inversés dans un mot mémoire processeur, en plus de préciser si l'ordre des mots mémoire est petit- ou gros-boutiste. ===Avantages, inconvénients et usage=== Le choix entre petit boutisme et gros boutisme est généralement une simple affaire de convention. Il n'y a pas d'avantage vraiment probant pour l'une ou l'autre de ces deux méthodes, juste quelques avantages ou inconvénients mineurs. Dans les faits, il y a autant d'architectures petit- que de gros-boutistes, la plupart des architectures récentes étant bi-boutistes. Précisons que le jeu d'instruction x86 est de type petit-boutiste. Si on quitte le domaine des jeu d'instruction, les protocoles réseaux et les formats de fichiers imposent un boutisme particulier. Les protocoles réseaux actuels (TCP-IP) sont de type gros-boutiste, ce qui impose de convertir les données réseaux avant de les utiliser sur les PC modernes. Et au passage, si le gros-boutisme est utilisé dans les protocoles réseau, alors que le petit-boutisme est roi sur le x86, c'est pour des raisons pratiques, que nous allons aborder ci-dessous. Le gros-boutisme est très facile à lire pour les humains. Les nombres en gros-boutistes se lisent de droite à gauche, comme il est d'usage dans les langues indo-européennes, alors que les nombres en petit boutistes se lisent dans l'ordre inverse de lecture. Pour la lecture en hexadécimal, il faut inverser l'ordre des octets, mais il faut garder l'ordre des chiffres dans chaque octet. Par exemple, le nombre 0x015665 (87 653 en décimal) se lit 0x015665 en gros-boutiste, mais 0x655601 en petit-boutiste. Et je ne vous raconte pas ce que cela donne avec un ''byte-swap''... Cette différence pose problème quand on doit lire des fichiers, du code machine ou des paquets réseau, avec un éditeur hexadécimal. Alors certes, la plupart des professionnels lisent directement les données en passant par des outils d'analyse qui se chargent d'afficher les nombres en gros-boutiste, voire en décimal. Un professionnel a à sa disposition du désassembleur pour le code machine, des analyseurs de paquets pour les paquets réseau, des décodeurs de fichiers pour les fichiers, des analyseurs de ''dump'' mémoire pour l'analyse de la mémoire, etc. Cependant, le gros-boutisme reste un avantage quand on utilise un éditeur hexadécimal, quel que soit l'usage. En conséquence, le gros-boutiste a été historiquement pas mal utilisé dans les protocoles réseaux et les formats de fichiers. Par contre, cet avantage de lecture a dû faire face à divers désavantages pour les architectures de processeur. Le petit-boutisme peut avoir des avantages sur les architectures qui gèrent des données de taille intermédiaires entre le byte et le mot. C'est le cas sur le x86, où l'on peut décider de lire des données de 8, 16, 32, ou 64 bits à partir d'une adresse mémoire. Avec le petit-boutisme, on s'assure qu'une lecture charge bien la même valeur, le même nombre. Par exemple, imaginons que je stocke le nombre 0x 14 25 36 48 sur un mot mémoire, en petit-boutiste. En petit-boutiste, une opération de lecture reverra soit les 8 bits de poids faible (0x 48), soit les 16 bits de poids faible (0x 36 48), soit le nombre complet. Ce ne serait pas le cas en gros-boutiste, où les lectures reverraient respectivement 0x 14, 0x 14 25 et 0x 14 25 36 48. Avec le gros-boutisme, de telles opérations de lecture n'ont pas vraiment de sens. En soit, cet avantage est assez limité et n'est utile que pour les compilateurs et les programmeurs en assembleur. Un autre avantage est un gain de performance pour certaines opérations. Les instructions en question sont les opérations où on doit additionner d'opérandes codées sur plusieurs octets; sur un processeur qui fait les calculs octet par octet. En clair, le processeur dispose d'instructions de calcul qui additionnent des nombres de 16, 32 ou 64 bit, voire plus. Mais à l'intérieur du processeur, les calculs sont faits octets par octets, l'unité de calcul ne pouvant qu'additionner deux nombres de 8 bits à la fois. Dans ce cas, le petit-boutisme garantit que l'addition des octets se fait dans le bon ordre, en commençant par les octets de poids faible pour progresser vers les octets de poids fort. En gros-boutisme, les choses sont beaucoup plus compliquées... Pour résumer, les avantages et inconvénients de chaque boutisme sont mineurs. Le gain en performance est nul sur les architectures modernes, qui ont des unités de calcul capables de faire des additions multi-octets. L'usage d'opérations de lecture de taille variable est aujourd'hui tombé en désuétude, vu que cela ne sert pas à grand chose et complexifie le jeu d'instruction. Enfin, l'avantage de lecture n'est utile que dans situations tellement rares qu'on peut légitimement questionner son statut d'avantage. En bref, les différentes formes de boutisme se valent. ==L'implémentation de l'adressage par byte au niveau de la mémoire RAM/ROM== Avant de poursuivre, rappelons que la notion de byte est avant tout liée au jeu d'instruction, mais qu'elle ne dit rien du bus mémoire ! Il est parfaitement possible d'utiliser un bus mémoire d'une taille différente de celle du byte ou du mot. La largeur du bus mémoire, la taille d'un mot, et la taille d'un byte, ne sont pas forcément corrélées. Néanmoins, deux cas classiques sont les plus courants. ===Les architectures avec une mémoire adressable par byte=== Le premier est celui où le bus mémoire transmet un byte à la fois. En clair, la largeur du bus mémoire est celle du byte. Le moindre accès mémoire se fait byte par byte, donc en plusieurs cycles d'horloge. Par exemple, sur un processeur 64 bits, la lecture d'un mot complet se fera octet par octet, ce qui demandera 8 cycles d'horloge, cycles d'horloge mémoire qui plus est. Ce qui explique le désavantage de cette méthode : la performance est assez mauvaise. La performance dépend de plus de la taille des données lue/écrites. On prend moins de temps à lire une donnée courte qu'une donnée longue. L'avantage est qu'on peut lire ou écrire un mot, peu importe son adresse. Pour donner un exemple, je peux parfaitement lire une donnée de 16 bits localisée à l'adresse 4, puis lire une autre donnée de 16 bits localisée à l'adresse 5 sans aucun problème. En conséquence, il n'y a pas de contraintes d'alignements et les problèmes que nous allons aborder dans la suite n'existent pas. [[File:Chargement d'une donnée sur un processeur sans contraitnes d'alignement.jpg|centre|vignette|upright=2|Chargement d'une donnée sur un processeur sans contraintes d'alignement.]] ===Les architectures avec une mémoire adressable par mot=== Pour éviter d'avoir des performances désastreuses, on utilise une autre solution : le bus mémoire a la largeur nécessaire pour lire un mot entier. Le processeur peut charger un mot mémoire entier dans ses registres, en un seul accès mémoire. Et pour lire des données plus petites qu'un mot mémoire, le processeur charge un mot complet, mais ignore les octets en trop. [[File:Exemple du chargement d'un octet dans un registre de trois octets.jpg|centre|vignette|upright=2|Exemple du chargement d'un octet dans un registre de trois octets.]] Il y a alors confusion entre un mot au sens du jeu d'instruction, et un mot mémoire. Pour rappel, une donnée qui a la même taille que le bus de données est appelée un mot mémoire. Mais dans ce cas, l'adressage de la mémoire et du CPU ne sont pas compatibles : le processeur utilise une adresse par byte, la mémoire une adresse par mot ! Tout se passe comme si la mémoire était découpée en blocs de la taille d'un mot. La capacité de la mémoire reste inchangée, ce qui fait que le nombre d'adresses utilisables diminue : il n'y a plus besoin que d'une adresse par mot mémoire et non par octet. Il faut donc faire une sorte d'interface entre les deux. [[File:Chargement d'une donnée sur un processeur avec contraintes d'alignement.jpg|centre|vignette|upright=2|Chargement d'une donnée sur un processeur avec contraintes d'alignement.]] Par convention, l'adresse d'un mot est l'adresse de son octet de poids faible. Les autres octets du mot ne sont pas adressables par la mémoire. Par exemple, si on prend un mot de 8 octets, on est certain qu'une adresse sur 8 disparaîtra. L'adresse du mot est utilisée pour communiquer avec la mémoire, mais cela ne signifie pas que l'adresse des octets est inutile au-delà du calcul de l'adresse du mot. En effet, l'accès à un octet précis demande de déterminer la position de l'octet dans le mot à partir de l'adresse du octet. Prenons un processeur ayant des mots de 4 octets et répertorions les adresses utilisables. Le premier mot contient les octets d'adresse 0, 1, 2 et 3. L'adresse zéro est l'adresse de l'octet de poids faible et sert donc d'adresse au premier mot, les autres sont inutilisables sur le bus mémoire. Le second mot contient les adresses 4, 5, 6 et 7, l'adresse 4 est l'adresse du mot, les autres sont inutilisables. Et ainsi de suite. Si on fait une liste exhaustive des adresses valides et invalides, on remarque que seules les adresses multiples de 4 sont utilisables. Et ceux qui sont encore plus observateurs remarqueront que 4 est la taille d'un mot. Dans l'exemple précédent, les adresses utilisables sont multiples de la taille d'un mot. Sachez que cela fonctionne quelle que soit la taille du mot. Si N est la taille d'un mot, alors seules les adresses multiples de N seront utilisables. Avec ce résultat, on peut trouver une procédure qui nous donne l'adresse d'un mot à partir de l'adresse d'un octet. Si un mot contient N bytes, alors l'adresse du mot se calcule en divisant l'adresse du byte par N. La position du byte dans le mot est quant à elle le reste de cette division. Un reste de 0 nous dit que l'octet est le premier du mot, un reste de 1 nous dit qu'il est le second, etc. [[File:Adresse d'un mot avec alignement mémoire strict.png|centre|vignette|upright=2|Adresse d'un mot avec alignement mémoire strict.]] Le processeur peut donc adresser la mémoire RAM en traduisant les adresses des octets en adresses de mot. Il lui suffit de faire une division pour cela. Il conserve aussi le reste de la division dans un registre pour sélectionner l'octet une fois la lecture terminée. Un accès mémoire se fait donc comme suit : il reçoit l'adresse à lire, il calcule l'adresse du mot, effectue la lecture, reçoit le mot à lire, et utilise le reste pour sélectionner l'octet final si besoin. La dernière étape est facultative et n'est présente que si on lit une donnée plus petite qu'un mot. La division est une opération assez complexe, mais il y a moyen de ruser. L'idée est de faire en sorte que N soit une puissance de deux. La division se traduit alors par un vulgaire décalage vers la droite, le calcul du reste pas une simple opération de masquage. C'est la raison pour laquelle les processeurs actuels utilisent des mots de 1, 2, 4, 8 octets. Sans cela, les accès mémoire seraient bien plus lents. De plus, cela permet d'économiser des fils sur le bus d'adresse. Si la taille d'un mot est égale à <math>2^{n}</math>, seules les adresses multiples de <math>2^{n}</math> seront utilisables. Or, ces adresses se reconnaissent facilement : leurs n bits de poids faibles valent zéro. On n'a donc pas besoin de câbler les fils correspondant à ces bits de poids faible. ==L'alignement mémoire== Dans la section précédente, nous avons évoqué le cas où un processeur à adressage par byte est couplé à une mémoire adressable par mot. Sur de telles architectures, des problèmes surviennent quand les lectures/écritures se font par mots entiers. Le processeur fournit l'adresse d'un byte, mais lit un mot entier à partir de ce byte. Par exemple, prenons une lecture d'un mot complet : celle-ci précise l'adresse d'un byte. Sur un CPU 64 bits, le processeur lit alors 64 bits d'un coup à partir de l'adresse du byte. Et cela peut poser quelques problèmes, dont la résolution demande de respecter des restrictions sur la place de chaque mot en mémoire, restrictions résumées sous le nom d''''alignement mémoire'''. ===L'exemple sur les processeurs 16 bits=== Pour faire comprendre ce qu'est l'alignement mémoire, nous allons prendre l'exemple d'un processeur 16 bits connecté à une mémoire de 16 bits, via un bus mémoire de 16 bits. Le processeur utilisant l'adressage par byte, chaque octet de la mémoire a sa propre adresse. Par contre, le processeur lit et écrit des paquets de 16 bits, soit deux octets. : Pour rappel, un groupe de deux octets est appelé un '''doublet'''. Pour la mémoire, les octets sont regroupés en groupes de deux, en '''doublets mémoire'''. Pour la mémoire, un doublet mémoire a une adresse unique. Et cela ne colle pas avec l'adressage par byte utilisé par le processeur, il y a une différence entre les adresses du processeur et celles de la mémoire. Il y a une adresse par doublet pour la mémoire, une adresse par octet pour le processeur. L'adresse mémoire a donc un bit de moins que l'adresse processeur. Pour faire la distinction, nous utiliserons les termes : ''adresse mémoire'' et ''adresse processeur''. Lorsque le processeur lit un doublet, il lit le premier octet à une adresse processeur et l'octet suivant dans l'adresse processeur suivante. Les adresses processeur sont donc regroupées par groupes de deux : l'adresse 0 et 1 adressent toutes deux le premier doublet, l'adresse 2 et 3 adressent le second doublet, etc. Un doublet est donc identifié par deux adresses processeur : une '''adresse paire''' et une '''adresse impaire'''. Nous allons partir du principe que l'octet de poids faible est dans l'adresse paire, l'octet de poids fort dans l'adresse impaire. Les règles de boutisme autorise de faire l'inverse, mais ce n'est pas le choix le plus intuitif. L'alignement mémoire dit quoi faire lorsque le processeur veut lire/écrire 16 bits à une adresse impaire. S'il veut lire 16 bits à une adresse impaire, les deux octets seront dans des doublets mémoire différents. Le premier sera l'octet de poids fort d'un doublet, l'autre sera l'octet de poids faible du doublet suivant. Le doublet que le processeur veut lire/écrire est à cheval sur deux doublets mémoire. Et le processeur ne gère pas cette situation naturellement. [[File:Alignement mémoire sur 16 bits.png|centre|vignette|upright=2|Alignement mémoire sur 16 bits]] Pour résoudre ce problème, il y a deux solutions : imposer l'alignement mémoire, supporter les accès non-alignés. L'alignement mémoire strict n'autorise que les accès mémoire à des adresses mémoires paires. Tout accès à une adresse mémoire impaire lève une exception matérielle, signe que c'est une erreur matérielle. Par contre, les adresses paires sont autorisées car une adresse paire identifie un doublet mémoire, que le processeur peut lire/écrire en une seule fois, à travers le bus mémoire. Le processeur gère donc uniquement des lectures/écritures de doublet, au sens de doublet mémoire. Sans alignement mémoire, on peut lire/écrire 16 bits à partir d'une adresse paire comme impaire, les deux sont autorisées. Pour cela, le processeur doit gérer les lectures/écritures de 16 bits à des adresses impaires. Vu que les 16 bits demandés sont à cheval sur deux doublets mémoire, le processeur doit lire les deux doublets mémoire, sélectionner les octets adéquats, et les concaténer pour obtenir les 16 bits finaux. Il faut noter que dans une interprétation stricte de l'alignement mémoire, le processeur peut lire/écrire un octet unique, mais seulement s'il est à une adresse paire. Le processeur peut demander à lire ou écrire un seul octet, mais la mémoire fournira deux octets et le processeur devra n'en conserver qu'un. Dans le cas le plus simple, seuls les octets à une adresse paire sont accessibles : l'octet de poids fort d'un doublet n'est pas accesible seul. Le processeur lit un doublet entier dans la mémoire et masque l'octet de poids fort, chargé en trop. Dans un cas plus évolué, les octets à une adresse impaire sont adressables. Dans ce cas, le processeur lit un doublet, déplace l'octet de poids fort dans l'octet de poids faible, et masque l'octet inutile. Dans tous les cas, le processeur ne lit/écrit qu'un doublet à la fois et sélectionne les octets demandés. ===L'alignement mémoire des données=== L'exemple précédent nous a montré ce qu'il en était sur les processeurs 16 bits. Mais pour généraliser le concept, nous allons voir le cas des processeurs 32 bits et plus. Nous venons de voir que l'alignement mémoire sur 16 bits impose des contraintes quant à l'adressage de la mémoire, en empêchant de lire des données qui sont à cheval sur deux doublets. Sur 32 bits, c'est la même chose, mais avec des quadruplets (des groupes de 4 octets, soit 32 bits) : impossible de lire des données si elles sont à cheval sur deux quadruplets mémoire. Sur 64 bits, c'est la même chose, mais avec des octuplets de 8 octets/ 64 bits : impossible de lire des données si elles sont à cheval sur deux octuplets mémoire. La différence, c'est que la situation peut se présenter même si on ne lit pas 32/64 bits. Imaginons le cas particulier suivant : je dispose d'un processeur utilisant des mots de 4 octets. Je dispose aussi d'un programme qui doit manipuler un caractère stocké sur 1 octet, un entier de 4 octets et une donnée de deux octets. Mais un problème se pose : le programme qui manipule ces données a été programmé par quelqu'un qui n'était pas au courant de ces histoire d'alignement, et il a répartit mes données un peu n'importe comment. Supposons que cet entier soit stocké à une adresse non-multiple de 4. Par exemple : {|class=wikitable |- !Adresse !Octet 4 !Octet 3 !Octet 2 !Octet 1 |- |0x 0000 0000 |Caractère |Entier |Entier |Entier |- |0x 0000 0004 |Entier |Donnée |Donnée |- |0x 0000 0008 | | | | |} La lecture ou écriture du caractère ne pose pas de problème, vu qu'il ne fait qu'un seul byte. Pour la donnée de 2 octets, c'est la même chose, car elle tient toute entière dans un mot mémoire. La lire demande de lire le mot et de masquer les octets inutiles. Mais pour l'entier, ça ne marche pas car il est à cheval sur deux mots ! On dit que l'entier n'est pas aligné en mémoire. En conséquence, impossible de le charger en une seule fois Pour résumer, avec un bus mémoire de 32 bits, le problème peut survenir si le processeur veut lire 32 bits, mais aussi 16 bits. Si on veut lire 16 bits, mais que le premier octet est dans un quadruplet, et l'autre octet dans un autre quadruplet, l'alignement mémoire intervient. Idem si on veut lire 4 octets, mais que les 3 premiers sont dans un quadruplet, pas le dernier. Tout cela est plus facile à comprendre avec un exemple. La situation est gérée différemment suivant le processeur. Sur certains processeurs, la donnée est chargée en deux fois : c'est légèrement plus lent que la charger en une seule fois, mais ça passe. On dit que le processeur gère des accès mémoire non-alignés. D'autres processeurs ne gérent pas ce genre d'accès mémoire et les traitent comme une erreur, similaire à une division par zéro, et lève une exception matérielle. Si on est chanceux, la routine d'exception charge la donnée en deux fois. Mais sur d'autres processeurs, le programme responsable de cet accès mémoire en dehors des clous se fait sauvagement planter. Par exemple, essayez de manipuler une donnée qui n'est pas "alignée" dans un mot de 16 octets avec une instruction SSE, vous aurez droit à un joli petit crash ! Pour éviter ce genre de choses, les compilateurs utilisés pour des langages de haut niveau préfèrent rajouter des données inutiles (on dit aussi du bourrage) de façon à ce que chaque donnée soit bien alignée sur le bon nombre d'octets. En reprenant notre exemple du dessus, et en notant le bourrage X, on obtiendrait ceci : {|class=wikitable |- !Adresse !Octet 4 !Octet 3 !Octet 2 !Octet 1 |- |0x 0000 0000 |Caractère |X |X |X |- |0x 0000 0004 |Entier |Entier |Entier |Entier |- |0x 0000 0008 |Donnée |Donnée |X |X |} Comme vous le voyez, de la mémoire est gâchée inutilement. Et quand on sait que de la mémoire cache est gâchée ainsi, ça peut jouer un peu sur les performances. Il y a cependant des situations dans lesquelles rajouter du bourrage est une bonne chose et permet des gains en performances assez abominables (une sombre histoire de cache dans les architectures multiprocesseurs ou multi-cœurs, mais je n'en dit pas plus). L'alignement mémoire se gère dans certains langages (comme le C, le C++ ou l'ADA), en gérant l'ordre de déclaration des variables. Essayez toujours de déclarer vos variables de façon à remplir un mot intégralement ou le plus possible. Renseignez-vous sur le bourrage, et essayez de savoir quelle est la taille des données en regardant la norme de vos langages. ===L'alignement des instructions en mémoire=== Les instructions ont toute une certaine taille, et elles peuvent être de taille fixe (toutes les instructions font X octets), ou de taille variable (le nombre d'octets dépend de l'instruction). Dans les deux cas, le processeur peut incorporer des contraintes sur l'alignement des instructions, au même titre que les contraintes d'alignement sur les données vues précédemment. Pour les instructions de taille fixe, les instructions sont placées à des adresses précises. Par exemple, prenons des instructions de 8 octets. La première instruction prend les 8 premiers octets de la mémoire, la seconde prend les 8 octets suivants, etc. En faisant cela, l'adresse d'une instruction est toujours un multiple de 8. Et on peut généraliser pour toute instruction de taille fixe : si elle fait X octets, son adresse est un multiple de X. Généralement, on prend X une puissance de deux pour simplifier beaucoup de choses. Notamment, cela permet de simplifier le ''program counter'' : quelques bits de poids faible deviennent inutiles. Par exemple, si on prend des instructions de 4 octets, les adresses des instructions sont des multiples de 4, donc les deux bits de poids faible de l'adresse sont toujours 00 et ne sont pas intégrés dans le ''program counter''. Le ''program counter'' est alors plus court de deux bits. Idem avec des instructions de 8 octets qui font économiser 3 bits, ou avec des instructions de 16 octets qui font économiser 4 bits. Les instructions de taille variable ne sont généralement pas alignées. Sur certains processeurs, les instructions n'ont pas de contraintes d'alignement du tout. Leur chargement est donc plus compliqué et demande des méthodes précises qui seront vues dans le chapitre sur l'unité de chargement du processeur. Évidemment, le chargement d'instructions non-alignées est donc plus lent. En conséquence, même si le processeur supporte des instructions non-alignées, les compilateurs ont tendance à aligner les instructions comme les données, sur la taille d'un mot mémoire, afin de gagner en performance. Sur d'autres processeurs, les instructions doivent être alignées. Dans le cas le plus simple, les instructions doivent être alignées sur un mot mémoire, elles doivent respecter les mêmes contraintes d'alignement que les données. Elles peuvent être plus courtes ou plus longues qu'un mot, mais elles doivent commencer à la première adresse d'un mot mémoire. D'autres architectures ont des contraintes d'alignement bizarres. Par exemple, les premiers processeurs x86 16 bits imposaient des instructions alignées sur 16 bits et cette contrainte est restée sur les processeurs 32 bits. Que ce soit pour des instructions de taille fixe ou variables, les circuits de chargement des instructions et les circuits d'accès mémoire ne sont pas les mêmes, ce qui fait que leurs contraintes d'alignement peuvent être différentes. On peut avoir quatre possibilités : des instructions non-alignées et des données alignées, l'inverse, les deux qui sont alignées, les deux qui ne sont pas alignées. Par exemple, il se peut qu'un processeur accepte des données non-alignées, mais ne gère pas des instructions non-alignées ! Le cas le plus simple, fréquent sur les architectures RISC, est d'avoir des instructions et données alignées de la même manière. Les architectures CISC utilisent souvent des contraintes d'alignement, avec généralement des instructions de taille variables non-alignées, mais des données alignées. Les deux dernières possibilités ne sont presque jamais utilisées. De plus, sur les processeurs où les deux sont alignés, on peut avoir un alignement différent pour les données et les instructions. Par exemple, pour un processeur qui utilise des instructions de 8 octets, mais des données de 4 octets. Les différences d'alignements posent une contrainte sur l'économie des bits sur le bus d'adresse. Il faut alors regarder ce qui se passe sur l'alignement des données. Par exemple, pour un processeur qui utilise des instructions de 8 octets, mais des données de 4 octets, on ne pourra économiser que deux bits, pour respecter l'alignement des données. Ou encore, sur un processeur avec des instructions alignées sur 8 octets, mais des données non-alignées, on ne pourra rien économiser. Un cas particulier est celui de l'Intel iAPX 432, dont les instructions étaient non-alignées au niveau des bits ! Leur taille variable faisait que la taille des instructions n'était pas un multiple d'octets. Il était possible d'avoir des instructions larges de 23 bits, d'autres de 41 bits, ou toute autre valeur non-divisible par 8. Un octet pouvait contenir des morceaux de deux instructions, à cheval sur l'octet. Ce comportement fort peu pratique faisait que l'implémentation de l'unité d"e chargement était complexe. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres du processeur | prevText=Les registres du processeur | next=Les modes d'adressage | nextText=Les modes d'adressage }} </noinclude> brajzw26uqykkr47uarhl6lsdzrc9i3 745882 745881 2025-07-03T18:39:59Z Mewtow 31375 /* L'exemple sur les processeurs 16 bits */ 745882 wikitext text/x-wiki Dans ce chapitre, on va parler de l'''endianess'' du processeur et de son alignement mémoire. Concrètement, on va s'intéresser à la façon dont le processeur repartit en mémoire les octets des données qu'il manipule. Ces deux paramètres sont sûrement déjà connus de ceux qui ont une expérience de la programmation assez conséquente. Les autres apprendront ce que c'est dans ce chapitre. Pour simplifier, ils sont à prendre en compte quand on échange des données entre registres et mémoire RAM. ==La différence entre mots et bytes== Avant toute chose, nous allons reparler rapidement de la différence entre un byte et un mot. Les deux termes sont généralement polysémiques, avec plusieurs sens. Aussi, définir ce qu'est un mot est assez compliqué. Voyons les différents sens de ce terme, chacun étant utile dans un contexte particulier. Dans les chapitres précédents, nous avons parlé des mots mémoire, à savoir des blocs de mémoire dont le nombre de bits correspond à la largeur du bus mémoire. Le premier sens possible est donc la quantité de données que l'on peut transférer entre CPU et RAM en un seul cycle d'horloge. Il s'agit d'une définition basée sur les transferts réels entre processeur et mémoire. Le terme que nous avons utilisé pour cette définition est : '''mot mémoire'''. Remarquez la subtile différence entre les termes "mot" et "mot mémoire" : le second terme indique bien qu'il s'agit de quelque de lié à la mémoire, pas le premier. Les deux ne sont pas confondre, et nous allons voir pourquoi. La définition précédente ne permet pas de définir ce qu'est un byte et un mot, vu que la distinction se fait au niveau du processeur, au niveau du jeu d'instruction. Précisément, elle intervient au niveau des instructions d'accès mémoire, éventuellement de certaines opérations de traitement de données. Dans ce qui va suivre, nous allons faire la différence entre les architectures à mot, à byte, et à chaines de caractères. Voyons dans le détail ces histoires de mots, de bytes, et autres. ===Les architectures à adressage par mot=== Au tout début de l'informatique, sur les anciens ordinateurs datant d'avant les années 80, les processeurs géraient qu'une seule taille pour les données. Par exemple, de tels processeurs ne géraient que des données de 8 bits, pas autre chose. Les données en question était des '''mots'''. Aux tout début de l'informatique, certaines machines utilisaient des mots de 3, 4, 5, 6 7, 13, 17, 23, 36 ou 48 bits. Pour donner quelques exemples, l'ordinateur ERA 1103 utilisait des mots de 36-bits, tout comme le PDP-10, et ne gérait pas d'autre taille pour les données : c'était 36 bits pour tout le monde. Les processeurs en question ne disposaient que d'une seule instruction de lecture/écriture, qui lisait/écrivait des mots entiers. On pouvait ainsi lire ou écrire des paquets de 3, 4, 5, 6 7, 13, 17, 23, 36 ou 48 bits. Les registres du processeur avaient généralement la même taille qu'un mot, ce qui fait que les processeurs de l'époque avaient des registres de 4, 8, 12, 24, 26, 28, 31, 36, 48, voire 60 bits. Les mots en question sont en théorie à distinguer des mots mémoire, mais ce n'est pas souvent le cas en pratique. Les architectures à adressage par mot faisaient en sorte qu'un mot soit de la même taille qu'un mot mémoire. La mémoire était donc découpée en mots, chacun avait sa propre adresse. Par exemple, une mémoire de 64 kilo-mots contenait 65 536 mots, chacun contenant autant de bits qu'un mot. Les mots faisaient tous la même taille, qui variait suivant la mémoire ou le processeur utilisé. Chaque mot avait sa propre adresse, ce qui fait qu'on parlait d''''adressage par mot'''. Il n'y avait qu'une seule unité d'adressage, ce qui fait que le byte et le mot étaient la même chose sur de telles architectures. La distinction entre byte et mot est apparue après, sur des ordinateurs/processeurs différents. ===Les architectures à adressage par byte=== Par la suite, des processeurs ont permis d'adresser des données plus petites qu'un mot. Les processeurs en question disposent de plusieurs instructions de lecture/écriture, qui manipulent des blocs de mémoire de taille différente. Par exemple, il peut avoir une instruction de lecture pour lire 8 bits, une autre pour lire 16 bits, une autre 32, etc. Une autre possibilité est celle où le processeur dispose d'une instruction de lecture, qu'on peut configurer suivant qu'on veuille lire/écrire un octet, deux, quatre, huit. Dans ce cas, on peut faire une distinction entre '''''byte''''' et '''mot''' : le byte est la plus petite donnée, le mot est la plus grande. Par exemple, un processeur disposant d'instruction d'accès mémoire capables de lire/écrire 8 ou 16 bits sont dans ce cas. Le byte fait alors 8 bits, le mot en fait 16. La séparation entre byte et mot peut parfois se compléter avec des tailles intermédiaires. Par exemple, prenons un processeur qui dispose d'une instruction de lecture capable de lire soit 8 bits, soit 16 bits, soit 32 bits, soit 64 bits. Dans ce cas, le byte vaut 8 bits, le mot en fait 64, les autres tailles sont des intermédiaires. Pour résumer, un mot est la plus grande unité adressable par le processeur, un byte est la plus petite. En général, le byte fait 8 bits, un octet. Mais ça n'a pas toujours été le cas, pas mal de jeux d'instructions font exception. L'exemple le plus parlant est celui des processeurs décimaux, qui utilisaient des entiers codés en BCD mais ne géraient pas les entiers codés en binaire normal. De tels processeurs encodaient des nombres sous la forme d'une suite de chiffres décimaux, codés en BCD sur 4 bits. Ils avaient des bytes de 4 bits, voire de 5/6 bits pour les ordinateurs qui ajoutaient un bit de parité/ECC par chiffre décimal. D'autres architectures avaient un byte de 3 à 7 bits. La taille d'un mot mémoire est de plusieurs bytes : un mot mémoire contient un nombre entier de bytes. La norme actuelle est d'utiliser des bytes d'un octet (8 bits), avec des mots contenant plusieurs octets. Le nombre d'octets dans un mot est généralement une puissance de deux pour simplifier les calculs. Cette règle souffre évidemment d'exceptions, mais l'usage de mots qui ne sont pas des puissances de 2 posent quelques problèmes techniques en termes d’adressage, comme on le verra plus bas. Sur de telles architectures, il y a une adresse mémoire par byte, et non par mot, ce qui fait qu'on parle d''''adressage par byte'''. Tous les ordinateurs modernes utilisent l'adressage par byte. Concrètement, sur les processeurs modernes, chaque octet de la mémoire a sa propre adresse, peu importe la taille du mot utilisé par le processeur. Par exemple, les anciens processeurs x86 32 bits et les processeurs x86 64 bits utilisent tous le même système d'adressage, où chaque octet a sa propre adresse, la seule différence est que les adresses sont plus nombreuses. Avec un adressage par mot, on aurait eu autant d'adresses qu'avant, mais les mots seraient passés de 32 à 64 bits en passant au 64 bits. Les registres font encore une fois la même taille qu'un mot, bien qu'il existe quelques rares exceptions. Les processeurs à adressage par byte ont souvent plusieurs instructions de lecture/écriture, chacune pour une taille précise. Pour rendre cela plus concret, prenons le cas de l'instruction de lecture. Il y a au minimum une instruction de lecture qui lit un byte en mémoire, une autre qui lit un mot complet. Il y a souvent des instructions pour les tailles intermédiaires. Par exemple, un processeur 64 bit a des instructions pour lire 8 bits, une autre pour lire 16 bits, une autre pour en lire 32, et enfin une pour lire 64 bits. Idem pour les instructions d'écriture, et les autres instructions d'accès mémoire. ===Les architectures à adressage par mot de type hybrides=== Il a existé des architectures adressées par mot qui géraient des bytes, mais sans pour autant leur donner des adresses. Leur idée était que les transferts entre CPU et mémoire se faisaient par mots, mais les instructions de lecture/écriture pouvaient sélectionner un byte dans le mot. Une instruction d'accès mémoire devait alors préciser deux choses : l'adresse du mot à lire/écrire, et la position du byte dans le mot adressé. Par exemple, on pouvait demander à lire le mot à l'adresse 0x5F, et de récupérer uniquement le byte numéro 6. Il s'agit d'architectures adressables par mot car l'adresse identifie un mot, pas un byte. Les bytes en question n'avaient pas d'adresses en eux-mêmes, il n'y avait pas d'adressage par byte. La sélection des bytes se faisait dans le processeur : le processeur lisait des mots entiers, avant que le hardware du processeur sélectionne automatiquement le byte voulu. D'ailleurs, aucune de ces architectures ne supportait de mode d'adressage base+index ou base+offset pour sélectionner des bytes dans un mot. Elles supportaient de tels modes d'adressage pour un mot, pas pour les bytes. Pour faire la différence, nous parlerons de pseudo-byte dans ce qui suit, pour bien préciser que ce ne sont pas de vrais bytes. Un exemple est le PDP-6 et le PDP-10, qui avaient des instructions de lecture/écriture de ce type. Elles prenaient trois informations : l'adresse d'un mot, la position du pseudo-byte dans le mot, et enfin la taille d'un pseudo-byte ! L'adressage était donc très flexible, car on pouvait configurer la taille du pseudo-byte. Outre l'instruction de lecture LDB et celle d'écriture DPB, d'autres instructions permettaient de manipuler des pseudo-bytes. L'instruction IBP incrémentait le numéro du pseudo-byte, par exemple. ===Les architectures à mot de taille variable=== D'autres architectures codaient leurs nombres en utilisant un nombre variable de bytes ! Dit autrement, elles avaient des mots de taille variable, d'où leur nom d''''architectures à mots de taille variable'''. Il s'agit d'architectures qui codaient les nombres par des chaines de caractères terminées par un byte de terminaison. La grande majorité étaient des architectures décimales, à savoir des ordinateurs qui utilisaient des nombres encodés en BCD ou dans un encodage similaire. Les nombres étaient codés en décimal, mais chaque chiffre était encodé en binaire sur quelques bits, généralement 4 à 6 bits. Les bytes stockaient chacun un caractère, qui était utilisé pour encoder soit un chiffre décimal, soit un autre symbole comme un byte de terminaison. Un caractère faisait plus de 4 bits, vu qu'il fallait au minimum coder les chiffres BCD et des symboles supplémentaires. La taille d'un caractère était généralement de 5/6 bits. Un exemple est celui des IBM 1400 series, qui utilisaient des chaines de caractères séparées par deux bytes : un byte de ''wordmark'' au début, et un byte de ''record mark'' à la fin. Les caractères étaient des chiffres codés en BCD, chaque caractère était codé sur 6 bits. Les calculs se faisaient chiffre par chiffre, au rythme d'un chiffre utilisé comme opérande par cycle d'horloge. Le processeur passait automatiquement d'un chiffre au suivant pour chaque opérande. Chaque caractère/chiffre avait sa propre adresse, ce qui fait l'architecture est techniquement adressable par byte, alors que les mots correspondaient aux nombres de taille variable. ===La comparaison entre l'adressage par mot et par byte=== Plus haut, nous avons vu deux types d'adressage : par mot et par byte. Avec la première, ce sont les mots qui ont des adresses. Les bytes n'existent pas forcément sur de telles architectures. Si une gestion des bytes est présente, les instructions de lecture/écriture utilisent des adresses pour les mots, couplé à la position du byte dans le mot. Les lectures/écritures se font pas mots entiers. À l'opposé, sur les architectures adressées par byte, une adresse correspond à un byte et non à un mot. Les deux techniques font que l'usage des adresses est différent. Entre une adresse par mot et une par byte, le nombre d'adresse n'est pas le même à capacité mémoire égale. Prenons un exemple assez simple, où l'on compare deux processeurs. Les deux ont des mots mémoire de 32 bits, pour simplifier la comparaison. Le premier processeur gère des bytes de 8 bits, et chacun a sa propre adresse, ce qui fait que c'est un adressage par byte qui est utilisé. Le second ne gère pas les bytes mais seulement des mots de 32 bits, ce qui fait que c'est un adressage par mot qui est utilisé. Dans les deux cas, la mémoire n'est pas organisée de la même manière. Prenons une mémoire de 24 octets pour l'exemple, soit 24/4 = 6 mots de 4 octets. Le premier processeur aura une adresse par byte, soit 24 adresses, et ce sera pareil pour la mémoire, qui utilisera une case mémoire par byte. Le second processeur n'aura que 6 adresses : une par mot. La mémoire a des cases mémoire qui contiennent un mot entier, soit 32 bits, 4 octets. [[File:Byte and word addressing.png|centre|vignette|upright=2|Adressage par mot et par Byte.]] L'avantage de l'adressage par mot est que l'on peut adresser plus de mémoire pour un nombre d'adresses égal. Si on a un processeur qui gère des adresses de 16 bits, on peut adresser 2^16 = 65 536 adresses. Avec un mot mémoire de 4 bytes d'un octet chacun, on peut adresser : soit 65 536 bytes/octets, soit 65 536mots et donc 65 536 × 4 octets. L'adressage par mot permet donc d'adresser plus de mémoire avec les mêmes adresses. Une autre manière de voir les choses est qu'une architecture à adressage par byte va utiliser beaucoup plus d'adresses qu'une architecture par mot, à capacité mémoire égale. L'avantage des architectures à adressage par byte est que l'on peut plus facilement modifier des données de petite taille. Par exemple, imaginons qu'un programmeur manipule du texte, avec des caractères codés sur un octet. S'il veut remplacer les lettres majuscules par des minuscules, il doit changer chaque lettre indépendamment des autres, l'une après l'autre. Avec un adressage par mot, il doit lire un mot entier, modifier chaque octet en utilisant des opérations de masquage, puis écrire le mot final. Avec un adressage par byte, il peut lire chaque byte indépendamment, le modifier sans recourir à des opérations de masquage, puis écrire le résultat. Le tout est plus simple avec l'adressage par byte : pas besoin d'opérations de masquage ! Par contre, les architectures à adressage par byte ont de nombreux défauts. Le fait qu'un mot contienne plusieurs octets/bytes a de nombreuses conséquences, desquelles naissent les contraintes d'alignement, de boutisme et autres. Dans ce qui suit, nous allons étudier les défauts des architectures adressables par byte, et allons laisser de côté les architectures adressables par mot. La raison est que toutes les architectures modernes sont adressables par byte, les seules architectures adressables par mot étant de très vieux ordinateurs aujourd'hui disparus. ==Le boutisme : une spécificité de l'adressage par byte== Le premier problème lié à l'adressage par byte est lié au fait que l'on a plusieurs bytes par mot : dans quel ordre placer les bytes dans un mot ? On peut introduire le tout par une analogie avec les langues humaines : certaines s’écrivent de gauche à droite et d'autres de droite à gauche. Dans un ordinateur, c'est pareil avec les bytes/octets des mots mémoire : on peut les écrire soit de gauche à droite, soit de droite à gauche. Quand on veut parler de cet ordre d'écriture, on parle de '''boutisme''' (''endianness''). Dans ce qui suit, nous allons partir du principe que le byte fait un octet, mais gardez dans un coin de votre tête que ce n'a pas toujours été le cas. Les explications qui vont suivre restent valide peu importe la taille du byte. ===Les différents types de boutisme=== Les deux types de boutisme les plus simples sont le gros-boutisme et le petit-boutisme. Sur les '''processeurs gros-boutistes''', la donnée est stockée des adresses les plus faibles vers les adresses plus grande. Pour rendre cela plus clair, prenons un entier qui prend plusieurs octets et qui est stocké entre deux adresses. L'octet de poids fort de l'entier est stocké dans l'adresse la plus faible, et inversement pour le poids faible qui est stocké dans l'adresse la plus grande. Sur les '''processeurs petit-boutistes''', c'est l'inverse : l'octet de poids faible de notre donnée est stocké dans la case mémoire ayant l'adresse la plus faible. La donnée est donc stockée dans l'ordre inverse pour les octets. Certains processeurs sont un peu plus souples : ils laissent le choix du boutisme. Sur ces processeurs, on peut configurer le boutisme en modifiant un bit dans un registre du processeur : il faut mettre ce bit à 1 pour du petit-boutiste, et à 0 pour du gros-boutiste, par exemple. Ces processeurs sont dits '''bi-boutistes'''. {| |[[File:Big-Endian-fr.svg|class=transparent|Gros-boutisme.]] |[[File:Little-Endian-fr.svg|class=transparent|Petit-boutisme.]] |} Petit et gros-boutisme ont pour particularité que la taille des mots ne change pas vraiment l'organisation des octets. Peu importe la taille d'un mot, celui-ci se lit toujours de gauche à droite, ou de droite à gauche. Cela n’apparaît pas avec les techniques de boutismes plus compliquées. [[File:Big-endian little-endian.jpg|centre|vignette|upright=2.5|Comparaison entre ''big-endian'' et ''little-endian'', pour des tailles de 16 et 32 bits.]] [[File:Comparaison entre boutisme avec et sans inversion de mots mémoire.jpg|vignette|Comparaison entre un nombre codé en gros-boutiste pur, et un nombre gros-boutiste dont les octets sont rangés dans un groupe en petit-boutiste. Le nombre en question est 0x 0A 0B 0C 0D, en hexadécimal, le premier mot mémoire étant indiqué en jaune, le second en blanc.]] Certains processeurs ont des boutismes plus compliqués, où chaque mot mémoire est découpé en plusieurs groupes d'octets. Il faut alors prendre en compte le boutisme des octets dans le groupe, mais aussi le boutisme des groupes eux-mêmes. On distingue ainsi un boutisme inter-groupe (le boutisme des groupes eux-même) et un boutisme intra-groupe (l'ordre des octets dans chaque groupe), tout deux pouvant être gros-boutiste ou petit-boutiste. Si l'ordre intra-groupe est identique à l'ordre inter-groupe, alors on retrouve du gros- ou petit-boutiste normal. Mais les choses changent si jamais l'ordre inter-groupe et intra-groupe sont différents. Dans ces conditions, on doit préciser un ordre d’inversion des mots mémoire (''byte-swap''), qui précise si les octets doivent être inversés dans un mot mémoire processeur, en plus de préciser si l'ordre des mots mémoire est petit- ou gros-boutiste. ===Avantages, inconvénients et usage=== Le choix entre petit boutisme et gros boutisme est généralement une simple affaire de convention. Il n'y a pas d'avantage vraiment probant pour l'une ou l'autre de ces deux méthodes, juste quelques avantages ou inconvénients mineurs. Dans les faits, il y a autant d'architectures petit- que de gros-boutistes, la plupart des architectures récentes étant bi-boutistes. Précisons que le jeu d'instruction x86 est de type petit-boutiste. Si on quitte le domaine des jeu d'instruction, les protocoles réseaux et les formats de fichiers imposent un boutisme particulier. Les protocoles réseaux actuels (TCP-IP) sont de type gros-boutiste, ce qui impose de convertir les données réseaux avant de les utiliser sur les PC modernes. Et au passage, si le gros-boutisme est utilisé dans les protocoles réseau, alors que le petit-boutisme est roi sur le x86, c'est pour des raisons pratiques, que nous allons aborder ci-dessous. Le gros-boutisme est très facile à lire pour les humains. Les nombres en gros-boutistes se lisent de droite à gauche, comme il est d'usage dans les langues indo-européennes, alors que les nombres en petit boutistes se lisent dans l'ordre inverse de lecture. Pour la lecture en hexadécimal, il faut inverser l'ordre des octets, mais il faut garder l'ordre des chiffres dans chaque octet. Par exemple, le nombre 0x015665 (87 653 en décimal) se lit 0x015665 en gros-boutiste, mais 0x655601 en petit-boutiste. Et je ne vous raconte pas ce que cela donne avec un ''byte-swap''... Cette différence pose problème quand on doit lire des fichiers, du code machine ou des paquets réseau, avec un éditeur hexadécimal. Alors certes, la plupart des professionnels lisent directement les données en passant par des outils d'analyse qui se chargent d'afficher les nombres en gros-boutiste, voire en décimal. Un professionnel a à sa disposition du désassembleur pour le code machine, des analyseurs de paquets pour les paquets réseau, des décodeurs de fichiers pour les fichiers, des analyseurs de ''dump'' mémoire pour l'analyse de la mémoire, etc. Cependant, le gros-boutisme reste un avantage quand on utilise un éditeur hexadécimal, quel que soit l'usage. En conséquence, le gros-boutiste a été historiquement pas mal utilisé dans les protocoles réseaux et les formats de fichiers. Par contre, cet avantage de lecture a dû faire face à divers désavantages pour les architectures de processeur. Le petit-boutisme peut avoir des avantages sur les architectures qui gèrent des données de taille intermédiaires entre le byte et le mot. C'est le cas sur le x86, où l'on peut décider de lire des données de 8, 16, 32, ou 64 bits à partir d'une adresse mémoire. Avec le petit-boutisme, on s'assure qu'une lecture charge bien la même valeur, le même nombre. Par exemple, imaginons que je stocke le nombre 0x 14 25 36 48 sur un mot mémoire, en petit-boutiste. En petit-boutiste, une opération de lecture reverra soit les 8 bits de poids faible (0x 48), soit les 16 bits de poids faible (0x 36 48), soit le nombre complet. Ce ne serait pas le cas en gros-boutiste, où les lectures reverraient respectivement 0x 14, 0x 14 25 et 0x 14 25 36 48. Avec le gros-boutisme, de telles opérations de lecture n'ont pas vraiment de sens. En soit, cet avantage est assez limité et n'est utile que pour les compilateurs et les programmeurs en assembleur. Un autre avantage est un gain de performance pour certaines opérations. Les instructions en question sont les opérations où on doit additionner d'opérandes codées sur plusieurs octets; sur un processeur qui fait les calculs octet par octet. En clair, le processeur dispose d'instructions de calcul qui additionnent des nombres de 16, 32 ou 64 bit, voire plus. Mais à l'intérieur du processeur, les calculs sont faits octets par octets, l'unité de calcul ne pouvant qu'additionner deux nombres de 8 bits à la fois. Dans ce cas, le petit-boutisme garantit que l'addition des octets se fait dans le bon ordre, en commençant par les octets de poids faible pour progresser vers les octets de poids fort. En gros-boutisme, les choses sont beaucoup plus compliquées... Pour résumer, les avantages et inconvénients de chaque boutisme sont mineurs. Le gain en performance est nul sur les architectures modernes, qui ont des unités de calcul capables de faire des additions multi-octets. L'usage d'opérations de lecture de taille variable est aujourd'hui tombé en désuétude, vu que cela ne sert pas à grand chose et complexifie le jeu d'instruction. Enfin, l'avantage de lecture n'est utile que dans situations tellement rares qu'on peut légitimement questionner son statut d'avantage. En bref, les différentes formes de boutisme se valent. ==L'implémentation de l'adressage par byte au niveau de la mémoire RAM/ROM== Avant de poursuivre, rappelons que la notion de byte est avant tout liée au jeu d'instruction, mais qu'elle ne dit rien du bus mémoire ! Il est parfaitement possible d'utiliser un bus mémoire d'une taille différente de celle du byte ou du mot. La largeur du bus mémoire, la taille d'un mot, et la taille d'un byte, ne sont pas forcément corrélées. Néanmoins, deux cas classiques sont les plus courants. ===Les architectures avec une mémoire adressable par byte=== Le premier est celui où le bus mémoire transmet un byte à la fois. En clair, la largeur du bus mémoire est celle du byte. Le moindre accès mémoire se fait byte par byte, donc en plusieurs cycles d'horloge. Par exemple, sur un processeur 64 bits, la lecture d'un mot complet se fera octet par octet, ce qui demandera 8 cycles d'horloge, cycles d'horloge mémoire qui plus est. Ce qui explique le désavantage de cette méthode : la performance est assez mauvaise. La performance dépend de plus de la taille des données lue/écrites. On prend moins de temps à lire une donnée courte qu'une donnée longue. L'avantage est qu'on peut lire ou écrire un mot, peu importe son adresse. Pour donner un exemple, je peux parfaitement lire une donnée de 16 bits localisée à l'adresse 4, puis lire une autre donnée de 16 bits localisée à l'adresse 5 sans aucun problème. En conséquence, il n'y a pas de contraintes d'alignements et les problèmes que nous allons aborder dans la suite n'existent pas. [[File:Chargement d'une donnée sur un processeur sans contraitnes d'alignement.jpg|centre|vignette|upright=2|Chargement d'une donnée sur un processeur sans contraintes d'alignement.]] ===Les architectures avec une mémoire adressable par mot=== Pour éviter d'avoir des performances désastreuses, on utilise une autre solution : le bus mémoire a la largeur nécessaire pour lire un mot entier. Le processeur peut charger un mot mémoire entier dans ses registres, en un seul accès mémoire. Et pour lire des données plus petites qu'un mot mémoire, le processeur charge un mot complet, mais ignore les octets en trop. [[File:Exemple du chargement d'un octet dans un registre de trois octets.jpg|centre|vignette|upright=2|Exemple du chargement d'un octet dans un registre de trois octets.]] Il y a alors confusion entre un mot au sens du jeu d'instruction, et un mot mémoire. Pour rappel, une donnée qui a la même taille que le bus de données est appelée un mot mémoire. Mais dans ce cas, l'adressage de la mémoire et du CPU ne sont pas compatibles : le processeur utilise une adresse par byte, la mémoire une adresse par mot ! Tout se passe comme si la mémoire était découpée en blocs de la taille d'un mot. La capacité de la mémoire reste inchangée, ce qui fait que le nombre d'adresses utilisables diminue : il n'y a plus besoin que d'une adresse par mot mémoire et non par octet. Il faut donc faire une sorte d'interface entre les deux. [[File:Chargement d'une donnée sur un processeur avec contraintes d'alignement.jpg|centre|vignette|upright=2|Chargement d'une donnée sur un processeur avec contraintes d'alignement.]] Par convention, l'adresse d'un mot est l'adresse de son octet de poids faible. Les autres octets du mot ne sont pas adressables par la mémoire. Par exemple, si on prend un mot de 8 octets, on est certain qu'une adresse sur 8 disparaîtra. L'adresse du mot est utilisée pour communiquer avec la mémoire, mais cela ne signifie pas que l'adresse des octets est inutile au-delà du calcul de l'adresse du mot. En effet, l'accès à un octet précis demande de déterminer la position de l'octet dans le mot à partir de l'adresse du octet. Prenons un processeur ayant des mots de 4 octets et répertorions les adresses utilisables. Le premier mot contient les octets d'adresse 0, 1, 2 et 3. L'adresse zéro est l'adresse de l'octet de poids faible et sert donc d'adresse au premier mot, les autres sont inutilisables sur le bus mémoire. Le second mot contient les adresses 4, 5, 6 et 7, l'adresse 4 est l'adresse du mot, les autres sont inutilisables. Et ainsi de suite. Si on fait une liste exhaustive des adresses valides et invalides, on remarque que seules les adresses multiples de 4 sont utilisables. Et ceux qui sont encore plus observateurs remarqueront que 4 est la taille d'un mot. Dans l'exemple précédent, les adresses utilisables sont multiples de la taille d'un mot. Sachez que cela fonctionne quelle que soit la taille du mot. Si N est la taille d'un mot, alors seules les adresses multiples de N seront utilisables. Avec ce résultat, on peut trouver une procédure qui nous donne l'adresse d'un mot à partir de l'adresse d'un octet. Si un mot contient N bytes, alors l'adresse du mot se calcule en divisant l'adresse du byte par N. La position du byte dans le mot est quant à elle le reste de cette division. Un reste de 0 nous dit que l'octet est le premier du mot, un reste de 1 nous dit qu'il est le second, etc. [[File:Adresse d'un mot avec alignement mémoire strict.png|centre|vignette|upright=2|Adresse d'un mot avec alignement mémoire strict.]] Le processeur peut donc adresser la mémoire RAM en traduisant les adresses des octets en adresses de mot. Il lui suffit de faire une division pour cela. Il conserve aussi le reste de la division dans un registre pour sélectionner l'octet une fois la lecture terminée. Un accès mémoire se fait donc comme suit : il reçoit l'adresse à lire, il calcule l'adresse du mot, effectue la lecture, reçoit le mot à lire, et utilise le reste pour sélectionner l'octet final si besoin. La dernière étape est facultative et n'est présente que si on lit une donnée plus petite qu'un mot. La division est une opération assez complexe, mais il y a moyen de ruser. L'idée est de faire en sorte que N soit une puissance de deux. La division se traduit alors par un vulgaire décalage vers la droite, le calcul du reste pas une simple opération de masquage. C'est la raison pour laquelle les processeurs actuels utilisent des mots de 1, 2, 4, 8 octets. Sans cela, les accès mémoire seraient bien plus lents. De plus, cela permet d'économiser des fils sur le bus d'adresse. Si la taille d'un mot est égale à <math>2^{n}</math>, seules les adresses multiples de <math>2^{n}</math> seront utilisables. Or, ces adresses se reconnaissent facilement : leurs n bits de poids faibles valent zéro. On n'a donc pas besoin de câbler les fils correspondant à ces bits de poids faible. ==L'alignement mémoire== Dans la section précédente, nous avons évoqué le cas où un processeur à adressage par byte est couplé à une mémoire adressable par mot. Sur de telles architectures, des problèmes surviennent quand les lectures/écritures se font par mots entiers. Le processeur fournit l'adresse d'un byte, mais lit un mot entier à partir de ce byte. Par exemple, prenons une lecture d'un mot complet : celle-ci précise l'adresse d'un byte. Sur un CPU 64 bits, le processeur lit alors 64 bits d'un coup à partir de l'adresse du byte. Et cela peut poser quelques problèmes, dont la résolution demande de respecter des restrictions sur la place de chaque mot en mémoire, restrictions résumées sous le nom d''''alignement mémoire'''. ===L'exemple sur les processeurs 16 bits=== Pour faire comprendre ce qu'est l'alignement mémoire, nous allons prendre l'exemple d'un processeur 16 bits connecté à une mémoire de 16 bits, via un bus mémoire de 16 bits. Le processeur utilisant l'adressage par byte, chaque octet de la mémoire a sa propre adresse. Par contre, le processeur lit et écrit des paquets de 16 bits, soit deux octets. : Pour rappel, un groupe de deux octets est appelé un '''doublet'''. Pour la mémoire, les octets sont regroupés en groupes de deux, en '''doublets mémoire'''. Pour la mémoire, un doublet mémoire a une adresse unique. Et cela ne colle pas avec l'adressage par byte utilisé par le processeur, il y a une différence entre les adresses du processeur et celles de la mémoire. Il y a une adresse par doublet pour la mémoire, une adresse par octet pour le processeur. L'adresse mémoire a donc un bit de moins que l'adresse processeur. Pour faire la distinction, nous utiliserons les termes : ''adresse mémoire'' et ''adresse processeur''. Lorsque le processeur lit un doublet, il lit le premier octet à une adresse processeur et l'octet suivant dans l'adresse processeur suivante. Les adresses processeur sont donc regroupées par groupes de deux : l'adresse 0 et 1 adressent toutes deux le premier doublet, l'adresse 2 et 3 adressent le second doublet, etc. Un doublet est donc identifié par deux adresses processeur : une '''adresse paire''' et une '''adresse impaire'''. Nous allons partir du principe que l'octet de poids faible est dans l'adresse paire, l'octet de poids fort dans l'adresse impaire. Les règles de boutisme autorise de faire l'inverse, mais ce n'est pas le choix le plus intuitif. L'alignement mémoire dit quoi faire lorsque le processeur veut lire/écrire 16 bits à une adresse impaire. S'il veut lire 16 bits à une adresse impaire, les deux octets seront dans des doublets mémoire différents. Le premier sera l'octet de poids fort d'un doublet, l'autre sera l'octet de poids faible du doublet suivant. Le doublet que le processeur veut lire/écrire est à cheval sur deux doublets mémoire. Et le processeur ne gère pas cette situation naturellement. [[File:Alignement mémoire sur 16 bits.png|centre|vignette|upright=2|Alignement mémoire sur 16 bits]] Pour résoudre ce problème, il y a deux solutions : imposer l'alignement mémoire, supporter les accès non-alignés. L'alignement mémoire strict n'autorise que les accès mémoire à des adresses mémoires paires. Tout accès à une adresse mémoire impaire lève une exception matérielle, signe que c'est une erreur matérielle. Par contre, les adresses paires sont autorisées car une adresse paire identifie un doublet mémoire, que le processeur peut lire/écrire en une seule fois, à travers le bus mémoire. Le processeur gère donc uniquement des lectures/écritures de doublet, au sens de doublet mémoire. Sans alignement mémoire, on peut lire/écrire 16 bits à partir d'une adresse paire comme impaire, les deux sont autorisées. Pour cela, le processeur doit gérer les lectures/écritures de 16 bits à des adresses impaires. Vu que les 16 bits demandés sont à cheval sur deux doublets mémoire, le processeur doit lire les deux doublets mémoire, sélectionner les octets adéquats, et les concaténer pour obtenir les 16 bits finaux. Pour ce qui est de lire/écrire des octets, l'alignement mémoire ne pose aucune contrainte, vu qu'un octet n'est jamais à cheval sur un doublet,quadruplet ou autre. Le processeur peut demander à lire ou écrire un seul octet, mais la mémoire fournira deux octets et le processeur devra n'en conserver qu'un. Donc, il faut prévoir un système pour sélectionner l'octet demandé dans un doublet. Pour la lecture d'un octet à une adresse paire, le processeur lit un doublet et masque l'octet de poids fort, chargé en trop. Pour une lecture d'un octet à une adresse impaire, le processeur lit un doublet, déplace l'octet de poids fort dans l'octet de poids faible, et masque l'octet inutile. Dans tous les cas, le processeur ne lit/écrit qu'un doublet à la fois et sélectionne les octets demandés. ===L'alignement mémoire des données=== L'exemple précédent nous a montré ce qu'il en était sur les processeurs 16 bits. Mais pour généraliser le concept, nous allons voir le cas des processeurs 32 bits et plus. Nous venons de voir que l'alignement mémoire sur 16 bits impose des contraintes quant à l'adressage de la mémoire, en empêchant de lire des données qui sont à cheval sur deux doublets. Sur 32 bits, c'est la même chose, mais avec des quadruplets (des groupes de 4 octets, soit 32 bits) : impossible de lire des données si elles sont à cheval sur deux quadruplets mémoire. Sur 64 bits, c'est la même chose, mais avec des octuplets de 8 octets/ 64 bits : impossible de lire des données si elles sont à cheval sur deux octuplets mémoire. La différence, c'est que la situation peut se présenter même si on ne lit pas 32/64 bits. Imaginons le cas particulier suivant : je dispose d'un processeur utilisant des mots de 4 octets. Je dispose aussi d'un programme qui doit manipuler un caractère stocké sur 1 octet, un entier de 4 octets et une donnée de deux octets. Mais un problème se pose : le programme qui manipule ces données a été programmé par quelqu'un qui n'était pas au courant de ces histoire d'alignement, et il a répartit mes données un peu n'importe comment. Supposons que cet entier soit stocké à une adresse non-multiple de 4. Par exemple : {|class=wikitable |- !Adresse !Octet 4 !Octet 3 !Octet 2 !Octet 1 |- |0x 0000 0000 |Caractère |Entier |Entier |Entier |- |0x 0000 0004 |Entier |Donnée |Donnée |- |0x 0000 0008 | | | | |} La lecture ou écriture du caractère ne pose pas de problème, vu qu'il ne fait qu'un seul byte. Pour la donnée de 2 octets, c'est la même chose, car elle tient toute entière dans un mot mémoire. La lire demande de lire le mot et de masquer les octets inutiles. Mais pour l'entier, ça ne marche pas car il est à cheval sur deux mots ! On dit que l'entier n'est pas aligné en mémoire. En conséquence, impossible de le charger en une seule fois Pour résumer, avec un bus mémoire de 32 bits, le problème peut survenir si le processeur veut lire 32 bits, mais aussi 16 bits. Si on veut lire 16 bits, mais que le premier octet est dans un quadruplet, et l'autre octet dans un autre quadruplet, l'alignement mémoire intervient. Idem si on veut lire 4 octets, mais que les 3 premiers sont dans un quadruplet, pas le dernier. Tout cela est plus facile à comprendre avec un exemple. La situation est gérée différemment suivant le processeur. Sur certains processeurs, la donnée est chargée en deux fois : c'est légèrement plus lent que la charger en une seule fois, mais ça passe. On dit que le processeur gère des accès mémoire non-alignés. D'autres processeurs ne gérent pas ce genre d'accès mémoire et les traitent comme une erreur, similaire à une division par zéro, et lève une exception matérielle. Si on est chanceux, la routine d'exception charge la donnée en deux fois. Mais sur d'autres processeurs, le programme responsable de cet accès mémoire en dehors des clous se fait sauvagement planter. Par exemple, essayez de manipuler une donnée qui n'est pas "alignée" dans un mot de 16 octets avec une instruction SSE, vous aurez droit à un joli petit crash ! Pour éviter ce genre de choses, les compilateurs utilisés pour des langages de haut niveau préfèrent rajouter des données inutiles (on dit aussi du bourrage) de façon à ce que chaque donnée soit bien alignée sur le bon nombre d'octets. En reprenant notre exemple du dessus, et en notant le bourrage X, on obtiendrait ceci : {|class=wikitable |- !Adresse !Octet 4 !Octet 3 !Octet 2 !Octet 1 |- |0x 0000 0000 |Caractère |X |X |X |- |0x 0000 0004 |Entier |Entier |Entier |Entier |- |0x 0000 0008 |Donnée |Donnée |X |X |} Comme vous le voyez, de la mémoire est gâchée inutilement. Et quand on sait que de la mémoire cache est gâchée ainsi, ça peut jouer un peu sur les performances. Il y a cependant des situations dans lesquelles rajouter du bourrage est une bonne chose et permet des gains en performances assez abominables (une sombre histoire de cache dans les architectures multiprocesseurs ou multi-cœurs, mais je n'en dit pas plus). L'alignement mémoire se gère dans certains langages (comme le C, le C++ ou l'ADA), en gérant l'ordre de déclaration des variables. Essayez toujours de déclarer vos variables de façon à remplir un mot intégralement ou le plus possible. Renseignez-vous sur le bourrage, et essayez de savoir quelle est la taille des données en regardant la norme de vos langages. ===L'alignement des instructions en mémoire=== Les instructions ont toute une certaine taille, et elles peuvent être de taille fixe (toutes les instructions font X octets), ou de taille variable (le nombre d'octets dépend de l'instruction). Dans les deux cas, le processeur peut incorporer des contraintes sur l'alignement des instructions, au même titre que les contraintes d'alignement sur les données vues précédemment. Pour les instructions de taille fixe, les instructions sont placées à des adresses précises. Par exemple, prenons des instructions de 8 octets. La première instruction prend les 8 premiers octets de la mémoire, la seconde prend les 8 octets suivants, etc. En faisant cela, l'adresse d'une instruction est toujours un multiple de 8. Et on peut généraliser pour toute instruction de taille fixe : si elle fait X octets, son adresse est un multiple de X. Généralement, on prend X une puissance de deux pour simplifier beaucoup de choses. Notamment, cela permet de simplifier le ''program counter'' : quelques bits de poids faible deviennent inutiles. Par exemple, si on prend des instructions de 4 octets, les adresses des instructions sont des multiples de 4, donc les deux bits de poids faible de l'adresse sont toujours 00 et ne sont pas intégrés dans le ''program counter''. Le ''program counter'' est alors plus court de deux bits. Idem avec des instructions de 8 octets qui font économiser 3 bits, ou avec des instructions de 16 octets qui font économiser 4 bits. Les instructions de taille variable ne sont généralement pas alignées. Sur certains processeurs, les instructions n'ont pas de contraintes d'alignement du tout. Leur chargement est donc plus compliqué et demande des méthodes précises qui seront vues dans le chapitre sur l'unité de chargement du processeur. Évidemment, le chargement d'instructions non-alignées est donc plus lent. En conséquence, même si le processeur supporte des instructions non-alignées, les compilateurs ont tendance à aligner les instructions comme les données, sur la taille d'un mot mémoire, afin de gagner en performance. Sur d'autres processeurs, les instructions doivent être alignées. Dans le cas le plus simple, les instructions doivent être alignées sur un mot mémoire, elles doivent respecter les mêmes contraintes d'alignement que les données. Elles peuvent être plus courtes ou plus longues qu'un mot, mais elles doivent commencer à la première adresse d'un mot mémoire. D'autres architectures ont des contraintes d'alignement bizarres. Par exemple, les premiers processeurs x86 16 bits imposaient des instructions alignées sur 16 bits et cette contrainte est restée sur les processeurs 32 bits. Que ce soit pour des instructions de taille fixe ou variables, les circuits de chargement des instructions et les circuits d'accès mémoire ne sont pas les mêmes, ce qui fait que leurs contraintes d'alignement peuvent être différentes. On peut avoir quatre possibilités : des instructions non-alignées et des données alignées, l'inverse, les deux qui sont alignées, les deux qui ne sont pas alignées. Par exemple, il se peut qu'un processeur accepte des données non-alignées, mais ne gère pas des instructions non-alignées ! Le cas le plus simple, fréquent sur les architectures RISC, est d'avoir des instructions et données alignées de la même manière. Les architectures CISC utilisent souvent des contraintes d'alignement, avec généralement des instructions de taille variables non-alignées, mais des données alignées. Les deux dernières possibilités ne sont presque jamais utilisées. De plus, sur les processeurs où les deux sont alignés, on peut avoir un alignement différent pour les données et les instructions. Par exemple, pour un processeur qui utilise des instructions de 8 octets, mais des données de 4 octets. Les différences d'alignements posent une contrainte sur l'économie des bits sur le bus d'adresse. Il faut alors regarder ce qui se passe sur l'alignement des données. Par exemple, pour un processeur qui utilise des instructions de 8 octets, mais des données de 4 octets, on ne pourra économiser que deux bits, pour respecter l'alignement des données. Ou encore, sur un processeur avec des instructions alignées sur 8 octets, mais des données non-alignées, on ne pourra rien économiser. Un cas particulier est celui de l'Intel iAPX 432, dont les instructions étaient non-alignées au niveau des bits ! Leur taille variable faisait que la taille des instructions n'était pas un multiple d'octets. Il était possible d'avoir des instructions larges de 23 bits, d'autres de 41 bits, ou toute autre valeur non-divisible par 8. Un octet pouvait contenir des morceaux de deux instructions, à cheval sur l'octet. Ce comportement fort peu pratique faisait que l'implémentation de l'unité d"e chargement était complexe. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres du processeur | prevText=Les registres du processeur | next=Les modes d'adressage | nextText=Les modes d'adressage }} </noinclude> iv8ng9l1qo3yvtr6wvsqu87q0zb5myw 745883 745882 2025-07-03T18:41:56Z Mewtow 31375 /* L'exemple sur les processeurs 16 bits */ 745883 wikitext text/x-wiki Dans ce chapitre, on va parler de l'''endianess'' du processeur et de son alignement mémoire. Concrètement, on va s'intéresser à la façon dont le processeur repartit en mémoire les octets des données qu'il manipule. Ces deux paramètres sont sûrement déjà connus de ceux qui ont une expérience de la programmation assez conséquente. Les autres apprendront ce que c'est dans ce chapitre. Pour simplifier, ils sont à prendre en compte quand on échange des données entre registres et mémoire RAM. ==La différence entre mots et bytes== Avant toute chose, nous allons reparler rapidement de la différence entre un byte et un mot. Les deux termes sont généralement polysémiques, avec plusieurs sens. Aussi, définir ce qu'est un mot est assez compliqué. Voyons les différents sens de ce terme, chacun étant utile dans un contexte particulier. Dans les chapitres précédents, nous avons parlé des mots mémoire, à savoir des blocs de mémoire dont le nombre de bits correspond à la largeur du bus mémoire. Le premier sens possible est donc la quantité de données que l'on peut transférer entre CPU et RAM en un seul cycle d'horloge. Il s'agit d'une définition basée sur les transferts réels entre processeur et mémoire. Le terme que nous avons utilisé pour cette définition est : '''mot mémoire'''. Remarquez la subtile différence entre les termes "mot" et "mot mémoire" : le second terme indique bien qu'il s'agit de quelque de lié à la mémoire, pas le premier. Les deux ne sont pas confondre, et nous allons voir pourquoi. La définition précédente ne permet pas de définir ce qu'est un byte et un mot, vu que la distinction se fait au niveau du processeur, au niveau du jeu d'instruction. Précisément, elle intervient au niveau des instructions d'accès mémoire, éventuellement de certaines opérations de traitement de données. Dans ce qui va suivre, nous allons faire la différence entre les architectures à mot, à byte, et à chaines de caractères. Voyons dans le détail ces histoires de mots, de bytes, et autres. ===Les architectures à adressage par mot=== Au tout début de l'informatique, sur les anciens ordinateurs datant d'avant les années 80, les processeurs géraient qu'une seule taille pour les données. Par exemple, de tels processeurs ne géraient que des données de 8 bits, pas autre chose. Les données en question était des '''mots'''. Aux tout début de l'informatique, certaines machines utilisaient des mots de 3, 4, 5, 6 7, 13, 17, 23, 36 ou 48 bits. Pour donner quelques exemples, l'ordinateur ERA 1103 utilisait des mots de 36-bits, tout comme le PDP-10, et ne gérait pas d'autre taille pour les données : c'était 36 bits pour tout le monde. Les processeurs en question ne disposaient que d'une seule instruction de lecture/écriture, qui lisait/écrivait des mots entiers. On pouvait ainsi lire ou écrire des paquets de 3, 4, 5, 6 7, 13, 17, 23, 36 ou 48 bits. Les registres du processeur avaient généralement la même taille qu'un mot, ce qui fait que les processeurs de l'époque avaient des registres de 4, 8, 12, 24, 26, 28, 31, 36, 48, voire 60 bits. Les mots en question sont en théorie à distinguer des mots mémoire, mais ce n'est pas souvent le cas en pratique. Les architectures à adressage par mot faisaient en sorte qu'un mot soit de la même taille qu'un mot mémoire. La mémoire était donc découpée en mots, chacun avait sa propre adresse. Par exemple, une mémoire de 64 kilo-mots contenait 65 536 mots, chacun contenant autant de bits qu'un mot. Les mots faisaient tous la même taille, qui variait suivant la mémoire ou le processeur utilisé. Chaque mot avait sa propre adresse, ce qui fait qu'on parlait d''''adressage par mot'''. Il n'y avait qu'une seule unité d'adressage, ce qui fait que le byte et le mot étaient la même chose sur de telles architectures. La distinction entre byte et mot est apparue après, sur des ordinateurs/processeurs différents. ===Les architectures à adressage par byte=== Par la suite, des processeurs ont permis d'adresser des données plus petites qu'un mot. Les processeurs en question disposent de plusieurs instructions de lecture/écriture, qui manipulent des blocs de mémoire de taille différente. Par exemple, il peut avoir une instruction de lecture pour lire 8 bits, une autre pour lire 16 bits, une autre 32, etc. Une autre possibilité est celle où le processeur dispose d'une instruction de lecture, qu'on peut configurer suivant qu'on veuille lire/écrire un octet, deux, quatre, huit. Dans ce cas, on peut faire une distinction entre '''''byte''''' et '''mot''' : le byte est la plus petite donnée, le mot est la plus grande. Par exemple, un processeur disposant d'instruction d'accès mémoire capables de lire/écrire 8 ou 16 bits sont dans ce cas. Le byte fait alors 8 bits, le mot en fait 16. La séparation entre byte et mot peut parfois se compléter avec des tailles intermédiaires. Par exemple, prenons un processeur qui dispose d'une instruction de lecture capable de lire soit 8 bits, soit 16 bits, soit 32 bits, soit 64 bits. Dans ce cas, le byte vaut 8 bits, le mot en fait 64, les autres tailles sont des intermédiaires. Pour résumer, un mot est la plus grande unité adressable par le processeur, un byte est la plus petite. En général, le byte fait 8 bits, un octet. Mais ça n'a pas toujours été le cas, pas mal de jeux d'instructions font exception. L'exemple le plus parlant est celui des processeurs décimaux, qui utilisaient des entiers codés en BCD mais ne géraient pas les entiers codés en binaire normal. De tels processeurs encodaient des nombres sous la forme d'une suite de chiffres décimaux, codés en BCD sur 4 bits. Ils avaient des bytes de 4 bits, voire de 5/6 bits pour les ordinateurs qui ajoutaient un bit de parité/ECC par chiffre décimal. D'autres architectures avaient un byte de 3 à 7 bits. La taille d'un mot mémoire est de plusieurs bytes : un mot mémoire contient un nombre entier de bytes. La norme actuelle est d'utiliser des bytes d'un octet (8 bits), avec des mots contenant plusieurs octets. Le nombre d'octets dans un mot est généralement une puissance de deux pour simplifier les calculs. Cette règle souffre évidemment d'exceptions, mais l'usage de mots qui ne sont pas des puissances de 2 posent quelques problèmes techniques en termes d’adressage, comme on le verra plus bas. Sur de telles architectures, il y a une adresse mémoire par byte, et non par mot, ce qui fait qu'on parle d''''adressage par byte'''. Tous les ordinateurs modernes utilisent l'adressage par byte. Concrètement, sur les processeurs modernes, chaque octet de la mémoire a sa propre adresse, peu importe la taille du mot utilisé par le processeur. Par exemple, les anciens processeurs x86 32 bits et les processeurs x86 64 bits utilisent tous le même système d'adressage, où chaque octet a sa propre adresse, la seule différence est que les adresses sont plus nombreuses. Avec un adressage par mot, on aurait eu autant d'adresses qu'avant, mais les mots seraient passés de 32 à 64 bits en passant au 64 bits. Les registres font encore une fois la même taille qu'un mot, bien qu'il existe quelques rares exceptions. Les processeurs à adressage par byte ont souvent plusieurs instructions de lecture/écriture, chacune pour une taille précise. Pour rendre cela plus concret, prenons le cas de l'instruction de lecture. Il y a au minimum une instruction de lecture qui lit un byte en mémoire, une autre qui lit un mot complet. Il y a souvent des instructions pour les tailles intermédiaires. Par exemple, un processeur 64 bit a des instructions pour lire 8 bits, une autre pour lire 16 bits, une autre pour en lire 32, et enfin une pour lire 64 bits. Idem pour les instructions d'écriture, et les autres instructions d'accès mémoire. ===Les architectures à adressage par mot de type hybrides=== Il a existé des architectures adressées par mot qui géraient des bytes, mais sans pour autant leur donner des adresses. Leur idée était que les transferts entre CPU et mémoire se faisaient par mots, mais les instructions de lecture/écriture pouvaient sélectionner un byte dans le mot. Une instruction d'accès mémoire devait alors préciser deux choses : l'adresse du mot à lire/écrire, et la position du byte dans le mot adressé. Par exemple, on pouvait demander à lire le mot à l'adresse 0x5F, et de récupérer uniquement le byte numéro 6. Il s'agit d'architectures adressables par mot car l'adresse identifie un mot, pas un byte. Les bytes en question n'avaient pas d'adresses en eux-mêmes, il n'y avait pas d'adressage par byte. La sélection des bytes se faisait dans le processeur : le processeur lisait des mots entiers, avant que le hardware du processeur sélectionne automatiquement le byte voulu. D'ailleurs, aucune de ces architectures ne supportait de mode d'adressage base+index ou base+offset pour sélectionner des bytes dans un mot. Elles supportaient de tels modes d'adressage pour un mot, pas pour les bytes. Pour faire la différence, nous parlerons de pseudo-byte dans ce qui suit, pour bien préciser que ce ne sont pas de vrais bytes. Un exemple est le PDP-6 et le PDP-10, qui avaient des instructions de lecture/écriture de ce type. Elles prenaient trois informations : l'adresse d'un mot, la position du pseudo-byte dans le mot, et enfin la taille d'un pseudo-byte ! L'adressage était donc très flexible, car on pouvait configurer la taille du pseudo-byte. Outre l'instruction de lecture LDB et celle d'écriture DPB, d'autres instructions permettaient de manipuler des pseudo-bytes. L'instruction IBP incrémentait le numéro du pseudo-byte, par exemple. ===Les architectures à mot de taille variable=== D'autres architectures codaient leurs nombres en utilisant un nombre variable de bytes ! Dit autrement, elles avaient des mots de taille variable, d'où leur nom d''''architectures à mots de taille variable'''. Il s'agit d'architectures qui codaient les nombres par des chaines de caractères terminées par un byte de terminaison. La grande majorité étaient des architectures décimales, à savoir des ordinateurs qui utilisaient des nombres encodés en BCD ou dans un encodage similaire. Les nombres étaient codés en décimal, mais chaque chiffre était encodé en binaire sur quelques bits, généralement 4 à 6 bits. Les bytes stockaient chacun un caractère, qui était utilisé pour encoder soit un chiffre décimal, soit un autre symbole comme un byte de terminaison. Un caractère faisait plus de 4 bits, vu qu'il fallait au minimum coder les chiffres BCD et des symboles supplémentaires. La taille d'un caractère était généralement de 5/6 bits. Un exemple est celui des IBM 1400 series, qui utilisaient des chaines de caractères séparées par deux bytes : un byte de ''wordmark'' au début, et un byte de ''record mark'' à la fin. Les caractères étaient des chiffres codés en BCD, chaque caractère était codé sur 6 bits. Les calculs se faisaient chiffre par chiffre, au rythme d'un chiffre utilisé comme opérande par cycle d'horloge. Le processeur passait automatiquement d'un chiffre au suivant pour chaque opérande. Chaque caractère/chiffre avait sa propre adresse, ce qui fait l'architecture est techniquement adressable par byte, alors que les mots correspondaient aux nombres de taille variable. ===La comparaison entre l'adressage par mot et par byte=== Plus haut, nous avons vu deux types d'adressage : par mot et par byte. Avec la première, ce sont les mots qui ont des adresses. Les bytes n'existent pas forcément sur de telles architectures. Si une gestion des bytes est présente, les instructions de lecture/écriture utilisent des adresses pour les mots, couplé à la position du byte dans le mot. Les lectures/écritures se font pas mots entiers. À l'opposé, sur les architectures adressées par byte, une adresse correspond à un byte et non à un mot. Les deux techniques font que l'usage des adresses est différent. Entre une adresse par mot et une par byte, le nombre d'adresse n'est pas le même à capacité mémoire égale. Prenons un exemple assez simple, où l'on compare deux processeurs. Les deux ont des mots mémoire de 32 bits, pour simplifier la comparaison. Le premier processeur gère des bytes de 8 bits, et chacun a sa propre adresse, ce qui fait que c'est un adressage par byte qui est utilisé. Le second ne gère pas les bytes mais seulement des mots de 32 bits, ce qui fait que c'est un adressage par mot qui est utilisé. Dans les deux cas, la mémoire n'est pas organisée de la même manière. Prenons une mémoire de 24 octets pour l'exemple, soit 24/4 = 6 mots de 4 octets. Le premier processeur aura une adresse par byte, soit 24 adresses, et ce sera pareil pour la mémoire, qui utilisera une case mémoire par byte. Le second processeur n'aura que 6 adresses : une par mot. La mémoire a des cases mémoire qui contiennent un mot entier, soit 32 bits, 4 octets. [[File:Byte and word addressing.png|centre|vignette|upright=2|Adressage par mot et par Byte.]] L'avantage de l'adressage par mot est que l'on peut adresser plus de mémoire pour un nombre d'adresses égal. Si on a un processeur qui gère des adresses de 16 bits, on peut adresser 2^16 = 65 536 adresses. Avec un mot mémoire de 4 bytes d'un octet chacun, on peut adresser : soit 65 536 bytes/octets, soit 65 536mots et donc 65 536 × 4 octets. L'adressage par mot permet donc d'adresser plus de mémoire avec les mêmes adresses. Une autre manière de voir les choses est qu'une architecture à adressage par byte va utiliser beaucoup plus d'adresses qu'une architecture par mot, à capacité mémoire égale. L'avantage des architectures à adressage par byte est que l'on peut plus facilement modifier des données de petite taille. Par exemple, imaginons qu'un programmeur manipule du texte, avec des caractères codés sur un octet. S'il veut remplacer les lettres majuscules par des minuscules, il doit changer chaque lettre indépendamment des autres, l'une après l'autre. Avec un adressage par mot, il doit lire un mot entier, modifier chaque octet en utilisant des opérations de masquage, puis écrire le mot final. Avec un adressage par byte, il peut lire chaque byte indépendamment, le modifier sans recourir à des opérations de masquage, puis écrire le résultat. Le tout est plus simple avec l'adressage par byte : pas besoin d'opérations de masquage ! Par contre, les architectures à adressage par byte ont de nombreux défauts. Le fait qu'un mot contienne plusieurs octets/bytes a de nombreuses conséquences, desquelles naissent les contraintes d'alignement, de boutisme et autres. Dans ce qui suit, nous allons étudier les défauts des architectures adressables par byte, et allons laisser de côté les architectures adressables par mot. La raison est que toutes les architectures modernes sont adressables par byte, les seules architectures adressables par mot étant de très vieux ordinateurs aujourd'hui disparus. ==Le boutisme : une spécificité de l'adressage par byte== Le premier problème lié à l'adressage par byte est lié au fait que l'on a plusieurs bytes par mot : dans quel ordre placer les bytes dans un mot ? On peut introduire le tout par une analogie avec les langues humaines : certaines s’écrivent de gauche à droite et d'autres de droite à gauche. Dans un ordinateur, c'est pareil avec les bytes/octets des mots mémoire : on peut les écrire soit de gauche à droite, soit de droite à gauche. Quand on veut parler de cet ordre d'écriture, on parle de '''boutisme''' (''endianness''). Dans ce qui suit, nous allons partir du principe que le byte fait un octet, mais gardez dans un coin de votre tête que ce n'a pas toujours été le cas. Les explications qui vont suivre restent valide peu importe la taille du byte. ===Les différents types de boutisme=== Les deux types de boutisme les plus simples sont le gros-boutisme et le petit-boutisme. Sur les '''processeurs gros-boutistes''', la donnée est stockée des adresses les plus faibles vers les adresses plus grande. Pour rendre cela plus clair, prenons un entier qui prend plusieurs octets et qui est stocké entre deux adresses. L'octet de poids fort de l'entier est stocké dans l'adresse la plus faible, et inversement pour le poids faible qui est stocké dans l'adresse la plus grande. Sur les '''processeurs petit-boutistes''', c'est l'inverse : l'octet de poids faible de notre donnée est stocké dans la case mémoire ayant l'adresse la plus faible. La donnée est donc stockée dans l'ordre inverse pour les octets. Certains processeurs sont un peu plus souples : ils laissent le choix du boutisme. Sur ces processeurs, on peut configurer le boutisme en modifiant un bit dans un registre du processeur : il faut mettre ce bit à 1 pour du petit-boutiste, et à 0 pour du gros-boutiste, par exemple. Ces processeurs sont dits '''bi-boutistes'''. {| |[[File:Big-Endian-fr.svg|class=transparent|Gros-boutisme.]] |[[File:Little-Endian-fr.svg|class=transparent|Petit-boutisme.]] |} Petit et gros-boutisme ont pour particularité que la taille des mots ne change pas vraiment l'organisation des octets. Peu importe la taille d'un mot, celui-ci se lit toujours de gauche à droite, ou de droite à gauche. Cela n’apparaît pas avec les techniques de boutismes plus compliquées. [[File:Big-endian little-endian.jpg|centre|vignette|upright=2.5|Comparaison entre ''big-endian'' et ''little-endian'', pour des tailles de 16 et 32 bits.]] [[File:Comparaison entre boutisme avec et sans inversion de mots mémoire.jpg|vignette|Comparaison entre un nombre codé en gros-boutiste pur, et un nombre gros-boutiste dont les octets sont rangés dans un groupe en petit-boutiste. Le nombre en question est 0x 0A 0B 0C 0D, en hexadécimal, le premier mot mémoire étant indiqué en jaune, le second en blanc.]] Certains processeurs ont des boutismes plus compliqués, où chaque mot mémoire est découpé en plusieurs groupes d'octets. Il faut alors prendre en compte le boutisme des octets dans le groupe, mais aussi le boutisme des groupes eux-mêmes. On distingue ainsi un boutisme inter-groupe (le boutisme des groupes eux-même) et un boutisme intra-groupe (l'ordre des octets dans chaque groupe), tout deux pouvant être gros-boutiste ou petit-boutiste. Si l'ordre intra-groupe est identique à l'ordre inter-groupe, alors on retrouve du gros- ou petit-boutiste normal. Mais les choses changent si jamais l'ordre inter-groupe et intra-groupe sont différents. Dans ces conditions, on doit préciser un ordre d’inversion des mots mémoire (''byte-swap''), qui précise si les octets doivent être inversés dans un mot mémoire processeur, en plus de préciser si l'ordre des mots mémoire est petit- ou gros-boutiste. ===Avantages, inconvénients et usage=== Le choix entre petit boutisme et gros boutisme est généralement une simple affaire de convention. Il n'y a pas d'avantage vraiment probant pour l'une ou l'autre de ces deux méthodes, juste quelques avantages ou inconvénients mineurs. Dans les faits, il y a autant d'architectures petit- que de gros-boutistes, la plupart des architectures récentes étant bi-boutistes. Précisons que le jeu d'instruction x86 est de type petit-boutiste. Si on quitte le domaine des jeu d'instruction, les protocoles réseaux et les formats de fichiers imposent un boutisme particulier. Les protocoles réseaux actuels (TCP-IP) sont de type gros-boutiste, ce qui impose de convertir les données réseaux avant de les utiliser sur les PC modernes. Et au passage, si le gros-boutisme est utilisé dans les protocoles réseau, alors que le petit-boutisme est roi sur le x86, c'est pour des raisons pratiques, que nous allons aborder ci-dessous. Le gros-boutisme est très facile à lire pour les humains. Les nombres en gros-boutistes se lisent de droite à gauche, comme il est d'usage dans les langues indo-européennes, alors que les nombres en petit boutistes se lisent dans l'ordre inverse de lecture. Pour la lecture en hexadécimal, il faut inverser l'ordre des octets, mais il faut garder l'ordre des chiffres dans chaque octet. Par exemple, le nombre 0x015665 (87 653 en décimal) se lit 0x015665 en gros-boutiste, mais 0x655601 en petit-boutiste. Et je ne vous raconte pas ce que cela donne avec un ''byte-swap''... Cette différence pose problème quand on doit lire des fichiers, du code machine ou des paquets réseau, avec un éditeur hexadécimal. Alors certes, la plupart des professionnels lisent directement les données en passant par des outils d'analyse qui se chargent d'afficher les nombres en gros-boutiste, voire en décimal. Un professionnel a à sa disposition du désassembleur pour le code machine, des analyseurs de paquets pour les paquets réseau, des décodeurs de fichiers pour les fichiers, des analyseurs de ''dump'' mémoire pour l'analyse de la mémoire, etc. Cependant, le gros-boutisme reste un avantage quand on utilise un éditeur hexadécimal, quel que soit l'usage. En conséquence, le gros-boutiste a été historiquement pas mal utilisé dans les protocoles réseaux et les formats de fichiers. Par contre, cet avantage de lecture a dû faire face à divers désavantages pour les architectures de processeur. Le petit-boutisme peut avoir des avantages sur les architectures qui gèrent des données de taille intermédiaires entre le byte et le mot. C'est le cas sur le x86, où l'on peut décider de lire des données de 8, 16, 32, ou 64 bits à partir d'une adresse mémoire. Avec le petit-boutisme, on s'assure qu'une lecture charge bien la même valeur, le même nombre. Par exemple, imaginons que je stocke le nombre 0x 14 25 36 48 sur un mot mémoire, en petit-boutiste. En petit-boutiste, une opération de lecture reverra soit les 8 bits de poids faible (0x 48), soit les 16 bits de poids faible (0x 36 48), soit le nombre complet. Ce ne serait pas le cas en gros-boutiste, où les lectures reverraient respectivement 0x 14, 0x 14 25 et 0x 14 25 36 48. Avec le gros-boutisme, de telles opérations de lecture n'ont pas vraiment de sens. En soit, cet avantage est assez limité et n'est utile que pour les compilateurs et les programmeurs en assembleur. Un autre avantage est un gain de performance pour certaines opérations. Les instructions en question sont les opérations où on doit additionner d'opérandes codées sur plusieurs octets; sur un processeur qui fait les calculs octet par octet. En clair, le processeur dispose d'instructions de calcul qui additionnent des nombres de 16, 32 ou 64 bit, voire plus. Mais à l'intérieur du processeur, les calculs sont faits octets par octets, l'unité de calcul ne pouvant qu'additionner deux nombres de 8 bits à la fois. Dans ce cas, le petit-boutisme garantit que l'addition des octets se fait dans le bon ordre, en commençant par les octets de poids faible pour progresser vers les octets de poids fort. En gros-boutisme, les choses sont beaucoup plus compliquées... Pour résumer, les avantages et inconvénients de chaque boutisme sont mineurs. Le gain en performance est nul sur les architectures modernes, qui ont des unités de calcul capables de faire des additions multi-octets. L'usage d'opérations de lecture de taille variable est aujourd'hui tombé en désuétude, vu que cela ne sert pas à grand chose et complexifie le jeu d'instruction. Enfin, l'avantage de lecture n'est utile que dans situations tellement rares qu'on peut légitimement questionner son statut d'avantage. En bref, les différentes formes de boutisme se valent. ==L'implémentation de l'adressage par byte au niveau de la mémoire RAM/ROM== Avant de poursuivre, rappelons que la notion de byte est avant tout liée au jeu d'instruction, mais qu'elle ne dit rien du bus mémoire ! Il est parfaitement possible d'utiliser un bus mémoire d'une taille différente de celle du byte ou du mot. La largeur du bus mémoire, la taille d'un mot, et la taille d'un byte, ne sont pas forcément corrélées. Néanmoins, deux cas classiques sont les plus courants. ===Les architectures avec une mémoire adressable par byte=== Le premier est celui où le bus mémoire transmet un byte à la fois. En clair, la largeur du bus mémoire est celle du byte. Le moindre accès mémoire se fait byte par byte, donc en plusieurs cycles d'horloge. Par exemple, sur un processeur 64 bits, la lecture d'un mot complet se fera octet par octet, ce qui demandera 8 cycles d'horloge, cycles d'horloge mémoire qui plus est. Ce qui explique le désavantage de cette méthode : la performance est assez mauvaise. La performance dépend de plus de la taille des données lue/écrites. On prend moins de temps à lire une donnée courte qu'une donnée longue. L'avantage est qu'on peut lire ou écrire un mot, peu importe son adresse. Pour donner un exemple, je peux parfaitement lire une donnée de 16 bits localisée à l'adresse 4, puis lire une autre donnée de 16 bits localisée à l'adresse 5 sans aucun problème. En conséquence, il n'y a pas de contraintes d'alignements et les problèmes que nous allons aborder dans la suite n'existent pas. [[File:Chargement d'une donnée sur un processeur sans contraitnes d'alignement.jpg|centre|vignette|upright=2|Chargement d'une donnée sur un processeur sans contraintes d'alignement.]] ===Les architectures avec une mémoire adressable par mot=== Pour éviter d'avoir des performances désastreuses, on utilise une autre solution : le bus mémoire a la largeur nécessaire pour lire un mot entier. Le processeur peut charger un mot mémoire entier dans ses registres, en un seul accès mémoire. Et pour lire des données plus petites qu'un mot mémoire, le processeur charge un mot complet, mais ignore les octets en trop. [[File:Exemple du chargement d'un octet dans un registre de trois octets.jpg|centre|vignette|upright=2|Exemple du chargement d'un octet dans un registre de trois octets.]] Il y a alors confusion entre un mot au sens du jeu d'instruction, et un mot mémoire. Pour rappel, une donnée qui a la même taille que le bus de données est appelée un mot mémoire. Mais dans ce cas, l'adressage de la mémoire et du CPU ne sont pas compatibles : le processeur utilise une adresse par byte, la mémoire une adresse par mot ! Tout se passe comme si la mémoire était découpée en blocs de la taille d'un mot. La capacité de la mémoire reste inchangée, ce qui fait que le nombre d'adresses utilisables diminue : il n'y a plus besoin que d'une adresse par mot mémoire et non par octet. Il faut donc faire une sorte d'interface entre les deux. [[File:Chargement d'une donnée sur un processeur avec contraintes d'alignement.jpg|centre|vignette|upright=2|Chargement d'une donnée sur un processeur avec contraintes d'alignement.]] Par convention, l'adresse d'un mot est l'adresse de son octet de poids faible. Les autres octets du mot ne sont pas adressables par la mémoire. Par exemple, si on prend un mot de 8 octets, on est certain qu'une adresse sur 8 disparaîtra. L'adresse du mot est utilisée pour communiquer avec la mémoire, mais cela ne signifie pas que l'adresse des octets est inutile au-delà du calcul de l'adresse du mot. En effet, l'accès à un octet précis demande de déterminer la position de l'octet dans le mot à partir de l'adresse du octet. Prenons un processeur ayant des mots de 4 octets et répertorions les adresses utilisables. Le premier mot contient les octets d'adresse 0, 1, 2 et 3. L'adresse zéro est l'adresse de l'octet de poids faible et sert donc d'adresse au premier mot, les autres sont inutilisables sur le bus mémoire. Le second mot contient les adresses 4, 5, 6 et 7, l'adresse 4 est l'adresse du mot, les autres sont inutilisables. Et ainsi de suite. Si on fait une liste exhaustive des adresses valides et invalides, on remarque que seules les adresses multiples de 4 sont utilisables. Et ceux qui sont encore plus observateurs remarqueront que 4 est la taille d'un mot. Dans l'exemple précédent, les adresses utilisables sont multiples de la taille d'un mot. Sachez que cela fonctionne quelle que soit la taille du mot. Si N est la taille d'un mot, alors seules les adresses multiples de N seront utilisables. Avec ce résultat, on peut trouver une procédure qui nous donne l'adresse d'un mot à partir de l'adresse d'un octet. Si un mot contient N bytes, alors l'adresse du mot se calcule en divisant l'adresse du byte par N. La position du byte dans le mot est quant à elle le reste de cette division. Un reste de 0 nous dit que l'octet est le premier du mot, un reste de 1 nous dit qu'il est le second, etc. [[File:Adresse d'un mot avec alignement mémoire strict.png|centre|vignette|upright=2|Adresse d'un mot avec alignement mémoire strict.]] Le processeur peut donc adresser la mémoire RAM en traduisant les adresses des octets en adresses de mot. Il lui suffit de faire une division pour cela. Il conserve aussi le reste de la division dans un registre pour sélectionner l'octet une fois la lecture terminée. Un accès mémoire se fait donc comme suit : il reçoit l'adresse à lire, il calcule l'adresse du mot, effectue la lecture, reçoit le mot à lire, et utilise le reste pour sélectionner l'octet final si besoin. La dernière étape est facultative et n'est présente que si on lit une donnée plus petite qu'un mot. La division est une opération assez complexe, mais il y a moyen de ruser. L'idée est de faire en sorte que N soit une puissance de deux. La division se traduit alors par un vulgaire décalage vers la droite, le calcul du reste pas une simple opération de masquage. C'est la raison pour laquelle les processeurs actuels utilisent des mots de 1, 2, 4, 8 octets. Sans cela, les accès mémoire seraient bien plus lents. De plus, cela permet d'économiser des fils sur le bus d'adresse. Si la taille d'un mot est égale à <math>2^{n}</math>, seules les adresses multiples de <math>2^{n}</math> seront utilisables. Or, ces adresses se reconnaissent facilement : leurs n bits de poids faibles valent zéro. On n'a donc pas besoin de câbler les fils correspondant à ces bits de poids faible. ==L'alignement mémoire== Dans la section précédente, nous avons évoqué le cas où un processeur à adressage par byte est couplé à une mémoire adressable par mot. Sur de telles architectures, des problèmes surviennent quand les lectures/écritures se font par mots entiers. Le processeur fournit l'adresse d'un byte, mais lit un mot entier à partir de ce byte. Par exemple, prenons une lecture d'un mot complet : celle-ci précise l'adresse d'un byte. Sur un CPU 64 bits, le processeur lit alors 64 bits d'un coup à partir de l'adresse du byte. Et cela peut poser quelques problèmes, dont la résolution demande de respecter des restrictions sur la place de chaque mot en mémoire, restrictions résumées sous le nom d''''alignement mémoire'''. ===L'exemple sur les processeurs 16 bits=== Pour faire comprendre ce qu'est l'alignement mémoire, nous allons prendre l'exemple d'un processeur 16 bits connecté à une mémoire de 16 bits, via un bus mémoire de 16 bits. Le processeur utilisant l'adressage par byte, chaque octet de la mémoire a sa propre adresse. Par contre, le processeur lit et écrit des paquets de 16 bits, soit deux octets. : Pour rappel, un groupe de deux octets est appelé un '''doublet'''. Pour la mémoire, les octets sont regroupés en groupes de deux, en '''doublets mémoire'''. Pour la mémoire, un doublet mémoire a une adresse unique. Et cela ne colle pas avec l'adressage par byte utilisé par le processeur, il y a une différence entre les adresses du processeur et celles de la mémoire. Il y a une adresse par doublet pour la mémoire, une adresse par octet pour le processeur. L'adresse mémoire a donc un bit de moins que l'adresse processeur. Pour faire la distinction, nous utiliserons les termes : ''adresse mémoire'' et ''adresse processeur''. Lorsque le processeur lit un doublet, il lit le premier octet à une adresse processeur et l'octet suivant dans l'adresse processeur suivante. Les adresses processeur sont donc regroupées par groupes de deux : l'adresse 0 et 1 adressent toutes deux le premier doublet, l'adresse 2 et 3 adressent le second doublet, etc. Un doublet est donc identifié par deux adresses processeur : une '''adresse paire''' et une '''adresse impaire'''. Nous allons partir du principe que l'octet de poids faible est dans l'adresse paire, l'octet de poids fort dans l'adresse impaire. Les règles de boutisme autorise de faire l'inverse, mais ce n'est pas le choix le plus intuitif. L'alignement mémoire dit quoi faire lorsque le processeur veut lire/écrire 16 bits à une adresse impaire. S'il veut lire 16 bits à une adresse impaire, les deux octets seront dans des doublets mémoire différents. Le premier sera l'octet de poids fort d'un doublet, l'autre sera l'octet de poids faible du doublet suivant. Le doublet que le processeur veut lire/écrire est à cheval sur deux doublets mémoire. Et le processeur ne gère pas cette situation naturellement. [[File:Alignement mémoire sur 16 bits.png|centre|vignette|upright=2|Alignement mémoire sur 16 bits]] Pour résoudre ce problème, il y a deux solutions : imposer l'alignement mémoire, supporter les accès non-alignés. L'alignement mémoire strict n'autorise que les accès mémoire à des adresses mémoires paires. Tout accès à une adresse mémoire impaire lève une exception matérielle, signe que c'est une erreur matérielle. Par contre, les adresses paires sont autorisées car une adresse paire identifie un doublet mémoire, que le processeur peut lire/écrire en une seule fois, à travers le bus mémoire. Le processeur gère donc uniquement des lectures/écritures de doublet, au sens de doublet mémoire. Sans alignement mémoire, on peut lire/écrire 16 bits à partir d'une adresse paire comme impaire, les deux sont autorisées. Pour cela, le processeur doit gérer les lectures/écritures de 16 bits à des adresses impaires. Vu que les 16 bits demandés sont à cheval sur deux doublets mémoire, le processeur doit lire les deux doublets mémoire, sélectionner les octets adéquats, et les concaténer pour obtenir les 16 bits finaux. Pour ce qui est de lire/écrire des octets, l'alignement mémoire ne pose aucune contrainte, vu qu'un octet n'est jamais à cheval sur un doublet,quadruplet ou autre. Le processeur peut demander à lire ou écrire un seul octet, mais la mémoire fournira deux octets et le processeur devra n'en conserver qu'un. Donc, il faut prévoir un système pour sélectionner l'octet demandé dans un doublet. Pour la lecture d'un octet à une adresse paire, le processeur lit un doublet et masque l'octet de poids fort, chargé en trop. Pour une lecture d'un octet à une adresse impaire, le processeur lit un doublet, déplace l'octet de poids fort dans l'octet de poids faible, et masque l'octet inutile. Dans tous les cas, le processeur ne lit/écrit qu'un doublet à la fois et sélectionne les octets demandés. Les écritures sont plus complexes, car elles demandent de lire un doublet, de modifier l'octet adéquat, et de réécrire le doublet final en RAM. Pour les lectures, le tout est réalisé par un circuit qui prend en entrée deux bits : le premier indique s'il faut faire une lecture sur 8 ou 16 bits, le second qui indique s'il faut lire l'octet de poids faible ou fort. ===L'alignement mémoire des données=== L'exemple précédent nous a montré ce qu'il en était sur les processeurs 16 bits. Mais pour généraliser le concept, nous allons voir le cas des processeurs 32 bits et plus. Nous venons de voir que l'alignement mémoire sur 16 bits impose des contraintes quant à l'adressage de la mémoire, en empêchant de lire des données qui sont à cheval sur deux doublets. Sur 32 bits, c'est la même chose, mais avec des quadruplets (des groupes de 4 octets, soit 32 bits) : impossible de lire des données si elles sont à cheval sur deux quadruplets mémoire. Sur 64 bits, c'est la même chose, mais avec des octuplets de 8 octets/ 64 bits : impossible de lire des données si elles sont à cheval sur deux octuplets mémoire. La différence, c'est que la situation peut se présenter même si on ne lit pas 32/64 bits. Imaginons le cas particulier suivant : je dispose d'un processeur utilisant des mots de 4 octets. Je dispose aussi d'un programme qui doit manipuler un caractère stocké sur 1 octet, un entier de 4 octets et une donnée de deux octets. Mais un problème se pose : le programme qui manipule ces données a été programmé par quelqu'un qui n'était pas au courant de ces histoire d'alignement, et il a répartit mes données un peu n'importe comment. Supposons que cet entier soit stocké à une adresse non-multiple de 4. Par exemple : {|class=wikitable |- !Adresse !Octet 4 !Octet 3 !Octet 2 !Octet 1 |- |0x 0000 0000 |Caractère |Entier |Entier |Entier |- |0x 0000 0004 |Entier |Donnée |Donnée |- |0x 0000 0008 | | | | |} La lecture ou écriture du caractère ne pose pas de problème, vu qu'il ne fait qu'un seul byte. Pour la donnée de 2 octets, c'est la même chose, car elle tient toute entière dans un mot mémoire. La lire demande de lire le mot et de masquer les octets inutiles. Mais pour l'entier, ça ne marche pas car il est à cheval sur deux mots ! On dit que l'entier n'est pas aligné en mémoire. En conséquence, impossible de le charger en une seule fois Pour résumer, avec un bus mémoire de 32 bits, le problème peut survenir si le processeur veut lire 32 bits, mais aussi 16 bits. Si on veut lire 16 bits, mais que le premier octet est dans un quadruplet, et l'autre octet dans un autre quadruplet, l'alignement mémoire intervient. Idem si on veut lire 4 octets, mais que les 3 premiers sont dans un quadruplet, pas le dernier. Tout cela est plus facile à comprendre avec un exemple. La situation est gérée différemment suivant le processeur. Sur certains processeurs, la donnée est chargée en deux fois : c'est légèrement plus lent que la charger en une seule fois, mais ça passe. On dit que le processeur gère des accès mémoire non-alignés. D'autres processeurs ne gérent pas ce genre d'accès mémoire et les traitent comme une erreur, similaire à une division par zéro, et lève une exception matérielle. Si on est chanceux, la routine d'exception charge la donnée en deux fois. Mais sur d'autres processeurs, le programme responsable de cet accès mémoire en dehors des clous se fait sauvagement planter. Par exemple, essayez de manipuler une donnée qui n'est pas "alignée" dans un mot de 16 octets avec une instruction SSE, vous aurez droit à un joli petit crash ! Pour éviter ce genre de choses, les compilateurs utilisés pour des langages de haut niveau préfèrent rajouter des données inutiles (on dit aussi du bourrage) de façon à ce que chaque donnée soit bien alignée sur le bon nombre d'octets. En reprenant notre exemple du dessus, et en notant le bourrage X, on obtiendrait ceci : {|class=wikitable |- !Adresse !Octet 4 !Octet 3 !Octet 2 !Octet 1 |- |0x 0000 0000 |Caractère |X |X |X |- |0x 0000 0004 |Entier |Entier |Entier |Entier |- |0x 0000 0008 |Donnée |Donnée |X |X |} Comme vous le voyez, de la mémoire est gâchée inutilement. Et quand on sait que de la mémoire cache est gâchée ainsi, ça peut jouer un peu sur les performances. Il y a cependant des situations dans lesquelles rajouter du bourrage est une bonne chose et permet des gains en performances assez abominables (une sombre histoire de cache dans les architectures multiprocesseurs ou multi-cœurs, mais je n'en dit pas plus). L'alignement mémoire se gère dans certains langages (comme le C, le C++ ou l'ADA), en gérant l'ordre de déclaration des variables. Essayez toujours de déclarer vos variables de façon à remplir un mot intégralement ou le plus possible. Renseignez-vous sur le bourrage, et essayez de savoir quelle est la taille des données en regardant la norme de vos langages. ===L'alignement des instructions en mémoire=== Les instructions ont toute une certaine taille, et elles peuvent être de taille fixe (toutes les instructions font X octets), ou de taille variable (le nombre d'octets dépend de l'instruction). Dans les deux cas, le processeur peut incorporer des contraintes sur l'alignement des instructions, au même titre que les contraintes d'alignement sur les données vues précédemment. Pour les instructions de taille fixe, les instructions sont placées à des adresses précises. Par exemple, prenons des instructions de 8 octets. La première instruction prend les 8 premiers octets de la mémoire, la seconde prend les 8 octets suivants, etc. En faisant cela, l'adresse d'une instruction est toujours un multiple de 8. Et on peut généraliser pour toute instruction de taille fixe : si elle fait X octets, son adresse est un multiple de X. Généralement, on prend X une puissance de deux pour simplifier beaucoup de choses. Notamment, cela permet de simplifier le ''program counter'' : quelques bits de poids faible deviennent inutiles. Par exemple, si on prend des instructions de 4 octets, les adresses des instructions sont des multiples de 4, donc les deux bits de poids faible de l'adresse sont toujours 00 et ne sont pas intégrés dans le ''program counter''. Le ''program counter'' est alors plus court de deux bits. Idem avec des instructions de 8 octets qui font économiser 3 bits, ou avec des instructions de 16 octets qui font économiser 4 bits. Les instructions de taille variable ne sont généralement pas alignées. Sur certains processeurs, les instructions n'ont pas de contraintes d'alignement du tout. Leur chargement est donc plus compliqué et demande des méthodes précises qui seront vues dans le chapitre sur l'unité de chargement du processeur. Évidemment, le chargement d'instructions non-alignées est donc plus lent. En conséquence, même si le processeur supporte des instructions non-alignées, les compilateurs ont tendance à aligner les instructions comme les données, sur la taille d'un mot mémoire, afin de gagner en performance. Sur d'autres processeurs, les instructions doivent être alignées. Dans le cas le plus simple, les instructions doivent être alignées sur un mot mémoire, elles doivent respecter les mêmes contraintes d'alignement que les données. Elles peuvent être plus courtes ou plus longues qu'un mot, mais elles doivent commencer à la première adresse d'un mot mémoire. D'autres architectures ont des contraintes d'alignement bizarres. Par exemple, les premiers processeurs x86 16 bits imposaient des instructions alignées sur 16 bits et cette contrainte est restée sur les processeurs 32 bits. Que ce soit pour des instructions de taille fixe ou variables, les circuits de chargement des instructions et les circuits d'accès mémoire ne sont pas les mêmes, ce qui fait que leurs contraintes d'alignement peuvent être différentes. On peut avoir quatre possibilités : des instructions non-alignées et des données alignées, l'inverse, les deux qui sont alignées, les deux qui ne sont pas alignées. Par exemple, il se peut qu'un processeur accepte des données non-alignées, mais ne gère pas des instructions non-alignées ! Le cas le plus simple, fréquent sur les architectures RISC, est d'avoir des instructions et données alignées de la même manière. Les architectures CISC utilisent souvent des contraintes d'alignement, avec généralement des instructions de taille variables non-alignées, mais des données alignées. Les deux dernières possibilités ne sont presque jamais utilisées. De plus, sur les processeurs où les deux sont alignés, on peut avoir un alignement différent pour les données et les instructions. Par exemple, pour un processeur qui utilise des instructions de 8 octets, mais des données de 4 octets. Les différences d'alignements posent une contrainte sur l'économie des bits sur le bus d'adresse. Il faut alors regarder ce qui se passe sur l'alignement des données. Par exemple, pour un processeur qui utilise des instructions de 8 octets, mais des données de 4 octets, on ne pourra économiser que deux bits, pour respecter l'alignement des données. Ou encore, sur un processeur avec des instructions alignées sur 8 octets, mais des données non-alignées, on ne pourra rien économiser. Un cas particulier est celui de l'Intel iAPX 432, dont les instructions étaient non-alignées au niveau des bits ! Leur taille variable faisait que la taille des instructions n'était pas un multiple d'octets. Il était possible d'avoir des instructions larges de 23 bits, d'autres de 41 bits, ou toute autre valeur non-divisible par 8. Un octet pouvait contenir des morceaux de deux instructions, à cheval sur l'octet. Ce comportement fort peu pratique faisait que l'implémentation de l'unité d"e chargement était complexe. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres du processeur | prevText=Les registres du processeur | next=Les modes d'adressage | nextText=Les modes d'adressage }} </noinclude> bsnjsl07m709pxmsjtzukt4waq7r0i9 745884 745883 2025-07-03T18:46:46Z Mewtow 31375 /* L'exemple sur les processeurs 16 bits */ 745884 wikitext text/x-wiki Dans ce chapitre, on va parler de l'''endianess'' du processeur et de son alignement mémoire. Concrètement, on va s'intéresser à la façon dont le processeur repartit en mémoire les octets des données qu'il manipule. Ces deux paramètres sont sûrement déjà connus de ceux qui ont une expérience de la programmation assez conséquente. Les autres apprendront ce que c'est dans ce chapitre. Pour simplifier, ils sont à prendre en compte quand on échange des données entre registres et mémoire RAM. ==La différence entre mots et bytes== Avant toute chose, nous allons reparler rapidement de la différence entre un byte et un mot. Les deux termes sont généralement polysémiques, avec plusieurs sens. Aussi, définir ce qu'est un mot est assez compliqué. Voyons les différents sens de ce terme, chacun étant utile dans un contexte particulier. Dans les chapitres précédents, nous avons parlé des mots mémoire, à savoir des blocs de mémoire dont le nombre de bits correspond à la largeur du bus mémoire. Le premier sens possible est donc la quantité de données que l'on peut transférer entre CPU et RAM en un seul cycle d'horloge. Il s'agit d'une définition basée sur les transferts réels entre processeur et mémoire. Le terme que nous avons utilisé pour cette définition est : '''mot mémoire'''. Remarquez la subtile différence entre les termes "mot" et "mot mémoire" : le second terme indique bien qu'il s'agit de quelque de lié à la mémoire, pas le premier. Les deux ne sont pas confondre, et nous allons voir pourquoi. La définition précédente ne permet pas de définir ce qu'est un byte et un mot, vu que la distinction se fait au niveau du processeur, au niveau du jeu d'instruction. Précisément, elle intervient au niveau des instructions d'accès mémoire, éventuellement de certaines opérations de traitement de données. Dans ce qui va suivre, nous allons faire la différence entre les architectures à mot, à byte, et à chaines de caractères. Voyons dans le détail ces histoires de mots, de bytes, et autres. ===Les architectures à adressage par mot=== Au tout début de l'informatique, sur les anciens ordinateurs datant d'avant les années 80, les processeurs géraient qu'une seule taille pour les données. Par exemple, de tels processeurs ne géraient que des données de 8 bits, pas autre chose. Les données en question était des '''mots'''. Aux tout début de l'informatique, certaines machines utilisaient des mots de 3, 4, 5, 6 7, 13, 17, 23, 36 ou 48 bits. Pour donner quelques exemples, l'ordinateur ERA 1103 utilisait des mots de 36-bits, tout comme le PDP-10, et ne gérait pas d'autre taille pour les données : c'était 36 bits pour tout le monde. Les processeurs en question ne disposaient que d'une seule instruction de lecture/écriture, qui lisait/écrivait des mots entiers. On pouvait ainsi lire ou écrire des paquets de 3, 4, 5, 6 7, 13, 17, 23, 36 ou 48 bits. Les registres du processeur avaient généralement la même taille qu'un mot, ce qui fait que les processeurs de l'époque avaient des registres de 4, 8, 12, 24, 26, 28, 31, 36, 48, voire 60 bits. Les mots en question sont en théorie à distinguer des mots mémoire, mais ce n'est pas souvent le cas en pratique. Les architectures à adressage par mot faisaient en sorte qu'un mot soit de la même taille qu'un mot mémoire. La mémoire était donc découpée en mots, chacun avait sa propre adresse. Par exemple, une mémoire de 64 kilo-mots contenait 65 536 mots, chacun contenant autant de bits qu'un mot. Les mots faisaient tous la même taille, qui variait suivant la mémoire ou le processeur utilisé. Chaque mot avait sa propre adresse, ce qui fait qu'on parlait d''''adressage par mot'''. Il n'y avait qu'une seule unité d'adressage, ce qui fait que le byte et le mot étaient la même chose sur de telles architectures. La distinction entre byte et mot est apparue après, sur des ordinateurs/processeurs différents. ===Les architectures à adressage par byte=== Par la suite, des processeurs ont permis d'adresser des données plus petites qu'un mot. Les processeurs en question disposent de plusieurs instructions de lecture/écriture, qui manipulent des blocs de mémoire de taille différente. Par exemple, il peut avoir une instruction de lecture pour lire 8 bits, une autre pour lire 16 bits, une autre 32, etc. Une autre possibilité est celle où le processeur dispose d'une instruction de lecture, qu'on peut configurer suivant qu'on veuille lire/écrire un octet, deux, quatre, huit. Dans ce cas, on peut faire une distinction entre '''''byte''''' et '''mot''' : le byte est la plus petite donnée, le mot est la plus grande. Par exemple, un processeur disposant d'instruction d'accès mémoire capables de lire/écrire 8 ou 16 bits sont dans ce cas. Le byte fait alors 8 bits, le mot en fait 16. La séparation entre byte et mot peut parfois se compléter avec des tailles intermédiaires. Par exemple, prenons un processeur qui dispose d'une instruction de lecture capable de lire soit 8 bits, soit 16 bits, soit 32 bits, soit 64 bits. Dans ce cas, le byte vaut 8 bits, le mot en fait 64, les autres tailles sont des intermédiaires. Pour résumer, un mot est la plus grande unité adressable par le processeur, un byte est la plus petite. En général, le byte fait 8 bits, un octet. Mais ça n'a pas toujours été le cas, pas mal de jeux d'instructions font exception. L'exemple le plus parlant est celui des processeurs décimaux, qui utilisaient des entiers codés en BCD mais ne géraient pas les entiers codés en binaire normal. De tels processeurs encodaient des nombres sous la forme d'une suite de chiffres décimaux, codés en BCD sur 4 bits. Ils avaient des bytes de 4 bits, voire de 5/6 bits pour les ordinateurs qui ajoutaient un bit de parité/ECC par chiffre décimal. D'autres architectures avaient un byte de 3 à 7 bits. La taille d'un mot mémoire est de plusieurs bytes : un mot mémoire contient un nombre entier de bytes. La norme actuelle est d'utiliser des bytes d'un octet (8 bits), avec des mots contenant plusieurs octets. Le nombre d'octets dans un mot est généralement une puissance de deux pour simplifier les calculs. Cette règle souffre évidemment d'exceptions, mais l'usage de mots qui ne sont pas des puissances de 2 posent quelques problèmes techniques en termes d’adressage, comme on le verra plus bas. Sur de telles architectures, il y a une adresse mémoire par byte, et non par mot, ce qui fait qu'on parle d''''adressage par byte'''. Tous les ordinateurs modernes utilisent l'adressage par byte. Concrètement, sur les processeurs modernes, chaque octet de la mémoire a sa propre adresse, peu importe la taille du mot utilisé par le processeur. Par exemple, les anciens processeurs x86 32 bits et les processeurs x86 64 bits utilisent tous le même système d'adressage, où chaque octet a sa propre adresse, la seule différence est que les adresses sont plus nombreuses. Avec un adressage par mot, on aurait eu autant d'adresses qu'avant, mais les mots seraient passés de 32 à 64 bits en passant au 64 bits. Les registres font encore une fois la même taille qu'un mot, bien qu'il existe quelques rares exceptions. Les processeurs à adressage par byte ont souvent plusieurs instructions de lecture/écriture, chacune pour une taille précise. Pour rendre cela plus concret, prenons le cas de l'instruction de lecture. Il y a au minimum une instruction de lecture qui lit un byte en mémoire, une autre qui lit un mot complet. Il y a souvent des instructions pour les tailles intermédiaires. Par exemple, un processeur 64 bit a des instructions pour lire 8 bits, une autre pour lire 16 bits, une autre pour en lire 32, et enfin une pour lire 64 bits. Idem pour les instructions d'écriture, et les autres instructions d'accès mémoire. ===Les architectures à adressage par mot de type hybrides=== Il a existé des architectures adressées par mot qui géraient des bytes, mais sans pour autant leur donner des adresses. Leur idée était que les transferts entre CPU et mémoire se faisaient par mots, mais les instructions de lecture/écriture pouvaient sélectionner un byte dans le mot. Une instruction d'accès mémoire devait alors préciser deux choses : l'adresse du mot à lire/écrire, et la position du byte dans le mot adressé. Par exemple, on pouvait demander à lire le mot à l'adresse 0x5F, et de récupérer uniquement le byte numéro 6. Il s'agit d'architectures adressables par mot car l'adresse identifie un mot, pas un byte. Les bytes en question n'avaient pas d'adresses en eux-mêmes, il n'y avait pas d'adressage par byte. La sélection des bytes se faisait dans le processeur : le processeur lisait des mots entiers, avant que le hardware du processeur sélectionne automatiquement le byte voulu. D'ailleurs, aucune de ces architectures ne supportait de mode d'adressage base+index ou base+offset pour sélectionner des bytes dans un mot. Elles supportaient de tels modes d'adressage pour un mot, pas pour les bytes. Pour faire la différence, nous parlerons de pseudo-byte dans ce qui suit, pour bien préciser que ce ne sont pas de vrais bytes. Un exemple est le PDP-6 et le PDP-10, qui avaient des instructions de lecture/écriture de ce type. Elles prenaient trois informations : l'adresse d'un mot, la position du pseudo-byte dans le mot, et enfin la taille d'un pseudo-byte ! L'adressage était donc très flexible, car on pouvait configurer la taille du pseudo-byte. Outre l'instruction de lecture LDB et celle d'écriture DPB, d'autres instructions permettaient de manipuler des pseudo-bytes. L'instruction IBP incrémentait le numéro du pseudo-byte, par exemple. ===Les architectures à mot de taille variable=== D'autres architectures codaient leurs nombres en utilisant un nombre variable de bytes ! Dit autrement, elles avaient des mots de taille variable, d'où leur nom d''''architectures à mots de taille variable'''. Il s'agit d'architectures qui codaient les nombres par des chaines de caractères terminées par un byte de terminaison. La grande majorité étaient des architectures décimales, à savoir des ordinateurs qui utilisaient des nombres encodés en BCD ou dans un encodage similaire. Les nombres étaient codés en décimal, mais chaque chiffre était encodé en binaire sur quelques bits, généralement 4 à 6 bits. Les bytes stockaient chacun un caractère, qui était utilisé pour encoder soit un chiffre décimal, soit un autre symbole comme un byte de terminaison. Un caractère faisait plus de 4 bits, vu qu'il fallait au minimum coder les chiffres BCD et des symboles supplémentaires. La taille d'un caractère était généralement de 5/6 bits. Un exemple est celui des IBM 1400 series, qui utilisaient des chaines de caractères séparées par deux bytes : un byte de ''wordmark'' au début, et un byte de ''record mark'' à la fin. Les caractères étaient des chiffres codés en BCD, chaque caractère était codé sur 6 bits. Les calculs se faisaient chiffre par chiffre, au rythme d'un chiffre utilisé comme opérande par cycle d'horloge. Le processeur passait automatiquement d'un chiffre au suivant pour chaque opérande. Chaque caractère/chiffre avait sa propre adresse, ce qui fait l'architecture est techniquement adressable par byte, alors que les mots correspondaient aux nombres de taille variable. ===La comparaison entre l'adressage par mot et par byte=== Plus haut, nous avons vu deux types d'adressage : par mot et par byte. Avec la première, ce sont les mots qui ont des adresses. Les bytes n'existent pas forcément sur de telles architectures. Si une gestion des bytes est présente, les instructions de lecture/écriture utilisent des adresses pour les mots, couplé à la position du byte dans le mot. Les lectures/écritures se font pas mots entiers. À l'opposé, sur les architectures adressées par byte, une adresse correspond à un byte et non à un mot. Les deux techniques font que l'usage des adresses est différent. Entre une adresse par mot et une par byte, le nombre d'adresse n'est pas le même à capacité mémoire égale. Prenons un exemple assez simple, où l'on compare deux processeurs. Les deux ont des mots mémoire de 32 bits, pour simplifier la comparaison. Le premier processeur gère des bytes de 8 bits, et chacun a sa propre adresse, ce qui fait que c'est un adressage par byte qui est utilisé. Le second ne gère pas les bytes mais seulement des mots de 32 bits, ce qui fait que c'est un adressage par mot qui est utilisé. Dans les deux cas, la mémoire n'est pas organisée de la même manière. Prenons une mémoire de 24 octets pour l'exemple, soit 24/4 = 6 mots de 4 octets. Le premier processeur aura une adresse par byte, soit 24 adresses, et ce sera pareil pour la mémoire, qui utilisera une case mémoire par byte. Le second processeur n'aura que 6 adresses : une par mot. La mémoire a des cases mémoire qui contiennent un mot entier, soit 32 bits, 4 octets. [[File:Byte and word addressing.png|centre|vignette|upright=2|Adressage par mot et par Byte.]] L'avantage de l'adressage par mot est que l'on peut adresser plus de mémoire pour un nombre d'adresses égal. Si on a un processeur qui gère des adresses de 16 bits, on peut adresser 2^16 = 65 536 adresses. Avec un mot mémoire de 4 bytes d'un octet chacun, on peut adresser : soit 65 536 bytes/octets, soit 65 536mots et donc 65 536 × 4 octets. L'adressage par mot permet donc d'adresser plus de mémoire avec les mêmes adresses. Une autre manière de voir les choses est qu'une architecture à adressage par byte va utiliser beaucoup plus d'adresses qu'une architecture par mot, à capacité mémoire égale. L'avantage des architectures à adressage par byte est que l'on peut plus facilement modifier des données de petite taille. Par exemple, imaginons qu'un programmeur manipule du texte, avec des caractères codés sur un octet. S'il veut remplacer les lettres majuscules par des minuscules, il doit changer chaque lettre indépendamment des autres, l'une après l'autre. Avec un adressage par mot, il doit lire un mot entier, modifier chaque octet en utilisant des opérations de masquage, puis écrire le mot final. Avec un adressage par byte, il peut lire chaque byte indépendamment, le modifier sans recourir à des opérations de masquage, puis écrire le résultat. Le tout est plus simple avec l'adressage par byte : pas besoin d'opérations de masquage ! Par contre, les architectures à adressage par byte ont de nombreux défauts. Le fait qu'un mot contienne plusieurs octets/bytes a de nombreuses conséquences, desquelles naissent les contraintes d'alignement, de boutisme et autres. Dans ce qui suit, nous allons étudier les défauts des architectures adressables par byte, et allons laisser de côté les architectures adressables par mot. La raison est que toutes les architectures modernes sont adressables par byte, les seules architectures adressables par mot étant de très vieux ordinateurs aujourd'hui disparus. ==Le boutisme : une spécificité de l'adressage par byte== Le premier problème lié à l'adressage par byte est lié au fait que l'on a plusieurs bytes par mot : dans quel ordre placer les bytes dans un mot ? On peut introduire le tout par une analogie avec les langues humaines : certaines s’écrivent de gauche à droite et d'autres de droite à gauche. Dans un ordinateur, c'est pareil avec les bytes/octets des mots mémoire : on peut les écrire soit de gauche à droite, soit de droite à gauche. Quand on veut parler de cet ordre d'écriture, on parle de '''boutisme''' (''endianness''). Dans ce qui suit, nous allons partir du principe que le byte fait un octet, mais gardez dans un coin de votre tête que ce n'a pas toujours été le cas. Les explications qui vont suivre restent valide peu importe la taille du byte. ===Les différents types de boutisme=== Les deux types de boutisme les plus simples sont le gros-boutisme et le petit-boutisme. Sur les '''processeurs gros-boutistes''', la donnée est stockée des adresses les plus faibles vers les adresses plus grande. Pour rendre cela plus clair, prenons un entier qui prend plusieurs octets et qui est stocké entre deux adresses. L'octet de poids fort de l'entier est stocké dans l'adresse la plus faible, et inversement pour le poids faible qui est stocké dans l'adresse la plus grande. Sur les '''processeurs petit-boutistes''', c'est l'inverse : l'octet de poids faible de notre donnée est stocké dans la case mémoire ayant l'adresse la plus faible. La donnée est donc stockée dans l'ordre inverse pour les octets. Certains processeurs sont un peu plus souples : ils laissent le choix du boutisme. Sur ces processeurs, on peut configurer le boutisme en modifiant un bit dans un registre du processeur : il faut mettre ce bit à 1 pour du petit-boutiste, et à 0 pour du gros-boutiste, par exemple. Ces processeurs sont dits '''bi-boutistes'''. {| |[[File:Big-Endian-fr.svg|class=transparent|Gros-boutisme.]] |[[File:Little-Endian-fr.svg|class=transparent|Petit-boutisme.]] |} Petit et gros-boutisme ont pour particularité que la taille des mots ne change pas vraiment l'organisation des octets. Peu importe la taille d'un mot, celui-ci se lit toujours de gauche à droite, ou de droite à gauche. Cela n’apparaît pas avec les techniques de boutismes plus compliquées. [[File:Big-endian little-endian.jpg|centre|vignette|upright=2.5|Comparaison entre ''big-endian'' et ''little-endian'', pour des tailles de 16 et 32 bits.]] [[File:Comparaison entre boutisme avec et sans inversion de mots mémoire.jpg|vignette|Comparaison entre un nombre codé en gros-boutiste pur, et un nombre gros-boutiste dont les octets sont rangés dans un groupe en petit-boutiste. Le nombre en question est 0x 0A 0B 0C 0D, en hexadécimal, le premier mot mémoire étant indiqué en jaune, le second en blanc.]] Certains processeurs ont des boutismes plus compliqués, où chaque mot mémoire est découpé en plusieurs groupes d'octets. Il faut alors prendre en compte le boutisme des octets dans le groupe, mais aussi le boutisme des groupes eux-mêmes. On distingue ainsi un boutisme inter-groupe (le boutisme des groupes eux-même) et un boutisme intra-groupe (l'ordre des octets dans chaque groupe), tout deux pouvant être gros-boutiste ou petit-boutiste. Si l'ordre intra-groupe est identique à l'ordre inter-groupe, alors on retrouve du gros- ou petit-boutiste normal. Mais les choses changent si jamais l'ordre inter-groupe et intra-groupe sont différents. Dans ces conditions, on doit préciser un ordre d’inversion des mots mémoire (''byte-swap''), qui précise si les octets doivent être inversés dans un mot mémoire processeur, en plus de préciser si l'ordre des mots mémoire est petit- ou gros-boutiste. ===Avantages, inconvénients et usage=== Le choix entre petit boutisme et gros boutisme est généralement une simple affaire de convention. Il n'y a pas d'avantage vraiment probant pour l'une ou l'autre de ces deux méthodes, juste quelques avantages ou inconvénients mineurs. Dans les faits, il y a autant d'architectures petit- que de gros-boutistes, la plupart des architectures récentes étant bi-boutistes. Précisons que le jeu d'instruction x86 est de type petit-boutiste. Si on quitte le domaine des jeu d'instruction, les protocoles réseaux et les formats de fichiers imposent un boutisme particulier. Les protocoles réseaux actuels (TCP-IP) sont de type gros-boutiste, ce qui impose de convertir les données réseaux avant de les utiliser sur les PC modernes. Et au passage, si le gros-boutisme est utilisé dans les protocoles réseau, alors que le petit-boutisme est roi sur le x86, c'est pour des raisons pratiques, que nous allons aborder ci-dessous. Le gros-boutisme est très facile à lire pour les humains. Les nombres en gros-boutistes se lisent de droite à gauche, comme il est d'usage dans les langues indo-européennes, alors que les nombres en petit boutistes se lisent dans l'ordre inverse de lecture. Pour la lecture en hexadécimal, il faut inverser l'ordre des octets, mais il faut garder l'ordre des chiffres dans chaque octet. Par exemple, le nombre 0x015665 (87 653 en décimal) se lit 0x015665 en gros-boutiste, mais 0x655601 en petit-boutiste. Et je ne vous raconte pas ce que cela donne avec un ''byte-swap''... Cette différence pose problème quand on doit lire des fichiers, du code machine ou des paquets réseau, avec un éditeur hexadécimal. Alors certes, la plupart des professionnels lisent directement les données en passant par des outils d'analyse qui se chargent d'afficher les nombres en gros-boutiste, voire en décimal. Un professionnel a à sa disposition du désassembleur pour le code machine, des analyseurs de paquets pour les paquets réseau, des décodeurs de fichiers pour les fichiers, des analyseurs de ''dump'' mémoire pour l'analyse de la mémoire, etc. Cependant, le gros-boutisme reste un avantage quand on utilise un éditeur hexadécimal, quel que soit l'usage. En conséquence, le gros-boutiste a été historiquement pas mal utilisé dans les protocoles réseaux et les formats de fichiers. Par contre, cet avantage de lecture a dû faire face à divers désavantages pour les architectures de processeur. Le petit-boutisme peut avoir des avantages sur les architectures qui gèrent des données de taille intermédiaires entre le byte et le mot. C'est le cas sur le x86, où l'on peut décider de lire des données de 8, 16, 32, ou 64 bits à partir d'une adresse mémoire. Avec le petit-boutisme, on s'assure qu'une lecture charge bien la même valeur, le même nombre. Par exemple, imaginons que je stocke le nombre 0x 14 25 36 48 sur un mot mémoire, en petit-boutiste. En petit-boutiste, une opération de lecture reverra soit les 8 bits de poids faible (0x 48), soit les 16 bits de poids faible (0x 36 48), soit le nombre complet. Ce ne serait pas le cas en gros-boutiste, où les lectures reverraient respectivement 0x 14, 0x 14 25 et 0x 14 25 36 48. Avec le gros-boutisme, de telles opérations de lecture n'ont pas vraiment de sens. En soit, cet avantage est assez limité et n'est utile que pour les compilateurs et les programmeurs en assembleur. Un autre avantage est un gain de performance pour certaines opérations. Les instructions en question sont les opérations où on doit additionner d'opérandes codées sur plusieurs octets; sur un processeur qui fait les calculs octet par octet. En clair, le processeur dispose d'instructions de calcul qui additionnent des nombres de 16, 32 ou 64 bit, voire plus. Mais à l'intérieur du processeur, les calculs sont faits octets par octets, l'unité de calcul ne pouvant qu'additionner deux nombres de 8 bits à la fois. Dans ce cas, le petit-boutisme garantit que l'addition des octets se fait dans le bon ordre, en commençant par les octets de poids faible pour progresser vers les octets de poids fort. En gros-boutisme, les choses sont beaucoup plus compliquées... Pour résumer, les avantages et inconvénients de chaque boutisme sont mineurs. Le gain en performance est nul sur les architectures modernes, qui ont des unités de calcul capables de faire des additions multi-octets. L'usage d'opérations de lecture de taille variable est aujourd'hui tombé en désuétude, vu que cela ne sert pas à grand chose et complexifie le jeu d'instruction. Enfin, l'avantage de lecture n'est utile que dans situations tellement rares qu'on peut légitimement questionner son statut d'avantage. En bref, les différentes formes de boutisme se valent. ==L'implémentation de l'adressage par byte au niveau de la mémoire RAM/ROM== Avant de poursuivre, rappelons que la notion de byte est avant tout liée au jeu d'instruction, mais qu'elle ne dit rien du bus mémoire ! Il est parfaitement possible d'utiliser un bus mémoire d'une taille différente de celle du byte ou du mot. La largeur du bus mémoire, la taille d'un mot, et la taille d'un byte, ne sont pas forcément corrélées. Néanmoins, deux cas classiques sont les plus courants. ===Les architectures avec une mémoire adressable par byte=== Le premier est celui où le bus mémoire transmet un byte à la fois. En clair, la largeur du bus mémoire est celle du byte. Le moindre accès mémoire se fait byte par byte, donc en plusieurs cycles d'horloge. Par exemple, sur un processeur 64 bits, la lecture d'un mot complet se fera octet par octet, ce qui demandera 8 cycles d'horloge, cycles d'horloge mémoire qui plus est. Ce qui explique le désavantage de cette méthode : la performance est assez mauvaise. La performance dépend de plus de la taille des données lue/écrites. On prend moins de temps à lire une donnée courte qu'une donnée longue. L'avantage est qu'on peut lire ou écrire un mot, peu importe son adresse. Pour donner un exemple, je peux parfaitement lire une donnée de 16 bits localisée à l'adresse 4, puis lire une autre donnée de 16 bits localisée à l'adresse 5 sans aucun problème. En conséquence, il n'y a pas de contraintes d'alignements et les problèmes que nous allons aborder dans la suite n'existent pas. [[File:Chargement d'une donnée sur un processeur sans contraitnes d'alignement.jpg|centre|vignette|upright=2|Chargement d'une donnée sur un processeur sans contraintes d'alignement.]] ===Les architectures avec une mémoire adressable par mot=== Pour éviter d'avoir des performances désastreuses, on utilise une autre solution : le bus mémoire a la largeur nécessaire pour lire un mot entier. Le processeur peut charger un mot mémoire entier dans ses registres, en un seul accès mémoire. Et pour lire des données plus petites qu'un mot mémoire, le processeur charge un mot complet, mais ignore les octets en trop. [[File:Exemple du chargement d'un octet dans un registre de trois octets.jpg|centre|vignette|upright=2|Exemple du chargement d'un octet dans un registre de trois octets.]] Il y a alors confusion entre un mot au sens du jeu d'instruction, et un mot mémoire. Pour rappel, une donnée qui a la même taille que le bus de données est appelée un mot mémoire. Mais dans ce cas, l'adressage de la mémoire et du CPU ne sont pas compatibles : le processeur utilise une adresse par byte, la mémoire une adresse par mot ! Tout se passe comme si la mémoire était découpée en blocs de la taille d'un mot. La capacité de la mémoire reste inchangée, ce qui fait que le nombre d'adresses utilisables diminue : il n'y a plus besoin que d'une adresse par mot mémoire et non par octet. Il faut donc faire une sorte d'interface entre les deux. [[File:Chargement d'une donnée sur un processeur avec contraintes d'alignement.jpg|centre|vignette|upright=2|Chargement d'une donnée sur un processeur avec contraintes d'alignement.]] Par convention, l'adresse d'un mot est l'adresse de son octet de poids faible. Les autres octets du mot ne sont pas adressables par la mémoire. Par exemple, si on prend un mot de 8 octets, on est certain qu'une adresse sur 8 disparaîtra. L'adresse du mot est utilisée pour communiquer avec la mémoire, mais cela ne signifie pas que l'adresse des octets est inutile au-delà du calcul de l'adresse du mot. En effet, l'accès à un octet précis demande de déterminer la position de l'octet dans le mot à partir de l'adresse du octet. Prenons un processeur ayant des mots de 4 octets et répertorions les adresses utilisables. Le premier mot contient les octets d'adresse 0, 1, 2 et 3. L'adresse zéro est l'adresse de l'octet de poids faible et sert donc d'adresse au premier mot, les autres sont inutilisables sur le bus mémoire. Le second mot contient les adresses 4, 5, 6 et 7, l'adresse 4 est l'adresse du mot, les autres sont inutilisables. Et ainsi de suite. Si on fait une liste exhaustive des adresses valides et invalides, on remarque que seules les adresses multiples de 4 sont utilisables. Et ceux qui sont encore plus observateurs remarqueront que 4 est la taille d'un mot. Dans l'exemple précédent, les adresses utilisables sont multiples de la taille d'un mot. Sachez que cela fonctionne quelle que soit la taille du mot. Si N est la taille d'un mot, alors seules les adresses multiples de N seront utilisables. Avec ce résultat, on peut trouver une procédure qui nous donne l'adresse d'un mot à partir de l'adresse d'un octet. Si un mot contient N bytes, alors l'adresse du mot se calcule en divisant l'adresse du byte par N. La position du byte dans le mot est quant à elle le reste de cette division. Un reste de 0 nous dit que l'octet est le premier du mot, un reste de 1 nous dit qu'il est le second, etc. [[File:Adresse d'un mot avec alignement mémoire strict.png|centre|vignette|upright=2|Adresse d'un mot avec alignement mémoire strict.]] Le processeur peut donc adresser la mémoire RAM en traduisant les adresses des octets en adresses de mot. Il lui suffit de faire une division pour cela. Il conserve aussi le reste de la division dans un registre pour sélectionner l'octet une fois la lecture terminée. Un accès mémoire se fait donc comme suit : il reçoit l'adresse à lire, il calcule l'adresse du mot, effectue la lecture, reçoit le mot à lire, et utilise le reste pour sélectionner l'octet final si besoin. La dernière étape est facultative et n'est présente que si on lit une donnée plus petite qu'un mot. La division est une opération assez complexe, mais il y a moyen de ruser. L'idée est de faire en sorte que N soit une puissance de deux. La division se traduit alors par un vulgaire décalage vers la droite, le calcul du reste pas une simple opération de masquage. C'est la raison pour laquelle les processeurs actuels utilisent des mots de 1, 2, 4, 8 octets. Sans cela, les accès mémoire seraient bien plus lents. De plus, cela permet d'économiser des fils sur le bus d'adresse. Si la taille d'un mot est égale à <math>2^{n}</math>, seules les adresses multiples de <math>2^{n}</math> seront utilisables. Or, ces adresses se reconnaissent facilement : leurs n bits de poids faibles valent zéro. On n'a donc pas besoin de câbler les fils correspondant à ces bits de poids faible. ==L'alignement mémoire== Dans la section précédente, nous avons évoqué le cas où un processeur à adressage par byte est couplé à une mémoire adressable par mot. Sur de telles architectures, des problèmes surviennent quand les lectures/écritures se font par mots entiers. Le processeur fournit l'adresse d'un byte, mais lit un mot entier à partir de ce byte. Par exemple, prenons une lecture d'un mot complet : celle-ci précise l'adresse d'un byte. Sur un CPU 64 bits, le processeur lit alors 64 bits d'un coup à partir de l'adresse du byte. Et cela peut poser quelques problèmes, dont la résolution demande de respecter des restrictions sur la place de chaque mot en mémoire, restrictions résumées sous le nom d''''alignement mémoire'''. ===L'exemple sur les processeurs 16 bits=== Pour faire comprendre ce qu'est l'alignement mémoire, nous allons prendre l'exemple d'un processeur 16 bits connecté à une mémoire de 16 bits, via un bus mémoire de 16 bits. Le processeur utilisant l'adressage par byte, chaque octet de la mémoire a sa propre adresse. Par contre, le processeur lit et écrit des paquets de 16 bits, soit deux octets. : Pour rappel, un groupe de deux octets est appelé un '''doublet'''. Pour la mémoire, les octets sont regroupés en groupes de deux, en '''doublets mémoire'''. Pour la mémoire, un doublet mémoire a une adresse unique. Et cela ne colle pas avec l'adressage par byte utilisé par le processeur, il y a une différence entre les adresses du processeur et celles de la mémoire. Il y a une adresse par doublet pour la mémoire, une adresse par octet pour le processeur. L'adresse mémoire a donc un bit de moins que l'adresse processeur. Pour faire la distinction, nous utiliserons les termes : ''adresse mémoire'' et ''adresse processeur''. Lorsque le processeur lit un doublet, il lit le premier octet à une adresse processeur et l'octet suivant dans l'adresse processeur suivante. Les adresses processeur sont donc regroupées par groupes de deux : l'adresse 0 et 1 adressent toutes deux le premier doublet, l'adresse 2 et 3 adressent le second doublet, etc. Un doublet est donc identifié par deux adresses processeur : une '''adresse paire''' et une '''adresse impaire'''. Nous allons partir du principe que l'octet de poids faible est dans l'adresse paire, l'octet de poids fort dans l'adresse impaire. Les règles de boutisme autorise de faire l'inverse, mais ce n'est pas le choix le plus intuitif. L'alignement mémoire dit quoi faire lorsque le processeur veut lire/écrire 16 bits à une adresse impaire. S'il veut lire 16 bits à une adresse impaire, les deux octets seront dans des doublets mémoire différents. Le premier sera l'octet de poids fort d'un doublet, l'autre sera l'octet de poids faible du doublet suivant. Le doublet que le processeur veut lire/écrire est à cheval sur deux doublets mémoire. Et le processeur ne gère pas cette situation naturellement. [[File:Alignement mémoire sur 16 bits.png|centre|vignette|upright=2|Alignement mémoire sur 16 bits]] Pour résoudre ce problème, il y a deux solutions : imposer l'alignement mémoire, supporter les accès non-alignés. L'alignement mémoire strict n'autorise que les accès mémoire à des adresses mémoires paires. Tout accès à une adresse mémoire impaire lève une exception matérielle, signe que c'est une erreur matérielle. Par contre, les adresses paires sont autorisées car une adresse paire identifie un doublet mémoire, que le processeur peut lire/écrire en une seule fois, à travers le bus mémoire. Le processeur gère donc uniquement des lectures/écritures de doublet, au sens de doublet mémoire. Sans alignement mémoire, on peut lire/écrire 16 bits à partir d'une adresse paire comme impaire, les deux sont autorisées. Pour cela, le processeur doit gérer les lectures/écritures de 16 bits à des adresses impaires. Vu que les 16 bits demandés sont à cheval sur deux doublets mémoire, le processeur doit lire les deux doublets mémoire, sélectionner les octets adéquats, et les concaténer pour obtenir les 16 bits finaux. Pour ce qui est de lire/écrire des octets, l'alignement mémoire ne pose aucune contrainte, vu qu'un octet n'est jamais à cheval sur un doublet,quadruplet ou autre. Le processeur peut demander à lire ou écrire un seul octet, mais la mémoire fournira deux octets et le processeur devra n'en conserver qu'un. Donc, il faut prévoir un système pour sélectionner l'octet demandé dans un doublet. Pour la lecture d'un octet à une adresse paire, le processeur lit un doublet et masque l'octet de poids fort, chargé en trop. Pour une lecture d'un octet à une adresse impaire, le processeur lit un doublet, déplace l'octet de poids fort dans l'octet de poids faible, et masque l'octet inutile. Dans tous les cas, le processeur ne lit/écrit qu'un doublet à la fois et sélectionne les octets demandés. Les écritures sont plus complexes, car elles demandent de lire un doublet, de modifier l'octet adéquat, et de réécrire le doublet final en RAM. Pour les lectures, le tout est réalisé par un circuit qui prend en entrée deux bits : le premier indique s'il faut faire une lecture sur 8 ou 16 bits, le second qui indique s'il faut lire l'octet de poids faible ou fort. Une autre possibilité est celle utilisée sur les anciens processeurs Intel 16 bits, qui utilisaient deux bits. Le premier est le bit de poids fort de l'adresse processeur, qui indiquait si l'adresse est paire ou non. Le second bit, nommé BHE, indique s'il fallait masquer l'octet de poids fort ou non. {|class="wikitable" |- ! ! Adresse paire ! Adresse impaire |- ! BHE = 0 | Lecture 16 bits | Lecture octet de poids fort |- ! BHE = 1 | Lecture octet de poids faible | Pas de lecture |} ===L'alignement mémoire des données=== L'exemple précédent nous a montré ce qu'il en était sur les processeurs 16 bits. Mais pour généraliser le concept, nous allons voir le cas des processeurs 32 bits et plus. Nous venons de voir que l'alignement mémoire sur 16 bits impose des contraintes quant à l'adressage de la mémoire, en empêchant de lire des données qui sont à cheval sur deux doublets. Sur 32 bits, c'est la même chose, mais avec des quadruplets (des groupes de 4 octets, soit 32 bits) : impossible de lire des données si elles sont à cheval sur deux quadruplets mémoire. Sur 64 bits, c'est la même chose, mais avec des octuplets de 8 octets/ 64 bits : impossible de lire des données si elles sont à cheval sur deux octuplets mémoire. La différence, c'est que la situation peut se présenter même si on ne lit pas 32/64 bits. Imaginons le cas particulier suivant : je dispose d'un processeur utilisant des mots de 4 octets. Je dispose aussi d'un programme qui doit manipuler un caractère stocké sur 1 octet, un entier de 4 octets et une donnée de deux octets. Mais un problème se pose : le programme qui manipule ces données a été programmé par quelqu'un qui n'était pas au courant de ces histoire d'alignement, et il a répartit mes données un peu n'importe comment. Supposons que cet entier soit stocké à une adresse non-multiple de 4. Par exemple : {|class=wikitable |- !Adresse !Octet 4 !Octet 3 !Octet 2 !Octet 1 |- |0x 0000 0000 |Caractère |Entier |Entier |Entier |- |0x 0000 0004 |Entier |Donnée |Donnée |- |0x 0000 0008 | | | | |} La lecture ou écriture du caractère ne pose pas de problème, vu qu'il ne fait qu'un seul byte. Pour la donnée de 2 octets, c'est la même chose, car elle tient toute entière dans un mot mémoire. La lire demande de lire le mot et de masquer les octets inutiles. Mais pour l'entier, ça ne marche pas car il est à cheval sur deux mots ! On dit que l'entier n'est pas aligné en mémoire. En conséquence, impossible de le charger en une seule fois Pour résumer, avec un bus mémoire de 32 bits, le problème peut survenir si le processeur veut lire 32 bits, mais aussi 16 bits. Si on veut lire 16 bits, mais que le premier octet est dans un quadruplet, et l'autre octet dans un autre quadruplet, l'alignement mémoire intervient. Idem si on veut lire 4 octets, mais que les 3 premiers sont dans un quadruplet, pas le dernier. Tout cela est plus facile à comprendre avec un exemple. La situation est gérée différemment suivant le processeur. Sur certains processeurs, la donnée est chargée en deux fois : c'est légèrement plus lent que la charger en une seule fois, mais ça passe. On dit que le processeur gère des accès mémoire non-alignés. D'autres processeurs ne gérent pas ce genre d'accès mémoire et les traitent comme une erreur, similaire à une division par zéro, et lève une exception matérielle. Si on est chanceux, la routine d'exception charge la donnée en deux fois. Mais sur d'autres processeurs, le programme responsable de cet accès mémoire en dehors des clous se fait sauvagement planter. Par exemple, essayez de manipuler une donnée qui n'est pas "alignée" dans un mot de 16 octets avec une instruction SSE, vous aurez droit à un joli petit crash ! Pour éviter ce genre de choses, les compilateurs utilisés pour des langages de haut niveau préfèrent rajouter des données inutiles (on dit aussi du bourrage) de façon à ce que chaque donnée soit bien alignée sur le bon nombre d'octets. En reprenant notre exemple du dessus, et en notant le bourrage X, on obtiendrait ceci : {|class=wikitable |- !Adresse !Octet 4 !Octet 3 !Octet 2 !Octet 1 |- |0x 0000 0000 |Caractère |X |X |X |- |0x 0000 0004 |Entier |Entier |Entier |Entier |- |0x 0000 0008 |Donnée |Donnée |X |X |} Comme vous le voyez, de la mémoire est gâchée inutilement. Et quand on sait que de la mémoire cache est gâchée ainsi, ça peut jouer un peu sur les performances. Il y a cependant des situations dans lesquelles rajouter du bourrage est une bonne chose et permet des gains en performances assez abominables (une sombre histoire de cache dans les architectures multiprocesseurs ou multi-cœurs, mais je n'en dit pas plus). L'alignement mémoire se gère dans certains langages (comme le C, le C++ ou l'ADA), en gérant l'ordre de déclaration des variables. Essayez toujours de déclarer vos variables de façon à remplir un mot intégralement ou le plus possible. Renseignez-vous sur le bourrage, et essayez de savoir quelle est la taille des données en regardant la norme de vos langages. ===L'alignement des instructions en mémoire=== Les instructions ont toute une certaine taille, et elles peuvent être de taille fixe (toutes les instructions font X octets), ou de taille variable (le nombre d'octets dépend de l'instruction). Dans les deux cas, le processeur peut incorporer des contraintes sur l'alignement des instructions, au même titre que les contraintes d'alignement sur les données vues précédemment. Pour les instructions de taille fixe, les instructions sont placées à des adresses précises. Par exemple, prenons des instructions de 8 octets. La première instruction prend les 8 premiers octets de la mémoire, la seconde prend les 8 octets suivants, etc. En faisant cela, l'adresse d'une instruction est toujours un multiple de 8. Et on peut généraliser pour toute instruction de taille fixe : si elle fait X octets, son adresse est un multiple de X. Généralement, on prend X une puissance de deux pour simplifier beaucoup de choses. Notamment, cela permet de simplifier le ''program counter'' : quelques bits de poids faible deviennent inutiles. Par exemple, si on prend des instructions de 4 octets, les adresses des instructions sont des multiples de 4, donc les deux bits de poids faible de l'adresse sont toujours 00 et ne sont pas intégrés dans le ''program counter''. Le ''program counter'' est alors plus court de deux bits. Idem avec des instructions de 8 octets qui font économiser 3 bits, ou avec des instructions de 16 octets qui font économiser 4 bits. Les instructions de taille variable ne sont généralement pas alignées. Sur certains processeurs, les instructions n'ont pas de contraintes d'alignement du tout. Leur chargement est donc plus compliqué et demande des méthodes précises qui seront vues dans le chapitre sur l'unité de chargement du processeur. Évidemment, le chargement d'instructions non-alignées est donc plus lent. En conséquence, même si le processeur supporte des instructions non-alignées, les compilateurs ont tendance à aligner les instructions comme les données, sur la taille d'un mot mémoire, afin de gagner en performance. Sur d'autres processeurs, les instructions doivent être alignées. Dans le cas le plus simple, les instructions doivent être alignées sur un mot mémoire, elles doivent respecter les mêmes contraintes d'alignement que les données. Elles peuvent être plus courtes ou plus longues qu'un mot, mais elles doivent commencer à la première adresse d'un mot mémoire. D'autres architectures ont des contraintes d'alignement bizarres. Par exemple, les premiers processeurs x86 16 bits imposaient des instructions alignées sur 16 bits et cette contrainte est restée sur les processeurs 32 bits. Que ce soit pour des instructions de taille fixe ou variables, les circuits de chargement des instructions et les circuits d'accès mémoire ne sont pas les mêmes, ce qui fait que leurs contraintes d'alignement peuvent être différentes. On peut avoir quatre possibilités : des instructions non-alignées et des données alignées, l'inverse, les deux qui sont alignées, les deux qui ne sont pas alignées. Par exemple, il se peut qu'un processeur accepte des données non-alignées, mais ne gère pas des instructions non-alignées ! Le cas le plus simple, fréquent sur les architectures RISC, est d'avoir des instructions et données alignées de la même manière. Les architectures CISC utilisent souvent des contraintes d'alignement, avec généralement des instructions de taille variables non-alignées, mais des données alignées. Les deux dernières possibilités ne sont presque jamais utilisées. De plus, sur les processeurs où les deux sont alignés, on peut avoir un alignement différent pour les données et les instructions. Par exemple, pour un processeur qui utilise des instructions de 8 octets, mais des données de 4 octets. Les différences d'alignements posent une contrainte sur l'économie des bits sur le bus d'adresse. Il faut alors regarder ce qui se passe sur l'alignement des données. Par exemple, pour un processeur qui utilise des instructions de 8 octets, mais des données de 4 octets, on ne pourra économiser que deux bits, pour respecter l'alignement des données. Ou encore, sur un processeur avec des instructions alignées sur 8 octets, mais des données non-alignées, on ne pourra rien économiser. Un cas particulier est celui de l'Intel iAPX 432, dont les instructions étaient non-alignées au niveau des bits ! Leur taille variable faisait que la taille des instructions n'était pas un multiple d'octets. Il était possible d'avoir des instructions larges de 23 bits, d'autres de 41 bits, ou toute autre valeur non-divisible par 8. Un octet pouvait contenir des morceaux de deux instructions, à cheval sur l'octet. Ce comportement fort peu pratique faisait que l'implémentation de l'unité d"e chargement était complexe. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres du processeur | prevText=Les registres du processeur | next=Les modes d'adressage | nextText=Les modes d'adressage }} </noinclude> 5fzaxqiymtms46dy80f9rdam8axv3os 745899 745884 2025-07-03T22:51:21Z Mewtow 31375 /* L'exemple sur les processeurs 16 bits */ 745899 wikitext text/x-wiki Dans ce chapitre, on va parler de l'''endianess'' du processeur et de son alignement mémoire. Concrètement, on va s'intéresser à la façon dont le processeur repartit en mémoire les octets des données qu'il manipule. Ces deux paramètres sont sûrement déjà connus de ceux qui ont une expérience de la programmation assez conséquente. Les autres apprendront ce que c'est dans ce chapitre. Pour simplifier, ils sont à prendre en compte quand on échange des données entre registres et mémoire RAM. ==La différence entre mots et bytes== Avant toute chose, nous allons reparler rapidement de la différence entre un byte et un mot. Les deux termes sont généralement polysémiques, avec plusieurs sens. Aussi, définir ce qu'est un mot est assez compliqué. Voyons les différents sens de ce terme, chacun étant utile dans un contexte particulier. Dans les chapitres précédents, nous avons parlé des mots mémoire, à savoir des blocs de mémoire dont le nombre de bits correspond à la largeur du bus mémoire. Le premier sens possible est donc la quantité de données que l'on peut transférer entre CPU et RAM en un seul cycle d'horloge. Il s'agit d'une définition basée sur les transferts réels entre processeur et mémoire. Le terme que nous avons utilisé pour cette définition est : '''mot mémoire'''. Remarquez la subtile différence entre les termes "mot" et "mot mémoire" : le second terme indique bien qu'il s'agit de quelque de lié à la mémoire, pas le premier. Les deux ne sont pas confondre, et nous allons voir pourquoi. La définition précédente ne permet pas de définir ce qu'est un byte et un mot, vu que la distinction se fait au niveau du processeur, au niveau du jeu d'instruction. Précisément, elle intervient au niveau des instructions d'accès mémoire, éventuellement de certaines opérations de traitement de données. Dans ce qui va suivre, nous allons faire la différence entre les architectures à mot, à byte, et à chaines de caractères. Voyons dans le détail ces histoires de mots, de bytes, et autres. ===Les architectures à adressage par mot=== Au tout début de l'informatique, sur les anciens ordinateurs datant d'avant les années 80, les processeurs géraient qu'une seule taille pour les données. Par exemple, de tels processeurs ne géraient que des données de 8 bits, pas autre chose. Les données en question était des '''mots'''. Aux tout début de l'informatique, certaines machines utilisaient des mots de 3, 4, 5, 6 7, 13, 17, 23, 36 ou 48 bits. Pour donner quelques exemples, l'ordinateur ERA 1103 utilisait des mots de 36-bits, tout comme le PDP-10, et ne gérait pas d'autre taille pour les données : c'était 36 bits pour tout le monde. Les processeurs en question ne disposaient que d'une seule instruction de lecture/écriture, qui lisait/écrivait des mots entiers. On pouvait ainsi lire ou écrire des paquets de 3, 4, 5, 6 7, 13, 17, 23, 36 ou 48 bits. Les registres du processeur avaient généralement la même taille qu'un mot, ce qui fait que les processeurs de l'époque avaient des registres de 4, 8, 12, 24, 26, 28, 31, 36, 48, voire 60 bits. Les mots en question sont en théorie à distinguer des mots mémoire, mais ce n'est pas souvent le cas en pratique. Les architectures à adressage par mot faisaient en sorte qu'un mot soit de la même taille qu'un mot mémoire. La mémoire était donc découpée en mots, chacun avait sa propre adresse. Par exemple, une mémoire de 64 kilo-mots contenait 65 536 mots, chacun contenant autant de bits qu'un mot. Les mots faisaient tous la même taille, qui variait suivant la mémoire ou le processeur utilisé. Chaque mot avait sa propre adresse, ce qui fait qu'on parlait d''''adressage par mot'''. Il n'y avait qu'une seule unité d'adressage, ce qui fait que le byte et le mot étaient la même chose sur de telles architectures. La distinction entre byte et mot est apparue après, sur des ordinateurs/processeurs différents. ===Les architectures à adressage par byte=== Par la suite, des processeurs ont permis d'adresser des données plus petites qu'un mot. Les processeurs en question disposent de plusieurs instructions de lecture/écriture, qui manipulent des blocs de mémoire de taille différente. Par exemple, il peut avoir une instruction de lecture pour lire 8 bits, une autre pour lire 16 bits, une autre 32, etc. Une autre possibilité est celle où le processeur dispose d'une instruction de lecture, qu'on peut configurer suivant qu'on veuille lire/écrire un octet, deux, quatre, huit. Dans ce cas, on peut faire une distinction entre '''''byte''''' et '''mot''' : le byte est la plus petite donnée, le mot est la plus grande. Par exemple, un processeur disposant d'instruction d'accès mémoire capables de lire/écrire 8 ou 16 bits sont dans ce cas. Le byte fait alors 8 bits, le mot en fait 16. La séparation entre byte et mot peut parfois se compléter avec des tailles intermédiaires. Par exemple, prenons un processeur qui dispose d'une instruction de lecture capable de lire soit 8 bits, soit 16 bits, soit 32 bits, soit 64 bits. Dans ce cas, le byte vaut 8 bits, le mot en fait 64, les autres tailles sont des intermédiaires. Pour résumer, un mot est la plus grande unité adressable par le processeur, un byte est la plus petite. En général, le byte fait 8 bits, un octet. Mais ça n'a pas toujours été le cas, pas mal de jeux d'instructions font exception. L'exemple le plus parlant est celui des processeurs décimaux, qui utilisaient des entiers codés en BCD mais ne géraient pas les entiers codés en binaire normal. De tels processeurs encodaient des nombres sous la forme d'une suite de chiffres décimaux, codés en BCD sur 4 bits. Ils avaient des bytes de 4 bits, voire de 5/6 bits pour les ordinateurs qui ajoutaient un bit de parité/ECC par chiffre décimal. D'autres architectures avaient un byte de 3 à 7 bits. La taille d'un mot mémoire est de plusieurs bytes : un mot mémoire contient un nombre entier de bytes. La norme actuelle est d'utiliser des bytes d'un octet (8 bits), avec des mots contenant plusieurs octets. Le nombre d'octets dans un mot est généralement une puissance de deux pour simplifier les calculs. Cette règle souffre évidemment d'exceptions, mais l'usage de mots qui ne sont pas des puissances de 2 posent quelques problèmes techniques en termes d’adressage, comme on le verra plus bas. Sur de telles architectures, il y a une adresse mémoire par byte, et non par mot, ce qui fait qu'on parle d''''adressage par byte'''. Tous les ordinateurs modernes utilisent l'adressage par byte. Concrètement, sur les processeurs modernes, chaque octet de la mémoire a sa propre adresse, peu importe la taille du mot utilisé par le processeur. Par exemple, les anciens processeurs x86 32 bits et les processeurs x86 64 bits utilisent tous le même système d'adressage, où chaque octet a sa propre adresse, la seule différence est que les adresses sont plus nombreuses. Avec un adressage par mot, on aurait eu autant d'adresses qu'avant, mais les mots seraient passés de 32 à 64 bits en passant au 64 bits. Les registres font encore une fois la même taille qu'un mot, bien qu'il existe quelques rares exceptions. Les processeurs à adressage par byte ont souvent plusieurs instructions de lecture/écriture, chacune pour une taille précise. Pour rendre cela plus concret, prenons le cas de l'instruction de lecture. Il y a au minimum une instruction de lecture qui lit un byte en mémoire, une autre qui lit un mot complet. Il y a souvent des instructions pour les tailles intermédiaires. Par exemple, un processeur 64 bit a des instructions pour lire 8 bits, une autre pour lire 16 bits, une autre pour en lire 32, et enfin une pour lire 64 bits. Idem pour les instructions d'écriture, et les autres instructions d'accès mémoire. ===Les architectures à adressage par mot de type hybrides=== Il a existé des architectures adressées par mot qui géraient des bytes, mais sans pour autant leur donner des adresses. Leur idée était que les transferts entre CPU et mémoire se faisaient par mots, mais les instructions de lecture/écriture pouvaient sélectionner un byte dans le mot. Une instruction d'accès mémoire devait alors préciser deux choses : l'adresse du mot à lire/écrire, et la position du byte dans le mot adressé. Par exemple, on pouvait demander à lire le mot à l'adresse 0x5F, et de récupérer uniquement le byte numéro 6. Il s'agit d'architectures adressables par mot car l'adresse identifie un mot, pas un byte. Les bytes en question n'avaient pas d'adresses en eux-mêmes, il n'y avait pas d'adressage par byte. La sélection des bytes se faisait dans le processeur : le processeur lisait des mots entiers, avant que le hardware du processeur sélectionne automatiquement le byte voulu. D'ailleurs, aucune de ces architectures ne supportait de mode d'adressage base+index ou base+offset pour sélectionner des bytes dans un mot. Elles supportaient de tels modes d'adressage pour un mot, pas pour les bytes. Pour faire la différence, nous parlerons de pseudo-byte dans ce qui suit, pour bien préciser que ce ne sont pas de vrais bytes. Un exemple est le PDP-6 et le PDP-10, qui avaient des instructions de lecture/écriture de ce type. Elles prenaient trois informations : l'adresse d'un mot, la position du pseudo-byte dans le mot, et enfin la taille d'un pseudo-byte ! L'adressage était donc très flexible, car on pouvait configurer la taille du pseudo-byte. Outre l'instruction de lecture LDB et celle d'écriture DPB, d'autres instructions permettaient de manipuler des pseudo-bytes. L'instruction IBP incrémentait le numéro du pseudo-byte, par exemple. ===Les architectures à mot de taille variable=== D'autres architectures codaient leurs nombres en utilisant un nombre variable de bytes ! Dit autrement, elles avaient des mots de taille variable, d'où leur nom d''''architectures à mots de taille variable'''. Il s'agit d'architectures qui codaient les nombres par des chaines de caractères terminées par un byte de terminaison. La grande majorité étaient des architectures décimales, à savoir des ordinateurs qui utilisaient des nombres encodés en BCD ou dans un encodage similaire. Les nombres étaient codés en décimal, mais chaque chiffre était encodé en binaire sur quelques bits, généralement 4 à 6 bits. Les bytes stockaient chacun un caractère, qui était utilisé pour encoder soit un chiffre décimal, soit un autre symbole comme un byte de terminaison. Un caractère faisait plus de 4 bits, vu qu'il fallait au minimum coder les chiffres BCD et des symboles supplémentaires. La taille d'un caractère était généralement de 5/6 bits. Un exemple est celui des IBM 1400 series, qui utilisaient des chaines de caractères séparées par deux bytes : un byte de ''wordmark'' au début, et un byte de ''record mark'' à la fin. Les caractères étaient des chiffres codés en BCD, chaque caractère était codé sur 6 bits. Les calculs se faisaient chiffre par chiffre, au rythme d'un chiffre utilisé comme opérande par cycle d'horloge. Le processeur passait automatiquement d'un chiffre au suivant pour chaque opérande. Chaque caractère/chiffre avait sa propre adresse, ce qui fait l'architecture est techniquement adressable par byte, alors que les mots correspondaient aux nombres de taille variable. ===La comparaison entre l'adressage par mot et par byte=== Plus haut, nous avons vu deux types d'adressage : par mot et par byte. Avec la première, ce sont les mots qui ont des adresses. Les bytes n'existent pas forcément sur de telles architectures. Si une gestion des bytes est présente, les instructions de lecture/écriture utilisent des adresses pour les mots, couplé à la position du byte dans le mot. Les lectures/écritures se font pas mots entiers. À l'opposé, sur les architectures adressées par byte, une adresse correspond à un byte et non à un mot. Les deux techniques font que l'usage des adresses est différent. Entre une adresse par mot et une par byte, le nombre d'adresse n'est pas le même à capacité mémoire égale. Prenons un exemple assez simple, où l'on compare deux processeurs. Les deux ont des mots mémoire de 32 bits, pour simplifier la comparaison. Le premier processeur gère des bytes de 8 bits, et chacun a sa propre adresse, ce qui fait que c'est un adressage par byte qui est utilisé. Le second ne gère pas les bytes mais seulement des mots de 32 bits, ce qui fait que c'est un adressage par mot qui est utilisé. Dans les deux cas, la mémoire n'est pas organisée de la même manière. Prenons une mémoire de 24 octets pour l'exemple, soit 24/4 = 6 mots de 4 octets. Le premier processeur aura une adresse par byte, soit 24 adresses, et ce sera pareil pour la mémoire, qui utilisera une case mémoire par byte. Le second processeur n'aura que 6 adresses : une par mot. La mémoire a des cases mémoire qui contiennent un mot entier, soit 32 bits, 4 octets. [[File:Byte and word addressing.png|centre|vignette|upright=2|Adressage par mot et par Byte.]] L'avantage de l'adressage par mot est que l'on peut adresser plus de mémoire pour un nombre d'adresses égal. Si on a un processeur qui gère des adresses de 16 bits, on peut adresser 2^16 = 65 536 adresses. Avec un mot mémoire de 4 bytes d'un octet chacun, on peut adresser : soit 65 536 bytes/octets, soit 65 536mots et donc 65 536 × 4 octets. L'adressage par mot permet donc d'adresser plus de mémoire avec les mêmes adresses. Une autre manière de voir les choses est qu'une architecture à adressage par byte va utiliser beaucoup plus d'adresses qu'une architecture par mot, à capacité mémoire égale. L'avantage des architectures à adressage par byte est que l'on peut plus facilement modifier des données de petite taille. Par exemple, imaginons qu'un programmeur manipule du texte, avec des caractères codés sur un octet. S'il veut remplacer les lettres majuscules par des minuscules, il doit changer chaque lettre indépendamment des autres, l'une après l'autre. Avec un adressage par mot, il doit lire un mot entier, modifier chaque octet en utilisant des opérations de masquage, puis écrire le mot final. Avec un adressage par byte, il peut lire chaque byte indépendamment, le modifier sans recourir à des opérations de masquage, puis écrire le résultat. Le tout est plus simple avec l'adressage par byte : pas besoin d'opérations de masquage ! Par contre, les architectures à adressage par byte ont de nombreux défauts. Le fait qu'un mot contienne plusieurs octets/bytes a de nombreuses conséquences, desquelles naissent les contraintes d'alignement, de boutisme et autres. Dans ce qui suit, nous allons étudier les défauts des architectures adressables par byte, et allons laisser de côté les architectures adressables par mot. La raison est que toutes les architectures modernes sont adressables par byte, les seules architectures adressables par mot étant de très vieux ordinateurs aujourd'hui disparus. ==Le boutisme : une spécificité de l'adressage par byte== Le premier problème lié à l'adressage par byte est lié au fait que l'on a plusieurs bytes par mot : dans quel ordre placer les bytes dans un mot ? On peut introduire le tout par une analogie avec les langues humaines : certaines s’écrivent de gauche à droite et d'autres de droite à gauche. Dans un ordinateur, c'est pareil avec les bytes/octets des mots mémoire : on peut les écrire soit de gauche à droite, soit de droite à gauche. Quand on veut parler de cet ordre d'écriture, on parle de '''boutisme''' (''endianness''). Dans ce qui suit, nous allons partir du principe que le byte fait un octet, mais gardez dans un coin de votre tête que ce n'a pas toujours été le cas. Les explications qui vont suivre restent valide peu importe la taille du byte. ===Les différents types de boutisme=== Les deux types de boutisme les plus simples sont le gros-boutisme et le petit-boutisme. Sur les '''processeurs gros-boutistes''', la donnée est stockée des adresses les plus faibles vers les adresses plus grande. Pour rendre cela plus clair, prenons un entier qui prend plusieurs octets et qui est stocké entre deux adresses. L'octet de poids fort de l'entier est stocké dans l'adresse la plus faible, et inversement pour le poids faible qui est stocké dans l'adresse la plus grande. Sur les '''processeurs petit-boutistes''', c'est l'inverse : l'octet de poids faible de notre donnée est stocké dans la case mémoire ayant l'adresse la plus faible. La donnée est donc stockée dans l'ordre inverse pour les octets. Certains processeurs sont un peu plus souples : ils laissent le choix du boutisme. Sur ces processeurs, on peut configurer le boutisme en modifiant un bit dans un registre du processeur : il faut mettre ce bit à 1 pour du petit-boutiste, et à 0 pour du gros-boutiste, par exemple. Ces processeurs sont dits '''bi-boutistes'''. {| |[[File:Big-Endian-fr.svg|class=transparent|Gros-boutisme.]] |[[File:Little-Endian-fr.svg|class=transparent|Petit-boutisme.]] |} Petit et gros-boutisme ont pour particularité que la taille des mots ne change pas vraiment l'organisation des octets. Peu importe la taille d'un mot, celui-ci se lit toujours de gauche à droite, ou de droite à gauche. Cela n’apparaît pas avec les techniques de boutismes plus compliquées. [[File:Big-endian little-endian.jpg|centre|vignette|upright=2.5|Comparaison entre ''big-endian'' et ''little-endian'', pour des tailles de 16 et 32 bits.]] [[File:Comparaison entre boutisme avec et sans inversion de mots mémoire.jpg|vignette|Comparaison entre un nombre codé en gros-boutiste pur, et un nombre gros-boutiste dont les octets sont rangés dans un groupe en petit-boutiste. Le nombre en question est 0x 0A 0B 0C 0D, en hexadécimal, le premier mot mémoire étant indiqué en jaune, le second en blanc.]] Certains processeurs ont des boutismes plus compliqués, où chaque mot mémoire est découpé en plusieurs groupes d'octets. Il faut alors prendre en compte le boutisme des octets dans le groupe, mais aussi le boutisme des groupes eux-mêmes. On distingue ainsi un boutisme inter-groupe (le boutisme des groupes eux-même) et un boutisme intra-groupe (l'ordre des octets dans chaque groupe), tout deux pouvant être gros-boutiste ou petit-boutiste. Si l'ordre intra-groupe est identique à l'ordre inter-groupe, alors on retrouve du gros- ou petit-boutiste normal. Mais les choses changent si jamais l'ordre inter-groupe et intra-groupe sont différents. Dans ces conditions, on doit préciser un ordre d’inversion des mots mémoire (''byte-swap''), qui précise si les octets doivent être inversés dans un mot mémoire processeur, en plus de préciser si l'ordre des mots mémoire est petit- ou gros-boutiste. ===Avantages, inconvénients et usage=== Le choix entre petit boutisme et gros boutisme est généralement une simple affaire de convention. Il n'y a pas d'avantage vraiment probant pour l'une ou l'autre de ces deux méthodes, juste quelques avantages ou inconvénients mineurs. Dans les faits, il y a autant d'architectures petit- que de gros-boutistes, la plupart des architectures récentes étant bi-boutistes. Précisons que le jeu d'instruction x86 est de type petit-boutiste. Si on quitte le domaine des jeu d'instruction, les protocoles réseaux et les formats de fichiers imposent un boutisme particulier. Les protocoles réseaux actuels (TCP-IP) sont de type gros-boutiste, ce qui impose de convertir les données réseaux avant de les utiliser sur les PC modernes. Et au passage, si le gros-boutisme est utilisé dans les protocoles réseau, alors que le petit-boutisme est roi sur le x86, c'est pour des raisons pratiques, que nous allons aborder ci-dessous. Le gros-boutisme est très facile à lire pour les humains. Les nombres en gros-boutistes se lisent de droite à gauche, comme il est d'usage dans les langues indo-européennes, alors que les nombres en petit boutistes se lisent dans l'ordre inverse de lecture. Pour la lecture en hexadécimal, il faut inverser l'ordre des octets, mais il faut garder l'ordre des chiffres dans chaque octet. Par exemple, le nombre 0x015665 (87 653 en décimal) se lit 0x015665 en gros-boutiste, mais 0x655601 en petit-boutiste. Et je ne vous raconte pas ce que cela donne avec un ''byte-swap''... Cette différence pose problème quand on doit lire des fichiers, du code machine ou des paquets réseau, avec un éditeur hexadécimal. Alors certes, la plupart des professionnels lisent directement les données en passant par des outils d'analyse qui se chargent d'afficher les nombres en gros-boutiste, voire en décimal. Un professionnel a à sa disposition du désassembleur pour le code machine, des analyseurs de paquets pour les paquets réseau, des décodeurs de fichiers pour les fichiers, des analyseurs de ''dump'' mémoire pour l'analyse de la mémoire, etc. Cependant, le gros-boutisme reste un avantage quand on utilise un éditeur hexadécimal, quel que soit l'usage. En conséquence, le gros-boutiste a été historiquement pas mal utilisé dans les protocoles réseaux et les formats de fichiers. Par contre, cet avantage de lecture a dû faire face à divers désavantages pour les architectures de processeur. Le petit-boutisme peut avoir des avantages sur les architectures qui gèrent des données de taille intermédiaires entre le byte et le mot. C'est le cas sur le x86, où l'on peut décider de lire des données de 8, 16, 32, ou 64 bits à partir d'une adresse mémoire. Avec le petit-boutisme, on s'assure qu'une lecture charge bien la même valeur, le même nombre. Par exemple, imaginons que je stocke le nombre 0x 14 25 36 48 sur un mot mémoire, en petit-boutiste. En petit-boutiste, une opération de lecture reverra soit les 8 bits de poids faible (0x 48), soit les 16 bits de poids faible (0x 36 48), soit le nombre complet. Ce ne serait pas le cas en gros-boutiste, où les lectures reverraient respectivement 0x 14, 0x 14 25 et 0x 14 25 36 48. Avec le gros-boutisme, de telles opérations de lecture n'ont pas vraiment de sens. En soit, cet avantage est assez limité et n'est utile que pour les compilateurs et les programmeurs en assembleur. Un autre avantage est un gain de performance pour certaines opérations. Les instructions en question sont les opérations où on doit additionner d'opérandes codées sur plusieurs octets; sur un processeur qui fait les calculs octet par octet. En clair, le processeur dispose d'instructions de calcul qui additionnent des nombres de 16, 32 ou 64 bit, voire plus. Mais à l'intérieur du processeur, les calculs sont faits octets par octets, l'unité de calcul ne pouvant qu'additionner deux nombres de 8 bits à la fois. Dans ce cas, le petit-boutisme garantit que l'addition des octets se fait dans le bon ordre, en commençant par les octets de poids faible pour progresser vers les octets de poids fort. En gros-boutisme, les choses sont beaucoup plus compliquées... Pour résumer, les avantages et inconvénients de chaque boutisme sont mineurs. Le gain en performance est nul sur les architectures modernes, qui ont des unités de calcul capables de faire des additions multi-octets. L'usage d'opérations de lecture de taille variable est aujourd'hui tombé en désuétude, vu que cela ne sert pas à grand chose et complexifie le jeu d'instruction. Enfin, l'avantage de lecture n'est utile que dans situations tellement rares qu'on peut légitimement questionner son statut d'avantage. En bref, les différentes formes de boutisme se valent. ==L'implémentation de l'adressage par byte au niveau de la mémoire RAM/ROM== Avant de poursuivre, rappelons que la notion de byte est avant tout liée au jeu d'instruction, mais qu'elle ne dit rien du bus mémoire ! Il est parfaitement possible d'utiliser un bus mémoire d'une taille différente de celle du byte ou du mot. La largeur du bus mémoire, la taille d'un mot, et la taille d'un byte, ne sont pas forcément corrélées. Néanmoins, deux cas classiques sont les plus courants. ===Les architectures avec une mémoire adressable par byte=== Le premier est celui où le bus mémoire transmet un byte à la fois. En clair, la largeur du bus mémoire est celle du byte. Le moindre accès mémoire se fait byte par byte, donc en plusieurs cycles d'horloge. Par exemple, sur un processeur 64 bits, la lecture d'un mot complet se fera octet par octet, ce qui demandera 8 cycles d'horloge, cycles d'horloge mémoire qui plus est. Ce qui explique le désavantage de cette méthode : la performance est assez mauvaise. La performance dépend de plus de la taille des données lue/écrites. On prend moins de temps à lire une donnée courte qu'une donnée longue. L'avantage est qu'on peut lire ou écrire un mot, peu importe son adresse. Pour donner un exemple, je peux parfaitement lire une donnée de 16 bits localisée à l'adresse 4, puis lire une autre donnée de 16 bits localisée à l'adresse 5 sans aucun problème. En conséquence, il n'y a pas de contraintes d'alignements et les problèmes que nous allons aborder dans la suite n'existent pas. [[File:Chargement d'une donnée sur un processeur sans contraitnes d'alignement.jpg|centre|vignette|upright=2|Chargement d'une donnée sur un processeur sans contraintes d'alignement.]] ===Les architectures avec une mémoire adressable par mot=== Pour éviter d'avoir des performances désastreuses, on utilise une autre solution : le bus mémoire a la largeur nécessaire pour lire un mot entier. Le processeur peut charger un mot mémoire entier dans ses registres, en un seul accès mémoire. Et pour lire des données plus petites qu'un mot mémoire, le processeur charge un mot complet, mais ignore les octets en trop. [[File:Exemple du chargement d'un octet dans un registre de trois octets.jpg|centre|vignette|upright=2|Exemple du chargement d'un octet dans un registre de trois octets.]] Il y a alors confusion entre un mot au sens du jeu d'instruction, et un mot mémoire. Pour rappel, une donnée qui a la même taille que le bus de données est appelée un mot mémoire. Mais dans ce cas, l'adressage de la mémoire et du CPU ne sont pas compatibles : le processeur utilise une adresse par byte, la mémoire une adresse par mot ! Tout se passe comme si la mémoire était découpée en blocs de la taille d'un mot. La capacité de la mémoire reste inchangée, ce qui fait que le nombre d'adresses utilisables diminue : il n'y a plus besoin que d'une adresse par mot mémoire et non par octet. Il faut donc faire une sorte d'interface entre les deux. [[File:Chargement d'une donnée sur un processeur avec contraintes d'alignement.jpg|centre|vignette|upright=2|Chargement d'une donnée sur un processeur avec contraintes d'alignement.]] Par convention, l'adresse d'un mot est l'adresse de son octet de poids faible. Les autres octets du mot ne sont pas adressables par la mémoire. Par exemple, si on prend un mot de 8 octets, on est certain qu'une adresse sur 8 disparaîtra. L'adresse du mot est utilisée pour communiquer avec la mémoire, mais cela ne signifie pas que l'adresse des octets est inutile au-delà du calcul de l'adresse du mot. En effet, l'accès à un octet précis demande de déterminer la position de l'octet dans le mot à partir de l'adresse du octet. Prenons un processeur ayant des mots de 4 octets et répertorions les adresses utilisables. Le premier mot contient les octets d'adresse 0, 1, 2 et 3. L'adresse zéro est l'adresse de l'octet de poids faible et sert donc d'adresse au premier mot, les autres sont inutilisables sur le bus mémoire. Le second mot contient les adresses 4, 5, 6 et 7, l'adresse 4 est l'adresse du mot, les autres sont inutilisables. Et ainsi de suite. Si on fait une liste exhaustive des adresses valides et invalides, on remarque que seules les adresses multiples de 4 sont utilisables. Et ceux qui sont encore plus observateurs remarqueront que 4 est la taille d'un mot. Dans l'exemple précédent, les adresses utilisables sont multiples de la taille d'un mot. Sachez que cela fonctionne quelle que soit la taille du mot. Si N est la taille d'un mot, alors seules les adresses multiples de N seront utilisables. Avec ce résultat, on peut trouver une procédure qui nous donne l'adresse d'un mot à partir de l'adresse d'un octet. Si un mot contient N bytes, alors l'adresse du mot se calcule en divisant l'adresse du byte par N. La position du byte dans le mot est quant à elle le reste de cette division. Un reste de 0 nous dit que l'octet est le premier du mot, un reste de 1 nous dit qu'il est le second, etc. [[File:Adresse d'un mot avec alignement mémoire strict.png|centre|vignette|upright=2|Adresse d'un mot avec alignement mémoire strict.]] Le processeur peut donc adresser la mémoire RAM en traduisant les adresses des octets en adresses de mot. Il lui suffit de faire une division pour cela. Il conserve aussi le reste de la division dans un registre pour sélectionner l'octet une fois la lecture terminée. Un accès mémoire se fait donc comme suit : il reçoit l'adresse à lire, il calcule l'adresse du mot, effectue la lecture, reçoit le mot à lire, et utilise le reste pour sélectionner l'octet final si besoin. La dernière étape est facultative et n'est présente que si on lit une donnée plus petite qu'un mot. La division est une opération assez complexe, mais il y a moyen de ruser. L'idée est de faire en sorte que N soit une puissance de deux. La division se traduit alors par un vulgaire décalage vers la droite, le calcul du reste pas une simple opération de masquage. C'est la raison pour laquelle les processeurs actuels utilisent des mots de 1, 2, 4, 8 octets. Sans cela, les accès mémoire seraient bien plus lents. De plus, cela permet d'économiser des fils sur le bus d'adresse. Si la taille d'un mot est égale à <math>2^{n}</math>, seules les adresses multiples de <math>2^{n}</math> seront utilisables. Or, ces adresses se reconnaissent facilement : leurs n bits de poids faibles valent zéro. On n'a donc pas besoin de câbler les fils correspondant à ces bits de poids faible. ==L'alignement mémoire== Dans la section précédente, nous avons évoqué le cas où un processeur à adressage par byte est couplé à une mémoire adressable par mot. Sur de telles architectures, des problèmes surviennent quand les lectures/écritures se font par mots entiers. Le processeur fournit l'adresse d'un byte, mais lit un mot entier à partir de ce byte. Par exemple, prenons une lecture d'un mot complet : celle-ci précise l'adresse d'un byte. Sur un CPU 64 bits, le processeur lit alors 64 bits d'un coup à partir de l'adresse du byte. Et cela peut poser quelques problèmes, dont la résolution demande de respecter des restrictions sur la place de chaque mot en mémoire, restrictions résumées sous le nom d''''alignement mémoire'''. ===L'exemple sur les processeurs 16 bits=== Pour faire comprendre ce qu'est l'alignement mémoire, nous allons prendre l'exemple d'un processeur 16 bits connecté à une mémoire de 16 bits, via un bus mémoire de 16 bits. Le processeur utilisant l'adressage par byte, chaque octet de la mémoire a sa propre adresse. Par contre, le processeur lit et écrit des paquets de 16 bits, soit deux octets. : Pour rappel, un groupe de deux octets est appelé un '''doublet'''. Pour la mémoire, les octets sont regroupés en groupes de deux, en '''doublets mémoire'''. Pour la mémoire, un doublet mémoire a une adresse unique. Et cela ne colle pas avec l'adressage par byte utilisé par le processeur, il y a une différence entre les adresses du processeur et celles de la mémoire. Il y a une adresse par doublet pour la mémoire, une adresse par octet pour le processeur. L'adresse mémoire a donc un bit de moins que l'adresse processeur. Pour faire la distinction, nous utiliserons les termes : ''adresse mémoire'' et ''adresse processeur''. Lorsque le processeur lit un doublet, il lit le premier octet à une adresse processeur et l'octet suivant dans l'adresse processeur suivante. Les adresses processeur sont donc regroupées par groupes de deux : l'adresse 0 et 1 adressent toutes deux le premier doublet, l'adresse 2 et 3 adressent le second doublet, etc. Un doublet est donc identifié par deux adresses processeur : une '''adresse paire''' et une '''adresse impaire'''. Nous allons partir du principe que l'octet de poids faible est dans l'adresse paire, l'octet de poids fort dans l'adresse impaire. Les règles de boutisme autorise de faire l'inverse, mais ce n'est pas le choix le plus intuitif. L'alignement mémoire dit quoi faire lorsque le processeur veut lire/écrire 16 bits à une adresse impaire. S'il veut lire 16 bits à une adresse impaire, les deux octets seront dans des doublets mémoire différents. Le premier sera l'octet de poids fort d'un doublet, l'autre sera l'octet de poids faible du doublet suivant. Le doublet que le processeur veut lire/écrire est à cheval sur deux doublets mémoire. Et le processeur ne gère pas cette situation naturellement. [[File:Alignement mémoire sur 16 bits.png|centre|vignette|upright=2|Alignement mémoire sur 16 bits]] Pour résoudre ce problème, il y a deux solutions : imposer l'alignement mémoire, supporter les accès non-alignés. L'alignement mémoire strict n'autorise que les accès mémoire à des adresses mémoires paires. Tout accès à une adresse mémoire impaire lève une exception matérielle, signe que c'est une erreur matérielle. Par contre, les adresses paires sont autorisées car une adresse paire identifie un doublet mémoire, que le processeur peut lire/écrire en une seule fois, à travers le bus mémoire. Le processeur gère donc uniquement des lectures/écritures de doublet, au sens de doublet mémoire. Sans alignement mémoire, on peut lire/écrire 16 bits à partir d'une adresse paire comme impaire, les deux sont autorisées. Pour cela, le processeur doit gérer les lectures/écritures de 16 bits à des adresses impaires. Vu que les 16 bits demandés sont à cheval sur deux doublets mémoire, le processeur doit lire les deux doublets mémoire, sélectionner les octets adéquats, et les concaténer pour obtenir les 16 bits finaux. Pour ce qui est de lire/écrire des octets, l'alignement mémoire ne pose aucune contrainte, vu qu'un octet n'est jamais à cheval sur un doublet,quadruplet ou autre. Le processeur peut demander à lire ou écrire un seul octet, mais la mémoire fournira deux octets et le processeur devra n'en conserver qu'un. Donc, il faut prévoir un système pour sélectionner l'octet demandé dans un doublet. Pour la lecture d'un octet à une adresse paire, le processeur lit un doublet et masque l'octet de poids fort, chargé en trop. Pour une lecture d'un octet à une adresse impaire, le processeur lit un doublet, déplace l'octet de poids fort dans l'octet de poids faible, et masque l'octet inutile. Dans tous les cas, le processeur ne lit/écrit qu'un doublet à la fois et sélectionne les octets demandés. Les écritures sont plus complexes, car elles demandent de lire un doublet, de modifier l'octet adéquat, et de réécrire le doublet final en RAM. Pour les lectures, le tout est réalisé par un circuit intégré au processeur, qui est directement relié au bus mémoire. Il prend en entrée deux bits : le premier indique s'il faut faire une lecture sur 8 ou 16 bits, le second qui indique s'il faut lire l'octet de poids faible ou fort. Le circuit est alors composé d'un circuit de masquage et d'un multiplexeur. Le multiplexeur est utilisé pour choisir l'octet de poids faible ou fort. Le circuit de masquage met à zéro l'octet de poids fort en cas d'accès sur 8 bits. [[File:Circuit d'accès 16-8 bits.png|centre|vignette|upright=2|Circuit d'accès 16-8 bits]] Une autre possibilité est celle utilisée sur les anciens processeurs Intel 16 bits, qui utilisaient deux bits. Le premier est le bit de poids fort de l'adresse processeur, qui indiquait si l'adresse est paire ou non. Le second bit, nommé BHE, indique s'il fallait masquer l'octet de poids fort ou non. {|class="wikitable" |- ! ! Adresse paire ! Adresse impaire |- ! BHE = 0 | Lecture 16 bits | Lecture octet de poids fort |- ! BHE = 1 | Lecture octet de poids faible | Pas de lecture |} ===L'alignement mémoire des données=== L'exemple précédent nous a montré ce qu'il en était sur les processeurs 16 bits. Mais pour généraliser le concept, nous allons voir le cas des processeurs 32 bits et plus. Nous venons de voir que l'alignement mémoire sur 16 bits impose des contraintes quant à l'adressage de la mémoire, en empêchant de lire des données qui sont à cheval sur deux doublets. Sur 32 bits, c'est la même chose, mais avec des quadruplets (des groupes de 4 octets, soit 32 bits) : impossible de lire des données si elles sont à cheval sur deux quadruplets mémoire. Sur 64 bits, c'est la même chose, mais avec des octuplets de 8 octets/ 64 bits : impossible de lire des données si elles sont à cheval sur deux octuplets mémoire. La différence, c'est que la situation peut se présenter même si on ne lit pas 32/64 bits. Imaginons le cas particulier suivant : je dispose d'un processeur utilisant des mots de 4 octets. Je dispose aussi d'un programme qui doit manipuler un caractère stocké sur 1 octet, un entier de 4 octets et une donnée de deux octets. Mais un problème se pose : le programme qui manipule ces données a été programmé par quelqu'un qui n'était pas au courant de ces histoire d'alignement, et il a répartit mes données un peu n'importe comment. Supposons que cet entier soit stocké à une adresse non-multiple de 4. Par exemple : {|class=wikitable |- !Adresse !Octet 4 !Octet 3 !Octet 2 !Octet 1 |- |0x 0000 0000 |Caractère |Entier |Entier |Entier |- |0x 0000 0004 |Entier |Donnée |Donnée |- |0x 0000 0008 | | | | |} La lecture ou écriture du caractère ne pose pas de problème, vu qu'il ne fait qu'un seul byte. Pour la donnée de 2 octets, c'est la même chose, car elle tient toute entière dans un mot mémoire. La lire demande de lire le mot et de masquer les octets inutiles. Mais pour l'entier, ça ne marche pas car il est à cheval sur deux mots ! On dit que l'entier n'est pas aligné en mémoire. En conséquence, impossible de le charger en une seule fois Pour résumer, avec un bus mémoire de 32 bits, le problème peut survenir si le processeur veut lire 32 bits, mais aussi 16 bits. Si on veut lire 16 bits, mais que le premier octet est dans un quadruplet, et l'autre octet dans un autre quadruplet, l'alignement mémoire intervient. Idem si on veut lire 4 octets, mais que les 3 premiers sont dans un quadruplet, pas le dernier. Tout cela est plus facile à comprendre avec un exemple. La situation est gérée différemment suivant le processeur. Sur certains processeurs, la donnée est chargée en deux fois : c'est légèrement plus lent que la charger en une seule fois, mais ça passe. On dit que le processeur gère des accès mémoire non-alignés. D'autres processeurs ne gérent pas ce genre d'accès mémoire et les traitent comme une erreur, similaire à une division par zéro, et lève une exception matérielle. Si on est chanceux, la routine d'exception charge la donnée en deux fois. Mais sur d'autres processeurs, le programme responsable de cet accès mémoire en dehors des clous se fait sauvagement planter. Par exemple, essayez de manipuler une donnée qui n'est pas "alignée" dans un mot de 16 octets avec une instruction SSE, vous aurez droit à un joli petit crash ! Pour éviter ce genre de choses, les compilateurs utilisés pour des langages de haut niveau préfèrent rajouter des données inutiles (on dit aussi du bourrage) de façon à ce que chaque donnée soit bien alignée sur le bon nombre d'octets. En reprenant notre exemple du dessus, et en notant le bourrage X, on obtiendrait ceci : {|class=wikitable |- !Adresse !Octet 4 !Octet 3 !Octet 2 !Octet 1 |- |0x 0000 0000 |Caractère |X |X |X |- |0x 0000 0004 |Entier |Entier |Entier |Entier |- |0x 0000 0008 |Donnée |Donnée |X |X |} Comme vous le voyez, de la mémoire est gâchée inutilement. Et quand on sait que de la mémoire cache est gâchée ainsi, ça peut jouer un peu sur les performances. Il y a cependant des situations dans lesquelles rajouter du bourrage est une bonne chose et permet des gains en performances assez abominables (une sombre histoire de cache dans les architectures multiprocesseurs ou multi-cœurs, mais je n'en dit pas plus). L'alignement mémoire se gère dans certains langages (comme le C, le C++ ou l'ADA), en gérant l'ordre de déclaration des variables. Essayez toujours de déclarer vos variables de façon à remplir un mot intégralement ou le plus possible. Renseignez-vous sur le bourrage, et essayez de savoir quelle est la taille des données en regardant la norme de vos langages. ===L'alignement des instructions en mémoire=== Les instructions ont toute une certaine taille, et elles peuvent être de taille fixe (toutes les instructions font X octets), ou de taille variable (le nombre d'octets dépend de l'instruction). Dans les deux cas, le processeur peut incorporer des contraintes sur l'alignement des instructions, au même titre que les contraintes d'alignement sur les données vues précédemment. Pour les instructions de taille fixe, les instructions sont placées à des adresses précises. Par exemple, prenons des instructions de 8 octets. La première instruction prend les 8 premiers octets de la mémoire, la seconde prend les 8 octets suivants, etc. En faisant cela, l'adresse d'une instruction est toujours un multiple de 8. Et on peut généraliser pour toute instruction de taille fixe : si elle fait X octets, son adresse est un multiple de X. Généralement, on prend X une puissance de deux pour simplifier beaucoup de choses. Notamment, cela permet de simplifier le ''program counter'' : quelques bits de poids faible deviennent inutiles. Par exemple, si on prend des instructions de 4 octets, les adresses des instructions sont des multiples de 4, donc les deux bits de poids faible de l'adresse sont toujours 00 et ne sont pas intégrés dans le ''program counter''. Le ''program counter'' est alors plus court de deux bits. Idem avec des instructions de 8 octets qui font économiser 3 bits, ou avec des instructions de 16 octets qui font économiser 4 bits. Les instructions de taille variable ne sont généralement pas alignées. Sur certains processeurs, les instructions n'ont pas de contraintes d'alignement du tout. Leur chargement est donc plus compliqué et demande des méthodes précises qui seront vues dans le chapitre sur l'unité de chargement du processeur. Évidemment, le chargement d'instructions non-alignées est donc plus lent. En conséquence, même si le processeur supporte des instructions non-alignées, les compilateurs ont tendance à aligner les instructions comme les données, sur la taille d'un mot mémoire, afin de gagner en performance. Sur d'autres processeurs, les instructions doivent être alignées. Dans le cas le plus simple, les instructions doivent être alignées sur un mot mémoire, elles doivent respecter les mêmes contraintes d'alignement que les données. Elles peuvent être plus courtes ou plus longues qu'un mot, mais elles doivent commencer à la première adresse d'un mot mémoire. D'autres architectures ont des contraintes d'alignement bizarres. Par exemple, les premiers processeurs x86 16 bits imposaient des instructions alignées sur 16 bits et cette contrainte est restée sur les processeurs 32 bits. Que ce soit pour des instructions de taille fixe ou variables, les circuits de chargement des instructions et les circuits d'accès mémoire ne sont pas les mêmes, ce qui fait que leurs contraintes d'alignement peuvent être différentes. On peut avoir quatre possibilités : des instructions non-alignées et des données alignées, l'inverse, les deux qui sont alignées, les deux qui ne sont pas alignées. Par exemple, il se peut qu'un processeur accepte des données non-alignées, mais ne gère pas des instructions non-alignées ! Le cas le plus simple, fréquent sur les architectures RISC, est d'avoir des instructions et données alignées de la même manière. Les architectures CISC utilisent souvent des contraintes d'alignement, avec généralement des instructions de taille variables non-alignées, mais des données alignées. Les deux dernières possibilités ne sont presque jamais utilisées. De plus, sur les processeurs où les deux sont alignés, on peut avoir un alignement différent pour les données et les instructions. Par exemple, pour un processeur qui utilise des instructions de 8 octets, mais des données de 4 octets. Les différences d'alignements posent une contrainte sur l'économie des bits sur le bus d'adresse. Il faut alors regarder ce qui se passe sur l'alignement des données. Par exemple, pour un processeur qui utilise des instructions de 8 octets, mais des données de 4 octets, on ne pourra économiser que deux bits, pour respecter l'alignement des données. Ou encore, sur un processeur avec des instructions alignées sur 8 octets, mais des données non-alignées, on ne pourra rien économiser. Un cas particulier est celui de l'Intel iAPX 432, dont les instructions étaient non-alignées au niveau des bits ! Leur taille variable faisait que la taille des instructions n'était pas un multiple d'octets. Il était possible d'avoir des instructions larges de 23 bits, d'autres de 41 bits, ou toute autre valeur non-divisible par 8. Un octet pouvait contenir des morceaux de deux instructions, à cheval sur l'octet. Ce comportement fort peu pratique faisait que l'implémentation de l'unité d"e chargement était complexe. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les registres du processeur | prevText=Les registres du processeur | next=Les modes d'adressage | nextText=Les modes d'adressage }} </noinclude> pffuo0mdsgybry98buhv6mnpcebtw4e Wikilivres:GUS2Wiki 4 78643 745901 745416 2025-07-04T06:49:21Z Alexis Jazz 81580 Updating gadget usage statistics from [[Special:GadgetUsage]] ([[phab:T121049]]) 745901 wikitext text/x-wiki {{#ifexist:Project:GUS2Wiki/top|{{/top}}|This page provides a historical record of [[Special:GadgetUsage]] through its page history. To get the data in CSV format, see wikitext. To customize this message or add categories, create [[/top]].}} Les données suivantes sont en cache et ont été mises à jour pour la dernière fois le 2025-07-01T07:19:02Z. {{PLURAL:5000|1=Un seul|5000}} résultat{{PLURAL:5000||s}} au maximum {{PLURAL:5000|est|sont}} disponible{{PLURAL:5000||s}} dans le cache. {| class="sortable wikitable" ! Gadget !! data-sort-type="number" | Nombre d’utilisateurs !! data-sort-type="number" | Utilisateurs actifs |- |AncreTitres || 33 || 0 |- |ArchiveLinks || 12 || 0 |- |Barre de luxe || 36 || 1 |- |BoutonsLiens || 42 || 0 |- |CategoryAboveAll || 18 || 0 |- |CategorySeparator || 23 || 0 |- |CoinsArrondis || 100 || 0 |- |CollapseSidebox || 36 || 0 |- |CouleurContributions || 32 || 0 |- |CouleursLiens || 25 || 0 |- |DeluxeAdmin || 5 || 0 |- |DeluxeEdit || 36 || 0 |- |DeluxeHistory || 44 || 1 |- |DeluxeImport || 19 || 0 |- |DeluxeRename || 17 || 0 |- |DeluxeSummary || 35 || 0 |- |DevTools || 17 || 0 |- |DirectPageLink || 25 || 0 |- |Emoticons || 44 || 0 |- |EmoticonsToolbar || 46 || 0 |- |FastRevert || 37 || 0 |- |FixArrayAltLines || 23 || 1 |- |FlecheHaut || 67 || 1 |- |GoogleTrans || 28 || 0 |- |HotCats || 81 || 1 |- |JournalDebug || 22 || 0 |- |JournalEnTable || 2 || 0 |- |LeftPaneSwitch || 5 || 0 |- |ListeABordure || 30 || 0 |- |LiveRC || 30 || 0 |- |LocalLiveClock || 27 || 0 |- |Logo || 41 || 0 |- |MobileView || 17 || 0 |- |NavigAdmin || 38 || 0 |- |OngletEditCount || 45 || 0 |- |OngletEditZeroth || 67 || 0 |- |OngletGoogle || 28 || 1 |- |OngletPurge || 55 || 0 |- |OptimizedSuivi || 18 || 0 |- |Popups || 59 || 0 |- |RenommageCategorie || 6 || 1 |- |RestaurationDeluxe || 12 || 0 |- |RevertDiff || 36 || 2 |- |ScriptAutoVersion || 17 || 0 |- |ScriptSidebox || 32 || 0 |- |ScriptToolbar || 43 || 0 |- |SisterProjects || 16 || 0 |- |SkinPreview || 4 || 0 |- |Smart patrol || 3 || 1 |- |SourceLanguage || 25 || 0 |- |SousPages || 56 || 0 |- |SpaceToolbar || 30 || 0 |- |TableUnicode || 56 || 0 |- |Tableau || 67 || 1 |- |TitreDeluxe || 56 || 0 |- |TitreHierarchique || 17 || 0 |- |UTCLiveClock || 27 || 0 |- |UnicodeEditRendering || 29 || 0 |- |WikEd || 29 || 0 |- |autonum || 1 || 0 |- |massblock || 3 || 0 |- |monBrouillon || 19 || 0 |- |perpagecustomization || 17 || 0 |- |recentchangesbox || 15 || 0 |- |searchFocus || 18 || 0 |- |searchbox || 30 || 1 |} * [[Spécial:GadgetUsage]] * [[m:Meta:GUS2Wiki/Script|GUS2Wiki]] <!-- data in CSV format: AncreTitres,33,0 ArchiveLinks,12,0 Barre de luxe,36,1 BoutonsLiens,42,0 CategoryAboveAll,18,0 CategorySeparator,23,0 CoinsArrondis,100,0 CollapseSidebox,36,0 CouleurContributions,32,0 CouleursLiens,25,0 DeluxeAdmin,5,0 DeluxeEdit,36,0 DeluxeHistory,44,1 DeluxeImport,19,0 DeluxeRename,17,0 DeluxeSummary,35,0 DevTools,17,0 DirectPageLink,25,0 Emoticons,44,0 EmoticonsToolbar,46,0 FastRevert,37,0 FixArrayAltLines,23,1 FlecheHaut,67,1 GoogleTrans,28,0 HotCats,81,1 JournalDebug,22,0 JournalEnTable,2,0 LeftPaneSwitch,5,0 ListeABordure,30,0 LiveRC,30,0 LocalLiveClock,27,0 Logo,41,0 MobileView,17,0 NavigAdmin,38,0 OngletEditCount,45,0 OngletEditZeroth,67,0 OngletGoogle,28,1 OngletPurge,55,0 OptimizedSuivi,18,0 Popups,59,0 RenommageCategorie,6,1 RestaurationDeluxe,12,0 RevertDiff,36,2 ScriptAutoVersion,17,0 ScriptSidebox,32,0 ScriptToolbar,43,0 SisterProjects,16,0 SkinPreview,4,0 Smart patrol,3,1 SourceLanguage,25,0 SousPages,56,0 SpaceToolbar,30,0 TableUnicode,56,0 Tableau,67,1 TitreDeluxe,56,0 TitreHierarchique,17,0 UTCLiveClock,27,0 UnicodeEditRendering,29,0 WikEd,29,0 autonum,1,0 massblock,3,0 monBrouillon,19,0 perpagecustomization,17,0 recentchangesbox,15,0 searchFocus,18,0 searchbox,30,1 --> l0skqxvhj3gvsprqet5bq1ds1zqga4l Wikilivres:Le Bistro/2025 4 82069 745887 744929 2025-07-03T20:36:35Z Matthius 11787 /* Propagande, prosélitisme, autopromotion, militanatisme, etc */ Réponse 745887 wikitext text/x-wiki <noinclude>{{Wikilivres:Le Bistro/En-tête}}</noinclude> == compléter les bons conseils pour un nouveau livre == bonjour wikilivre ! je refais un tour sur ce wiki depuis un sacré bout de temps. Je vois que certains noms sont toujours là :) wouah. J'ai entâmé un livre nouveau aka. [[La sécurité du citoyen dans son logement]] que je vais encore améliorer mais je me pose dejà quelques questions sur le process, et vu que [[Wikilivres/Créer un wikilivre]] est assez high level je préfère demander ici des conseils. J'aime à penser que si l'idée est pertinente le guide pourra évoluer rapidement. * '''AutoCat''': il est indiqué clairement dans le guide pour la page de garde du livre de mettre <code><nowiki>{{AutoCat}}</nowiki></code> en bas de page, mais est-ce conseillé également sur chaque page du livre ? ça a l'air de marcher et donc plutôt oui: & si oui on pourrait l'ajouter dans le guide ? * je ne sais pas quoi mettre dans `CDU item` : on peut peut être orienter vers une bonne page sur le comment remplir le template proposé sur la page de garde * '''navigation horizontale''': est-ce qu'un moyen universel permet de suivre les chapitres d'un livre ? ex. si je suis sur un chapitre et que je veux aller au suivant, soit je passe par la page parent, soit je passe par la catégorie. Mais je voudrai (mieux qu') un bouton "next" / "previous". Enfin voici l'idée. S'il y a des choses en template automatique, je suis preneur (peut être le guide aussi) (PS: je vois que la gestion du sommaire est automatisée au sein même d'un chapitre : génial :) ) :NB: à une certaines époque j'utilisais des templates propres au livre (ex. [[Modèle:Les félins]]) et je vois que certains livres ont repris l'idée.. * '''catégorie''' : que faut-il mettre exactement dans le contenu de la catégorie auto-générée pour le nouveau livre ? juste <code><nowiki>[[Catégorie:Livres par titre]]</nowiki></code> ? * '''livre modèle''' : avez-vous un livre "modèle" : c'est-à-dire un livre (probablement à succès & pas trop grand) qui serait particulièrement suivi par les habitués et sur lequel on retrouverai toutes les techniques les plus avancées pour bien rédiger un livre. Il apparaîtrait du coup en modèle dans le guide. qu'en pensez-vous ? [[Utilisateur:Boly38|Boly]] [[Discussion_Utilisateur:Boly38|♪]] 5 mars 2025 à 18:09 (CET) :Salut Boly :* Autocat : normalement, il ne se met que dans le modèle listant les chapitres du livre, inclus dans toutes les pages. Par exemple le modèle {{m|Programmation JavaFX}} est inclus comme ceci : <nowiki><noinclude>{{Programmation JavaFX}}</noinclude></nowiki>) dans tous les chapitres du livre [[Programmation JavaFX]]. :* [[Wikilivres:CDU]] : il y a un moteur de recherche pour trouver le classement, mais il n'est pas encore pleinement détaillé et parfois il faut créer les pages correspondantes à la CDU. J'utilise http://www.udcsummary.info/php/index.php?lang=fr pour ajouter les pages manquantes. Si tu trouves un ou plusieurs classement possibles, je peux me charger de créer les pages qui manquent. :* '''navigation horizontale''' : Fait automatiquement par l'inclusion du modèle dans toutes les pages. Voir par exemple : [[Programmation Java Swing/Introduction]]. Le modèle ajoute les liens suivant, précédent et une flèche au milieu pour déplier la liste complète des chapitres du livre. :Pour la catégorie, un petit descriptif, comme par exemple : <pre><nowiki> Catégorie recensant les pages du livre [[Programmation JavaFX]]. Pour discuter de la rédaction du livre c'est ici : [[Discussion:Programmation JavaFX]]. [[Catégorie:Java]] </nowiki></pre> :--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 5 mars 2025 à 19:22 (CET) ::J'ai fait des clics magiques (dans l'historique des pages) pour remercier ; je ne sais pas où ça atteri mais bon. Le template sommaire avec navigation par page c'est exactement ce que je voulais : c'est top :) & merci aussi pour les illustrations ! David L au top ! ! [[Utilisateur:Boly38|Boly]] [[Discussion_Utilisateur:Boly38|♪]] 7 mars 2025 à 18:04 (CET) == Problème de cache sur la page d'accueil == Salut, Les utilisateurs anonymes voient toujours les mêmes livres sur la page d'accueil (pendant plusieurs mois) alors que les livres changent tous les jours pour les utilisateurs connectés. Il faudrait installer l'extension [[mw:Extension:MagicNoCache]] afin de pouvoir utiliser <nowiki>__NOC</nowiki>ACHE__ sur la page d'accueil. --&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 29 mars 2025 à 20:56 (CET) :Bonjour, bien reçu, j'ai créé un ticket pour voir déjà si on peut diminuer ce cache à 24h (sinon il faudra voter pour l'extension) : https://phabricator.wikimedia.org/T390674. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<span style="color:#FF6600">$</span>♠]]) 1 avril 2025 à 11:46 (CEST) ::Merci JackPotte. ::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 1 avril 2025 à 19:00 (CEST) :::Un problème similaire a été signalé en 2023 [[phabricator:T351573]], et en 2017 [[phabricator:T119366]] mais pas la moindre action de correction depuis toutes les années écoulées. Les problèmes des "petits" wiki ne sont pas écoutés. :::J'ai donc créé la page de vote pour installer l'extension : [[Wikilivres:Prise de décision/Installer l'extension MagicNoCache]]. :::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 1 avril 2025 à 19:48 (CEST) ::::{{Mention|Lionel Scheepmans}}, {{Mention|Fourmidable}} : un avis / un vote sur ce sujet ? --&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 12 mai 2025 à 20:04 (CEST) :::::Je viens de donner mon avis sur la page idoine, merci du rappel ! [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 13 mai 2025 à 11:00 (CEST) == Erreur d'affichage sur la page d'accueil == Bonjour tout le monde, Un petit message pour savoir où nous en sommes sur le problème d'affichage dans la page d'accueil (débordement des cadres de livres suggérés sur la boîte à outils des utilisateurs connectés). Wikilivresquement, [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 26 avril 2025 à 17:59 (CEST) :Salut Fourmidable, :J'ai tenté de trouver une solution pour cet habillage, mais il est tellement mal conçu que ça semble impossible. :C'est le seul habillage qui pose problème, pour plusieurs pages et pas seulement la page d'accueil. :La décision arbitraire d'imposer cet habillage sans consulter la communauté du projet est une aberration. :Le mieux serait de : :# créer un bug pour l'habillage Vector-2022 qui ne fonctionne plus dès qu'il y a le moindre code CSS, :# créer une demande de fonctionnalité pour que les administrateurs du projet puisse sélectionner l'habillage par défaut par projet choisi par décision communautaire, :Mais comme les "petits wikis" ne sont pas écoutés, ce serait inutile (voir les nombreux exemples de problèmes reportés spécifiques à fr.wikibooks dont aucun n'a jamais été résolu). :--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 26 avril 2025 à 20:26 (CEST) ::Ok, en tout cas sache que je soutiens ta proposition ! [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 1 mai 2025 à 16:28 (CEST) == Matthius : le grand retour == Bonjour à tous, Quelqu'un veut-il bien m'aider à relire les [https://fr.wikibooks.org/w/index.php?title=Sp%C3%A9cial%3AContributions&target=Matthius&namespace=0&tagfilter=&newOnly=1&start=&end=&limit=50 nouveaux livres de Matthius] ? Il semble y avoir, une fois de plus, de graves problèmes de sourçage et des attaques (même déjà soulignées en 2023 !) contre "le libéralisme" et "la finance" avec des phrases obscures ; par exemple : * dans [[Conseils Chrétiens]] : "Le libéralisme empêche de voir la société. Alors on croit les films libéraux, faisant croire que l’individu fait la société, alors que c’est la société qui fait l’individu. En effet, notre ego est créé par notre famille." * dans [[Pourquoi un Dieu ?]] : "L'individualisme dû au libéralisme, de plus en plus prégnant, va par contre cacher de plus en plus notre sociabilité et notre créativité.", "le social-libéralisme ne sera que le moyen d'accéder au pouvoir par la voie opportune alors qu'on cachera le social au peuple, pour ne pas qu'il se comprenne. Le dirigeant social-libéral aura appris dans les écoles d'économie que les marchés c'est magique.", "désengager l'état, détruisant alors le développement donc la république", "La faille du libéralisme est la censure, censure permise par la pauvreté des esprits ayant peur des autres à cause de l'individualisme forcené. [...] Le libéralisme cherchera la censure pour empêcher qu'il y ait suffisamment d'esprits philosophes et créatifs s'intéressant à la politique.", "La finance croira alors qu'il faille installer une dictature pour liquider la population trop difficile à maîtriser. [...] il s'agit pour la finance de trouver de plus en plus d'illusions pour satisfaire la population" * dans [[Économie Enfants]] : le libéralisme a "rendu l’école non épanouissante par le manque de créativité, en disant que le pays ne peut plus se développer, à cause de la monnaie privée" et l'assertion non (mal ?) argumentée "Le libéralisme aboutit selon moi à l'abrutissement de l'individu, voire à la violence" * dans [[Devenir un Génie]] : "Ils sont ainsi devenus égoïstes, donc libéraux.", "le libéralisme peut apporter un manque de liberté, car c’est une doctrine et une idéologie orientée sur l'individu, individualisme cachant une société, allant alors vers la destruction du plus faible par une liberté sans limite.", "La finance a en fait tenté et tente de faire croire qu’elle s’occupe de notre liberté, alors qu’elle veut nous empêcher de nous émanciper." * dans [[Univers Vivant]] : "La finance veut que nous soyons des consommateurs alors que nous sommes des acteurs de la société.", "Pour les financiers la population pauvre doit souffrir de malnutrition.", la finance "devient alors autoritaire comme après la crise de 1929. Nous sommes à un moment crucial où nous pouvons remettre en cause l’idéologie scientiste aboutissant à nier la nature. Ainsi il y avait 1,7% de CO2 pendant le crétacé au lieu de 0,04 % en 2023." Notons que le dernier ouvrage en date, [[XXIe]], est particulièrement gratiné : * climatoscepticisme : "le GIEC aura causé une hécatombe de suicides pour un faux réchauffement de la terre" * théories du complot sur les résultats des élections occidentales : "Selon des journalistes de Sud Ouest diffusés sur Agora Vox qui ont récoltés les suffrages des élections de 2017 et qui ont suivi l’élection de 2022, Macron n’a pas été élu par les français. En réalité il est arrivé dernier des élections présidentielles de 2017.", "Emmanuel Macron avait des nuls médiatisés face à lui" * théories du complot sur la CIA et les démocrates américains : "les démocrates trichent sur les élections en 2021", "Les États-Unis sont partis d’Afghanistan pour préparer la guerre d’Ukraine" * biais prorusse : "la Russie entre en guerre contre l’Ukraine en février 2022, puisque l’Ukraine avait attaqué la Russie. Les médias occidentaux feront croire [...] que c’est la Russie qui attaque", "Vladimir Poutine est voulu par les russes, contrairement aux élus occidentaux. Les élections en Russie se déroulent suffisamment bien pour que la Russie soit considérée comme une démocratie." -- [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 11 mai 2025 à 17:24 (CEST) :J'ai lancé une série de [[Wikilivres:demandes de suppression|demandes de suppression]]. Je notifie les personnes ayant participé à l'[[Wikilivres:Demandes de suppression/2023|ancien débat (2023)]] : {{Mention|JackPotte}}, {{Mention|Lionel Scheepmans}} et {{Mention|DavidL}} pour info. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 12 mai 2025 à 11:23 (CEST) ::Salut @[[Utilisateur:Fourmidable|Fourmidable]].. C'est bien que tu inspecte le contenu de Wikiversité à la recherche de contenu indésirable ou problématiques. Mais je vois dans le titre de ce sujet de discussion une forme de sarcasme et de condescendance qui ne me semble pas adapter à un projet collaboration où tout le monde est le bienvenu peu importe ses croyance et ses idée. De plus la première personne concernée, c'est à dire l'auteur, n'y est pas notifiée. ::Ensuite, il fauétait une fois se mettre d'accord sur le fait que la ligne éditoriale de Wikiversité est différente à celle de Wikipedia. Un recueil de cours et de travaux de recherche, ce n'est pas une encyclopédie. On en a déjà discuté. La neutralité de point de vue n'existe pas dans l'enseignement ni dans la recherche. ::Pour preuve, mon fils a un cours de religion dans SZ formation secondaire et il peut choisir entre différentes religion ou opter pour un cours de morale et de citoyenneté. À l'université, les orientation idéologique des enseignants son souvent bien connue. Et il est évident que l'enseignement dans une business school sera plus libérale qu'une fac de théologie. ::Dans le cadre des travaux de recherches, la Liberté d'expression doit être complète, l'auteur doit être libre d'y faire ses propre interprétations des faits et développant sa propre argumentation. Sans quoi, c'est plus de la recherche. ::Finalement, un support d'enseignement dans un projet collaboratif, n'est pas un projet de recherche. On ne parle pas en "je" dans un cours, on le fait dans une recherche. Or, l'usage du "Je" implique une certaine subjectivité. ::En conclusion, je ne vois pas ce nouvelle appel dans la forme et l'énergie qu'il se présente, comme quelque chose de très collaboratif. Et je n'ai pas envie de jouer à nouveau le médiateur dans ce redémarage d'une confrontation idéologique entre deux contributeurs incapable de collaborer dans la production de contenu de qualité. ::Plutôt que de faire du rameutage ici, je te proposeraient plutôt, selon tes disponibilités, de collaborer aux écrits des auteurs en discutant avec eux sur le page de discussions de leurs articles au sujet des améliorations possibles. Plutôt que de faire appel à la suppression de toute une page pour certains passages problématiques, une démarche collaboratif serait d'aider à la résolutions de ces problèmes, dans le but de ne pas perdre tout le reste de la page. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 13:20 (CEST) :::Tu as raison, je notifie aussi {{Mention|Matthius}} en espérant que cette fois son comportement soit plus constructif... Concernant les ouvrages qui sont moins problématiques, j'ai fait des demandes dans les pages de discussion idoines. Ici on a des ouvrages clairement complotistes et anti-science qui nuisent à la réputation de Wikilivres. (PS : Nous sommes sur Wikilivres, pas sur Wikiversité ;)) [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 12 mai 2025 à 13:21 (CEST) ::::Entre-nous @[[Utilisateur:Fourmidable|Fourmidable]], je ne trouve pas ton comportement plus constructif, ni collaboratif que le tien... [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 13:24 (CEST) :::::À mes yeux et dans le cadre d'un projet collaboratif, commencer par une demande de suppression avant toute chose peut même être perçu comme violant. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 13:26 (CEST) ::::::Mon but n'est pas de faire une croisade pour le libéralisme ou le GIEC sur Wikilivres, mais il y a quand même des limites pour tenir la réputation du site et plus largement de la Wikimedia Foundation. Je te rejoins sur le fait que les auteurs ne doivent pas être libres d'écrire absolument tout ce qu'ils veulent, et aussi que la critique doit être constructive, mais ce n'est pas au créateur du livre d'être le seul arbitre de ce qui est raisonnable ou pas vis-à-vis de son travail (i.e. simple reformulation, suppression partielle ou totale...). Et en 2023 Matthius a montré un comportement très agressif vis-à-vis de mes critiques, ce qui a mené '''ensuite''' à des débats de suppression. Pour l'instant, je ne fais que soulever des phrases (souvent identiques à celles de 2023) que je trouve (de nouveau) hautement problématiques d'un point de vue scientifique (manque voire absence totale de sourçage), mais le passage par des demandes de suppression directement se justifie par une forme de récidive sur certaines affirmations auxquelles aucune amélioration n'a été apportée après critique. Tu m'accuses de rameutage, mais je ne fais que consulter la communauté dans son ensemble : ici pour une discussion globale, sur [[Wikilivres:Demandes de suppression]] pour un débat et un "vote" au cas par cas. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 12 mai 2025 à 13:34 (CEST) :::::::Désolé aussia pour le côté péjoratif du terme rameutage. Parlons de notiffication c'est plis adéquat. :::::::Je réalise seulement que l'on est sur wikilivres et pas Wikiversité. Désolé sur mon smartphone ça ne saute pas aux yeux. Il faut donc recontextualiser tout ce que j'ai écrits précédement. Heureusement, historiquement Wikiversité est un sous projet de wikilivre. Les deux projet sont très proches dans leurs mission pédagogique et mode de fonctionnement. L'objet ici étant de produire des livres pédagogiques pour toute les tranches d'âges et pas uniquement des ouvrages qui doivent répondre à à des attentes scientifiques. Il apparait dans tes propos des thermes très wikipédien tel que le sourçage et la neutralité de point de vue. Je ne pense pas que cela doit s'appliquer ici. :::::::Ensuite Wikilivres est trop petit pour avoir un commuté d'arbitrage et je n'ai pas envie de parcourir les historiques à la recherche de qui a commencé. Mais je maintient l'idée que notifier des personnes vers un appel à suppression est une démarche que je considère symboliqueemnt violente et me semble aussi être une récidive. :::::::As-tu cherché à améliorer les texte en question en discutant avec l'auteur avant de proposer leurs suppression ? :::::::As-tu conscience que nous sommes ici dans un projet collaboratif, pluraliste et non universitaire ? [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 15:02 (CEST) ::::::::Du reste, nous ne sommes pas ici pour répondre à des suposées attentes de la Fondation Wikimedia. Car le rôle de celle-ci est précisément de répondre aux notres. C'est le rôle d'une fondation. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 15:07 (CEST) :::::::::Bonjour, :::::::::Il faudrait avant tout classer les écrits de l'auteur, car il pourrait il y avoir un problème d'admissibilité, Wikilivres étant avant tout un projet de rédaction de livres '''pédagogiques'''. Ces écrits contiennent beaucoup d'avis personnels et présentent une vision sans discussion ni argumentation, sans apporter de pédagogie sur un sujet particulier. :::::::::Si on peut qualifier les écrits comme de la recherche, il vaudrait mieux les déplacer vers la wikiversité, où une communauté supplémentaire et plus expérimentée sur la recherche pourrait exprimer son avis sur le sujet ou sur comment améliorer/corriger les écrits de Matthius. :::::::::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 12 mai 2025 à 20:01 (CEST) ::::::::::Je plussoie {{Mention|DavidL}}. {{Mention|Lionel Scheepmans}} ce que tu dis s'applique aux cas où il y a une réelle démarche scientifique ou a minima une attitude collaborative de la part de l'auteur. Or : ::::::::::* premièrement (tu le sais sans doute, étant toi-même chercheur), les livres de Matthius sont très loin de toute méthode scientifique, c'est plutôt un ensemble d'assertions non sourcées qui font la promotion d'une idéologie (et on verse même dans l'antiscience avec les paragraphes sur le GIEC). On pourrait donner la parole à Matthius sur ce sujet mais je crains qu'il ne se définisse même pas lui-même comme scientifique ; ::::::::::* deuxièmement, avec cette série de recréations le 8 décembre dernier, sans attendre l'avis de la communauté, et avec les '''mêmes phrases''' problématiques (parfois à peine reformulées, souvent conservées à l'identique), je ne vois pas comment on pourrait supposer que Matthius fait preuve d'ouverture d'esprit et d'attitude collaborative. ::::::::::Bref, si vous voulez absolument garder tous ces ouvrages et essayer de composer tant bien que mal avec la pugnacité de leur auteur, ce sera sans moi... À mon avis, il serait nettement plus profitable de traduire les livrels de [[:en:Subject:Economics|Wikibooks en anglais sur l'économie]], par exemple. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 13 mai 2025 à 11:07 (CEST) :::::::::::Je viens de prévenir Matthius par mail. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 13 mai 2025 à 11:12 (CEST) ::::::::::::Tree bien. Moi aussi, je n'ai plus envie de consacrer du temps là dessus. Je vous laisse donc traiter la situation puisque votre avis est majoritaire. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 13 mai 2025 à 11:27 (CEST) :::::::::::Je ne comprends pas cette assertion. Je cite François Gervais contre le GIEC, qui a écrit pour le GIEC sans être entendu pour la conclusion. :::::::::::Je n'ai pas reformulé mes phrases à l'identique. J'ai soit indiqué la source contrairement à ce qui dit Fourmidable, soit indiqué que c'était mon point de vue ou émis une explication. Aussi quand je fais une assertion scientifique, j'en indique souvent la cause scientifique. Fourmidable a tendance à reprendre les phrases où je répète ce qui a été écrit avant pour aller plus loin. Donc il faut chercher dans mes livrels la phrase où je cite et où j'émets une hypothèse avec la cause scientifique. Je vais relire Fourmidable. :::::::::::Aussi j'ai trouvé sur l'[http://web.archive.org/web/20240810201141/https://www.google.com/search?q=mati%C3%A8re+temps+%C3%A2me âme qui ralentit la vitesse]. Je pense que Google utilise une IA pour détecter les limites de l'humain. Mon expérience de pensée va contre le matérialisme scientifique puisque j'émets l'hypothèse supérieure qu'il existe des multivers où des âmes agissent sur le nôtre. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 13 mai 2025 à 11:36 (CEST) :::::::::::Je ne pense pas effectivement que mon livrel sur le XXIe va rester sur wikibooks puisque il va contre ce qu'indique wikipedia. J'espère juste qu'il puisse rester. :::::::::::Seulement j'ai une formation en ingénierie et j'ai trouvé sur [https://archive.org/details/TempsAme l'âme qui ralentit la vitesse] [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 13 mai 2025 à 12:13 (CEST) ::::::::::Vous admettez {{Mention|DavidL}} que vous ne connaissez pas les domaines que j'aborde. Mes livrels sont pédagogiques donc vous pouvez apprendre avec. Donc lisez les avant d'émettre l'hypothèse qu'ils ne le sont pas. J'ai créé le coaching sans coach qui a permis de revoir la pédagogie d'un journal d'un réseau international. Mais cela ne m'empêche pas d'aller contre le libéralisme et l'appât du gain qui sont selon moi les fléaux actuels. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 13 mai 2025 à 12:06 (CEST) :::::::::::@[[Utilisateur:Matthius|Matthius]] semble ouvert au débat et à une aide pour améliorer ses textes. La suppression ne me semble donc pas une option souhaitable. Wikilivres est indépendant de Wikipédia. Il faut donc se référer à nos règles et recommandations locale disponible dans les espaces de noms "wikilivres" et "aide". Je vais essayer de prendre le temps d'écouter les textes avec une voix de synthèse pour gagner du temps. Cela me permettra d'en faire des commentaire en vue d'une amélioration. Car si ce sont des sources qui manques et bien il suffit de les ajouter. Nous sommes là pour travailler ensemble pour produire des ouvrages pédagogiques de qualité, pas pour juger du travail des autres en vue d'une suppression. Restons, s'il vous plait dans un esprit d'entraide et de collaboration. C'est tellement rare à notre époque... [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 14 mai 2025 à 15:00 (CEST) :::::::::::Mon livrel sur le XXIe siècle en cours d'écriture va aussi contre les théories du complot occidentales. J'écris que la Russie et la Chine sont des démocraties, alors que nos médias disent que ce sont des dictatures. J'émets effectivement des hypothèses non sourcées dans ce nouveau livrel. Je peux et vais les sourcer. Par contre j'utiliserai des sources primaires. En réalité, j'émets l'hypothèse que ce sont nos médias qui sont dans la post-vérité et que ce ne sont pas les médias étatsuniens, ni russes, ni chinois qui y sont. Ce livrel est effectivement une bombe dangereuse contre nos médias comme l'indique Fourmidable. ::::::::::::Je ne comprends pas l'acharnement de Fourmidable à ne pas vouloir discuter avec moi et à vouloir automatiquement supprimer mes livrels sans discussion préalable. En effet il a eu un an pour m'indiquer comment améliorer mes livrels. Et que Fourmidable ne me dise pas que c'est moi qui ait commencé, puisque j'étais outré qu'on veuille supprimer mes livrels avec ses copains sans discussion pédagagogique au tout début. ::::::::::::Concernant la neutralité de wikipedia : wikipedia ne fait que révéler l'avis des médias financés donc il n'est pas neutre. Être neutre c'est révéler tous les points de vue, même ceux avec lesquels on n'est pas d'accord, ce que [https://archive.org/details/wikipediaCo-Fondateur fit wikipedia au début de son histoire] et ce pour quoi je me suis intéressé et ai été réprimé sauf pour wikibooks anglais qui m'a viré pour ne pas enlever mon nom. :{{Mention|Matthius}} Avez-vous l'intention de publier des livres scientifiques, c'est-à-dire sourcés par de la science publiée et évaluée par les pairs, et à défaut de grands médias nationaux et internationaux ? Vous pouvez aussi tester vos hypothèses mais votre travail ne doit pas consister à sélectionner les sources qui vous conviennent pour seulement valider votre théorie, en mettant de coté tout ce qui vous dérangerait dans cette entreprise. --[[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 10:48 (CEST) ::@[[Utilisateur:Fourmidable|Fourmidable]], je pense que tu te fais une vision fausse du monde de l'édition. @[[Utilisateur:Matthius|Matthius]] peut payé une maison d'édition, dans le cadre d'une [[w:Édition_à_compte_d'auteur|édition à compte d'auteur]]. Probablement qu'il l'a déjà fait puisqu'il a déjà publié des ouvrages au format papier parmi ceux qu'il veut placer sur Wikilivres. Il en a même déposé certains dans une bibliothèque universitaire. Quant à la revue par les paires ne se fait que dans le cadre des journaux scientifique. ::J'ai écouté l'ouvrage [[Pourquoi un Dieu ?]] Et je trouve effectivement qu'il n'a pas sa place dans Wikilivres. Non pas parce qu'il critique le libéralisme avec des propos que je partage en grande partie, mais parce qu'il s'apparente plus à de la propagande chrétienne qu'à un réel ouvrage pédagogique sur le sujet. ::Matthius y est en posture de prédicateur et non de pédagogue. Je dirais que la moitié des phrases de l'ouvrage que j'ai écouté sont des affirmations sans argumentation ni démonstration valide. La thèse de son ouvrage se résume à dire que dieu est la seule chose qui peut expliquer un phénomène actuellement inexpliqué. Ce qui est une corrélation fallacieuse puisqu'il n'existe aucun lien de causalité. ::Pour moi, les ouvrages évangéliste ou propagandiste n'ont pas leur place dans Wikilivres et je serais d'avis d'ouvrir une prise de décision pour établir une règle d'interdiction. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 11:42 (CEST) :::Oui voilà, nous sommes d'accord. Peut-être que Matthius peut adopter une attitude plus scientifique, mais l'esprit de "pédagogie" s'accompagne forcément d'une démarche scientifique, sinon c'est de la prédication/propagande. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 11:45 (CEST) ::::@[[Utilisateur:Fourmidable|Fourmidable]]... Wikilivres n'est pas une bibliothèque "scientifique" mais pédagogique. Tu sembles confondre les deux termes. Les livres pour enfants que contient Wikilivres ne sont pas "scientifique" tout en étant pédagogiques. ::::Un autre fait qui peut être reproché à @[[Utilisateur:Matthius|Matthius]] est son autopromotion, [[Wikilivres:Présentation#● Wikilivres n'est pas une vitrine|alors que la démarche proscrite sur Wikilivres]]. ::::Plutôt que de supprimer l'important travail effectué par Matthius, je propose à nouveau de le déplacer en sous page de son espace utilisateur pour qu'il puisse retravailler ses écrits. ::::Pour un retour dans l'espace principale, il faudrait au préalable qu'il supprime des ses travaux toute forme d'autopromotion et toute forme propagande, prosélytisme ou autre type de discours prédicateur. Ceci notamment en référence aux choix politiques [https://www.senat.fr/leg/ppl17-386.html français], [https://www.rtbf.be/article/le-proselytisme-religieux-ou-politique-n-a-pas-sa-place-a-l-ecole-quels-chiffres-derriere-ce-phenomene-pointe-par-la-ministre-de-l-education-11477234 belge], [https://www.assnat.qc.ca/fr/travaux-parlementaires/projets-loi/projet-loi-94-43-1.html Quebec], [https://ge.ch/grandconseil/data/loisvotee/L11764.pdf suisse]. Quatres communautés culturelles très largement majoritaire dans l'espace francophone des projets Wikimédia. ::::J'invite Matthius et les autres membres de notre communauté réagir à ce message et de discuter du lancement d'une nouvelle prise de décision pour interdire la propagande et le prosélytisme dans Wikilivres. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 12:21 (CEST) :::::Ce que je veux dire, c'est qu'un bon livre pédagogique s'appuie forcément sur des connaissances scientifiques. Ok pour un redéplacement. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 12:37 (CEST) ::::::Ne fais pas à ton tour du prosélytisme scientifique @[[Utilisateur:Fourmidable|Fourmidable]]. La science et les connaissances dites scientifiques comme tu les entends n'est pas la seule chose sur laquelle on peut s'appuyer pour produire un contenu pédagogique. ::::::Que fais-tu de la méditation, de l'humour, de la poésie, de la musique, du dessin, et toute autre expression artistique ? ::::::Et il existe aussi un tas d'ouvrages pédagogique religieux (pour le catéchisme entre autre), sauf que, comme la plupart des législations nationales des pays francophones occidentaux, je pense qu'ils n'ont pas leur place dans Wikilivres. Ce sur quoi nous devons nous positionner dans une prise de décision collective. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 12:52 (CEST) :::::::Ah oui, dans ce sens-là il y a en effet moins de science à proprement parler… Mais je ne suis pas sûr que cela s'applique aux propos politiques. Ça ne me viendrait pas à l'idée de faire un Wikilivre afin de convertir les gens au libéralisme, par exemple. C'est le rôle d'autres wikis ou sites web spécialisés. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 14:44 (CEST) :::Je vais supprimer Du même Auteur et Du même éditeur de mes wikilivres. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 15 mai 2025 à 12:32 (CEST) ::::Si vous voulez, mais c'est loin d'être le point principal. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 12:38 (CEST) :::::Effectivement @[[Utilisateur:Matthius|Matthius]], c'est une bonne résolution, mais il reste le prosélytisme à résoudre et je pense que cela demande beaucoup de travail à réaliser dans votre espace de travail personnel. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 12:55 (CEST) ::::::Vous mettiez que seul Pourquoi un Dieu est prosélyte. J'avais effectivement un doute en ajoutant ce livrel. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 15 mai 2025 à 19:43 (CEST) :::::::Je n'ai pas encore eu le temps d'écouter les autres livres @[[Utilisateur:Matthius|Matthius]] . Nous somme tous bénévoles ici. Cela peut prendre du temps, mais je vous invite déjà à déplacer vous-même le livre ''Pourquoi un Dieu'' dans vos sous page utilisateur''.'' :::::::Par anticipation, je peux déjà dire que tous les autres ouvrages faisant la publicité de vos écris doit être modifier ou retirer de l'espace principale ainsi que tous ceux qui font référence à Dieu ou au catholicisme de manière prosélyte. :::::::Seul le nom des auteurs devrais être repris dans les livre avec éventuellement des hyperliens vers leurs pages utilisateur qu'il sont libre d'éditer comme il veulent. :::::::On peut ensuite créer des pages catégories qui reprennent tous les travaux des auteurs, avec l'avantage qu'elle se complétent automatiquement à chaque fois que l'on ajoute une catégorie en bas de page d'un ouvrage. Vous trouverrez certainement des indication dans les pages d'aide. :::::::Je vous rassure sur le fait que ce traitement serait semblable pour un politicien libéral faisant la publicité de son parti, de ses idéologies et de sa personne. N'hésitez pas d'ailleurs à parcourir les autres wikilives pour y détecter ce genre de problème avant de nous le signaler. C'est ce que fait @[[Utilisateur:Fourmidable|Fourmidable]] en cherchant à veiller sur la qualité et la conformité de notre projet. Une belle fin de journée ! [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 16 mai 2025 à 11:41 (CEST) ::::::::Pour info, je confirme et soutiens tout ce que propose {{Mention|Lionel Scheepmans}} dans son dernier message (merci à lui). [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 16 mai 2025 à 12:01 (CEST) ::::::::Pourquoi a Dieu a été mis à jour dans mon espace personnel. Je ne sais pas comment effacer une page wikibooks.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 16 mai 2025 à 12:24 (CEST) :::::::::@[[Utilisateur:Matthius|Matthius]]. Je ne comprends pas ce que vous dite. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 16 mai 2025 à 15:16 (CEST) ::::::::::J'ai copié-collé Pourquoi un Dieu dans ma page personnelle. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 16 mai 2025 à 21:36 (CEST) :::::::::::Ah très bien @[[Utilisateur:Matthius|Matthius]]. Mais en fait, il est possible de déplacer les pages en les renomant. Cela permet de conserver tout l'historique de l'édition. Je vais le faire quand je serai sur PC. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 17 mai 2025 à 03:34 (CEST) ::::::::::::Ne le faites pas : L'original de l'historique est sur mon espace perso. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 17 mai 2025 à 09:30 (CEST) :::::::::::::@[[Utilisateur:Matthius|Matthius]], j'ai écouté l'ouvrage Économie enfant. Si j'étais à la tête d'une maison d'édition, je ne publierais pas ce manuscrit. Il y a des passages très intéressants avec des idées originales que je partage, mais aucune argumentation pour les valider. Pour le reste, on retrouve un copié collé du précédent ouvrage. Beaucoup d'information factuelle sans réelle contextualisation ni fil conducteur et puis de nombreuses affirmations gratuites qui ne sont finalement que des opinions très relatives et de nouveau non argumentées. :::::::::::::Le pire étant que certaine de ces affirmations son tout simplement fausses ou inscensées. :::::::::::::Exemples d'une phrase : :::::::::::::« Écrire sur ce que vous comprenez de l’archéologie, qui est l’humanité avant l’écriture. » :::::::::::::Cette phrase est erronée et n'a même aucun sens. L'archéologie n'est pas l'humanité, mais un domaine des sciences créé par les humains. Ensuite, l'archéologie n'est pas quelque chose qui se limite à avant l'écriture. Il existe des nombreux sites archéologiques qui fouillent les vestiges de la Rome antique. Une civilisation qui n'était pas dénuée d'écriture. :::::::::::::Exemple d'un paragraphe : :::::::::::::« Le [[w:Capital|capital]] de l’humanité peut donc être la Terre. En effet, l'argent est produit à partir du papier venant du bois. Les trafiquants ont toujours voulu se l'approprier. Le capital pourrait donc ne pas être l’argent. Le troc nécessite cependant un patrimoine conséquent. La Chine veut s’approprier le capital Lune, pour y prendre l’Helium 3 selon Solidarité et Progrès, seule ressource lunaire qu'il est intéressant de transporter, afin de le fusionner, pour en obtenir de l’énergie illimitée, favorisant la créativité par le surplus de biens. » :::::::::::::Ce paragraphe est incompréhensible et citer un parti politique (à d'autres reprises aussi dans l'ouvrage) comme source pour poser une affirmation, pose deux gros problèmes. 1 celui de faire la publicité d'une idéologie au sein d'un écrit pédagogique, 2 celui de ne pas respecter un des principes de base de l'écriture scientifique alors que le livre en parle et la défend. :::::::::::::Je n'irai pas plus loin dans les exemples. :::::::::::::Dans leurs états actuels et pour que ces livres travaux d'écritures soient admissibles dans Wikilivres. Je pense que vous devez impérativement supprimer : :::::::::::::* toute promotion personnelle. :::::::::::::* toute forme de Prosélytisme religieux. :::::::::::::* toute forme de publicité ou contre publicité politique et partisane :::::::::::::* toute affirmation fausse et autres types de fabulations. :::::::::::::* tout raisonnement ou démonstration sans lien de causalité. :::::::::::::Suite à quoi, il faudrait encore dans l'idéal en améliorer le style de sorte à y développer un fil conducteur qui permettrait aux lecteurs de suivre un développement ordonné propice à l'apprentissage, et non leur soumettre un journal de réflexions personnelles, reprenant des erreurs factuelles et logiques. :::::::::::::C'est un travail conséquent. :::::::::::::Et en ce qui concerne le prosélytisme, les approches politiques partisanes, il est impératif, y compris les sous page de votre page utilisateur. :::::::::::::Il y a des idées intéressantes dans vos écrits, et je partage pas mal de vos points de vue concernant la question du néolibéralisme. Mais Wikilivres n'est pas une tribune d'opinion à l'image d'AgoraVox. Nous sommes ici pour produire des ouvrages pédagogiques. Pas pour influencer nos lecteurs en faveurs ou à l'encontre de certaines religions ou idéologies. :::::::::::::Tout en l'encourageant à le faire de manière plus courtoise et constructive, je remercie donc @[[Utilisateur:Fourmidable|Fourmidable]] de nous avoir alerté sur l'incompatibilité de vos ouvrages avec notre projet. Dans tous les cas ceux que j'ai écoutés jusqu'à présent. :::::::::::::J'aimerais à votre tour vous encourager à poursuivre vos travaux d'écriture en cherchant à vous rapprocher de notre objectif tout en respectant nos règles et recommandations. Mais sachez aussi que vous pouvez aussi améliorer l'article de Wikipédia sur l'[[w:Économie_réelle|économie réelle]]. Ou aussi développer une leçon sur Wikiversité sur le même sujet dans la [[v:Faculté:Économie|Faculté d'Économie]]. C'est un sujet intéressant qui permet de mettre en lumières les limites de la [[w:Finance|finance]]. :::::::::::::Ces deux activités seraient moins ambitieuses que de vouloir produire un livre de qualité pour expliquer l'économie aux enfants. Cela demande une grande maîtrise du sujet en plus d'un certain don pour la vulgarisation. :::::::::::::Il me reste deux ouvrages proposés à la suppression à écouter, mais j'ai bien peur d'y retrouver les mêmes incompatibilités que celles que je viens d'expliquer à l'instant. :::::::::::::Bien cordialement, [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 26 mai 2025 à 21:16 (CEST) :::::::::::::Mon correcteur orhtographique ne fonctionnant pas pour des commentaires aussi long, le message que je viens de laisser est truflé de fautes et je n'ai pas le temps ni le courrage de les corriger. Encore une fois, le travail que je fournis sur ce projet est tout à fait bénévole. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 26 mai 2025 à 21:21 (CEST) ::::::::::::::J'ai passé beaucoup de temps à élaborer le coaching sans coach. Ce n'est naturel pour aucun ancien élève de simplifier. Je ne sais pas combien de fois j'ai relu Comment Écrire des Histoires. J'ai toujours beaucoup de temps devant moi pour revoir mes livrels.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 10:51 (CEST) :::::::::::::::@[[Utilisateur:Matthius|Matthius]], c'est précisément parce que vous travailler beaucoup et que vous Me semblez de bonne foi et volonté, que je passe autant de temps à vous aiidez. Tous vos textes comprends des problèmes qu'il faut résoudre. Vous devriez commencer par supprimer tout ce qui fait référence à vous, à la religion et au politique, pour ne garder que des faits et affirmations vérifiées par des sources sûres et non partisannes, à chaque fois pour vous assurez que vous n'être pas simplement en train de diffuser ou colporter une opinion fausse et/ou partisane. Ce qui vient d'être dit est incontournable. :::::::::::::::Je penses ensuite qu'indique messages auxquelles ont été écrites vos sections sont superflues dans le cadre d'un ouvrage pédagogique. La chronologie de vos écrits n'est pas un bon un fil conducteur. Encore une fois, Wikilivres n'est pas un lieu pour publier ses mémoires ou ses réélections du jour. Il existe le format blog pour ce genre de choses. :::::::::::::::Tennez compte aussi que nous ne disposons pas forcément d'autant de temps et de motivation que pour revoir vos livres. Raison pour laquelle, des méthodes plus expéditives telles que la suppression complète des pages inadaptées à notre projet finiront par être appliquées. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 13:18 (CEST) ::::::::::::::::Le livrel le plus important pour moi est l'économie pour les enfants, vient ensuite devenir un génie. L'Univers est Vivant a été référencé sur les moteurs de recherche récemment parce que j'ai trouvé sur l'âme qui ralentit la vitesse. Quand on cherche matière temps âme sur les moteurs de recherche occidentaux on tombe sur ma page archive.org/details/TempsAme. Il n'y a toujours pas de chercheur qui a publié sur la mathématisation de ma trouvaille. L'univers est vivant est une amélioration d'un autre livre. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 13:56 (CEST) ::::::::::::::::Je viens de mettre mon [http://matthieu.giroux.free.fr/html/cv.htm CV] à jour pour montrer ce que j'ai influencé. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 14:05 (CEST) ::::::::::::::::C'est moi qui ai diffusé le terme économie réelle. Je reproche à ceux qui l'ont utilisé d'être des économistes scolaires, c'est à dire de se référer à l'économie monétaire pour parler d'économie réelle. Je peux cependant mettre un historique de cette économie sur la page wikipedia. Je me demande juste s'il va rester. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 14:08 (CEST) :::::::::::::::::Je suis désolé @[[Utilisateur:Matthius|Matthius]]. Je ne vais pas poursuivre nos conversations faute d'en avoir envie. Vous ma laissez sur cette impression que votre motivation première est de promouvoir votre personne, vos valeurs et vos idées. Je vais donc arrêter de vous consacrer du temps. Je suis ici pour soutenir et développer les projets et intérêts collectifs et non individuels. Bonne chance pour vos ambitions que je vous invite à réaliser en dehors des projets Wikipédia. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 15:00 (CEST) ::::::::::::::::::Mon projet relève de l'intérêt général de faire connaître l'économie du XIX{{e}} siècle de [[Henry Charles Carey]]. Mon égoïsme peut donc être aussi le vôtre. Pour moi il faut être intelligent et égoïste pour défendre l'intérêt général. Je pense qu'on peut tous avoir l'air de génies comme les enfants peuvent avoir l'air de génies. Oui, je suis militant et veux faire partager la joie de la politique. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 15:55 (CEST) :::::::::::::::::::Nous ne sommes donc pas sur la même longueur d'onde. Je vois invite à ne pas faire de militantisme sur les projets wikimedia. Il y a d'autres endois pour le faire. La blogosphère, des tribune comme agoravox, et de nombreux sites web tenus par des communautés militantes et reliée aux valeurs et idées pour lesquelles vous militer. Ceci est mon dernier message à ce sujet. Cordialement. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 16:18 (CEST) ::::::::::::::::::::Je vous mets au défi de penser que les wikipédiens ne sont pas des militants. Eux veulent aussi défendre l'intérêt général en apportant la connaissance. Par contre ils ne ciblent pas leurs apports. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 17:10 (CEST) ::::::::::::::::::::Comme prévu, on me dit que mon [https://fr.wikipedia.org/wiki/%C3%89conomie_r%C3%A9elle#Histoire ajout sur l'économie réelle] est inédit. Je pense que vous vous êtes intéressé à certains de mes écrits parce qu'ils vous apportaient des réponses. Je peux faire cela sur wikibooks. Seulement c'est encore plus difficile sur wikipedia. Je ne suis pas théseux. Oui l'économie réelle a été créée pour faire connaître l'économie physique de Lyndon Larouche. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 30 mai 2025 à 17:15 (CEST) :::::::::::::::::::::Merci quand même ! [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 31 mai 2025 à 00:24 (CEST) :Mon livrel l'univers est vivant [https://www.agoravox.tv/actualites/technologies/article/et-si-la-physique-quantique-avait-105532 a eu un impact]. Je pense aussi avoir influencé les jeunes qui se sont tournés vers la bible. == [Recherche universitaire] Questionnaire sur la gouvernance Wikimedia == Bonjour à toutes et à tous, Dans le cadre d’un mémoire de recherche sur les modèles de gouvernance décentralisés dans les communs numériques, je mène une étude analysant le mouvement Wikimedia. L’objectif est de mieux comprendre la perception qu’ont les contributeurs et contributrices des projets Wikimedia (Wikilivres, Wikipédia, Wikidata, Commons, etc.) de la Fondation Wikimedia, de ses décisions, et des relations avec les chapters locaux (ex. Wikimédia France). Un questionnaire anonyme, rapide à remplir (environ 5 minutes), a été conçu à cet effet. Il s’adresse à toute personne majeure ayant déjà contribué à un projet Wikimedia, quelle que soit l’ancienneté ou le niveau d’implication. Lien vers le questionnaire : framaforms.org/questionnaire-communaute-wikipedienne-et-la-wikimedia-fondation-1747225404 '''Important''' : Les résultats seront utilisés uniquement dans un cadre académique. L'enquête, ainsi que l'étude, ne sont ni commandités ni supervisés par la Fondation ou aucun chapitre local. Il s'agit simplement d'un projet scolaire que je mène {{sourire}}. Merci d’avance pour votre participation ! [[Utilisateur:3(MG)²|3(MG)²]] ([[Discussion utilisateur:3(MG)²|discussion]]) 27 mai 2025 à 10:43 (CEST) :J'ai répondu. Bon courage pour ton mémoire ! (Ça me fait penser que je dois avancer sur le mien aussi...) [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 29 mai 2025 à 23:28 (CEST) == Propagande, prosélitisme, autopromotion, militanatisme, etc == Bonjours à la communauté des contributeurs de Wikilivres. Je me dit qu'il serait bon de faire une nouvelle prise de décision pour mieux cadrer le contenu de notre projet par rapport à ce qui se situebdans le titre de ce message. Qu'en pensez-vous ? [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 16:22 (CEST) :Totalement {{Pour}} ! [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 29 mai 2025 à 21:53 (CEST) :L'économie financière peut être considérée comme une propagande puisque son utilisation ne permet pas de lier la macro-économie et la micro-économie, ne permettant donc pas de développer une société comme le fait l'[https://fr.wikipedia.org/wiki/%C3%89conomie_r%C3%A9elle économie réelle]. :Si on considère le prosélytisme comme convaincre de rejoindre sa communauté, il faudrait donc enlever tous les wikilivres qui sont beaucoup lus, puisque les wikilivres qui sont peu lus n'arrivent pas à convaincre. :L'autopromotion permet malgré tout de connaître ce que fait l'auteur d'un wikilivre. Si on enlève le chemin qu'a suivi l'auteur, on évacuerait ainsi ses contradictions et on pourrait donc faire dire à un auteur l'inverse de ce qu'il a compris au bout de son parcours. :Je considère ceux qui contribuent à wikipedia et à wikibooks comme des militants, puisqu'ils essaient d'influencer les autres avec ce qu'ils écrivent sur ces sites web. Certes, certains travaux peuvent être désintéressés, mais alors pourquoi mettre ces travaux sur ces sites web alors. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 3 juillet 2025 à 22:36 (CEST) k7scrtvxy6wxq77jza0meibuf6h4m04 745888 745887 2025-07-03T20:41:21Z Matthius 11787 /* Propagande, prosélitisme, autopromotion, militanatisme, etc */ Réponse 745888 wikitext text/x-wiki <noinclude>{{Wikilivres:Le Bistro/En-tête}}</noinclude> == compléter les bons conseils pour un nouveau livre == bonjour wikilivre ! je refais un tour sur ce wiki depuis un sacré bout de temps. Je vois que certains noms sont toujours là :) wouah. J'ai entâmé un livre nouveau aka. [[La sécurité du citoyen dans son logement]] que je vais encore améliorer mais je me pose dejà quelques questions sur le process, et vu que [[Wikilivres/Créer un wikilivre]] est assez high level je préfère demander ici des conseils. J'aime à penser que si l'idée est pertinente le guide pourra évoluer rapidement. * '''AutoCat''': il est indiqué clairement dans le guide pour la page de garde du livre de mettre <code><nowiki>{{AutoCat}}</nowiki></code> en bas de page, mais est-ce conseillé également sur chaque page du livre ? ça a l'air de marcher et donc plutôt oui: & si oui on pourrait l'ajouter dans le guide ? * je ne sais pas quoi mettre dans `CDU item` : on peut peut être orienter vers une bonne page sur le comment remplir le template proposé sur la page de garde * '''navigation horizontale''': est-ce qu'un moyen universel permet de suivre les chapitres d'un livre ? ex. si je suis sur un chapitre et que je veux aller au suivant, soit je passe par la page parent, soit je passe par la catégorie. Mais je voudrai (mieux qu') un bouton "next" / "previous". Enfin voici l'idée. S'il y a des choses en template automatique, je suis preneur (peut être le guide aussi) (PS: je vois que la gestion du sommaire est automatisée au sein même d'un chapitre : génial :) ) :NB: à une certaines époque j'utilisais des templates propres au livre (ex. [[Modèle:Les félins]]) et je vois que certains livres ont repris l'idée.. * '''catégorie''' : que faut-il mettre exactement dans le contenu de la catégorie auto-générée pour le nouveau livre ? juste <code><nowiki>[[Catégorie:Livres par titre]]</nowiki></code> ? * '''livre modèle''' : avez-vous un livre "modèle" : c'est-à-dire un livre (probablement à succès & pas trop grand) qui serait particulièrement suivi par les habitués et sur lequel on retrouverai toutes les techniques les plus avancées pour bien rédiger un livre. Il apparaîtrait du coup en modèle dans le guide. qu'en pensez-vous ? [[Utilisateur:Boly38|Boly]] [[Discussion_Utilisateur:Boly38|♪]] 5 mars 2025 à 18:09 (CET) :Salut Boly :* Autocat : normalement, il ne se met que dans le modèle listant les chapitres du livre, inclus dans toutes les pages. Par exemple le modèle {{m|Programmation JavaFX}} est inclus comme ceci : <nowiki><noinclude>{{Programmation JavaFX}}</noinclude></nowiki>) dans tous les chapitres du livre [[Programmation JavaFX]]. :* [[Wikilivres:CDU]] : il y a un moteur de recherche pour trouver le classement, mais il n'est pas encore pleinement détaillé et parfois il faut créer les pages correspondantes à la CDU. J'utilise http://www.udcsummary.info/php/index.php?lang=fr pour ajouter les pages manquantes. Si tu trouves un ou plusieurs classement possibles, je peux me charger de créer les pages qui manquent. :* '''navigation horizontale''' : Fait automatiquement par l'inclusion du modèle dans toutes les pages. Voir par exemple : [[Programmation Java Swing/Introduction]]. Le modèle ajoute les liens suivant, précédent et une flèche au milieu pour déplier la liste complète des chapitres du livre. :Pour la catégorie, un petit descriptif, comme par exemple : <pre><nowiki> Catégorie recensant les pages du livre [[Programmation JavaFX]]. Pour discuter de la rédaction du livre c'est ici : [[Discussion:Programmation JavaFX]]. [[Catégorie:Java]] </nowiki></pre> :--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 5 mars 2025 à 19:22 (CET) ::J'ai fait des clics magiques (dans l'historique des pages) pour remercier ; je ne sais pas où ça atteri mais bon. Le template sommaire avec navigation par page c'est exactement ce que je voulais : c'est top :) & merci aussi pour les illustrations ! David L au top ! ! [[Utilisateur:Boly38|Boly]] [[Discussion_Utilisateur:Boly38|♪]] 7 mars 2025 à 18:04 (CET) == Problème de cache sur la page d'accueil == Salut, Les utilisateurs anonymes voient toujours les mêmes livres sur la page d'accueil (pendant plusieurs mois) alors que les livres changent tous les jours pour les utilisateurs connectés. Il faudrait installer l'extension [[mw:Extension:MagicNoCache]] afin de pouvoir utiliser <nowiki>__NOC</nowiki>ACHE__ sur la page d'accueil. --&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 29 mars 2025 à 20:56 (CET) :Bonjour, bien reçu, j'ai créé un ticket pour voir déjà si on peut diminuer ce cache à 24h (sinon il faudra voter pour l'extension) : https://phabricator.wikimedia.org/T390674. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<span style="color:#FF6600">$</span>♠]]) 1 avril 2025 à 11:46 (CEST) ::Merci JackPotte. ::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 1 avril 2025 à 19:00 (CEST) :::Un problème similaire a été signalé en 2023 [[phabricator:T351573]], et en 2017 [[phabricator:T119366]] mais pas la moindre action de correction depuis toutes les années écoulées. Les problèmes des "petits" wiki ne sont pas écoutés. :::J'ai donc créé la page de vote pour installer l'extension : [[Wikilivres:Prise de décision/Installer l'extension MagicNoCache]]. :::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 1 avril 2025 à 19:48 (CEST) ::::{{Mention|Lionel Scheepmans}}, {{Mention|Fourmidable}} : un avis / un vote sur ce sujet ? --&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 12 mai 2025 à 20:04 (CEST) :::::Je viens de donner mon avis sur la page idoine, merci du rappel ! [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 13 mai 2025 à 11:00 (CEST) == Erreur d'affichage sur la page d'accueil == Bonjour tout le monde, Un petit message pour savoir où nous en sommes sur le problème d'affichage dans la page d'accueil (débordement des cadres de livres suggérés sur la boîte à outils des utilisateurs connectés). Wikilivresquement, [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 26 avril 2025 à 17:59 (CEST) :Salut Fourmidable, :J'ai tenté de trouver une solution pour cet habillage, mais il est tellement mal conçu que ça semble impossible. :C'est le seul habillage qui pose problème, pour plusieurs pages et pas seulement la page d'accueil. :La décision arbitraire d'imposer cet habillage sans consulter la communauté du projet est une aberration. :Le mieux serait de : :# créer un bug pour l'habillage Vector-2022 qui ne fonctionne plus dès qu'il y a le moindre code CSS, :# créer une demande de fonctionnalité pour que les administrateurs du projet puisse sélectionner l'habillage par défaut par projet choisi par décision communautaire, :Mais comme les "petits wikis" ne sont pas écoutés, ce serait inutile (voir les nombreux exemples de problèmes reportés spécifiques à fr.wikibooks dont aucun n'a jamais été résolu). :--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 26 avril 2025 à 20:26 (CEST) ::Ok, en tout cas sache que je soutiens ta proposition ! [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 1 mai 2025 à 16:28 (CEST) == Matthius : le grand retour == Bonjour à tous, Quelqu'un veut-il bien m'aider à relire les [https://fr.wikibooks.org/w/index.php?title=Sp%C3%A9cial%3AContributions&target=Matthius&namespace=0&tagfilter=&newOnly=1&start=&end=&limit=50 nouveaux livres de Matthius] ? Il semble y avoir, une fois de plus, de graves problèmes de sourçage et des attaques (même déjà soulignées en 2023 !) contre "le libéralisme" et "la finance" avec des phrases obscures ; par exemple : * dans [[Conseils Chrétiens]] : "Le libéralisme empêche de voir la société. Alors on croit les films libéraux, faisant croire que l’individu fait la société, alors que c’est la société qui fait l’individu. En effet, notre ego est créé par notre famille." * dans [[Pourquoi un Dieu ?]] : "L'individualisme dû au libéralisme, de plus en plus prégnant, va par contre cacher de plus en plus notre sociabilité et notre créativité.", "le social-libéralisme ne sera que le moyen d'accéder au pouvoir par la voie opportune alors qu'on cachera le social au peuple, pour ne pas qu'il se comprenne. Le dirigeant social-libéral aura appris dans les écoles d'économie que les marchés c'est magique.", "désengager l'état, détruisant alors le développement donc la république", "La faille du libéralisme est la censure, censure permise par la pauvreté des esprits ayant peur des autres à cause de l'individualisme forcené. [...] Le libéralisme cherchera la censure pour empêcher qu'il y ait suffisamment d'esprits philosophes et créatifs s'intéressant à la politique.", "La finance croira alors qu'il faille installer une dictature pour liquider la population trop difficile à maîtriser. [...] il s'agit pour la finance de trouver de plus en plus d'illusions pour satisfaire la population" * dans [[Économie Enfants]] : le libéralisme a "rendu l’école non épanouissante par le manque de créativité, en disant que le pays ne peut plus se développer, à cause de la monnaie privée" et l'assertion non (mal ?) argumentée "Le libéralisme aboutit selon moi à l'abrutissement de l'individu, voire à la violence" * dans [[Devenir un Génie]] : "Ils sont ainsi devenus égoïstes, donc libéraux.", "le libéralisme peut apporter un manque de liberté, car c’est une doctrine et une idéologie orientée sur l'individu, individualisme cachant une société, allant alors vers la destruction du plus faible par une liberté sans limite.", "La finance a en fait tenté et tente de faire croire qu’elle s’occupe de notre liberté, alors qu’elle veut nous empêcher de nous émanciper." * dans [[Univers Vivant]] : "La finance veut que nous soyons des consommateurs alors que nous sommes des acteurs de la société.", "Pour les financiers la population pauvre doit souffrir de malnutrition.", la finance "devient alors autoritaire comme après la crise de 1929. Nous sommes à un moment crucial où nous pouvons remettre en cause l’idéologie scientiste aboutissant à nier la nature. Ainsi il y avait 1,7% de CO2 pendant le crétacé au lieu de 0,04 % en 2023." Notons que le dernier ouvrage en date, [[XXIe]], est particulièrement gratiné : * climatoscepticisme : "le GIEC aura causé une hécatombe de suicides pour un faux réchauffement de la terre" * théories du complot sur les résultats des élections occidentales : "Selon des journalistes de Sud Ouest diffusés sur Agora Vox qui ont récoltés les suffrages des élections de 2017 et qui ont suivi l’élection de 2022, Macron n’a pas été élu par les français. En réalité il est arrivé dernier des élections présidentielles de 2017.", "Emmanuel Macron avait des nuls médiatisés face à lui" * théories du complot sur la CIA et les démocrates américains : "les démocrates trichent sur les élections en 2021", "Les États-Unis sont partis d’Afghanistan pour préparer la guerre d’Ukraine" * biais prorusse : "la Russie entre en guerre contre l’Ukraine en février 2022, puisque l’Ukraine avait attaqué la Russie. Les médias occidentaux feront croire [...] que c’est la Russie qui attaque", "Vladimir Poutine est voulu par les russes, contrairement aux élus occidentaux. Les élections en Russie se déroulent suffisamment bien pour que la Russie soit considérée comme une démocratie." -- [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 11 mai 2025 à 17:24 (CEST) :J'ai lancé une série de [[Wikilivres:demandes de suppression|demandes de suppression]]. Je notifie les personnes ayant participé à l'[[Wikilivres:Demandes de suppression/2023|ancien débat (2023)]] : {{Mention|JackPotte}}, {{Mention|Lionel Scheepmans}} et {{Mention|DavidL}} pour info. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 12 mai 2025 à 11:23 (CEST) ::Salut @[[Utilisateur:Fourmidable|Fourmidable]].. C'est bien que tu inspecte le contenu de Wikiversité à la recherche de contenu indésirable ou problématiques. Mais je vois dans le titre de ce sujet de discussion une forme de sarcasme et de condescendance qui ne me semble pas adapter à un projet collaboration où tout le monde est le bienvenu peu importe ses croyance et ses idée. De plus la première personne concernée, c'est à dire l'auteur, n'y est pas notifiée. ::Ensuite, il fauétait une fois se mettre d'accord sur le fait que la ligne éditoriale de Wikiversité est différente à celle de Wikipedia. Un recueil de cours et de travaux de recherche, ce n'est pas une encyclopédie. On en a déjà discuté. La neutralité de point de vue n'existe pas dans l'enseignement ni dans la recherche. ::Pour preuve, mon fils a un cours de religion dans SZ formation secondaire et il peut choisir entre différentes religion ou opter pour un cours de morale et de citoyenneté. À l'université, les orientation idéologique des enseignants son souvent bien connue. Et il est évident que l'enseignement dans une business school sera plus libérale qu'une fac de théologie. ::Dans le cadre des travaux de recherches, la Liberté d'expression doit être complète, l'auteur doit être libre d'y faire ses propre interprétations des faits et développant sa propre argumentation. Sans quoi, c'est plus de la recherche. ::Finalement, un support d'enseignement dans un projet collaboratif, n'est pas un projet de recherche. On ne parle pas en "je" dans un cours, on le fait dans une recherche. Or, l'usage du "Je" implique une certaine subjectivité. ::En conclusion, je ne vois pas ce nouvelle appel dans la forme et l'énergie qu'il se présente, comme quelque chose de très collaboratif. Et je n'ai pas envie de jouer à nouveau le médiateur dans ce redémarage d'une confrontation idéologique entre deux contributeurs incapable de collaborer dans la production de contenu de qualité. ::Plutôt que de faire du rameutage ici, je te proposeraient plutôt, selon tes disponibilités, de collaborer aux écrits des auteurs en discutant avec eux sur le page de discussions de leurs articles au sujet des améliorations possibles. Plutôt que de faire appel à la suppression de toute une page pour certains passages problématiques, une démarche collaboratif serait d'aider à la résolutions de ces problèmes, dans le but de ne pas perdre tout le reste de la page. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 13:20 (CEST) :::Tu as raison, je notifie aussi {{Mention|Matthius}} en espérant que cette fois son comportement soit plus constructif... Concernant les ouvrages qui sont moins problématiques, j'ai fait des demandes dans les pages de discussion idoines. Ici on a des ouvrages clairement complotistes et anti-science qui nuisent à la réputation de Wikilivres. (PS : Nous sommes sur Wikilivres, pas sur Wikiversité ;)) [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 12 mai 2025 à 13:21 (CEST) ::::Entre-nous @[[Utilisateur:Fourmidable|Fourmidable]], je ne trouve pas ton comportement plus constructif, ni collaboratif que le tien... [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 13:24 (CEST) :::::À mes yeux et dans le cadre d'un projet collaboratif, commencer par une demande de suppression avant toute chose peut même être perçu comme violant. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 13:26 (CEST) ::::::Mon but n'est pas de faire une croisade pour le libéralisme ou le GIEC sur Wikilivres, mais il y a quand même des limites pour tenir la réputation du site et plus largement de la Wikimedia Foundation. Je te rejoins sur le fait que les auteurs ne doivent pas être libres d'écrire absolument tout ce qu'ils veulent, et aussi que la critique doit être constructive, mais ce n'est pas au créateur du livre d'être le seul arbitre de ce qui est raisonnable ou pas vis-à-vis de son travail (i.e. simple reformulation, suppression partielle ou totale...). Et en 2023 Matthius a montré un comportement très agressif vis-à-vis de mes critiques, ce qui a mené '''ensuite''' à des débats de suppression. Pour l'instant, je ne fais que soulever des phrases (souvent identiques à celles de 2023) que je trouve (de nouveau) hautement problématiques d'un point de vue scientifique (manque voire absence totale de sourçage), mais le passage par des demandes de suppression directement se justifie par une forme de récidive sur certaines affirmations auxquelles aucune amélioration n'a été apportée après critique. Tu m'accuses de rameutage, mais je ne fais que consulter la communauté dans son ensemble : ici pour une discussion globale, sur [[Wikilivres:Demandes de suppression]] pour un débat et un "vote" au cas par cas. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 12 mai 2025 à 13:34 (CEST) :::::::Désolé aussia pour le côté péjoratif du terme rameutage. Parlons de notiffication c'est plis adéquat. :::::::Je réalise seulement que l'on est sur wikilivres et pas Wikiversité. Désolé sur mon smartphone ça ne saute pas aux yeux. Il faut donc recontextualiser tout ce que j'ai écrits précédement. Heureusement, historiquement Wikiversité est un sous projet de wikilivre. Les deux projet sont très proches dans leurs mission pédagogique et mode de fonctionnement. L'objet ici étant de produire des livres pédagogiques pour toute les tranches d'âges et pas uniquement des ouvrages qui doivent répondre à à des attentes scientifiques. Il apparait dans tes propos des thermes très wikipédien tel que le sourçage et la neutralité de point de vue. Je ne pense pas que cela doit s'appliquer ici. :::::::Ensuite Wikilivres est trop petit pour avoir un commuté d'arbitrage et je n'ai pas envie de parcourir les historiques à la recherche de qui a commencé. Mais je maintient l'idée que notifier des personnes vers un appel à suppression est une démarche que je considère symboliqueemnt violente et me semble aussi être une récidive. :::::::As-tu cherché à améliorer les texte en question en discutant avec l'auteur avant de proposer leurs suppression ? :::::::As-tu conscience que nous sommes ici dans un projet collaboratif, pluraliste et non universitaire ? [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 15:02 (CEST) ::::::::Du reste, nous ne sommes pas ici pour répondre à des suposées attentes de la Fondation Wikimedia. Car le rôle de celle-ci est précisément de répondre aux notres. C'est le rôle d'une fondation. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 15:07 (CEST) :::::::::Bonjour, :::::::::Il faudrait avant tout classer les écrits de l'auteur, car il pourrait il y avoir un problème d'admissibilité, Wikilivres étant avant tout un projet de rédaction de livres '''pédagogiques'''. Ces écrits contiennent beaucoup d'avis personnels et présentent une vision sans discussion ni argumentation, sans apporter de pédagogie sur un sujet particulier. :::::::::Si on peut qualifier les écrits comme de la recherche, il vaudrait mieux les déplacer vers la wikiversité, où une communauté supplémentaire et plus expérimentée sur la recherche pourrait exprimer son avis sur le sujet ou sur comment améliorer/corriger les écrits de Matthius. :::::::::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 12 mai 2025 à 20:01 (CEST) ::::::::::Je plussoie {{Mention|DavidL}}. {{Mention|Lionel Scheepmans}} ce que tu dis s'applique aux cas où il y a une réelle démarche scientifique ou a minima une attitude collaborative de la part de l'auteur. Or : ::::::::::* premièrement (tu le sais sans doute, étant toi-même chercheur), les livres de Matthius sont très loin de toute méthode scientifique, c'est plutôt un ensemble d'assertions non sourcées qui font la promotion d'une idéologie (et on verse même dans l'antiscience avec les paragraphes sur le GIEC). On pourrait donner la parole à Matthius sur ce sujet mais je crains qu'il ne se définisse même pas lui-même comme scientifique ; ::::::::::* deuxièmement, avec cette série de recréations le 8 décembre dernier, sans attendre l'avis de la communauté, et avec les '''mêmes phrases''' problématiques (parfois à peine reformulées, souvent conservées à l'identique), je ne vois pas comment on pourrait supposer que Matthius fait preuve d'ouverture d'esprit et d'attitude collaborative. ::::::::::Bref, si vous voulez absolument garder tous ces ouvrages et essayer de composer tant bien que mal avec la pugnacité de leur auteur, ce sera sans moi... À mon avis, il serait nettement plus profitable de traduire les livrels de [[:en:Subject:Economics|Wikibooks en anglais sur l'économie]], par exemple. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 13 mai 2025 à 11:07 (CEST) :::::::::::Je viens de prévenir Matthius par mail. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 13 mai 2025 à 11:12 (CEST) ::::::::::::Tree bien. Moi aussi, je n'ai plus envie de consacrer du temps là dessus. Je vous laisse donc traiter la situation puisque votre avis est majoritaire. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 13 mai 2025 à 11:27 (CEST) :::::::::::Je ne comprends pas cette assertion. Je cite François Gervais contre le GIEC, qui a écrit pour le GIEC sans être entendu pour la conclusion. :::::::::::Je n'ai pas reformulé mes phrases à l'identique. J'ai soit indiqué la source contrairement à ce qui dit Fourmidable, soit indiqué que c'était mon point de vue ou émis une explication. Aussi quand je fais une assertion scientifique, j'en indique souvent la cause scientifique. Fourmidable a tendance à reprendre les phrases où je répète ce qui a été écrit avant pour aller plus loin. Donc il faut chercher dans mes livrels la phrase où je cite et où j'émets une hypothèse avec la cause scientifique. Je vais relire Fourmidable. :::::::::::Aussi j'ai trouvé sur l'[http://web.archive.org/web/20240810201141/https://www.google.com/search?q=mati%C3%A8re+temps+%C3%A2me âme qui ralentit la vitesse]. Je pense que Google utilise une IA pour détecter les limites de l'humain. Mon expérience de pensée va contre le matérialisme scientifique puisque j'émets l'hypothèse supérieure qu'il existe des multivers où des âmes agissent sur le nôtre. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 13 mai 2025 à 11:36 (CEST) :::::::::::Je ne pense pas effectivement que mon livrel sur le XXIe va rester sur wikibooks puisque il va contre ce qu'indique wikipedia. J'espère juste qu'il puisse rester. :::::::::::Seulement j'ai une formation en ingénierie et j'ai trouvé sur [https://archive.org/details/TempsAme l'âme qui ralentit la vitesse] [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 13 mai 2025 à 12:13 (CEST) ::::::::::Vous admettez {{Mention|DavidL}} que vous ne connaissez pas les domaines que j'aborde. Mes livrels sont pédagogiques donc vous pouvez apprendre avec. Donc lisez les avant d'émettre l'hypothèse qu'ils ne le sont pas. J'ai créé le coaching sans coach qui a permis de revoir la pédagogie d'un journal d'un réseau international. Mais cela ne m'empêche pas d'aller contre le libéralisme et l'appât du gain qui sont selon moi les fléaux actuels. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 13 mai 2025 à 12:06 (CEST) :::::::::::@[[Utilisateur:Matthius|Matthius]] semble ouvert au débat et à une aide pour améliorer ses textes. La suppression ne me semble donc pas une option souhaitable. Wikilivres est indépendant de Wikipédia. Il faut donc se référer à nos règles et recommandations locale disponible dans les espaces de noms "wikilivres" et "aide". Je vais essayer de prendre le temps d'écouter les textes avec une voix de synthèse pour gagner du temps. Cela me permettra d'en faire des commentaire en vue d'une amélioration. Car si ce sont des sources qui manques et bien il suffit de les ajouter. Nous sommes là pour travailler ensemble pour produire des ouvrages pédagogiques de qualité, pas pour juger du travail des autres en vue d'une suppression. Restons, s'il vous plait dans un esprit d'entraide et de collaboration. C'est tellement rare à notre époque... [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 14 mai 2025 à 15:00 (CEST) :::::::::::Mon livrel sur le XXIe siècle en cours d'écriture va aussi contre les théories du complot occidentales. J'écris que la Russie et la Chine sont des démocraties, alors que nos médias disent que ce sont des dictatures. J'émets effectivement des hypothèses non sourcées dans ce nouveau livrel. Je peux et vais les sourcer. Par contre j'utiliserai des sources primaires. En réalité, j'émets l'hypothèse que ce sont nos médias qui sont dans la post-vérité et que ce ne sont pas les médias étatsuniens, ni russes, ni chinois qui y sont. Ce livrel est effectivement une bombe dangereuse contre nos médias comme l'indique Fourmidable. ::::::::::::Je ne comprends pas l'acharnement de Fourmidable à ne pas vouloir discuter avec moi et à vouloir automatiquement supprimer mes livrels sans discussion préalable. En effet il a eu un an pour m'indiquer comment améliorer mes livrels. Et que Fourmidable ne me dise pas que c'est moi qui ait commencé, puisque j'étais outré qu'on veuille supprimer mes livrels avec ses copains sans discussion pédagagogique au tout début. ::::::::::::Concernant la neutralité de wikipedia : wikipedia ne fait que révéler l'avis des médias financés donc il n'est pas neutre. Être neutre c'est révéler tous les points de vue, même ceux avec lesquels on n'est pas d'accord, ce que [https://archive.org/details/wikipediaCo-Fondateur fit wikipedia au début de son histoire] et ce pour quoi je me suis intéressé et ai été réprimé sauf pour wikibooks anglais qui m'a viré pour ne pas enlever mon nom. :{{Mention|Matthius}} Avez-vous l'intention de publier des livres scientifiques, c'est-à-dire sourcés par de la science publiée et évaluée par les pairs, et à défaut de grands médias nationaux et internationaux ? Vous pouvez aussi tester vos hypothèses mais votre travail ne doit pas consister à sélectionner les sources qui vous conviennent pour seulement valider votre théorie, en mettant de coté tout ce qui vous dérangerait dans cette entreprise. --[[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 10:48 (CEST) ::@[[Utilisateur:Fourmidable|Fourmidable]], je pense que tu te fais une vision fausse du monde de l'édition. @[[Utilisateur:Matthius|Matthius]] peut payé une maison d'édition, dans le cadre d'une [[w:Édition_à_compte_d'auteur|édition à compte d'auteur]]. Probablement qu'il l'a déjà fait puisqu'il a déjà publié des ouvrages au format papier parmi ceux qu'il veut placer sur Wikilivres. Il en a même déposé certains dans une bibliothèque universitaire. Quant à la revue par les paires ne se fait que dans le cadre des journaux scientifique. ::J'ai écouté l'ouvrage [[Pourquoi un Dieu ?]] Et je trouve effectivement qu'il n'a pas sa place dans Wikilivres. Non pas parce qu'il critique le libéralisme avec des propos que je partage en grande partie, mais parce qu'il s'apparente plus à de la propagande chrétienne qu'à un réel ouvrage pédagogique sur le sujet. ::Matthius y est en posture de prédicateur et non de pédagogue. Je dirais que la moitié des phrases de l'ouvrage que j'ai écouté sont des affirmations sans argumentation ni démonstration valide. La thèse de son ouvrage se résume à dire que dieu est la seule chose qui peut expliquer un phénomène actuellement inexpliqué. Ce qui est une corrélation fallacieuse puisqu'il n'existe aucun lien de causalité. ::Pour moi, les ouvrages évangéliste ou propagandiste n'ont pas leur place dans Wikilivres et je serais d'avis d'ouvrir une prise de décision pour établir une règle d'interdiction. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 11:42 (CEST) :::Oui voilà, nous sommes d'accord. Peut-être que Matthius peut adopter une attitude plus scientifique, mais l'esprit de "pédagogie" s'accompagne forcément d'une démarche scientifique, sinon c'est de la prédication/propagande. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 11:45 (CEST) ::::@[[Utilisateur:Fourmidable|Fourmidable]]... Wikilivres n'est pas une bibliothèque "scientifique" mais pédagogique. Tu sembles confondre les deux termes. Les livres pour enfants que contient Wikilivres ne sont pas "scientifique" tout en étant pédagogiques. ::::Un autre fait qui peut être reproché à @[[Utilisateur:Matthius|Matthius]] est son autopromotion, [[Wikilivres:Présentation#● Wikilivres n'est pas une vitrine|alors que la démarche proscrite sur Wikilivres]]. ::::Plutôt que de supprimer l'important travail effectué par Matthius, je propose à nouveau de le déplacer en sous page de son espace utilisateur pour qu'il puisse retravailler ses écrits. ::::Pour un retour dans l'espace principale, il faudrait au préalable qu'il supprime des ses travaux toute forme d'autopromotion et toute forme propagande, prosélytisme ou autre type de discours prédicateur. Ceci notamment en référence aux choix politiques [https://www.senat.fr/leg/ppl17-386.html français], [https://www.rtbf.be/article/le-proselytisme-religieux-ou-politique-n-a-pas-sa-place-a-l-ecole-quels-chiffres-derriere-ce-phenomene-pointe-par-la-ministre-de-l-education-11477234 belge], [https://www.assnat.qc.ca/fr/travaux-parlementaires/projets-loi/projet-loi-94-43-1.html Quebec], [https://ge.ch/grandconseil/data/loisvotee/L11764.pdf suisse]. Quatres communautés culturelles très largement majoritaire dans l'espace francophone des projets Wikimédia. ::::J'invite Matthius et les autres membres de notre communauté réagir à ce message et de discuter du lancement d'une nouvelle prise de décision pour interdire la propagande et le prosélytisme dans Wikilivres. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 12:21 (CEST) :::::Ce que je veux dire, c'est qu'un bon livre pédagogique s'appuie forcément sur des connaissances scientifiques. Ok pour un redéplacement. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 12:37 (CEST) ::::::Ne fais pas à ton tour du prosélytisme scientifique @[[Utilisateur:Fourmidable|Fourmidable]]. La science et les connaissances dites scientifiques comme tu les entends n'est pas la seule chose sur laquelle on peut s'appuyer pour produire un contenu pédagogique. ::::::Que fais-tu de la méditation, de l'humour, de la poésie, de la musique, du dessin, et toute autre expression artistique ? ::::::Et il existe aussi un tas d'ouvrages pédagogique religieux (pour le catéchisme entre autre), sauf que, comme la plupart des législations nationales des pays francophones occidentaux, je pense qu'ils n'ont pas leur place dans Wikilivres. Ce sur quoi nous devons nous positionner dans une prise de décision collective. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 12:52 (CEST) :::::::Ah oui, dans ce sens-là il y a en effet moins de science à proprement parler… Mais je ne suis pas sûr que cela s'applique aux propos politiques. Ça ne me viendrait pas à l'idée de faire un Wikilivre afin de convertir les gens au libéralisme, par exemple. C'est le rôle d'autres wikis ou sites web spécialisés. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 14:44 (CEST) :::Je vais supprimer Du même Auteur et Du même éditeur de mes wikilivres. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 15 mai 2025 à 12:32 (CEST) ::::Si vous voulez, mais c'est loin d'être le point principal. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 12:38 (CEST) :::::Effectivement @[[Utilisateur:Matthius|Matthius]], c'est une bonne résolution, mais il reste le prosélytisme à résoudre et je pense que cela demande beaucoup de travail à réaliser dans votre espace de travail personnel. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 12:55 (CEST) ::::::Vous mettiez que seul Pourquoi un Dieu est prosélyte. J'avais effectivement un doute en ajoutant ce livrel. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 15 mai 2025 à 19:43 (CEST) :::::::Je n'ai pas encore eu le temps d'écouter les autres livres @[[Utilisateur:Matthius|Matthius]] . Nous somme tous bénévoles ici. Cela peut prendre du temps, mais je vous invite déjà à déplacer vous-même le livre ''Pourquoi un Dieu'' dans vos sous page utilisateur''.'' :::::::Par anticipation, je peux déjà dire que tous les autres ouvrages faisant la publicité de vos écris doit être modifier ou retirer de l'espace principale ainsi que tous ceux qui font référence à Dieu ou au catholicisme de manière prosélyte. :::::::Seul le nom des auteurs devrais être repris dans les livre avec éventuellement des hyperliens vers leurs pages utilisateur qu'il sont libre d'éditer comme il veulent. :::::::On peut ensuite créer des pages catégories qui reprennent tous les travaux des auteurs, avec l'avantage qu'elle se complétent automatiquement à chaque fois que l'on ajoute une catégorie en bas de page d'un ouvrage. Vous trouverrez certainement des indication dans les pages d'aide. :::::::Je vous rassure sur le fait que ce traitement serait semblable pour un politicien libéral faisant la publicité de son parti, de ses idéologies et de sa personne. N'hésitez pas d'ailleurs à parcourir les autres wikilives pour y détecter ce genre de problème avant de nous le signaler. C'est ce que fait @[[Utilisateur:Fourmidable|Fourmidable]] en cherchant à veiller sur la qualité et la conformité de notre projet. Une belle fin de journée ! [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 16 mai 2025 à 11:41 (CEST) ::::::::Pour info, je confirme et soutiens tout ce que propose {{Mention|Lionel Scheepmans}} dans son dernier message (merci à lui). [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 16 mai 2025 à 12:01 (CEST) ::::::::Pourquoi a Dieu a été mis à jour dans mon espace personnel. Je ne sais pas comment effacer une page wikibooks.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 16 mai 2025 à 12:24 (CEST) :::::::::@[[Utilisateur:Matthius|Matthius]]. Je ne comprends pas ce que vous dite. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 16 mai 2025 à 15:16 (CEST) ::::::::::J'ai copié-collé Pourquoi un Dieu dans ma page personnelle. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 16 mai 2025 à 21:36 (CEST) :::::::::::Ah très bien @[[Utilisateur:Matthius|Matthius]]. Mais en fait, il est possible de déplacer les pages en les renomant. Cela permet de conserver tout l'historique de l'édition. Je vais le faire quand je serai sur PC. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 17 mai 2025 à 03:34 (CEST) ::::::::::::Ne le faites pas : L'original de l'historique est sur mon espace perso. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 17 mai 2025 à 09:30 (CEST) :::::::::::::@[[Utilisateur:Matthius|Matthius]], j'ai écouté l'ouvrage Économie enfant. Si j'étais à la tête d'une maison d'édition, je ne publierais pas ce manuscrit. Il y a des passages très intéressants avec des idées originales que je partage, mais aucune argumentation pour les valider. Pour le reste, on retrouve un copié collé du précédent ouvrage. Beaucoup d'information factuelle sans réelle contextualisation ni fil conducteur et puis de nombreuses affirmations gratuites qui ne sont finalement que des opinions très relatives et de nouveau non argumentées. :::::::::::::Le pire étant que certaine de ces affirmations son tout simplement fausses ou inscensées. :::::::::::::Exemples d'une phrase : :::::::::::::« Écrire sur ce que vous comprenez de l’archéologie, qui est l’humanité avant l’écriture. » :::::::::::::Cette phrase est erronée et n'a même aucun sens. L'archéologie n'est pas l'humanité, mais un domaine des sciences créé par les humains. Ensuite, l'archéologie n'est pas quelque chose qui se limite à avant l'écriture. Il existe des nombreux sites archéologiques qui fouillent les vestiges de la Rome antique. Une civilisation qui n'était pas dénuée d'écriture. :::::::::::::Exemple d'un paragraphe : :::::::::::::« Le [[w:Capital|capital]] de l’humanité peut donc être la Terre. En effet, l'argent est produit à partir du papier venant du bois. Les trafiquants ont toujours voulu se l'approprier. Le capital pourrait donc ne pas être l’argent. Le troc nécessite cependant un patrimoine conséquent. La Chine veut s’approprier le capital Lune, pour y prendre l’Helium 3 selon Solidarité et Progrès, seule ressource lunaire qu'il est intéressant de transporter, afin de le fusionner, pour en obtenir de l’énergie illimitée, favorisant la créativité par le surplus de biens. » :::::::::::::Ce paragraphe est incompréhensible et citer un parti politique (à d'autres reprises aussi dans l'ouvrage) comme source pour poser une affirmation, pose deux gros problèmes. 1 celui de faire la publicité d'une idéologie au sein d'un écrit pédagogique, 2 celui de ne pas respecter un des principes de base de l'écriture scientifique alors que le livre en parle et la défend. :::::::::::::Je n'irai pas plus loin dans les exemples. :::::::::::::Dans leurs états actuels et pour que ces livres travaux d'écritures soient admissibles dans Wikilivres. Je pense que vous devez impérativement supprimer : :::::::::::::* toute promotion personnelle. :::::::::::::* toute forme de Prosélytisme religieux. :::::::::::::* toute forme de publicité ou contre publicité politique et partisane :::::::::::::* toute affirmation fausse et autres types de fabulations. :::::::::::::* tout raisonnement ou démonstration sans lien de causalité. :::::::::::::Suite à quoi, il faudrait encore dans l'idéal en améliorer le style de sorte à y développer un fil conducteur qui permettrait aux lecteurs de suivre un développement ordonné propice à l'apprentissage, et non leur soumettre un journal de réflexions personnelles, reprenant des erreurs factuelles et logiques. :::::::::::::C'est un travail conséquent. :::::::::::::Et en ce qui concerne le prosélytisme, les approches politiques partisanes, il est impératif, y compris les sous page de votre page utilisateur. :::::::::::::Il y a des idées intéressantes dans vos écrits, et je partage pas mal de vos points de vue concernant la question du néolibéralisme. Mais Wikilivres n'est pas une tribune d'opinion à l'image d'AgoraVox. Nous sommes ici pour produire des ouvrages pédagogiques. Pas pour influencer nos lecteurs en faveurs ou à l'encontre de certaines religions ou idéologies. :::::::::::::Tout en l'encourageant à le faire de manière plus courtoise et constructive, je remercie donc @[[Utilisateur:Fourmidable|Fourmidable]] de nous avoir alerté sur l'incompatibilité de vos ouvrages avec notre projet. Dans tous les cas ceux que j'ai écoutés jusqu'à présent. :::::::::::::J'aimerais à votre tour vous encourager à poursuivre vos travaux d'écriture en cherchant à vous rapprocher de notre objectif tout en respectant nos règles et recommandations. Mais sachez aussi que vous pouvez aussi améliorer l'article de Wikipédia sur l'[[w:Économie_réelle|économie réelle]]. Ou aussi développer une leçon sur Wikiversité sur le même sujet dans la [[v:Faculté:Économie|Faculté d'Économie]]. C'est un sujet intéressant qui permet de mettre en lumières les limites de la [[w:Finance|finance]]. :::::::::::::Ces deux activités seraient moins ambitieuses que de vouloir produire un livre de qualité pour expliquer l'économie aux enfants. Cela demande une grande maîtrise du sujet en plus d'un certain don pour la vulgarisation. :::::::::::::Il me reste deux ouvrages proposés à la suppression à écouter, mais j'ai bien peur d'y retrouver les mêmes incompatibilités que celles que je viens d'expliquer à l'instant. :::::::::::::Bien cordialement, [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 26 mai 2025 à 21:16 (CEST) :::::::::::::Mon correcteur orhtographique ne fonctionnant pas pour des commentaires aussi long, le message que je viens de laisser est truflé de fautes et je n'ai pas le temps ni le courrage de les corriger. Encore une fois, le travail que je fournis sur ce projet est tout à fait bénévole. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 26 mai 2025 à 21:21 (CEST) ::::::::::::::J'ai passé beaucoup de temps à élaborer le coaching sans coach. Ce n'est naturel pour aucun ancien élève de simplifier. Je ne sais pas combien de fois j'ai relu Comment Écrire des Histoires. J'ai toujours beaucoup de temps devant moi pour revoir mes livrels.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 10:51 (CEST) :::::::::::::::@[[Utilisateur:Matthius|Matthius]], c'est précisément parce que vous travailler beaucoup et que vous Me semblez de bonne foi et volonté, que je passe autant de temps à vous aiidez. Tous vos textes comprends des problèmes qu'il faut résoudre. Vous devriez commencer par supprimer tout ce qui fait référence à vous, à la religion et au politique, pour ne garder que des faits et affirmations vérifiées par des sources sûres et non partisannes, à chaque fois pour vous assurez que vous n'être pas simplement en train de diffuser ou colporter une opinion fausse et/ou partisane. Ce qui vient d'être dit est incontournable. :::::::::::::::Je penses ensuite qu'indique messages auxquelles ont été écrites vos sections sont superflues dans le cadre d'un ouvrage pédagogique. La chronologie de vos écrits n'est pas un bon un fil conducteur. Encore une fois, Wikilivres n'est pas un lieu pour publier ses mémoires ou ses réélections du jour. Il existe le format blog pour ce genre de choses. :::::::::::::::Tennez compte aussi que nous ne disposons pas forcément d'autant de temps et de motivation que pour revoir vos livres. Raison pour laquelle, des méthodes plus expéditives telles que la suppression complète des pages inadaptées à notre projet finiront par être appliquées. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 13:18 (CEST) ::::::::::::::::Le livrel le plus important pour moi est l'économie pour les enfants, vient ensuite devenir un génie. L'Univers est Vivant a été référencé sur les moteurs de recherche récemment parce que j'ai trouvé sur l'âme qui ralentit la vitesse. Quand on cherche matière temps âme sur les moteurs de recherche occidentaux on tombe sur ma page archive.org/details/TempsAme. Il n'y a toujours pas de chercheur qui a publié sur la mathématisation de ma trouvaille. L'univers est vivant est une amélioration d'un autre livre. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 13:56 (CEST) ::::::::::::::::Je viens de mettre mon [http://matthieu.giroux.free.fr/html/cv.htm CV] à jour pour montrer ce que j'ai influencé. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 14:05 (CEST) ::::::::::::::::C'est moi qui ai diffusé le terme économie réelle. Je reproche à ceux qui l'ont utilisé d'être des économistes scolaires, c'est à dire de se référer à l'économie monétaire pour parler d'économie réelle. Je peux cependant mettre un historique de cette économie sur la page wikipedia. Je me demande juste s'il va rester. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 14:08 (CEST) :::::::::::::::::Je suis désolé @[[Utilisateur:Matthius|Matthius]]. Je ne vais pas poursuivre nos conversations faute d'en avoir envie. Vous ma laissez sur cette impression que votre motivation première est de promouvoir votre personne, vos valeurs et vos idées. Je vais donc arrêter de vous consacrer du temps. Je suis ici pour soutenir et développer les projets et intérêts collectifs et non individuels. Bonne chance pour vos ambitions que je vous invite à réaliser en dehors des projets Wikipédia. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 15:00 (CEST) ::::::::::::::::::Mon projet relève de l'intérêt général de faire connaître l'économie du XIX{{e}} siècle de [[Henry Charles Carey]]. Mon égoïsme peut donc être aussi le vôtre. Pour moi il faut être intelligent et égoïste pour défendre l'intérêt général. Je pense qu'on peut tous avoir l'air de génies comme les enfants peuvent avoir l'air de génies. Oui, je suis militant et veux faire partager la joie de la politique. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 15:55 (CEST) :::::::::::::::::::Nous ne sommes donc pas sur la même longueur d'onde. Je vois invite à ne pas faire de militantisme sur les projets wikimedia. Il y a d'autres endois pour le faire. La blogosphère, des tribune comme agoravox, et de nombreux sites web tenus par des communautés militantes et reliée aux valeurs et idées pour lesquelles vous militer. Ceci est mon dernier message à ce sujet. Cordialement. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 16:18 (CEST) ::::::::::::::::::::Je vous mets au défi de penser que les wikipédiens ne sont pas des militants. Eux veulent aussi défendre l'intérêt général en apportant la connaissance. Par contre ils ne ciblent pas leurs apports. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 17:10 (CEST) ::::::::::::::::::::Comme prévu, on me dit que mon [https://fr.wikipedia.org/wiki/%C3%89conomie_r%C3%A9elle#Histoire ajout sur l'économie réelle] est inédit. Je pense que vous vous êtes intéressé à certains de mes écrits parce qu'ils vous apportaient des réponses. Je peux faire cela sur wikibooks. Seulement c'est encore plus difficile sur wikipedia. Je ne suis pas théseux. Oui l'économie réelle a été créée pour faire connaître l'économie physique de Lyndon Larouche. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 30 mai 2025 à 17:15 (CEST) :::::::::::::::::::::Merci quand même ! [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 31 mai 2025 à 00:24 (CEST) :Mon livrel l'univers est vivant [https://www.agoravox.tv/actualites/technologies/article/et-si-la-physique-quantique-avait-105532 a eu un impact]. Je pense aussi avoir influencé les jeunes qui se sont tournés vers la bible. == [Recherche universitaire] Questionnaire sur la gouvernance Wikimedia == Bonjour à toutes et à tous, Dans le cadre d’un mémoire de recherche sur les modèles de gouvernance décentralisés dans les communs numériques, je mène une étude analysant le mouvement Wikimedia. L’objectif est de mieux comprendre la perception qu’ont les contributeurs et contributrices des projets Wikimedia (Wikilivres, Wikipédia, Wikidata, Commons, etc.) de la Fondation Wikimedia, de ses décisions, et des relations avec les chapters locaux (ex. Wikimédia France). Un questionnaire anonyme, rapide à remplir (environ 5 minutes), a été conçu à cet effet. Il s’adresse à toute personne majeure ayant déjà contribué à un projet Wikimedia, quelle que soit l’ancienneté ou le niveau d’implication. Lien vers le questionnaire : framaforms.org/questionnaire-communaute-wikipedienne-et-la-wikimedia-fondation-1747225404 '''Important''' : Les résultats seront utilisés uniquement dans un cadre académique. L'enquête, ainsi que l'étude, ne sont ni commandités ni supervisés par la Fondation ou aucun chapitre local. Il s'agit simplement d'un projet scolaire que je mène {{sourire}}. Merci d’avance pour votre participation ! [[Utilisateur:3(MG)²|3(MG)²]] ([[Discussion utilisateur:3(MG)²|discussion]]) 27 mai 2025 à 10:43 (CEST) :J'ai répondu. Bon courage pour ton mémoire ! (Ça me fait penser que je dois avancer sur le mien aussi...) [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 29 mai 2025 à 23:28 (CEST) == Propagande, prosélitisme, autopromotion, militanatisme, etc == Bonjours à la communauté des contributeurs de Wikilivres. Je me dit qu'il serait bon de faire une nouvelle prise de décision pour mieux cadrer le contenu de notre projet par rapport à ce qui se situebdans le titre de ce message. Qu'en pensez-vous ? [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 16:22 (CEST) :Totalement {{Pour}} ! [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 29 mai 2025 à 21:53 (CEST) :L'économie financière peut être considérée comme une propagande puisque son utilisation ne permet pas de lier la macro-économie et la micro-économie, ne permettant donc pas de développer une société comme le fait l'[https://fr.wikipedia.org/wiki/%C3%89conomie_r%C3%A9elle économie réelle]. :Si on considère le prosélytisme comme convaincre de rejoindre sa communauté, il faudrait donc enlever tous les wikilivres qui sont beaucoup lus, puisque les wikilivres qui sont peu lus n'arrivent pas à convaincre. :L'autopromotion permet malgré tout de connaître ce que fait l'auteur d'un wikilivre. Si on enlève le chemin qu'a suivi l'auteur, on évacuerait ainsi ses contradictions et on pourrait donc faire dire à un auteur l'inverse de ce qu'il a compris au bout de son parcours. :Je considère ceux qui contribuent à wikipedia et à wikibooks comme des militants, puisqu'ils essaient d'influencer les autres avec ce qu'ils écrivent sur ces sites web. Certes, certains travaux peuvent être désintéressés, mais alors pourquoi mettre ces travaux sur ces sites web alors. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 3 juillet 2025 à 22:36 (CEST) :L'économie financière peut être considérée comme une propagande puisque son utilisation ne permet pas de lier la macro-économie et la micro-économie, ne permettant donc pas de développer une société comme le fait l'économie réelle. :Si on considère le prosélytisme comme convaincre de rejoindre sa communauté, il faudrait donc enlever tous les wikilivres qui sont beaucoup lus, puisque les wikilivres qui sont peu lus n'arrivent pas à convaincre. :L'autopromotion permet malgré tout de connaître ce que fait l'auteur d'un wikilivre. Si on enlève le chemin qu'a suivi l'auteur, on évacuerait ainsi ses contradictions et on pourrait donc faire dire à un auteur l'inverse de ce qu'il a compris au bout de son parcours. :Je considère ceux qui contribuent à wikipedia et à wikibooks comme des militants, puisqu'ils essaient d'influencer les autres avec ce qu'ils écrivent sur ces sites web. Certes, certains travaux peuvent être désintéressés, mais alors pourquoi mettre ces travaux sur ces sites web alors. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 3 juillet 2025 à 22:41 (CEST) 7cpzh9egqbj0jnl1fmcr4bqlyhcxwov 745889 745888 2025-07-03T20:41:41Z Matthius 11787 /* Propagande, prosélitisme, autopromotion, militanatisme, etc */ 745889 wikitext text/x-wiki <noinclude>{{Wikilivres:Le Bistro/En-tête}}</noinclude> == compléter les bons conseils pour un nouveau livre == bonjour wikilivre ! je refais un tour sur ce wiki depuis un sacré bout de temps. Je vois que certains noms sont toujours là :) wouah. J'ai entâmé un livre nouveau aka. [[La sécurité du citoyen dans son logement]] que je vais encore améliorer mais je me pose dejà quelques questions sur le process, et vu que [[Wikilivres/Créer un wikilivre]] est assez high level je préfère demander ici des conseils. J'aime à penser que si l'idée est pertinente le guide pourra évoluer rapidement. * '''AutoCat''': il est indiqué clairement dans le guide pour la page de garde du livre de mettre <code><nowiki>{{AutoCat}}</nowiki></code> en bas de page, mais est-ce conseillé également sur chaque page du livre ? ça a l'air de marcher et donc plutôt oui: & si oui on pourrait l'ajouter dans le guide ? * je ne sais pas quoi mettre dans `CDU item` : on peut peut être orienter vers une bonne page sur le comment remplir le template proposé sur la page de garde * '''navigation horizontale''': est-ce qu'un moyen universel permet de suivre les chapitres d'un livre ? ex. si je suis sur un chapitre et que je veux aller au suivant, soit je passe par la page parent, soit je passe par la catégorie. Mais je voudrai (mieux qu') un bouton "next" / "previous". Enfin voici l'idée. S'il y a des choses en template automatique, je suis preneur (peut être le guide aussi) (PS: je vois que la gestion du sommaire est automatisée au sein même d'un chapitre : génial :) ) :NB: à une certaines époque j'utilisais des templates propres au livre (ex. [[Modèle:Les félins]]) et je vois que certains livres ont repris l'idée.. * '''catégorie''' : que faut-il mettre exactement dans le contenu de la catégorie auto-générée pour le nouveau livre ? juste <code><nowiki>[[Catégorie:Livres par titre]]</nowiki></code> ? * '''livre modèle''' : avez-vous un livre "modèle" : c'est-à-dire un livre (probablement à succès & pas trop grand) qui serait particulièrement suivi par les habitués et sur lequel on retrouverai toutes les techniques les plus avancées pour bien rédiger un livre. Il apparaîtrait du coup en modèle dans le guide. qu'en pensez-vous ? [[Utilisateur:Boly38|Boly]] [[Discussion_Utilisateur:Boly38|♪]] 5 mars 2025 à 18:09 (CET) :Salut Boly :* Autocat : normalement, il ne se met que dans le modèle listant les chapitres du livre, inclus dans toutes les pages. Par exemple le modèle {{m|Programmation JavaFX}} est inclus comme ceci : <nowiki><noinclude>{{Programmation JavaFX}}</noinclude></nowiki>) dans tous les chapitres du livre [[Programmation JavaFX]]. :* [[Wikilivres:CDU]] : il y a un moteur de recherche pour trouver le classement, mais il n'est pas encore pleinement détaillé et parfois il faut créer les pages correspondantes à la CDU. J'utilise http://www.udcsummary.info/php/index.php?lang=fr pour ajouter les pages manquantes. Si tu trouves un ou plusieurs classement possibles, je peux me charger de créer les pages qui manquent. :* '''navigation horizontale''' : Fait automatiquement par l'inclusion du modèle dans toutes les pages. Voir par exemple : [[Programmation Java Swing/Introduction]]. Le modèle ajoute les liens suivant, précédent et une flèche au milieu pour déplier la liste complète des chapitres du livre. :Pour la catégorie, un petit descriptif, comme par exemple : <pre><nowiki> Catégorie recensant les pages du livre [[Programmation JavaFX]]. Pour discuter de la rédaction du livre c'est ici : [[Discussion:Programmation JavaFX]]. [[Catégorie:Java]] </nowiki></pre> :--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 5 mars 2025 à 19:22 (CET) ::J'ai fait des clics magiques (dans l'historique des pages) pour remercier ; je ne sais pas où ça atteri mais bon. Le template sommaire avec navigation par page c'est exactement ce que je voulais : c'est top :) & merci aussi pour les illustrations ! David L au top ! ! [[Utilisateur:Boly38|Boly]] [[Discussion_Utilisateur:Boly38|♪]] 7 mars 2025 à 18:04 (CET) == Problème de cache sur la page d'accueil == Salut, Les utilisateurs anonymes voient toujours les mêmes livres sur la page d'accueil (pendant plusieurs mois) alors que les livres changent tous les jours pour les utilisateurs connectés. Il faudrait installer l'extension [[mw:Extension:MagicNoCache]] afin de pouvoir utiliser <nowiki>__NOC</nowiki>ACHE__ sur la page d'accueil. --&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 29 mars 2025 à 20:56 (CET) :Bonjour, bien reçu, j'ai créé un ticket pour voir déjà si on peut diminuer ce cache à 24h (sinon il faudra voter pour l'extension) : https://phabricator.wikimedia.org/T390674. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<span style="color:#FF6600">$</span>♠]]) 1 avril 2025 à 11:46 (CEST) ::Merci JackPotte. ::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 1 avril 2025 à 19:00 (CEST) :::Un problème similaire a été signalé en 2023 [[phabricator:T351573]], et en 2017 [[phabricator:T119366]] mais pas la moindre action de correction depuis toutes les années écoulées. Les problèmes des "petits" wiki ne sont pas écoutés. :::J'ai donc créé la page de vote pour installer l'extension : [[Wikilivres:Prise de décision/Installer l'extension MagicNoCache]]. :::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 1 avril 2025 à 19:48 (CEST) ::::{{Mention|Lionel Scheepmans}}, {{Mention|Fourmidable}} : un avis / un vote sur ce sujet ? --&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 12 mai 2025 à 20:04 (CEST) :::::Je viens de donner mon avis sur la page idoine, merci du rappel ! [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 13 mai 2025 à 11:00 (CEST) == Erreur d'affichage sur la page d'accueil == Bonjour tout le monde, Un petit message pour savoir où nous en sommes sur le problème d'affichage dans la page d'accueil (débordement des cadres de livres suggérés sur la boîte à outils des utilisateurs connectés). Wikilivresquement, [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 26 avril 2025 à 17:59 (CEST) :Salut Fourmidable, :J'ai tenté de trouver une solution pour cet habillage, mais il est tellement mal conçu que ça semble impossible. :C'est le seul habillage qui pose problème, pour plusieurs pages et pas seulement la page d'accueil. :La décision arbitraire d'imposer cet habillage sans consulter la communauté du projet est une aberration. :Le mieux serait de : :# créer un bug pour l'habillage Vector-2022 qui ne fonctionne plus dès qu'il y a le moindre code CSS, :# créer une demande de fonctionnalité pour que les administrateurs du projet puisse sélectionner l'habillage par défaut par projet choisi par décision communautaire, :Mais comme les "petits wikis" ne sont pas écoutés, ce serait inutile (voir les nombreux exemples de problèmes reportés spécifiques à fr.wikibooks dont aucun n'a jamais été résolu). :--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 26 avril 2025 à 20:26 (CEST) ::Ok, en tout cas sache que je soutiens ta proposition ! [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 1 mai 2025 à 16:28 (CEST) == Matthius : le grand retour == Bonjour à tous, Quelqu'un veut-il bien m'aider à relire les [https://fr.wikibooks.org/w/index.php?title=Sp%C3%A9cial%3AContributions&target=Matthius&namespace=0&tagfilter=&newOnly=1&start=&end=&limit=50 nouveaux livres de Matthius] ? Il semble y avoir, une fois de plus, de graves problèmes de sourçage et des attaques (même déjà soulignées en 2023 !) contre "le libéralisme" et "la finance" avec des phrases obscures ; par exemple : * dans [[Conseils Chrétiens]] : "Le libéralisme empêche de voir la société. Alors on croit les films libéraux, faisant croire que l’individu fait la société, alors que c’est la société qui fait l’individu. En effet, notre ego est créé par notre famille." * dans [[Pourquoi un Dieu ?]] : "L'individualisme dû au libéralisme, de plus en plus prégnant, va par contre cacher de plus en plus notre sociabilité et notre créativité.", "le social-libéralisme ne sera que le moyen d'accéder au pouvoir par la voie opportune alors qu'on cachera le social au peuple, pour ne pas qu'il se comprenne. Le dirigeant social-libéral aura appris dans les écoles d'économie que les marchés c'est magique.", "désengager l'état, détruisant alors le développement donc la république", "La faille du libéralisme est la censure, censure permise par la pauvreté des esprits ayant peur des autres à cause de l'individualisme forcené. [...] Le libéralisme cherchera la censure pour empêcher qu'il y ait suffisamment d'esprits philosophes et créatifs s'intéressant à la politique.", "La finance croira alors qu'il faille installer une dictature pour liquider la population trop difficile à maîtriser. [...] il s'agit pour la finance de trouver de plus en plus d'illusions pour satisfaire la population" * dans [[Économie Enfants]] : le libéralisme a "rendu l’école non épanouissante par le manque de créativité, en disant que le pays ne peut plus se développer, à cause de la monnaie privée" et l'assertion non (mal ?) argumentée "Le libéralisme aboutit selon moi à l'abrutissement de l'individu, voire à la violence" * dans [[Devenir un Génie]] : "Ils sont ainsi devenus égoïstes, donc libéraux.", "le libéralisme peut apporter un manque de liberté, car c’est une doctrine et une idéologie orientée sur l'individu, individualisme cachant une société, allant alors vers la destruction du plus faible par une liberté sans limite.", "La finance a en fait tenté et tente de faire croire qu’elle s’occupe de notre liberté, alors qu’elle veut nous empêcher de nous émanciper." * dans [[Univers Vivant]] : "La finance veut que nous soyons des consommateurs alors que nous sommes des acteurs de la société.", "Pour les financiers la population pauvre doit souffrir de malnutrition.", la finance "devient alors autoritaire comme après la crise de 1929. Nous sommes à un moment crucial où nous pouvons remettre en cause l’idéologie scientiste aboutissant à nier la nature. Ainsi il y avait 1,7% de CO2 pendant le crétacé au lieu de 0,04 % en 2023." Notons que le dernier ouvrage en date, [[XXIe]], est particulièrement gratiné : * climatoscepticisme : "le GIEC aura causé une hécatombe de suicides pour un faux réchauffement de la terre" * théories du complot sur les résultats des élections occidentales : "Selon des journalistes de Sud Ouest diffusés sur Agora Vox qui ont récoltés les suffrages des élections de 2017 et qui ont suivi l’élection de 2022, Macron n’a pas été élu par les français. En réalité il est arrivé dernier des élections présidentielles de 2017.", "Emmanuel Macron avait des nuls médiatisés face à lui" * théories du complot sur la CIA et les démocrates américains : "les démocrates trichent sur les élections en 2021", "Les États-Unis sont partis d’Afghanistan pour préparer la guerre d’Ukraine" * biais prorusse : "la Russie entre en guerre contre l’Ukraine en février 2022, puisque l’Ukraine avait attaqué la Russie. Les médias occidentaux feront croire [...] que c’est la Russie qui attaque", "Vladimir Poutine est voulu par les russes, contrairement aux élus occidentaux. Les élections en Russie se déroulent suffisamment bien pour que la Russie soit considérée comme une démocratie." -- [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 11 mai 2025 à 17:24 (CEST) :J'ai lancé une série de [[Wikilivres:demandes de suppression|demandes de suppression]]. Je notifie les personnes ayant participé à l'[[Wikilivres:Demandes de suppression/2023|ancien débat (2023)]] : {{Mention|JackPotte}}, {{Mention|Lionel Scheepmans}} et {{Mention|DavidL}} pour info. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 12 mai 2025 à 11:23 (CEST) ::Salut @[[Utilisateur:Fourmidable|Fourmidable]].. C'est bien que tu inspecte le contenu de Wikiversité à la recherche de contenu indésirable ou problématiques. Mais je vois dans le titre de ce sujet de discussion une forme de sarcasme et de condescendance qui ne me semble pas adapter à un projet collaboration où tout le monde est le bienvenu peu importe ses croyance et ses idée. De plus la première personne concernée, c'est à dire l'auteur, n'y est pas notifiée. ::Ensuite, il fauétait une fois se mettre d'accord sur le fait que la ligne éditoriale de Wikiversité est différente à celle de Wikipedia. Un recueil de cours et de travaux de recherche, ce n'est pas une encyclopédie. On en a déjà discuté. La neutralité de point de vue n'existe pas dans l'enseignement ni dans la recherche. ::Pour preuve, mon fils a un cours de religion dans SZ formation secondaire et il peut choisir entre différentes religion ou opter pour un cours de morale et de citoyenneté. À l'université, les orientation idéologique des enseignants son souvent bien connue. Et il est évident que l'enseignement dans une business school sera plus libérale qu'une fac de théologie. ::Dans le cadre des travaux de recherches, la Liberté d'expression doit être complète, l'auteur doit être libre d'y faire ses propre interprétations des faits et développant sa propre argumentation. Sans quoi, c'est plus de la recherche. ::Finalement, un support d'enseignement dans un projet collaboratif, n'est pas un projet de recherche. On ne parle pas en "je" dans un cours, on le fait dans une recherche. Or, l'usage du "Je" implique une certaine subjectivité. ::En conclusion, je ne vois pas ce nouvelle appel dans la forme et l'énergie qu'il se présente, comme quelque chose de très collaboratif. Et je n'ai pas envie de jouer à nouveau le médiateur dans ce redémarage d'une confrontation idéologique entre deux contributeurs incapable de collaborer dans la production de contenu de qualité. ::Plutôt que de faire du rameutage ici, je te proposeraient plutôt, selon tes disponibilités, de collaborer aux écrits des auteurs en discutant avec eux sur le page de discussions de leurs articles au sujet des améliorations possibles. Plutôt que de faire appel à la suppression de toute une page pour certains passages problématiques, une démarche collaboratif serait d'aider à la résolutions de ces problèmes, dans le but de ne pas perdre tout le reste de la page. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 13:20 (CEST) :::Tu as raison, je notifie aussi {{Mention|Matthius}} en espérant que cette fois son comportement soit plus constructif... Concernant les ouvrages qui sont moins problématiques, j'ai fait des demandes dans les pages de discussion idoines. Ici on a des ouvrages clairement complotistes et anti-science qui nuisent à la réputation de Wikilivres. (PS : Nous sommes sur Wikilivres, pas sur Wikiversité ;)) [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 12 mai 2025 à 13:21 (CEST) ::::Entre-nous @[[Utilisateur:Fourmidable|Fourmidable]], je ne trouve pas ton comportement plus constructif, ni collaboratif que le tien... [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 13:24 (CEST) :::::À mes yeux et dans le cadre d'un projet collaboratif, commencer par une demande de suppression avant toute chose peut même être perçu comme violant. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 13:26 (CEST) ::::::Mon but n'est pas de faire une croisade pour le libéralisme ou le GIEC sur Wikilivres, mais il y a quand même des limites pour tenir la réputation du site et plus largement de la Wikimedia Foundation. Je te rejoins sur le fait que les auteurs ne doivent pas être libres d'écrire absolument tout ce qu'ils veulent, et aussi que la critique doit être constructive, mais ce n'est pas au créateur du livre d'être le seul arbitre de ce qui est raisonnable ou pas vis-à-vis de son travail (i.e. simple reformulation, suppression partielle ou totale...). Et en 2023 Matthius a montré un comportement très agressif vis-à-vis de mes critiques, ce qui a mené '''ensuite''' à des débats de suppression. Pour l'instant, je ne fais que soulever des phrases (souvent identiques à celles de 2023) que je trouve (de nouveau) hautement problématiques d'un point de vue scientifique (manque voire absence totale de sourçage), mais le passage par des demandes de suppression directement se justifie par une forme de récidive sur certaines affirmations auxquelles aucune amélioration n'a été apportée après critique. Tu m'accuses de rameutage, mais je ne fais que consulter la communauté dans son ensemble : ici pour une discussion globale, sur [[Wikilivres:Demandes de suppression]] pour un débat et un "vote" au cas par cas. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 12 mai 2025 à 13:34 (CEST) :::::::Désolé aussia pour le côté péjoratif du terme rameutage. Parlons de notiffication c'est plis adéquat. :::::::Je réalise seulement que l'on est sur wikilivres et pas Wikiversité. Désolé sur mon smartphone ça ne saute pas aux yeux. Il faut donc recontextualiser tout ce que j'ai écrits précédement. Heureusement, historiquement Wikiversité est un sous projet de wikilivre. Les deux projet sont très proches dans leurs mission pédagogique et mode de fonctionnement. L'objet ici étant de produire des livres pédagogiques pour toute les tranches d'âges et pas uniquement des ouvrages qui doivent répondre à à des attentes scientifiques. Il apparait dans tes propos des thermes très wikipédien tel que le sourçage et la neutralité de point de vue. Je ne pense pas que cela doit s'appliquer ici. :::::::Ensuite Wikilivres est trop petit pour avoir un commuté d'arbitrage et je n'ai pas envie de parcourir les historiques à la recherche de qui a commencé. Mais je maintient l'idée que notifier des personnes vers un appel à suppression est une démarche que je considère symboliqueemnt violente et me semble aussi être une récidive. :::::::As-tu cherché à améliorer les texte en question en discutant avec l'auteur avant de proposer leurs suppression ? :::::::As-tu conscience que nous sommes ici dans un projet collaboratif, pluraliste et non universitaire ? [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 15:02 (CEST) ::::::::Du reste, nous ne sommes pas ici pour répondre à des suposées attentes de la Fondation Wikimedia. Car le rôle de celle-ci est précisément de répondre aux notres. C'est le rôle d'une fondation. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 15:07 (CEST) :::::::::Bonjour, :::::::::Il faudrait avant tout classer les écrits de l'auteur, car il pourrait il y avoir un problème d'admissibilité, Wikilivres étant avant tout un projet de rédaction de livres '''pédagogiques'''. Ces écrits contiennent beaucoup d'avis personnels et présentent une vision sans discussion ni argumentation, sans apporter de pédagogie sur un sujet particulier. :::::::::Si on peut qualifier les écrits comme de la recherche, il vaudrait mieux les déplacer vers la wikiversité, où une communauté supplémentaire et plus expérimentée sur la recherche pourrait exprimer son avis sur le sujet ou sur comment améliorer/corriger les écrits de Matthius. :::::::::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 12 mai 2025 à 20:01 (CEST) ::::::::::Je plussoie {{Mention|DavidL}}. {{Mention|Lionel Scheepmans}} ce que tu dis s'applique aux cas où il y a une réelle démarche scientifique ou a minima une attitude collaborative de la part de l'auteur. Or : ::::::::::* premièrement (tu le sais sans doute, étant toi-même chercheur), les livres de Matthius sont très loin de toute méthode scientifique, c'est plutôt un ensemble d'assertions non sourcées qui font la promotion d'une idéologie (et on verse même dans l'antiscience avec les paragraphes sur le GIEC). On pourrait donner la parole à Matthius sur ce sujet mais je crains qu'il ne se définisse même pas lui-même comme scientifique ; ::::::::::* deuxièmement, avec cette série de recréations le 8 décembre dernier, sans attendre l'avis de la communauté, et avec les '''mêmes phrases''' problématiques (parfois à peine reformulées, souvent conservées à l'identique), je ne vois pas comment on pourrait supposer que Matthius fait preuve d'ouverture d'esprit et d'attitude collaborative. ::::::::::Bref, si vous voulez absolument garder tous ces ouvrages et essayer de composer tant bien que mal avec la pugnacité de leur auteur, ce sera sans moi... À mon avis, il serait nettement plus profitable de traduire les livrels de [[:en:Subject:Economics|Wikibooks en anglais sur l'économie]], par exemple. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 13 mai 2025 à 11:07 (CEST) :::::::::::Je viens de prévenir Matthius par mail. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 13 mai 2025 à 11:12 (CEST) ::::::::::::Tree bien. Moi aussi, je n'ai plus envie de consacrer du temps là dessus. Je vous laisse donc traiter la situation puisque votre avis est majoritaire. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 13 mai 2025 à 11:27 (CEST) :::::::::::Je ne comprends pas cette assertion. Je cite François Gervais contre le GIEC, qui a écrit pour le GIEC sans être entendu pour la conclusion. :::::::::::Je n'ai pas reformulé mes phrases à l'identique. J'ai soit indiqué la source contrairement à ce qui dit Fourmidable, soit indiqué que c'était mon point de vue ou émis une explication. Aussi quand je fais une assertion scientifique, j'en indique souvent la cause scientifique. Fourmidable a tendance à reprendre les phrases où je répète ce qui a été écrit avant pour aller plus loin. Donc il faut chercher dans mes livrels la phrase où je cite et où j'émets une hypothèse avec la cause scientifique. Je vais relire Fourmidable. :::::::::::Aussi j'ai trouvé sur l'[http://web.archive.org/web/20240810201141/https://www.google.com/search?q=mati%C3%A8re+temps+%C3%A2me âme qui ralentit la vitesse]. Je pense que Google utilise une IA pour détecter les limites de l'humain. Mon expérience de pensée va contre le matérialisme scientifique puisque j'émets l'hypothèse supérieure qu'il existe des multivers où des âmes agissent sur le nôtre. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 13 mai 2025 à 11:36 (CEST) :::::::::::Je ne pense pas effectivement que mon livrel sur le XXIe va rester sur wikibooks puisque il va contre ce qu'indique wikipedia. J'espère juste qu'il puisse rester. :::::::::::Seulement j'ai une formation en ingénierie et j'ai trouvé sur [https://archive.org/details/TempsAme l'âme qui ralentit la vitesse] [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 13 mai 2025 à 12:13 (CEST) ::::::::::Vous admettez {{Mention|DavidL}} que vous ne connaissez pas les domaines que j'aborde. Mes livrels sont pédagogiques donc vous pouvez apprendre avec. Donc lisez les avant d'émettre l'hypothèse qu'ils ne le sont pas. J'ai créé le coaching sans coach qui a permis de revoir la pédagogie d'un journal d'un réseau international. Mais cela ne m'empêche pas d'aller contre le libéralisme et l'appât du gain qui sont selon moi les fléaux actuels. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 13 mai 2025 à 12:06 (CEST) :::::::::::@[[Utilisateur:Matthius|Matthius]] semble ouvert au débat et à une aide pour améliorer ses textes. La suppression ne me semble donc pas une option souhaitable. Wikilivres est indépendant de Wikipédia. Il faut donc se référer à nos règles et recommandations locale disponible dans les espaces de noms "wikilivres" et "aide". Je vais essayer de prendre le temps d'écouter les textes avec une voix de synthèse pour gagner du temps. Cela me permettra d'en faire des commentaire en vue d'une amélioration. Car si ce sont des sources qui manques et bien il suffit de les ajouter. Nous sommes là pour travailler ensemble pour produire des ouvrages pédagogiques de qualité, pas pour juger du travail des autres en vue d'une suppression. Restons, s'il vous plait dans un esprit d'entraide et de collaboration. C'est tellement rare à notre époque... [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 14 mai 2025 à 15:00 (CEST) :::::::::::Mon livrel sur le XXIe siècle en cours d'écriture va aussi contre les théories du complot occidentales. J'écris que la Russie et la Chine sont des démocraties, alors que nos médias disent que ce sont des dictatures. J'émets effectivement des hypothèses non sourcées dans ce nouveau livrel. Je peux et vais les sourcer. Par contre j'utiliserai des sources primaires. En réalité, j'émets l'hypothèse que ce sont nos médias qui sont dans la post-vérité et que ce ne sont pas les médias étatsuniens, ni russes, ni chinois qui y sont. Ce livrel est effectivement une bombe dangereuse contre nos médias comme l'indique Fourmidable. ::::::::::::Je ne comprends pas l'acharnement de Fourmidable à ne pas vouloir discuter avec moi et à vouloir automatiquement supprimer mes livrels sans discussion préalable. En effet il a eu un an pour m'indiquer comment améliorer mes livrels. Et que Fourmidable ne me dise pas que c'est moi qui ait commencé, puisque j'étais outré qu'on veuille supprimer mes livrels avec ses copains sans discussion pédagagogique au tout début. ::::::::::::Concernant la neutralité de wikipedia : wikipedia ne fait que révéler l'avis des médias financés donc il n'est pas neutre. Être neutre c'est révéler tous les points de vue, même ceux avec lesquels on n'est pas d'accord, ce que [https://archive.org/details/wikipediaCo-Fondateur fit wikipedia au début de son histoire] et ce pour quoi je me suis intéressé et ai été réprimé sauf pour wikibooks anglais qui m'a viré pour ne pas enlever mon nom. :{{Mention|Matthius}} Avez-vous l'intention de publier des livres scientifiques, c'est-à-dire sourcés par de la science publiée et évaluée par les pairs, et à défaut de grands médias nationaux et internationaux ? Vous pouvez aussi tester vos hypothèses mais votre travail ne doit pas consister à sélectionner les sources qui vous conviennent pour seulement valider votre théorie, en mettant de coté tout ce qui vous dérangerait dans cette entreprise. --[[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 10:48 (CEST) ::@[[Utilisateur:Fourmidable|Fourmidable]], je pense que tu te fais une vision fausse du monde de l'édition. @[[Utilisateur:Matthius|Matthius]] peut payé une maison d'édition, dans le cadre d'une [[w:Édition_à_compte_d'auteur|édition à compte d'auteur]]. Probablement qu'il l'a déjà fait puisqu'il a déjà publié des ouvrages au format papier parmi ceux qu'il veut placer sur Wikilivres. Il en a même déposé certains dans une bibliothèque universitaire. Quant à la revue par les paires ne se fait que dans le cadre des journaux scientifique. ::J'ai écouté l'ouvrage [[Pourquoi un Dieu ?]] Et je trouve effectivement qu'il n'a pas sa place dans Wikilivres. Non pas parce qu'il critique le libéralisme avec des propos que je partage en grande partie, mais parce qu'il s'apparente plus à de la propagande chrétienne qu'à un réel ouvrage pédagogique sur le sujet. ::Matthius y est en posture de prédicateur et non de pédagogue. Je dirais que la moitié des phrases de l'ouvrage que j'ai écouté sont des affirmations sans argumentation ni démonstration valide. La thèse de son ouvrage se résume à dire que dieu est la seule chose qui peut expliquer un phénomène actuellement inexpliqué. Ce qui est une corrélation fallacieuse puisqu'il n'existe aucun lien de causalité. ::Pour moi, les ouvrages évangéliste ou propagandiste n'ont pas leur place dans Wikilivres et je serais d'avis d'ouvrir une prise de décision pour établir une règle d'interdiction. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 11:42 (CEST) :::Oui voilà, nous sommes d'accord. Peut-être que Matthius peut adopter une attitude plus scientifique, mais l'esprit de "pédagogie" s'accompagne forcément d'une démarche scientifique, sinon c'est de la prédication/propagande. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 11:45 (CEST) ::::@[[Utilisateur:Fourmidable|Fourmidable]]... Wikilivres n'est pas une bibliothèque "scientifique" mais pédagogique. Tu sembles confondre les deux termes. Les livres pour enfants que contient Wikilivres ne sont pas "scientifique" tout en étant pédagogiques. ::::Un autre fait qui peut être reproché à @[[Utilisateur:Matthius|Matthius]] est son autopromotion, [[Wikilivres:Présentation#● Wikilivres n'est pas une vitrine|alors que la démarche proscrite sur Wikilivres]]. ::::Plutôt que de supprimer l'important travail effectué par Matthius, je propose à nouveau de le déplacer en sous page de son espace utilisateur pour qu'il puisse retravailler ses écrits. ::::Pour un retour dans l'espace principale, il faudrait au préalable qu'il supprime des ses travaux toute forme d'autopromotion et toute forme propagande, prosélytisme ou autre type de discours prédicateur. Ceci notamment en référence aux choix politiques [https://www.senat.fr/leg/ppl17-386.html français], [https://www.rtbf.be/article/le-proselytisme-religieux-ou-politique-n-a-pas-sa-place-a-l-ecole-quels-chiffres-derriere-ce-phenomene-pointe-par-la-ministre-de-l-education-11477234 belge], [https://www.assnat.qc.ca/fr/travaux-parlementaires/projets-loi/projet-loi-94-43-1.html Quebec], [https://ge.ch/grandconseil/data/loisvotee/L11764.pdf suisse]. Quatres communautés culturelles très largement majoritaire dans l'espace francophone des projets Wikimédia. ::::J'invite Matthius et les autres membres de notre communauté réagir à ce message et de discuter du lancement d'une nouvelle prise de décision pour interdire la propagande et le prosélytisme dans Wikilivres. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 12:21 (CEST) :::::Ce que je veux dire, c'est qu'un bon livre pédagogique s'appuie forcément sur des connaissances scientifiques. Ok pour un redéplacement. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 12:37 (CEST) ::::::Ne fais pas à ton tour du prosélytisme scientifique @[[Utilisateur:Fourmidable|Fourmidable]]. La science et les connaissances dites scientifiques comme tu les entends n'est pas la seule chose sur laquelle on peut s'appuyer pour produire un contenu pédagogique. ::::::Que fais-tu de la méditation, de l'humour, de la poésie, de la musique, du dessin, et toute autre expression artistique ? ::::::Et il existe aussi un tas d'ouvrages pédagogique religieux (pour le catéchisme entre autre), sauf que, comme la plupart des législations nationales des pays francophones occidentaux, je pense qu'ils n'ont pas leur place dans Wikilivres. Ce sur quoi nous devons nous positionner dans une prise de décision collective. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 12:52 (CEST) :::::::Ah oui, dans ce sens-là il y a en effet moins de science à proprement parler… Mais je ne suis pas sûr que cela s'applique aux propos politiques. Ça ne me viendrait pas à l'idée de faire un Wikilivre afin de convertir les gens au libéralisme, par exemple. C'est le rôle d'autres wikis ou sites web spécialisés. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 14:44 (CEST) :::Je vais supprimer Du même Auteur et Du même éditeur de mes wikilivres. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 15 mai 2025 à 12:32 (CEST) ::::Si vous voulez, mais c'est loin d'être le point principal. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 12:38 (CEST) :::::Effectivement @[[Utilisateur:Matthius|Matthius]], c'est une bonne résolution, mais il reste le prosélytisme à résoudre et je pense que cela demande beaucoup de travail à réaliser dans votre espace de travail personnel. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 12:55 (CEST) ::::::Vous mettiez que seul Pourquoi un Dieu est prosélyte. J'avais effectivement un doute en ajoutant ce livrel. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 15 mai 2025 à 19:43 (CEST) :::::::Je n'ai pas encore eu le temps d'écouter les autres livres @[[Utilisateur:Matthius|Matthius]] . Nous somme tous bénévoles ici. Cela peut prendre du temps, mais je vous invite déjà à déplacer vous-même le livre ''Pourquoi un Dieu'' dans vos sous page utilisateur''.'' :::::::Par anticipation, je peux déjà dire que tous les autres ouvrages faisant la publicité de vos écris doit être modifier ou retirer de l'espace principale ainsi que tous ceux qui font référence à Dieu ou au catholicisme de manière prosélyte. :::::::Seul le nom des auteurs devrais être repris dans les livre avec éventuellement des hyperliens vers leurs pages utilisateur qu'il sont libre d'éditer comme il veulent. :::::::On peut ensuite créer des pages catégories qui reprennent tous les travaux des auteurs, avec l'avantage qu'elle se complétent automatiquement à chaque fois que l'on ajoute une catégorie en bas de page d'un ouvrage. Vous trouverrez certainement des indication dans les pages d'aide. :::::::Je vous rassure sur le fait que ce traitement serait semblable pour un politicien libéral faisant la publicité de son parti, de ses idéologies et de sa personne. N'hésitez pas d'ailleurs à parcourir les autres wikilives pour y détecter ce genre de problème avant de nous le signaler. C'est ce que fait @[[Utilisateur:Fourmidable|Fourmidable]] en cherchant à veiller sur la qualité et la conformité de notre projet. Une belle fin de journée ! [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 16 mai 2025 à 11:41 (CEST) ::::::::Pour info, je confirme et soutiens tout ce que propose {{Mention|Lionel Scheepmans}} dans son dernier message (merci à lui). [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 16 mai 2025 à 12:01 (CEST) ::::::::Pourquoi a Dieu a été mis à jour dans mon espace personnel. Je ne sais pas comment effacer une page wikibooks.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 16 mai 2025 à 12:24 (CEST) :::::::::@[[Utilisateur:Matthius|Matthius]]. Je ne comprends pas ce que vous dite. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 16 mai 2025 à 15:16 (CEST) ::::::::::J'ai copié-collé Pourquoi un Dieu dans ma page personnelle. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 16 mai 2025 à 21:36 (CEST) :::::::::::Ah très bien @[[Utilisateur:Matthius|Matthius]]. Mais en fait, il est possible de déplacer les pages en les renomant. Cela permet de conserver tout l'historique de l'édition. Je vais le faire quand je serai sur PC. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 17 mai 2025 à 03:34 (CEST) ::::::::::::Ne le faites pas : L'original de l'historique est sur mon espace perso. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 17 mai 2025 à 09:30 (CEST) :::::::::::::@[[Utilisateur:Matthius|Matthius]], j'ai écouté l'ouvrage Économie enfant. Si j'étais à la tête d'une maison d'édition, je ne publierais pas ce manuscrit. Il y a des passages très intéressants avec des idées originales que je partage, mais aucune argumentation pour les valider. Pour le reste, on retrouve un copié collé du précédent ouvrage. Beaucoup d'information factuelle sans réelle contextualisation ni fil conducteur et puis de nombreuses affirmations gratuites qui ne sont finalement que des opinions très relatives et de nouveau non argumentées. :::::::::::::Le pire étant que certaine de ces affirmations son tout simplement fausses ou inscensées. :::::::::::::Exemples d'une phrase : :::::::::::::« Écrire sur ce que vous comprenez de l’archéologie, qui est l’humanité avant l’écriture. » :::::::::::::Cette phrase est erronée et n'a même aucun sens. L'archéologie n'est pas l'humanité, mais un domaine des sciences créé par les humains. Ensuite, l'archéologie n'est pas quelque chose qui se limite à avant l'écriture. Il existe des nombreux sites archéologiques qui fouillent les vestiges de la Rome antique. Une civilisation qui n'était pas dénuée d'écriture. :::::::::::::Exemple d'un paragraphe : :::::::::::::« Le [[w:Capital|capital]] de l’humanité peut donc être la Terre. En effet, l'argent est produit à partir du papier venant du bois. Les trafiquants ont toujours voulu se l'approprier. Le capital pourrait donc ne pas être l’argent. Le troc nécessite cependant un patrimoine conséquent. La Chine veut s’approprier le capital Lune, pour y prendre l’Helium 3 selon Solidarité et Progrès, seule ressource lunaire qu'il est intéressant de transporter, afin de le fusionner, pour en obtenir de l’énergie illimitée, favorisant la créativité par le surplus de biens. » :::::::::::::Ce paragraphe est incompréhensible et citer un parti politique (à d'autres reprises aussi dans l'ouvrage) comme source pour poser une affirmation, pose deux gros problèmes. 1 celui de faire la publicité d'une idéologie au sein d'un écrit pédagogique, 2 celui de ne pas respecter un des principes de base de l'écriture scientifique alors que le livre en parle et la défend. :::::::::::::Je n'irai pas plus loin dans les exemples. :::::::::::::Dans leurs états actuels et pour que ces livres travaux d'écritures soient admissibles dans Wikilivres. Je pense que vous devez impérativement supprimer : :::::::::::::* toute promotion personnelle. :::::::::::::* toute forme de Prosélytisme religieux. :::::::::::::* toute forme de publicité ou contre publicité politique et partisane :::::::::::::* toute affirmation fausse et autres types de fabulations. :::::::::::::* tout raisonnement ou démonstration sans lien de causalité. :::::::::::::Suite à quoi, il faudrait encore dans l'idéal en améliorer le style de sorte à y développer un fil conducteur qui permettrait aux lecteurs de suivre un développement ordonné propice à l'apprentissage, et non leur soumettre un journal de réflexions personnelles, reprenant des erreurs factuelles et logiques. :::::::::::::C'est un travail conséquent. :::::::::::::Et en ce qui concerne le prosélytisme, les approches politiques partisanes, il est impératif, y compris les sous page de votre page utilisateur. :::::::::::::Il y a des idées intéressantes dans vos écrits, et je partage pas mal de vos points de vue concernant la question du néolibéralisme. Mais Wikilivres n'est pas une tribune d'opinion à l'image d'AgoraVox. Nous sommes ici pour produire des ouvrages pédagogiques. Pas pour influencer nos lecteurs en faveurs ou à l'encontre de certaines religions ou idéologies. :::::::::::::Tout en l'encourageant à le faire de manière plus courtoise et constructive, je remercie donc @[[Utilisateur:Fourmidable|Fourmidable]] de nous avoir alerté sur l'incompatibilité de vos ouvrages avec notre projet. Dans tous les cas ceux que j'ai écoutés jusqu'à présent. :::::::::::::J'aimerais à votre tour vous encourager à poursuivre vos travaux d'écriture en cherchant à vous rapprocher de notre objectif tout en respectant nos règles et recommandations. Mais sachez aussi que vous pouvez aussi améliorer l'article de Wikipédia sur l'[[w:Économie_réelle|économie réelle]]. Ou aussi développer une leçon sur Wikiversité sur le même sujet dans la [[v:Faculté:Économie|Faculté d'Économie]]. C'est un sujet intéressant qui permet de mettre en lumières les limites de la [[w:Finance|finance]]. :::::::::::::Ces deux activités seraient moins ambitieuses que de vouloir produire un livre de qualité pour expliquer l'économie aux enfants. Cela demande une grande maîtrise du sujet en plus d'un certain don pour la vulgarisation. :::::::::::::Il me reste deux ouvrages proposés à la suppression à écouter, mais j'ai bien peur d'y retrouver les mêmes incompatibilités que celles que je viens d'expliquer à l'instant. :::::::::::::Bien cordialement, [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 26 mai 2025 à 21:16 (CEST) :::::::::::::Mon correcteur orhtographique ne fonctionnant pas pour des commentaires aussi long, le message que je viens de laisser est truflé de fautes et je n'ai pas le temps ni le courrage de les corriger. Encore une fois, le travail que je fournis sur ce projet est tout à fait bénévole. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 26 mai 2025 à 21:21 (CEST) ::::::::::::::J'ai passé beaucoup de temps à élaborer le coaching sans coach. Ce n'est naturel pour aucun ancien élève de simplifier. Je ne sais pas combien de fois j'ai relu Comment Écrire des Histoires. J'ai toujours beaucoup de temps devant moi pour revoir mes livrels.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 10:51 (CEST) :::::::::::::::@[[Utilisateur:Matthius|Matthius]], c'est précisément parce que vous travailler beaucoup et que vous Me semblez de bonne foi et volonté, que je passe autant de temps à vous aiidez. Tous vos textes comprends des problèmes qu'il faut résoudre. Vous devriez commencer par supprimer tout ce qui fait référence à vous, à la religion et au politique, pour ne garder que des faits et affirmations vérifiées par des sources sûres et non partisannes, à chaque fois pour vous assurez que vous n'être pas simplement en train de diffuser ou colporter une opinion fausse et/ou partisane. Ce qui vient d'être dit est incontournable. :::::::::::::::Je penses ensuite qu'indique messages auxquelles ont été écrites vos sections sont superflues dans le cadre d'un ouvrage pédagogique. La chronologie de vos écrits n'est pas un bon un fil conducteur. Encore une fois, Wikilivres n'est pas un lieu pour publier ses mémoires ou ses réélections du jour. Il existe le format blog pour ce genre de choses. :::::::::::::::Tennez compte aussi que nous ne disposons pas forcément d'autant de temps et de motivation que pour revoir vos livres. Raison pour laquelle, des méthodes plus expéditives telles que la suppression complète des pages inadaptées à notre projet finiront par être appliquées. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 13:18 (CEST) ::::::::::::::::Le livrel le plus important pour moi est l'économie pour les enfants, vient ensuite devenir un génie. L'Univers est Vivant a été référencé sur les moteurs de recherche récemment parce que j'ai trouvé sur l'âme qui ralentit la vitesse. Quand on cherche matière temps âme sur les moteurs de recherche occidentaux on tombe sur ma page archive.org/details/TempsAme. Il n'y a toujours pas de chercheur qui a publié sur la mathématisation de ma trouvaille. L'univers est vivant est une amélioration d'un autre livre. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 13:56 (CEST) ::::::::::::::::Je viens de mettre mon [http://matthieu.giroux.free.fr/html/cv.htm CV] à jour pour montrer ce que j'ai influencé. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 14:05 (CEST) ::::::::::::::::C'est moi qui ai diffusé le terme économie réelle. Je reproche à ceux qui l'ont utilisé d'être des économistes scolaires, c'est à dire de se référer à l'économie monétaire pour parler d'économie réelle. Je peux cependant mettre un historique de cette économie sur la page wikipedia. Je me demande juste s'il va rester. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 14:08 (CEST) :::::::::::::::::Je suis désolé @[[Utilisateur:Matthius|Matthius]]. Je ne vais pas poursuivre nos conversations faute d'en avoir envie. Vous ma laissez sur cette impression que votre motivation première est de promouvoir votre personne, vos valeurs et vos idées. Je vais donc arrêter de vous consacrer du temps. Je suis ici pour soutenir et développer les projets et intérêts collectifs et non individuels. Bonne chance pour vos ambitions que je vous invite à réaliser en dehors des projets Wikipédia. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 15:00 (CEST) ::::::::::::::::::Mon projet relève de l'intérêt général de faire connaître l'économie du XIX{{e}} siècle de [[Henry Charles Carey]]. Mon égoïsme peut donc être aussi le vôtre. Pour moi il faut être intelligent et égoïste pour défendre l'intérêt général. Je pense qu'on peut tous avoir l'air de génies comme les enfants peuvent avoir l'air de génies. Oui, je suis militant et veux faire partager la joie de la politique. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 15:55 (CEST) :::::::::::::::::::Nous ne sommes donc pas sur la même longueur d'onde. Je vois invite à ne pas faire de militantisme sur les projets wikimedia. Il y a d'autres endois pour le faire. La blogosphère, des tribune comme agoravox, et de nombreux sites web tenus par des communautés militantes et reliée aux valeurs et idées pour lesquelles vous militer. Ceci est mon dernier message à ce sujet. Cordialement. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 16:18 (CEST) ::::::::::::::::::::Je vous mets au défi de penser que les wikipédiens ne sont pas des militants. Eux veulent aussi défendre l'intérêt général en apportant la connaissance. Par contre ils ne ciblent pas leurs apports. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 17:10 (CEST) ::::::::::::::::::::Comme prévu, on me dit que mon [https://fr.wikipedia.org/wiki/%C3%89conomie_r%C3%A9elle#Histoire ajout sur l'économie réelle] est inédit. Je pense que vous vous êtes intéressé à certains de mes écrits parce qu'ils vous apportaient des réponses. Je peux faire cela sur wikibooks. Seulement c'est encore plus difficile sur wikipedia. Je ne suis pas théseux. Oui l'économie réelle a été créée pour faire connaître l'économie physique de Lyndon Larouche. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 30 mai 2025 à 17:15 (CEST) :::::::::::::::::::::Merci quand même ! [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 31 mai 2025 à 00:24 (CEST) :Mon livrel l'univers est vivant [https://www.agoravox.tv/actualites/technologies/article/et-si-la-physique-quantique-avait-105532 a eu un impact]. Je pense aussi avoir influencé les jeunes qui se sont tournés vers la bible. == [Recherche universitaire] Questionnaire sur la gouvernance Wikimedia == Bonjour à toutes et à tous, Dans le cadre d’un mémoire de recherche sur les modèles de gouvernance décentralisés dans les communs numériques, je mène une étude analysant le mouvement Wikimedia. L’objectif est de mieux comprendre la perception qu’ont les contributeurs et contributrices des projets Wikimedia (Wikilivres, Wikipédia, Wikidata, Commons, etc.) de la Fondation Wikimedia, de ses décisions, et des relations avec les chapters locaux (ex. Wikimédia France). Un questionnaire anonyme, rapide à remplir (environ 5 minutes), a été conçu à cet effet. Il s’adresse à toute personne majeure ayant déjà contribué à un projet Wikimedia, quelle que soit l’ancienneté ou le niveau d’implication. Lien vers le questionnaire : framaforms.org/questionnaire-communaute-wikipedienne-et-la-wikimedia-fondation-1747225404 '''Important''' : Les résultats seront utilisés uniquement dans un cadre académique. L'enquête, ainsi que l'étude, ne sont ni commandités ni supervisés par la Fondation ou aucun chapitre local. Il s'agit simplement d'un projet scolaire que je mène {{sourire}}. Merci d’avance pour votre participation ! [[Utilisateur:3(MG)²|3(MG)²]] ([[Discussion utilisateur:3(MG)²|discussion]]) 27 mai 2025 à 10:43 (CEST) :J'ai répondu. Bon courage pour ton mémoire ! (Ça me fait penser que je dois avancer sur le mien aussi...) [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 29 mai 2025 à 23:28 (CEST) == Propagande, prosélitisme, autopromotion, militanatisme, etc == Bonjours à la communauté des contributeurs de Wikilivres. Je me dit qu'il serait bon de faire une nouvelle prise de décision pour mieux cadrer le contenu de notre projet par rapport à ce qui se situebdans le titre de ce message. Qu'en pensez-vous ? [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 16:22 (CEST) :Totalement {{Pour}} ! [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 29 mai 2025 à 21:53 (CEST) :L'économie financière peut être considérée comme une propagande puisque son utilisation ne permet pas de lier la macro-économie et la micro-économie, ne permettant donc pas de développer une société comme le fait l'[https://fr.wikipedia.org/wiki/%C3%89conomie_r%C3%A9elle économie réelle]. :Si on considère le prosélytisme comme convaincre de rejoindre sa communauté, il faudrait donc enlever tous les wikilivres qui sont beaucoup lus, puisque les wikilivres qui sont peu lus n'arrivent pas à convaincre. :L'autopromotion permet malgré tout de connaître ce que fait l'auteur d'un wikilivre. Si on enlève le chemin qu'a suivi l'auteur, on évacuerait ainsi ses contradictions et on pourrait donc faire dire à un auteur l'inverse de ce qu'il a compris au bout de son parcours. :Je considère ceux qui contribuent à wikipedia et à wikibooks comme des militants, puisqu'ils essaient d'influencer les autres avec ce qu'ils écrivent sur ces sites web. Certes, certains travaux peuvent être désintéressés, mais alors pourquoi mettre ces travaux sur ces sites web alors. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 3 juillet 2025 à 22:36 (CEST) k7scrtvxy6wxq77jza0meibuf6h4m04 745890 745889 2025-07-03T20:43:47Z Matthius 11787 /* Propagande, prosélitisme, autopromotion, militanatisme, etc */ 745890 wikitext text/x-wiki <noinclude>{{Wikilivres:Le Bistro/En-tête}}</noinclude> == compléter les bons conseils pour un nouveau livre == bonjour wikilivre ! je refais un tour sur ce wiki depuis un sacré bout de temps. Je vois que certains noms sont toujours là :) wouah. J'ai entâmé un livre nouveau aka. [[La sécurité du citoyen dans son logement]] que je vais encore améliorer mais je me pose dejà quelques questions sur le process, et vu que [[Wikilivres/Créer un wikilivre]] est assez high level je préfère demander ici des conseils. J'aime à penser que si l'idée est pertinente le guide pourra évoluer rapidement. * '''AutoCat''': il est indiqué clairement dans le guide pour la page de garde du livre de mettre <code><nowiki>{{AutoCat}}</nowiki></code> en bas de page, mais est-ce conseillé également sur chaque page du livre ? ça a l'air de marcher et donc plutôt oui: & si oui on pourrait l'ajouter dans le guide ? * je ne sais pas quoi mettre dans `CDU item` : on peut peut être orienter vers une bonne page sur le comment remplir le template proposé sur la page de garde * '''navigation horizontale''': est-ce qu'un moyen universel permet de suivre les chapitres d'un livre ? ex. si je suis sur un chapitre et que je veux aller au suivant, soit je passe par la page parent, soit je passe par la catégorie. Mais je voudrai (mieux qu') un bouton "next" / "previous". Enfin voici l'idée. S'il y a des choses en template automatique, je suis preneur (peut être le guide aussi) (PS: je vois que la gestion du sommaire est automatisée au sein même d'un chapitre : génial :) ) :NB: à une certaines époque j'utilisais des templates propres au livre (ex. [[Modèle:Les félins]]) et je vois que certains livres ont repris l'idée.. * '''catégorie''' : que faut-il mettre exactement dans le contenu de la catégorie auto-générée pour le nouveau livre ? juste <code><nowiki>[[Catégorie:Livres par titre]]</nowiki></code> ? * '''livre modèle''' : avez-vous un livre "modèle" : c'est-à-dire un livre (probablement à succès & pas trop grand) qui serait particulièrement suivi par les habitués et sur lequel on retrouverai toutes les techniques les plus avancées pour bien rédiger un livre. Il apparaîtrait du coup en modèle dans le guide. qu'en pensez-vous ? [[Utilisateur:Boly38|Boly]] [[Discussion_Utilisateur:Boly38|♪]] 5 mars 2025 à 18:09 (CET) :Salut Boly :* Autocat : normalement, il ne se met que dans le modèle listant les chapitres du livre, inclus dans toutes les pages. Par exemple le modèle {{m|Programmation JavaFX}} est inclus comme ceci : <nowiki><noinclude>{{Programmation JavaFX}}</noinclude></nowiki>) dans tous les chapitres du livre [[Programmation JavaFX]]. :* [[Wikilivres:CDU]] : il y a un moteur de recherche pour trouver le classement, mais il n'est pas encore pleinement détaillé et parfois il faut créer les pages correspondantes à la CDU. J'utilise http://www.udcsummary.info/php/index.php?lang=fr pour ajouter les pages manquantes. Si tu trouves un ou plusieurs classement possibles, je peux me charger de créer les pages qui manquent. :* '''navigation horizontale''' : Fait automatiquement par l'inclusion du modèle dans toutes les pages. Voir par exemple : [[Programmation Java Swing/Introduction]]. Le modèle ajoute les liens suivant, précédent et une flèche au milieu pour déplier la liste complète des chapitres du livre. :Pour la catégorie, un petit descriptif, comme par exemple : <pre><nowiki> Catégorie recensant les pages du livre [[Programmation JavaFX]]. Pour discuter de la rédaction du livre c'est ici : [[Discussion:Programmation JavaFX]]. [[Catégorie:Java]] </nowiki></pre> :--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 5 mars 2025 à 19:22 (CET) ::J'ai fait des clics magiques (dans l'historique des pages) pour remercier ; je ne sais pas où ça atteri mais bon. Le template sommaire avec navigation par page c'est exactement ce que je voulais : c'est top :) & merci aussi pour les illustrations ! David L au top ! ! [[Utilisateur:Boly38|Boly]] [[Discussion_Utilisateur:Boly38|♪]] 7 mars 2025 à 18:04 (CET) == Problème de cache sur la page d'accueil == Salut, Les utilisateurs anonymes voient toujours les mêmes livres sur la page d'accueil (pendant plusieurs mois) alors que les livres changent tous les jours pour les utilisateurs connectés. Il faudrait installer l'extension [[mw:Extension:MagicNoCache]] afin de pouvoir utiliser <nowiki>__NOC</nowiki>ACHE__ sur la page d'accueil. --&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 29 mars 2025 à 20:56 (CET) :Bonjour, bien reçu, j'ai créé un ticket pour voir déjà si on peut diminuer ce cache à 24h (sinon il faudra voter pour l'extension) : https://phabricator.wikimedia.org/T390674. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<span style="color:#FF6600">$</span>♠]]) 1 avril 2025 à 11:46 (CEST) ::Merci JackPotte. ::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 1 avril 2025 à 19:00 (CEST) :::Un problème similaire a été signalé en 2023 [[phabricator:T351573]], et en 2017 [[phabricator:T119366]] mais pas la moindre action de correction depuis toutes les années écoulées. Les problèmes des "petits" wiki ne sont pas écoutés. :::J'ai donc créé la page de vote pour installer l'extension : [[Wikilivres:Prise de décision/Installer l'extension MagicNoCache]]. :::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 1 avril 2025 à 19:48 (CEST) ::::{{Mention|Lionel Scheepmans}}, {{Mention|Fourmidable}} : un avis / un vote sur ce sujet ? --&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 12 mai 2025 à 20:04 (CEST) :::::Je viens de donner mon avis sur la page idoine, merci du rappel ! [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 13 mai 2025 à 11:00 (CEST) == Erreur d'affichage sur la page d'accueil == Bonjour tout le monde, Un petit message pour savoir où nous en sommes sur le problème d'affichage dans la page d'accueil (débordement des cadres de livres suggérés sur la boîte à outils des utilisateurs connectés). Wikilivresquement, [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 26 avril 2025 à 17:59 (CEST) :Salut Fourmidable, :J'ai tenté de trouver une solution pour cet habillage, mais il est tellement mal conçu que ça semble impossible. :C'est le seul habillage qui pose problème, pour plusieurs pages et pas seulement la page d'accueil. :La décision arbitraire d'imposer cet habillage sans consulter la communauté du projet est une aberration. :Le mieux serait de : :# créer un bug pour l'habillage Vector-2022 qui ne fonctionne plus dès qu'il y a le moindre code CSS, :# créer une demande de fonctionnalité pour que les administrateurs du projet puisse sélectionner l'habillage par défaut par projet choisi par décision communautaire, :Mais comme les "petits wikis" ne sont pas écoutés, ce serait inutile (voir les nombreux exemples de problèmes reportés spécifiques à fr.wikibooks dont aucun n'a jamais été résolu). :--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 26 avril 2025 à 20:26 (CEST) ::Ok, en tout cas sache que je soutiens ta proposition ! [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 1 mai 2025 à 16:28 (CEST) == Matthius : le grand retour == Bonjour à tous, Quelqu'un veut-il bien m'aider à relire les [https://fr.wikibooks.org/w/index.php?title=Sp%C3%A9cial%3AContributions&target=Matthius&namespace=0&tagfilter=&newOnly=1&start=&end=&limit=50 nouveaux livres de Matthius] ? Il semble y avoir, une fois de plus, de graves problèmes de sourçage et des attaques (même déjà soulignées en 2023 !) contre "le libéralisme" et "la finance" avec des phrases obscures ; par exemple : * dans [[Conseils Chrétiens]] : "Le libéralisme empêche de voir la société. Alors on croit les films libéraux, faisant croire que l’individu fait la société, alors que c’est la société qui fait l’individu. En effet, notre ego est créé par notre famille." * dans [[Pourquoi un Dieu ?]] : "L'individualisme dû au libéralisme, de plus en plus prégnant, va par contre cacher de plus en plus notre sociabilité et notre créativité.", "le social-libéralisme ne sera que le moyen d'accéder au pouvoir par la voie opportune alors qu'on cachera le social au peuple, pour ne pas qu'il se comprenne. Le dirigeant social-libéral aura appris dans les écoles d'économie que les marchés c'est magique.", "désengager l'état, détruisant alors le développement donc la république", "La faille du libéralisme est la censure, censure permise par la pauvreté des esprits ayant peur des autres à cause de l'individualisme forcené. [...] Le libéralisme cherchera la censure pour empêcher qu'il y ait suffisamment d'esprits philosophes et créatifs s'intéressant à la politique.", "La finance croira alors qu'il faille installer une dictature pour liquider la population trop difficile à maîtriser. [...] il s'agit pour la finance de trouver de plus en plus d'illusions pour satisfaire la population" * dans [[Économie Enfants]] : le libéralisme a "rendu l’école non épanouissante par le manque de créativité, en disant que le pays ne peut plus se développer, à cause de la monnaie privée" et l'assertion non (mal ?) argumentée "Le libéralisme aboutit selon moi à l'abrutissement de l'individu, voire à la violence" * dans [[Devenir un Génie]] : "Ils sont ainsi devenus égoïstes, donc libéraux.", "le libéralisme peut apporter un manque de liberté, car c’est une doctrine et une idéologie orientée sur l'individu, individualisme cachant une société, allant alors vers la destruction du plus faible par une liberté sans limite.", "La finance a en fait tenté et tente de faire croire qu’elle s’occupe de notre liberté, alors qu’elle veut nous empêcher de nous émanciper." * dans [[Univers Vivant]] : "La finance veut que nous soyons des consommateurs alors que nous sommes des acteurs de la société.", "Pour les financiers la population pauvre doit souffrir de malnutrition.", la finance "devient alors autoritaire comme après la crise de 1929. Nous sommes à un moment crucial où nous pouvons remettre en cause l’idéologie scientiste aboutissant à nier la nature. Ainsi il y avait 1,7% de CO2 pendant le crétacé au lieu de 0,04 % en 2023." Notons que le dernier ouvrage en date, [[XXIe]], est particulièrement gratiné : * climatoscepticisme : "le GIEC aura causé une hécatombe de suicides pour un faux réchauffement de la terre" * théories du complot sur les résultats des élections occidentales : "Selon des journalistes de Sud Ouest diffusés sur Agora Vox qui ont récoltés les suffrages des élections de 2017 et qui ont suivi l’élection de 2022, Macron n’a pas été élu par les français. En réalité il est arrivé dernier des élections présidentielles de 2017.", "Emmanuel Macron avait des nuls médiatisés face à lui" * théories du complot sur la CIA et les démocrates américains : "les démocrates trichent sur les élections en 2021", "Les États-Unis sont partis d’Afghanistan pour préparer la guerre d’Ukraine" * biais prorusse : "la Russie entre en guerre contre l’Ukraine en février 2022, puisque l’Ukraine avait attaqué la Russie. Les médias occidentaux feront croire [...] que c’est la Russie qui attaque", "Vladimir Poutine est voulu par les russes, contrairement aux élus occidentaux. Les élections en Russie se déroulent suffisamment bien pour que la Russie soit considérée comme une démocratie." -- [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 11 mai 2025 à 17:24 (CEST) :J'ai lancé une série de [[Wikilivres:demandes de suppression|demandes de suppression]]. Je notifie les personnes ayant participé à l'[[Wikilivres:Demandes de suppression/2023|ancien débat (2023)]] : {{Mention|JackPotte}}, {{Mention|Lionel Scheepmans}} et {{Mention|DavidL}} pour info. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 12 mai 2025 à 11:23 (CEST) ::Salut @[[Utilisateur:Fourmidable|Fourmidable]].. C'est bien que tu inspecte le contenu de Wikiversité à la recherche de contenu indésirable ou problématiques. Mais je vois dans le titre de ce sujet de discussion une forme de sarcasme et de condescendance qui ne me semble pas adapter à un projet collaboration où tout le monde est le bienvenu peu importe ses croyance et ses idée. De plus la première personne concernée, c'est à dire l'auteur, n'y est pas notifiée. ::Ensuite, il fauétait une fois se mettre d'accord sur le fait que la ligne éditoriale de Wikiversité est différente à celle de Wikipedia. Un recueil de cours et de travaux de recherche, ce n'est pas une encyclopédie. On en a déjà discuté. La neutralité de point de vue n'existe pas dans l'enseignement ni dans la recherche. ::Pour preuve, mon fils a un cours de religion dans SZ formation secondaire et il peut choisir entre différentes religion ou opter pour un cours de morale et de citoyenneté. À l'université, les orientation idéologique des enseignants son souvent bien connue. Et il est évident que l'enseignement dans une business school sera plus libérale qu'une fac de théologie. ::Dans le cadre des travaux de recherches, la Liberté d'expression doit être complète, l'auteur doit être libre d'y faire ses propre interprétations des faits et développant sa propre argumentation. Sans quoi, c'est plus de la recherche. ::Finalement, un support d'enseignement dans un projet collaboratif, n'est pas un projet de recherche. On ne parle pas en "je" dans un cours, on le fait dans une recherche. Or, l'usage du "Je" implique une certaine subjectivité. ::En conclusion, je ne vois pas ce nouvelle appel dans la forme et l'énergie qu'il se présente, comme quelque chose de très collaboratif. Et je n'ai pas envie de jouer à nouveau le médiateur dans ce redémarage d'une confrontation idéologique entre deux contributeurs incapable de collaborer dans la production de contenu de qualité. ::Plutôt que de faire du rameutage ici, je te proposeraient plutôt, selon tes disponibilités, de collaborer aux écrits des auteurs en discutant avec eux sur le page de discussions de leurs articles au sujet des améliorations possibles. Plutôt que de faire appel à la suppression de toute une page pour certains passages problématiques, une démarche collaboratif serait d'aider à la résolutions de ces problèmes, dans le but de ne pas perdre tout le reste de la page. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 13:20 (CEST) :::Tu as raison, je notifie aussi {{Mention|Matthius}} en espérant que cette fois son comportement soit plus constructif... Concernant les ouvrages qui sont moins problématiques, j'ai fait des demandes dans les pages de discussion idoines. Ici on a des ouvrages clairement complotistes et anti-science qui nuisent à la réputation de Wikilivres. (PS : Nous sommes sur Wikilivres, pas sur Wikiversité ;)) [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 12 mai 2025 à 13:21 (CEST) ::::Entre-nous @[[Utilisateur:Fourmidable|Fourmidable]], je ne trouve pas ton comportement plus constructif, ni collaboratif que le tien... [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 13:24 (CEST) :::::À mes yeux et dans le cadre d'un projet collaboratif, commencer par une demande de suppression avant toute chose peut même être perçu comme violant. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 13:26 (CEST) ::::::Mon but n'est pas de faire une croisade pour le libéralisme ou le GIEC sur Wikilivres, mais il y a quand même des limites pour tenir la réputation du site et plus largement de la Wikimedia Foundation. Je te rejoins sur le fait que les auteurs ne doivent pas être libres d'écrire absolument tout ce qu'ils veulent, et aussi que la critique doit être constructive, mais ce n'est pas au créateur du livre d'être le seul arbitre de ce qui est raisonnable ou pas vis-à-vis de son travail (i.e. simple reformulation, suppression partielle ou totale...). Et en 2023 Matthius a montré un comportement très agressif vis-à-vis de mes critiques, ce qui a mené '''ensuite''' à des débats de suppression. Pour l'instant, je ne fais que soulever des phrases (souvent identiques à celles de 2023) que je trouve (de nouveau) hautement problématiques d'un point de vue scientifique (manque voire absence totale de sourçage), mais le passage par des demandes de suppression directement se justifie par une forme de récidive sur certaines affirmations auxquelles aucune amélioration n'a été apportée après critique. Tu m'accuses de rameutage, mais je ne fais que consulter la communauté dans son ensemble : ici pour une discussion globale, sur [[Wikilivres:Demandes de suppression]] pour un débat et un "vote" au cas par cas. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 12 mai 2025 à 13:34 (CEST) :::::::Désolé aussia pour le côté péjoratif du terme rameutage. Parlons de notiffication c'est plis adéquat. :::::::Je réalise seulement que l'on est sur wikilivres et pas Wikiversité. Désolé sur mon smartphone ça ne saute pas aux yeux. Il faut donc recontextualiser tout ce que j'ai écrits précédement. Heureusement, historiquement Wikiversité est un sous projet de wikilivre. Les deux projet sont très proches dans leurs mission pédagogique et mode de fonctionnement. L'objet ici étant de produire des livres pédagogiques pour toute les tranches d'âges et pas uniquement des ouvrages qui doivent répondre à à des attentes scientifiques. Il apparait dans tes propos des thermes très wikipédien tel que le sourçage et la neutralité de point de vue. Je ne pense pas que cela doit s'appliquer ici. :::::::Ensuite Wikilivres est trop petit pour avoir un commuté d'arbitrage et je n'ai pas envie de parcourir les historiques à la recherche de qui a commencé. Mais je maintient l'idée que notifier des personnes vers un appel à suppression est une démarche que je considère symboliqueemnt violente et me semble aussi être une récidive. :::::::As-tu cherché à améliorer les texte en question en discutant avec l'auteur avant de proposer leurs suppression ? :::::::As-tu conscience que nous sommes ici dans un projet collaboratif, pluraliste et non universitaire ? [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 15:02 (CEST) ::::::::Du reste, nous ne sommes pas ici pour répondre à des suposées attentes de la Fondation Wikimedia. Car le rôle de celle-ci est précisément de répondre aux notres. C'est le rôle d'une fondation. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 15:07 (CEST) :::::::::Bonjour, :::::::::Il faudrait avant tout classer les écrits de l'auteur, car il pourrait il y avoir un problème d'admissibilité, Wikilivres étant avant tout un projet de rédaction de livres '''pédagogiques'''. Ces écrits contiennent beaucoup d'avis personnels et présentent une vision sans discussion ni argumentation, sans apporter de pédagogie sur un sujet particulier. :::::::::Si on peut qualifier les écrits comme de la recherche, il vaudrait mieux les déplacer vers la wikiversité, où une communauté supplémentaire et plus expérimentée sur la recherche pourrait exprimer son avis sur le sujet ou sur comment améliorer/corriger les écrits de Matthius. :::::::::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 12 mai 2025 à 20:01 (CEST) ::::::::::Je plussoie {{Mention|DavidL}}. {{Mention|Lionel Scheepmans}} ce que tu dis s'applique aux cas où il y a une réelle démarche scientifique ou a minima une attitude collaborative de la part de l'auteur. Or : ::::::::::* premièrement (tu le sais sans doute, étant toi-même chercheur), les livres de Matthius sont très loin de toute méthode scientifique, c'est plutôt un ensemble d'assertions non sourcées qui font la promotion d'une idéologie (et on verse même dans l'antiscience avec les paragraphes sur le GIEC). On pourrait donner la parole à Matthius sur ce sujet mais je crains qu'il ne se définisse même pas lui-même comme scientifique ; ::::::::::* deuxièmement, avec cette série de recréations le 8 décembre dernier, sans attendre l'avis de la communauté, et avec les '''mêmes phrases''' problématiques (parfois à peine reformulées, souvent conservées à l'identique), je ne vois pas comment on pourrait supposer que Matthius fait preuve d'ouverture d'esprit et d'attitude collaborative. ::::::::::Bref, si vous voulez absolument garder tous ces ouvrages et essayer de composer tant bien que mal avec la pugnacité de leur auteur, ce sera sans moi... À mon avis, il serait nettement plus profitable de traduire les livrels de [[:en:Subject:Economics|Wikibooks en anglais sur l'économie]], par exemple. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 13 mai 2025 à 11:07 (CEST) :::::::::::Je viens de prévenir Matthius par mail. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 13 mai 2025 à 11:12 (CEST) ::::::::::::Tree bien. Moi aussi, je n'ai plus envie de consacrer du temps là dessus. Je vous laisse donc traiter la situation puisque votre avis est majoritaire. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 13 mai 2025 à 11:27 (CEST) :::::::::::Je ne comprends pas cette assertion. Je cite François Gervais contre le GIEC, qui a écrit pour le GIEC sans être entendu pour la conclusion. :::::::::::Je n'ai pas reformulé mes phrases à l'identique. J'ai soit indiqué la source contrairement à ce qui dit Fourmidable, soit indiqué que c'était mon point de vue ou émis une explication. Aussi quand je fais une assertion scientifique, j'en indique souvent la cause scientifique. Fourmidable a tendance à reprendre les phrases où je répète ce qui a été écrit avant pour aller plus loin. Donc il faut chercher dans mes livrels la phrase où je cite et où j'émets une hypothèse avec la cause scientifique. Je vais relire Fourmidable. :::::::::::Aussi j'ai trouvé sur l'[http://web.archive.org/web/20240810201141/https://www.google.com/search?q=mati%C3%A8re+temps+%C3%A2me âme qui ralentit la vitesse]. Je pense que Google utilise une IA pour détecter les limites de l'humain. Mon expérience de pensée va contre le matérialisme scientifique puisque j'émets l'hypothèse supérieure qu'il existe des multivers où des âmes agissent sur le nôtre. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 13 mai 2025 à 11:36 (CEST) :::::::::::Je ne pense pas effectivement que mon livrel sur le XXIe va rester sur wikibooks puisque il va contre ce qu'indique wikipedia. J'espère juste qu'il puisse rester. :::::::::::Seulement j'ai une formation en ingénierie et j'ai trouvé sur [https://archive.org/details/TempsAme l'âme qui ralentit la vitesse] [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 13 mai 2025 à 12:13 (CEST) ::::::::::Vous admettez {{Mention|DavidL}} que vous ne connaissez pas les domaines que j'aborde. Mes livrels sont pédagogiques donc vous pouvez apprendre avec. Donc lisez les avant d'émettre l'hypothèse qu'ils ne le sont pas. J'ai créé le coaching sans coach qui a permis de revoir la pédagogie d'un journal d'un réseau international. Mais cela ne m'empêche pas d'aller contre le libéralisme et l'appât du gain qui sont selon moi les fléaux actuels. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 13 mai 2025 à 12:06 (CEST) :::::::::::@[[Utilisateur:Matthius|Matthius]] semble ouvert au débat et à une aide pour améliorer ses textes. La suppression ne me semble donc pas une option souhaitable. Wikilivres est indépendant de Wikipédia. Il faut donc se référer à nos règles et recommandations locale disponible dans les espaces de noms "wikilivres" et "aide". Je vais essayer de prendre le temps d'écouter les textes avec une voix de synthèse pour gagner du temps. Cela me permettra d'en faire des commentaire en vue d'une amélioration. Car si ce sont des sources qui manques et bien il suffit de les ajouter. Nous sommes là pour travailler ensemble pour produire des ouvrages pédagogiques de qualité, pas pour juger du travail des autres en vue d'une suppression. Restons, s'il vous plait dans un esprit d'entraide et de collaboration. C'est tellement rare à notre époque... [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 14 mai 2025 à 15:00 (CEST) :::::::::::Mon livrel sur le XXIe siècle en cours d'écriture va aussi contre les théories du complot occidentales. J'écris que la Russie et la Chine sont des démocraties, alors que nos médias disent que ce sont des dictatures. J'émets effectivement des hypothèses non sourcées dans ce nouveau livrel. Je peux et vais les sourcer. Par contre j'utiliserai des sources primaires. En réalité, j'émets l'hypothèse que ce sont nos médias qui sont dans la post-vérité et que ce ne sont pas les médias étatsuniens, ni russes, ni chinois qui y sont. Ce livrel est effectivement une bombe dangereuse contre nos médias comme l'indique Fourmidable. ::::::::::::Je ne comprends pas l'acharnement de Fourmidable à ne pas vouloir discuter avec moi et à vouloir automatiquement supprimer mes livrels sans discussion préalable. En effet il a eu un an pour m'indiquer comment améliorer mes livrels. Et que Fourmidable ne me dise pas que c'est moi qui ait commencé, puisque j'étais outré qu'on veuille supprimer mes livrels avec ses copains sans discussion pédagagogique au tout début. ::::::::::::Concernant la neutralité de wikipedia : wikipedia ne fait que révéler l'avis des médias financés donc il n'est pas neutre. Être neutre c'est révéler tous les points de vue, même ceux avec lesquels on n'est pas d'accord, ce que [https://archive.org/details/wikipediaCo-Fondateur fit wikipedia au début de son histoire] et ce pour quoi je me suis intéressé et ai été réprimé sauf pour wikibooks anglais qui m'a viré pour ne pas enlever mon nom. :{{Mention|Matthius}} Avez-vous l'intention de publier des livres scientifiques, c'est-à-dire sourcés par de la science publiée et évaluée par les pairs, et à défaut de grands médias nationaux et internationaux ? Vous pouvez aussi tester vos hypothèses mais votre travail ne doit pas consister à sélectionner les sources qui vous conviennent pour seulement valider votre théorie, en mettant de coté tout ce qui vous dérangerait dans cette entreprise. --[[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 10:48 (CEST) ::@[[Utilisateur:Fourmidable|Fourmidable]], je pense que tu te fais une vision fausse du monde de l'édition. @[[Utilisateur:Matthius|Matthius]] peut payé une maison d'édition, dans le cadre d'une [[w:Édition_à_compte_d'auteur|édition à compte d'auteur]]. Probablement qu'il l'a déjà fait puisqu'il a déjà publié des ouvrages au format papier parmi ceux qu'il veut placer sur Wikilivres. Il en a même déposé certains dans une bibliothèque universitaire. Quant à la revue par les paires ne se fait que dans le cadre des journaux scientifique. ::J'ai écouté l'ouvrage [[Pourquoi un Dieu ?]] Et je trouve effectivement qu'il n'a pas sa place dans Wikilivres. Non pas parce qu'il critique le libéralisme avec des propos que je partage en grande partie, mais parce qu'il s'apparente plus à de la propagande chrétienne qu'à un réel ouvrage pédagogique sur le sujet. ::Matthius y est en posture de prédicateur et non de pédagogue. Je dirais que la moitié des phrases de l'ouvrage que j'ai écouté sont des affirmations sans argumentation ni démonstration valide. La thèse de son ouvrage se résume à dire que dieu est la seule chose qui peut expliquer un phénomène actuellement inexpliqué. Ce qui est une corrélation fallacieuse puisqu'il n'existe aucun lien de causalité. ::Pour moi, les ouvrages évangéliste ou propagandiste n'ont pas leur place dans Wikilivres et je serais d'avis d'ouvrir une prise de décision pour établir une règle d'interdiction. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 11:42 (CEST) :::Oui voilà, nous sommes d'accord. Peut-être que Matthius peut adopter une attitude plus scientifique, mais l'esprit de "pédagogie" s'accompagne forcément d'une démarche scientifique, sinon c'est de la prédication/propagande. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 11:45 (CEST) ::::@[[Utilisateur:Fourmidable|Fourmidable]]... Wikilivres n'est pas une bibliothèque "scientifique" mais pédagogique. Tu sembles confondre les deux termes. Les livres pour enfants que contient Wikilivres ne sont pas "scientifique" tout en étant pédagogiques. ::::Un autre fait qui peut être reproché à @[[Utilisateur:Matthius|Matthius]] est son autopromotion, [[Wikilivres:Présentation#● Wikilivres n'est pas une vitrine|alors que la démarche proscrite sur Wikilivres]]. ::::Plutôt que de supprimer l'important travail effectué par Matthius, je propose à nouveau de le déplacer en sous page de son espace utilisateur pour qu'il puisse retravailler ses écrits. ::::Pour un retour dans l'espace principale, il faudrait au préalable qu'il supprime des ses travaux toute forme d'autopromotion et toute forme propagande, prosélytisme ou autre type de discours prédicateur. Ceci notamment en référence aux choix politiques [https://www.senat.fr/leg/ppl17-386.html français], [https://www.rtbf.be/article/le-proselytisme-religieux-ou-politique-n-a-pas-sa-place-a-l-ecole-quels-chiffres-derriere-ce-phenomene-pointe-par-la-ministre-de-l-education-11477234 belge], [https://www.assnat.qc.ca/fr/travaux-parlementaires/projets-loi/projet-loi-94-43-1.html Quebec], [https://ge.ch/grandconseil/data/loisvotee/L11764.pdf suisse]. Quatres communautés culturelles très largement majoritaire dans l'espace francophone des projets Wikimédia. ::::J'invite Matthius et les autres membres de notre communauté réagir à ce message et de discuter du lancement d'une nouvelle prise de décision pour interdire la propagande et le prosélytisme dans Wikilivres. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 12:21 (CEST) :::::Ce que je veux dire, c'est qu'un bon livre pédagogique s'appuie forcément sur des connaissances scientifiques. Ok pour un redéplacement. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 12:37 (CEST) ::::::Ne fais pas à ton tour du prosélytisme scientifique @[[Utilisateur:Fourmidable|Fourmidable]]. La science et les connaissances dites scientifiques comme tu les entends n'est pas la seule chose sur laquelle on peut s'appuyer pour produire un contenu pédagogique. ::::::Que fais-tu de la méditation, de l'humour, de la poésie, de la musique, du dessin, et toute autre expression artistique ? ::::::Et il existe aussi un tas d'ouvrages pédagogique religieux (pour le catéchisme entre autre), sauf que, comme la plupart des législations nationales des pays francophones occidentaux, je pense qu'ils n'ont pas leur place dans Wikilivres. Ce sur quoi nous devons nous positionner dans une prise de décision collective. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 12:52 (CEST) :::::::Ah oui, dans ce sens-là il y a en effet moins de science à proprement parler… Mais je ne suis pas sûr que cela s'applique aux propos politiques. Ça ne me viendrait pas à l'idée de faire un Wikilivre afin de convertir les gens au libéralisme, par exemple. C'est le rôle d'autres wikis ou sites web spécialisés. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 14:44 (CEST) :::Je vais supprimer Du même Auteur et Du même éditeur de mes wikilivres. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 15 mai 2025 à 12:32 (CEST) ::::Si vous voulez, mais c'est loin d'être le point principal. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 12:38 (CEST) :::::Effectivement @[[Utilisateur:Matthius|Matthius]], c'est une bonne résolution, mais il reste le prosélytisme à résoudre et je pense que cela demande beaucoup de travail à réaliser dans votre espace de travail personnel. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 12:55 (CEST) ::::::Vous mettiez que seul Pourquoi un Dieu est prosélyte. J'avais effectivement un doute en ajoutant ce livrel. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 15 mai 2025 à 19:43 (CEST) :::::::Je n'ai pas encore eu le temps d'écouter les autres livres @[[Utilisateur:Matthius|Matthius]] . Nous somme tous bénévoles ici. Cela peut prendre du temps, mais je vous invite déjà à déplacer vous-même le livre ''Pourquoi un Dieu'' dans vos sous page utilisateur''.'' :::::::Par anticipation, je peux déjà dire que tous les autres ouvrages faisant la publicité de vos écris doit être modifier ou retirer de l'espace principale ainsi que tous ceux qui font référence à Dieu ou au catholicisme de manière prosélyte. :::::::Seul le nom des auteurs devrais être repris dans les livre avec éventuellement des hyperliens vers leurs pages utilisateur qu'il sont libre d'éditer comme il veulent. :::::::On peut ensuite créer des pages catégories qui reprennent tous les travaux des auteurs, avec l'avantage qu'elle se complétent automatiquement à chaque fois que l'on ajoute une catégorie en bas de page d'un ouvrage. Vous trouverrez certainement des indication dans les pages d'aide. :::::::Je vous rassure sur le fait que ce traitement serait semblable pour un politicien libéral faisant la publicité de son parti, de ses idéologies et de sa personne. N'hésitez pas d'ailleurs à parcourir les autres wikilives pour y détecter ce genre de problème avant de nous le signaler. C'est ce que fait @[[Utilisateur:Fourmidable|Fourmidable]] en cherchant à veiller sur la qualité et la conformité de notre projet. Une belle fin de journée ! [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 16 mai 2025 à 11:41 (CEST) ::::::::Pour info, je confirme et soutiens tout ce que propose {{Mention|Lionel Scheepmans}} dans son dernier message (merci à lui). [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 16 mai 2025 à 12:01 (CEST) ::::::::Pourquoi a Dieu a été mis à jour dans mon espace personnel. Je ne sais pas comment effacer une page wikibooks.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 16 mai 2025 à 12:24 (CEST) :::::::::@[[Utilisateur:Matthius|Matthius]]. Je ne comprends pas ce que vous dite. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 16 mai 2025 à 15:16 (CEST) ::::::::::J'ai copié-collé Pourquoi un Dieu dans ma page personnelle. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 16 mai 2025 à 21:36 (CEST) :::::::::::Ah très bien @[[Utilisateur:Matthius|Matthius]]. Mais en fait, il est possible de déplacer les pages en les renomant. Cela permet de conserver tout l'historique de l'édition. Je vais le faire quand je serai sur PC. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 17 mai 2025 à 03:34 (CEST) ::::::::::::Ne le faites pas : L'original de l'historique est sur mon espace perso. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 17 mai 2025 à 09:30 (CEST) :::::::::::::@[[Utilisateur:Matthius|Matthius]], j'ai écouté l'ouvrage Économie enfant. Si j'étais à la tête d'une maison d'édition, je ne publierais pas ce manuscrit. Il y a des passages très intéressants avec des idées originales que je partage, mais aucune argumentation pour les valider. Pour le reste, on retrouve un copié collé du précédent ouvrage. Beaucoup d'information factuelle sans réelle contextualisation ni fil conducteur et puis de nombreuses affirmations gratuites qui ne sont finalement que des opinions très relatives et de nouveau non argumentées. :::::::::::::Le pire étant que certaine de ces affirmations son tout simplement fausses ou inscensées. :::::::::::::Exemples d'une phrase : :::::::::::::« Écrire sur ce que vous comprenez de l’archéologie, qui est l’humanité avant l’écriture. » :::::::::::::Cette phrase est erronée et n'a même aucun sens. L'archéologie n'est pas l'humanité, mais un domaine des sciences créé par les humains. Ensuite, l'archéologie n'est pas quelque chose qui se limite à avant l'écriture. Il existe des nombreux sites archéologiques qui fouillent les vestiges de la Rome antique. Une civilisation qui n'était pas dénuée d'écriture. :::::::::::::Exemple d'un paragraphe : :::::::::::::« Le [[w:Capital|capital]] de l’humanité peut donc être la Terre. En effet, l'argent est produit à partir du papier venant du bois. Les trafiquants ont toujours voulu se l'approprier. Le capital pourrait donc ne pas être l’argent. Le troc nécessite cependant un patrimoine conséquent. La Chine veut s’approprier le capital Lune, pour y prendre l’Helium 3 selon Solidarité et Progrès, seule ressource lunaire qu'il est intéressant de transporter, afin de le fusionner, pour en obtenir de l’énergie illimitée, favorisant la créativité par le surplus de biens. » :::::::::::::Ce paragraphe est incompréhensible et citer un parti politique (à d'autres reprises aussi dans l'ouvrage) comme source pour poser une affirmation, pose deux gros problèmes. 1 celui de faire la publicité d'une idéologie au sein d'un écrit pédagogique, 2 celui de ne pas respecter un des principes de base de l'écriture scientifique alors que le livre en parle et la défend. :::::::::::::Je n'irai pas plus loin dans les exemples. :::::::::::::Dans leurs états actuels et pour que ces livres travaux d'écritures soient admissibles dans Wikilivres. Je pense que vous devez impérativement supprimer : :::::::::::::* toute promotion personnelle. :::::::::::::* toute forme de Prosélytisme religieux. :::::::::::::* toute forme de publicité ou contre publicité politique et partisane :::::::::::::* toute affirmation fausse et autres types de fabulations. :::::::::::::* tout raisonnement ou démonstration sans lien de causalité. :::::::::::::Suite à quoi, il faudrait encore dans l'idéal en améliorer le style de sorte à y développer un fil conducteur qui permettrait aux lecteurs de suivre un développement ordonné propice à l'apprentissage, et non leur soumettre un journal de réflexions personnelles, reprenant des erreurs factuelles et logiques. :::::::::::::C'est un travail conséquent. :::::::::::::Et en ce qui concerne le prosélytisme, les approches politiques partisanes, il est impératif, y compris les sous page de votre page utilisateur. :::::::::::::Il y a des idées intéressantes dans vos écrits, et je partage pas mal de vos points de vue concernant la question du néolibéralisme. Mais Wikilivres n'est pas une tribune d'opinion à l'image d'AgoraVox. Nous sommes ici pour produire des ouvrages pédagogiques. Pas pour influencer nos lecteurs en faveurs ou à l'encontre de certaines religions ou idéologies. :::::::::::::Tout en l'encourageant à le faire de manière plus courtoise et constructive, je remercie donc @[[Utilisateur:Fourmidable|Fourmidable]] de nous avoir alerté sur l'incompatibilité de vos ouvrages avec notre projet. Dans tous les cas ceux que j'ai écoutés jusqu'à présent. :::::::::::::J'aimerais à votre tour vous encourager à poursuivre vos travaux d'écriture en cherchant à vous rapprocher de notre objectif tout en respectant nos règles et recommandations. Mais sachez aussi que vous pouvez aussi améliorer l'article de Wikipédia sur l'[[w:Économie_réelle|économie réelle]]. Ou aussi développer une leçon sur Wikiversité sur le même sujet dans la [[v:Faculté:Économie|Faculté d'Économie]]. C'est un sujet intéressant qui permet de mettre en lumières les limites de la [[w:Finance|finance]]. :::::::::::::Ces deux activités seraient moins ambitieuses que de vouloir produire un livre de qualité pour expliquer l'économie aux enfants. Cela demande une grande maîtrise du sujet en plus d'un certain don pour la vulgarisation. :::::::::::::Il me reste deux ouvrages proposés à la suppression à écouter, mais j'ai bien peur d'y retrouver les mêmes incompatibilités que celles que je viens d'expliquer à l'instant. :::::::::::::Bien cordialement, [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 26 mai 2025 à 21:16 (CEST) :::::::::::::Mon correcteur orhtographique ne fonctionnant pas pour des commentaires aussi long, le message que je viens de laisser est truflé de fautes et je n'ai pas le temps ni le courrage de les corriger. Encore une fois, le travail que je fournis sur ce projet est tout à fait bénévole. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 26 mai 2025 à 21:21 (CEST) ::::::::::::::J'ai passé beaucoup de temps à élaborer le coaching sans coach. Ce n'est naturel pour aucun ancien élève de simplifier. Je ne sais pas combien de fois j'ai relu Comment Écrire des Histoires. J'ai toujours beaucoup de temps devant moi pour revoir mes livrels.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 10:51 (CEST) :::::::::::::::@[[Utilisateur:Matthius|Matthius]], c'est précisément parce que vous travailler beaucoup et que vous Me semblez de bonne foi et volonté, que je passe autant de temps à vous aiidez. Tous vos textes comprends des problèmes qu'il faut résoudre. Vous devriez commencer par supprimer tout ce qui fait référence à vous, à la religion et au politique, pour ne garder que des faits et affirmations vérifiées par des sources sûres et non partisannes, à chaque fois pour vous assurez que vous n'être pas simplement en train de diffuser ou colporter une opinion fausse et/ou partisane. Ce qui vient d'être dit est incontournable. :::::::::::::::Je penses ensuite qu'indique messages auxquelles ont été écrites vos sections sont superflues dans le cadre d'un ouvrage pédagogique. La chronologie de vos écrits n'est pas un bon un fil conducteur. Encore une fois, Wikilivres n'est pas un lieu pour publier ses mémoires ou ses réélections du jour. Il existe le format blog pour ce genre de choses. :::::::::::::::Tennez compte aussi que nous ne disposons pas forcément d'autant de temps et de motivation que pour revoir vos livres. Raison pour laquelle, des méthodes plus expéditives telles que la suppression complète des pages inadaptées à notre projet finiront par être appliquées. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 13:18 (CEST) ::::::::::::::::Le livrel le plus important pour moi est l'économie pour les enfants, vient ensuite devenir un génie. L'Univers est Vivant a été référencé sur les moteurs de recherche récemment parce que j'ai trouvé sur l'âme qui ralentit la vitesse. Quand on cherche matière temps âme sur les moteurs de recherche occidentaux on tombe sur ma page archive.org/details/TempsAme. Il n'y a toujours pas de chercheur qui a publié sur la mathématisation de ma trouvaille. L'univers est vivant est une amélioration d'un autre livre. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 13:56 (CEST) ::::::::::::::::Je viens de mettre mon [http://matthieu.giroux.free.fr/html/cv.htm CV] à jour pour montrer ce que j'ai influencé. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 14:05 (CEST) ::::::::::::::::C'est moi qui ai diffusé le terme économie réelle. Je reproche à ceux qui l'ont utilisé d'être des économistes scolaires, c'est à dire de se référer à l'économie monétaire pour parler d'économie réelle. Je peux cependant mettre un historique de cette économie sur la page wikipedia. Je me demande juste s'il va rester. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 14:08 (CEST) :::::::::::::::::Je suis désolé @[[Utilisateur:Matthius|Matthius]]. Je ne vais pas poursuivre nos conversations faute d'en avoir envie. Vous ma laissez sur cette impression que votre motivation première est de promouvoir votre personne, vos valeurs et vos idées. Je vais donc arrêter de vous consacrer du temps. Je suis ici pour soutenir et développer les projets et intérêts collectifs et non individuels. Bonne chance pour vos ambitions que je vous invite à réaliser en dehors des projets Wikipédia. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 15:00 (CEST) ::::::::::::::::::Mon projet relève de l'intérêt général de faire connaître l'économie du XIX{{e}} siècle de [[Henry Charles Carey]]. Mon égoïsme peut donc être aussi le vôtre. Pour moi il faut être intelligent et égoïste pour défendre l'intérêt général. Je pense qu'on peut tous avoir l'air de génies comme les enfants peuvent avoir l'air de génies. Oui, je suis militant et veux faire partager la joie de la politique. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 15:55 (CEST) :::::::::::::::::::Nous ne sommes donc pas sur la même longueur d'onde. Je vois invite à ne pas faire de militantisme sur les projets wikimedia. Il y a d'autres endois pour le faire. La blogosphère, des tribune comme agoravox, et de nombreux sites web tenus par des communautés militantes et reliée aux valeurs et idées pour lesquelles vous militer. Ceci est mon dernier message à ce sujet. Cordialement. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 16:18 (CEST) ::::::::::::::::::::Je vous mets au défi de penser que les wikipédiens ne sont pas des militants. Eux veulent aussi défendre l'intérêt général en apportant la connaissance. Par contre ils ne ciblent pas leurs apports. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 17:10 (CEST) ::::::::::::::::::::Comme prévu, on me dit que mon [https://fr.wikipedia.org/wiki/%C3%89conomie_r%C3%A9elle#Histoire ajout sur l'économie réelle] est inédit. Je pense que vous vous êtes intéressé à certains de mes écrits parce qu'ils vous apportaient des réponses. Je peux faire cela sur wikibooks. Seulement c'est encore plus difficile sur wikipedia. Je ne suis pas théseux. Oui l'économie réelle a été créée pour faire connaître l'économie physique de Lyndon Larouche. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 30 mai 2025 à 17:15 (CEST) :::::::::::::::::::::Merci quand même ! [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 31 mai 2025 à 00:24 (CEST) :Mon livrel l'univers est vivant [https://www.agoravox.tv/actualites/technologies/article/et-si-la-physique-quantique-avait-105532 a eu un impact]. Je pense aussi avoir influencé les jeunes qui se sont tournés vers la bible. == [Recherche universitaire] Questionnaire sur la gouvernance Wikimedia == Bonjour à toutes et à tous, Dans le cadre d’un mémoire de recherche sur les modèles de gouvernance décentralisés dans les communs numériques, je mène une étude analysant le mouvement Wikimedia. L’objectif est de mieux comprendre la perception qu’ont les contributeurs et contributrices des projets Wikimedia (Wikilivres, Wikipédia, Wikidata, Commons, etc.) de la Fondation Wikimedia, de ses décisions, et des relations avec les chapters locaux (ex. Wikimédia France). Un questionnaire anonyme, rapide à remplir (environ 5 minutes), a été conçu à cet effet. Il s’adresse à toute personne majeure ayant déjà contribué à un projet Wikimedia, quelle que soit l’ancienneté ou le niveau d’implication. Lien vers le questionnaire : framaforms.org/questionnaire-communaute-wikipedienne-et-la-wikimedia-fondation-1747225404 '''Important''' : Les résultats seront utilisés uniquement dans un cadre académique. L'enquête, ainsi que l'étude, ne sont ni commandités ni supervisés par la Fondation ou aucun chapitre local. Il s'agit simplement d'un projet scolaire que je mène {{sourire}}. Merci d’avance pour votre participation ! [[Utilisateur:3(MG)²|3(MG)²]] ([[Discussion utilisateur:3(MG)²|discussion]]) 27 mai 2025 à 10:43 (CEST) :J'ai répondu. Bon courage pour ton mémoire ! (Ça me fait penser que je dois avancer sur le mien aussi...) [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 29 mai 2025 à 23:28 (CEST) == Propagande, prosélitisme, autopromotion, militanatisme, etc == Bonjours à la communauté des contributeurs de Wikilivres. Je me dit qu'il serait bon de faire une nouvelle prise de décision pour mieux cadrer le contenu de notre projet par rapport à ce qui se situebdans le titre de ce message. Qu'en pensez-vous ? [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 16:22 (CEST) :Totalement {{Pour}} ! [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 29 mai 2025 à 21:53 (CEST) :L'économie financière peut être considérée comme une propagande puisque son utilisation ne permet pas de lier la macro-économie et la micro-économie, ne permettant donc pas de développer une société comme le fait l'[https://fr.wikipedia.org/wiki/%C3%89conomie_r%C3%A9elle économie réelle]. :Si on considère le prosélytisme comme convaincre de rejoindre sa communauté, il faudrait donc enlever tous les wikilivres qui sont beaucoup lus, puisque les wikilivres qui sont peu lus n'arrivent pas à convaincre. :L'autopromotion permet malgré tout de connaître ce que fait l'auteur d'un wikilivre. Si on enlève le chemin qu'a suivi l'auteur, on évacuerait ainsi ses contradictions et on pourrait donc faire dire à un auteur l'inverse de ce qu'il a compris au bout de son parcours. Je suis pour qu'il y ait une page de l'auteur regroupant les livrels de l'auteur comme sur wikisource. :Je considère ceux qui contribuent à wikipedia et à wikibooks comme des militants, puisqu'ils essaient d'influencer les autres avec ce qu'ils écrivent sur ces sites web. Certes, certains travaux peuvent être désintéressés, mais alors pourquoi mettre ces travaux sur ces sites web alors. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 3 juillet 2025 à 22:36 (CEST) h0u18g0hfx4xjsxp5u9svt3gq55jja9 745891 745890 2025-07-03T20:51:15Z Matthius 11787 /* Propagande, prosélitisme, autopromotion, militanatisme, etc */ 745891 wikitext text/x-wiki <noinclude>{{Wikilivres:Le Bistro/En-tête}}</noinclude> == compléter les bons conseils pour un nouveau livre == bonjour wikilivre ! je refais un tour sur ce wiki depuis un sacré bout de temps. Je vois que certains noms sont toujours là :) wouah. J'ai entâmé un livre nouveau aka. [[La sécurité du citoyen dans son logement]] que je vais encore améliorer mais je me pose dejà quelques questions sur le process, et vu que [[Wikilivres/Créer un wikilivre]] est assez high level je préfère demander ici des conseils. J'aime à penser que si l'idée est pertinente le guide pourra évoluer rapidement. * '''AutoCat''': il est indiqué clairement dans le guide pour la page de garde du livre de mettre <code><nowiki>{{AutoCat}}</nowiki></code> en bas de page, mais est-ce conseillé également sur chaque page du livre ? ça a l'air de marcher et donc plutôt oui: & si oui on pourrait l'ajouter dans le guide ? * je ne sais pas quoi mettre dans `CDU item` : on peut peut être orienter vers une bonne page sur le comment remplir le template proposé sur la page de garde * '''navigation horizontale''': est-ce qu'un moyen universel permet de suivre les chapitres d'un livre ? ex. si je suis sur un chapitre et que je veux aller au suivant, soit je passe par la page parent, soit je passe par la catégorie. Mais je voudrai (mieux qu') un bouton "next" / "previous". Enfin voici l'idée. S'il y a des choses en template automatique, je suis preneur (peut être le guide aussi) (PS: je vois que la gestion du sommaire est automatisée au sein même d'un chapitre : génial :) ) :NB: à une certaines époque j'utilisais des templates propres au livre (ex. [[Modèle:Les félins]]) et je vois que certains livres ont repris l'idée.. * '''catégorie''' : que faut-il mettre exactement dans le contenu de la catégorie auto-générée pour le nouveau livre ? juste <code><nowiki>[[Catégorie:Livres par titre]]</nowiki></code> ? * '''livre modèle''' : avez-vous un livre "modèle" : c'est-à-dire un livre (probablement à succès & pas trop grand) qui serait particulièrement suivi par les habitués et sur lequel on retrouverai toutes les techniques les plus avancées pour bien rédiger un livre. Il apparaîtrait du coup en modèle dans le guide. qu'en pensez-vous ? [[Utilisateur:Boly38|Boly]] [[Discussion_Utilisateur:Boly38|♪]] 5 mars 2025 à 18:09 (CET) :Salut Boly :* Autocat : normalement, il ne se met que dans le modèle listant les chapitres du livre, inclus dans toutes les pages. Par exemple le modèle {{m|Programmation JavaFX}} est inclus comme ceci : <nowiki><noinclude>{{Programmation JavaFX}}</noinclude></nowiki>) dans tous les chapitres du livre [[Programmation JavaFX]]. :* [[Wikilivres:CDU]] : il y a un moteur de recherche pour trouver le classement, mais il n'est pas encore pleinement détaillé et parfois il faut créer les pages correspondantes à la CDU. J'utilise http://www.udcsummary.info/php/index.php?lang=fr pour ajouter les pages manquantes. Si tu trouves un ou plusieurs classement possibles, je peux me charger de créer les pages qui manquent. :* '''navigation horizontale''' : Fait automatiquement par l'inclusion du modèle dans toutes les pages. Voir par exemple : [[Programmation Java Swing/Introduction]]. Le modèle ajoute les liens suivant, précédent et une flèche au milieu pour déplier la liste complète des chapitres du livre. :Pour la catégorie, un petit descriptif, comme par exemple : <pre><nowiki> Catégorie recensant les pages du livre [[Programmation JavaFX]]. Pour discuter de la rédaction du livre c'est ici : [[Discussion:Programmation JavaFX]]. [[Catégorie:Java]] </nowiki></pre> :--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 5 mars 2025 à 19:22 (CET) ::J'ai fait des clics magiques (dans l'historique des pages) pour remercier ; je ne sais pas où ça atteri mais bon. Le template sommaire avec navigation par page c'est exactement ce que je voulais : c'est top :) & merci aussi pour les illustrations ! David L au top ! ! [[Utilisateur:Boly38|Boly]] [[Discussion_Utilisateur:Boly38|♪]] 7 mars 2025 à 18:04 (CET) == Problème de cache sur la page d'accueil == Salut, Les utilisateurs anonymes voient toujours les mêmes livres sur la page d'accueil (pendant plusieurs mois) alors que les livres changent tous les jours pour les utilisateurs connectés. Il faudrait installer l'extension [[mw:Extension:MagicNoCache]] afin de pouvoir utiliser <nowiki>__NOC</nowiki>ACHE__ sur la page d'accueil. --&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 29 mars 2025 à 20:56 (CET) :Bonjour, bien reçu, j'ai créé un ticket pour voir déjà si on peut diminuer ce cache à 24h (sinon il faudra voter pour l'extension) : https://phabricator.wikimedia.org/T390674. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<span style="color:#FF6600">$</span>♠]]) 1 avril 2025 à 11:46 (CEST) ::Merci JackPotte. ::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 1 avril 2025 à 19:00 (CEST) :::Un problème similaire a été signalé en 2023 [[phabricator:T351573]], et en 2017 [[phabricator:T119366]] mais pas la moindre action de correction depuis toutes les années écoulées. Les problèmes des "petits" wiki ne sont pas écoutés. :::J'ai donc créé la page de vote pour installer l'extension : [[Wikilivres:Prise de décision/Installer l'extension MagicNoCache]]. :::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 1 avril 2025 à 19:48 (CEST) ::::{{Mention|Lionel Scheepmans}}, {{Mention|Fourmidable}} : un avis / un vote sur ce sujet ? --&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 12 mai 2025 à 20:04 (CEST) :::::Je viens de donner mon avis sur la page idoine, merci du rappel ! [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 13 mai 2025 à 11:00 (CEST) == Erreur d'affichage sur la page d'accueil == Bonjour tout le monde, Un petit message pour savoir où nous en sommes sur le problème d'affichage dans la page d'accueil (débordement des cadres de livres suggérés sur la boîte à outils des utilisateurs connectés). Wikilivresquement, [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 26 avril 2025 à 17:59 (CEST) :Salut Fourmidable, :J'ai tenté de trouver une solution pour cet habillage, mais il est tellement mal conçu que ça semble impossible. :C'est le seul habillage qui pose problème, pour plusieurs pages et pas seulement la page d'accueil. :La décision arbitraire d'imposer cet habillage sans consulter la communauté du projet est une aberration. :Le mieux serait de : :# créer un bug pour l'habillage Vector-2022 qui ne fonctionne plus dès qu'il y a le moindre code CSS, :# créer une demande de fonctionnalité pour que les administrateurs du projet puisse sélectionner l'habillage par défaut par projet choisi par décision communautaire, :Mais comme les "petits wikis" ne sont pas écoutés, ce serait inutile (voir les nombreux exemples de problèmes reportés spécifiques à fr.wikibooks dont aucun n'a jamais été résolu). :--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 26 avril 2025 à 20:26 (CEST) ::Ok, en tout cas sache que je soutiens ta proposition ! [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 1 mai 2025 à 16:28 (CEST) == Matthius : le grand retour == Bonjour à tous, Quelqu'un veut-il bien m'aider à relire les [https://fr.wikibooks.org/w/index.php?title=Sp%C3%A9cial%3AContributions&target=Matthius&namespace=0&tagfilter=&newOnly=1&start=&end=&limit=50 nouveaux livres de Matthius] ? Il semble y avoir, une fois de plus, de graves problèmes de sourçage et des attaques (même déjà soulignées en 2023 !) contre "le libéralisme" et "la finance" avec des phrases obscures ; par exemple : * dans [[Conseils Chrétiens]] : "Le libéralisme empêche de voir la société. Alors on croit les films libéraux, faisant croire que l’individu fait la société, alors que c’est la société qui fait l’individu. En effet, notre ego est créé par notre famille." * dans [[Pourquoi un Dieu ?]] : "L'individualisme dû au libéralisme, de plus en plus prégnant, va par contre cacher de plus en plus notre sociabilité et notre créativité.", "le social-libéralisme ne sera que le moyen d'accéder au pouvoir par la voie opportune alors qu'on cachera le social au peuple, pour ne pas qu'il se comprenne. Le dirigeant social-libéral aura appris dans les écoles d'économie que les marchés c'est magique.", "désengager l'état, détruisant alors le développement donc la république", "La faille du libéralisme est la censure, censure permise par la pauvreté des esprits ayant peur des autres à cause de l'individualisme forcené. [...] Le libéralisme cherchera la censure pour empêcher qu'il y ait suffisamment d'esprits philosophes et créatifs s'intéressant à la politique.", "La finance croira alors qu'il faille installer une dictature pour liquider la population trop difficile à maîtriser. [...] il s'agit pour la finance de trouver de plus en plus d'illusions pour satisfaire la population" * dans [[Économie Enfants]] : le libéralisme a "rendu l’école non épanouissante par le manque de créativité, en disant que le pays ne peut plus se développer, à cause de la monnaie privée" et l'assertion non (mal ?) argumentée "Le libéralisme aboutit selon moi à l'abrutissement de l'individu, voire à la violence" * dans [[Devenir un Génie]] : "Ils sont ainsi devenus égoïstes, donc libéraux.", "le libéralisme peut apporter un manque de liberté, car c’est une doctrine et une idéologie orientée sur l'individu, individualisme cachant une société, allant alors vers la destruction du plus faible par une liberté sans limite.", "La finance a en fait tenté et tente de faire croire qu’elle s’occupe de notre liberté, alors qu’elle veut nous empêcher de nous émanciper." * dans [[Univers Vivant]] : "La finance veut que nous soyons des consommateurs alors que nous sommes des acteurs de la société.", "Pour les financiers la population pauvre doit souffrir de malnutrition.", la finance "devient alors autoritaire comme après la crise de 1929. Nous sommes à un moment crucial où nous pouvons remettre en cause l’idéologie scientiste aboutissant à nier la nature. Ainsi il y avait 1,7% de CO2 pendant le crétacé au lieu de 0,04 % en 2023." Notons que le dernier ouvrage en date, [[XXIe]], est particulièrement gratiné : * climatoscepticisme : "le GIEC aura causé une hécatombe de suicides pour un faux réchauffement de la terre" * théories du complot sur les résultats des élections occidentales : "Selon des journalistes de Sud Ouest diffusés sur Agora Vox qui ont récoltés les suffrages des élections de 2017 et qui ont suivi l’élection de 2022, Macron n’a pas été élu par les français. En réalité il est arrivé dernier des élections présidentielles de 2017.", "Emmanuel Macron avait des nuls médiatisés face à lui" * théories du complot sur la CIA et les démocrates américains : "les démocrates trichent sur les élections en 2021", "Les États-Unis sont partis d’Afghanistan pour préparer la guerre d’Ukraine" * biais prorusse : "la Russie entre en guerre contre l’Ukraine en février 2022, puisque l’Ukraine avait attaqué la Russie. Les médias occidentaux feront croire [...] que c’est la Russie qui attaque", "Vladimir Poutine est voulu par les russes, contrairement aux élus occidentaux. Les élections en Russie se déroulent suffisamment bien pour que la Russie soit considérée comme une démocratie." -- [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 11 mai 2025 à 17:24 (CEST) :J'ai lancé une série de [[Wikilivres:demandes de suppression|demandes de suppression]]. Je notifie les personnes ayant participé à l'[[Wikilivres:Demandes de suppression/2023|ancien débat (2023)]] : {{Mention|JackPotte}}, {{Mention|Lionel Scheepmans}} et {{Mention|DavidL}} pour info. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 12 mai 2025 à 11:23 (CEST) ::Salut @[[Utilisateur:Fourmidable|Fourmidable]].. C'est bien que tu inspecte le contenu de Wikiversité à la recherche de contenu indésirable ou problématiques. Mais je vois dans le titre de ce sujet de discussion une forme de sarcasme et de condescendance qui ne me semble pas adapter à un projet collaboration où tout le monde est le bienvenu peu importe ses croyance et ses idée. De plus la première personne concernée, c'est à dire l'auteur, n'y est pas notifiée. ::Ensuite, il fauétait une fois se mettre d'accord sur le fait que la ligne éditoriale de Wikiversité est différente à celle de Wikipedia. Un recueil de cours et de travaux de recherche, ce n'est pas une encyclopédie. On en a déjà discuté. La neutralité de point de vue n'existe pas dans l'enseignement ni dans la recherche. ::Pour preuve, mon fils a un cours de religion dans SZ formation secondaire et il peut choisir entre différentes religion ou opter pour un cours de morale et de citoyenneté. À l'université, les orientation idéologique des enseignants son souvent bien connue. Et il est évident que l'enseignement dans une business school sera plus libérale qu'une fac de théologie. ::Dans le cadre des travaux de recherches, la Liberté d'expression doit être complète, l'auteur doit être libre d'y faire ses propre interprétations des faits et développant sa propre argumentation. Sans quoi, c'est plus de la recherche. ::Finalement, un support d'enseignement dans un projet collaboratif, n'est pas un projet de recherche. On ne parle pas en "je" dans un cours, on le fait dans une recherche. Or, l'usage du "Je" implique une certaine subjectivité. ::En conclusion, je ne vois pas ce nouvelle appel dans la forme et l'énergie qu'il se présente, comme quelque chose de très collaboratif. Et je n'ai pas envie de jouer à nouveau le médiateur dans ce redémarage d'une confrontation idéologique entre deux contributeurs incapable de collaborer dans la production de contenu de qualité. ::Plutôt que de faire du rameutage ici, je te proposeraient plutôt, selon tes disponibilités, de collaborer aux écrits des auteurs en discutant avec eux sur le page de discussions de leurs articles au sujet des améliorations possibles. Plutôt que de faire appel à la suppression de toute une page pour certains passages problématiques, une démarche collaboratif serait d'aider à la résolutions de ces problèmes, dans le but de ne pas perdre tout le reste de la page. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 13:20 (CEST) :::Tu as raison, je notifie aussi {{Mention|Matthius}} en espérant que cette fois son comportement soit plus constructif... Concernant les ouvrages qui sont moins problématiques, j'ai fait des demandes dans les pages de discussion idoines. Ici on a des ouvrages clairement complotistes et anti-science qui nuisent à la réputation de Wikilivres. (PS : Nous sommes sur Wikilivres, pas sur Wikiversité ;)) [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 12 mai 2025 à 13:21 (CEST) ::::Entre-nous @[[Utilisateur:Fourmidable|Fourmidable]], je ne trouve pas ton comportement plus constructif, ni collaboratif que le tien... [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 13:24 (CEST) :::::À mes yeux et dans le cadre d'un projet collaboratif, commencer par une demande de suppression avant toute chose peut même être perçu comme violant. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 13:26 (CEST) ::::::Mon but n'est pas de faire une croisade pour le libéralisme ou le GIEC sur Wikilivres, mais il y a quand même des limites pour tenir la réputation du site et plus largement de la Wikimedia Foundation. Je te rejoins sur le fait que les auteurs ne doivent pas être libres d'écrire absolument tout ce qu'ils veulent, et aussi que la critique doit être constructive, mais ce n'est pas au créateur du livre d'être le seul arbitre de ce qui est raisonnable ou pas vis-à-vis de son travail (i.e. simple reformulation, suppression partielle ou totale...). Et en 2023 Matthius a montré un comportement très agressif vis-à-vis de mes critiques, ce qui a mené '''ensuite''' à des débats de suppression. Pour l'instant, je ne fais que soulever des phrases (souvent identiques à celles de 2023) que je trouve (de nouveau) hautement problématiques d'un point de vue scientifique (manque voire absence totale de sourçage), mais le passage par des demandes de suppression directement se justifie par une forme de récidive sur certaines affirmations auxquelles aucune amélioration n'a été apportée après critique. Tu m'accuses de rameutage, mais je ne fais que consulter la communauté dans son ensemble : ici pour une discussion globale, sur [[Wikilivres:Demandes de suppression]] pour un débat et un "vote" au cas par cas. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 12 mai 2025 à 13:34 (CEST) :::::::Désolé aussia pour le côté péjoratif du terme rameutage. Parlons de notiffication c'est plis adéquat. :::::::Je réalise seulement que l'on est sur wikilivres et pas Wikiversité. Désolé sur mon smartphone ça ne saute pas aux yeux. Il faut donc recontextualiser tout ce que j'ai écrits précédement. Heureusement, historiquement Wikiversité est un sous projet de wikilivre. Les deux projet sont très proches dans leurs mission pédagogique et mode de fonctionnement. L'objet ici étant de produire des livres pédagogiques pour toute les tranches d'âges et pas uniquement des ouvrages qui doivent répondre à à des attentes scientifiques. Il apparait dans tes propos des thermes très wikipédien tel que le sourçage et la neutralité de point de vue. Je ne pense pas que cela doit s'appliquer ici. :::::::Ensuite Wikilivres est trop petit pour avoir un commuté d'arbitrage et je n'ai pas envie de parcourir les historiques à la recherche de qui a commencé. Mais je maintient l'idée que notifier des personnes vers un appel à suppression est une démarche que je considère symboliqueemnt violente et me semble aussi être une récidive. :::::::As-tu cherché à améliorer les texte en question en discutant avec l'auteur avant de proposer leurs suppression ? :::::::As-tu conscience que nous sommes ici dans un projet collaboratif, pluraliste et non universitaire ? [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 15:02 (CEST) ::::::::Du reste, nous ne sommes pas ici pour répondre à des suposées attentes de la Fondation Wikimedia. Car le rôle de celle-ci est précisément de répondre aux notres. C'est le rôle d'une fondation. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 15:07 (CEST) :::::::::Bonjour, :::::::::Il faudrait avant tout classer les écrits de l'auteur, car il pourrait il y avoir un problème d'admissibilité, Wikilivres étant avant tout un projet de rédaction de livres '''pédagogiques'''. Ces écrits contiennent beaucoup d'avis personnels et présentent une vision sans discussion ni argumentation, sans apporter de pédagogie sur un sujet particulier. :::::::::Si on peut qualifier les écrits comme de la recherche, il vaudrait mieux les déplacer vers la wikiversité, où une communauté supplémentaire et plus expérimentée sur la recherche pourrait exprimer son avis sur le sujet ou sur comment améliorer/corriger les écrits de Matthius. :::::::::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 12 mai 2025 à 20:01 (CEST) ::::::::::Je plussoie {{Mention|DavidL}}. {{Mention|Lionel Scheepmans}} ce que tu dis s'applique aux cas où il y a une réelle démarche scientifique ou a minima une attitude collaborative de la part de l'auteur. Or : ::::::::::* premièrement (tu le sais sans doute, étant toi-même chercheur), les livres de Matthius sont très loin de toute méthode scientifique, c'est plutôt un ensemble d'assertions non sourcées qui font la promotion d'une idéologie (et on verse même dans l'antiscience avec les paragraphes sur le GIEC). On pourrait donner la parole à Matthius sur ce sujet mais je crains qu'il ne se définisse même pas lui-même comme scientifique ; ::::::::::* deuxièmement, avec cette série de recréations le 8 décembre dernier, sans attendre l'avis de la communauté, et avec les '''mêmes phrases''' problématiques (parfois à peine reformulées, souvent conservées à l'identique), je ne vois pas comment on pourrait supposer que Matthius fait preuve d'ouverture d'esprit et d'attitude collaborative. ::::::::::Bref, si vous voulez absolument garder tous ces ouvrages et essayer de composer tant bien que mal avec la pugnacité de leur auteur, ce sera sans moi... À mon avis, il serait nettement plus profitable de traduire les livrels de [[:en:Subject:Economics|Wikibooks en anglais sur l'économie]], par exemple. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 13 mai 2025 à 11:07 (CEST) :::::::::::Je viens de prévenir Matthius par mail. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 13 mai 2025 à 11:12 (CEST) ::::::::::::Tree bien. Moi aussi, je n'ai plus envie de consacrer du temps là dessus. Je vous laisse donc traiter la situation puisque votre avis est majoritaire. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 13 mai 2025 à 11:27 (CEST) :::::::::::Je ne comprends pas cette assertion. Je cite François Gervais contre le GIEC, qui a écrit pour le GIEC sans être entendu pour la conclusion. :::::::::::Je n'ai pas reformulé mes phrases à l'identique. J'ai soit indiqué la source contrairement à ce qui dit Fourmidable, soit indiqué que c'était mon point de vue ou émis une explication. Aussi quand je fais une assertion scientifique, j'en indique souvent la cause scientifique. Fourmidable a tendance à reprendre les phrases où je répète ce qui a été écrit avant pour aller plus loin. Donc il faut chercher dans mes livrels la phrase où je cite et où j'émets une hypothèse avec la cause scientifique. Je vais relire Fourmidable. :::::::::::Aussi j'ai trouvé sur l'[http://web.archive.org/web/20240810201141/https://www.google.com/search?q=mati%C3%A8re+temps+%C3%A2me âme qui ralentit la vitesse]. Je pense que Google utilise une IA pour détecter les limites de l'humain. Mon expérience de pensée va contre le matérialisme scientifique puisque j'émets l'hypothèse supérieure qu'il existe des multivers où des âmes agissent sur le nôtre. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 13 mai 2025 à 11:36 (CEST) :::::::::::Je ne pense pas effectivement que mon livrel sur le XXIe va rester sur wikibooks puisque il va contre ce qu'indique wikipedia. J'espère juste qu'il puisse rester. :::::::::::Seulement j'ai une formation en ingénierie et j'ai trouvé sur [https://archive.org/details/TempsAme l'âme qui ralentit la vitesse] [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 13 mai 2025 à 12:13 (CEST) ::::::::::Vous admettez {{Mention|DavidL}} que vous ne connaissez pas les domaines que j'aborde. Mes livrels sont pédagogiques donc vous pouvez apprendre avec. Donc lisez les avant d'émettre l'hypothèse qu'ils ne le sont pas. J'ai créé le coaching sans coach qui a permis de revoir la pédagogie d'un journal d'un réseau international. Mais cela ne m'empêche pas d'aller contre le libéralisme et l'appât du gain qui sont selon moi les fléaux actuels. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 13 mai 2025 à 12:06 (CEST) :::::::::::@[[Utilisateur:Matthius|Matthius]] semble ouvert au débat et à une aide pour améliorer ses textes. La suppression ne me semble donc pas une option souhaitable. Wikilivres est indépendant de Wikipédia. Il faut donc se référer à nos règles et recommandations locale disponible dans les espaces de noms "wikilivres" et "aide". Je vais essayer de prendre le temps d'écouter les textes avec une voix de synthèse pour gagner du temps. Cela me permettra d'en faire des commentaire en vue d'une amélioration. Car si ce sont des sources qui manques et bien il suffit de les ajouter. Nous sommes là pour travailler ensemble pour produire des ouvrages pédagogiques de qualité, pas pour juger du travail des autres en vue d'une suppression. Restons, s'il vous plait dans un esprit d'entraide et de collaboration. C'est tellement rare à notre époque... [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 14 mai 2025 à 15:00 (CEST) :::::::::::Mon livrel sur le XXIe siècle en cours d'écriture va aussi contre les théories du complot occidentales. J'écris que la Russie et la Chine sont des démocraties, alors que nos médias disent que ce sont des dictatures. J'émets effectivement des hypothèses non sourcées dans ce nouveau livrel. Je peux et vais les sourcer. Par contre j'utiliserai des sources primaires. En réalité, j'émets l'hypothèse que ce sont nos médias qui sont dans la post-vérité et que ce ne sont pas les médias étatsuniens, ni russes, ni chinois qui y sont. Ce livrel est effectivement une bombe dangereuse contre nos médias comme l'indique Fourmidable. ::::::::::::Je ne comprends pas l'acharnement de Fourmidable à ne pas vouloir discuter avec moi et à vouloir automatiquement supprimer mes livrels sans discussion préalable. En effet il a eu un an pour m'indiquer comment améliorer mes livrels. Et que Fourmidable ne me dise pas que c'est moi qui ait commencé, puisque j'étais outré qu'on veuille supprimer mes livrels avec ses copains sans discussion pédagagogique au tout début. ::::::::::::Concernant la neutralité de wikipedia : wikipedia ne fait que révéler l'avis des médias financés donc il n'est pas neutre. Être neutre c'est révéler tous les points de vue, même ceux avec lesquels on n'est pas d'accord, ce que [https://archive.org/details/wikipediaCo-Fondateur fit wikipedia au début de son histoire] et ce pour quoi je me suis intéressé et ai été réprimé sauf pour wikibooks anglais qui m'a viré pour ne pas enlever mon nom. :{{Mention|Matthius}} Avez-vous l'intention de publier des livres scientifiques, c'est-à-dire sourcés par de la science publiée et évaluée par les pairs, et à défaut de grands médias nationaux et internationaux ? Vous pouvez aussi tester vos hypothèses mais votre travail ne doit pas consister à sélectionner les sources qui vous conviennent pour seulement valider votre théorie, en mettant de coté tout ce qui vous dérangerait dans cette entreprise. --[[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 10:48 (CEST) ::@[[Utilisateur:Fourmidable|Fourmidable]], je pense que tu te fais une vision fausse du monde de l'édition. @[[Utilisateur:Matthius|Matthius]] peut payé une maison d'édition, dans le cadre d'une [[w:Édition_à_compte_d'auteur|édition à compte d'auteur]]. Probablement qu'il l'a déjà fait puisqu'il a déjà publié des ouvrages au format papier parmi ceux qu'il veut placer sur Wikilivres. Il en a même déposé certains dans une bibliothèque universitaire. Quant à la revue par les paires ne se fait que dans le cadre des journaux scientifique. ::J'ai écouté l'ouvrage [[Pourquoi un Dieu ?]] Et je trouve effectivement qu'il n'a pas sa place dans Wikilivres. Non pas parce qu'il critique le libéralisme avec des propos que je partage en grande partie, mais parce qu'il s'apparente plus à de la propagande chrétienne qu'à un réel ouvrage pédagogique sur le sujet. ::Matthius y est en posture de prédicateur et non de pédagogue. Je dirais que la moitié des phrases de l'ouvrage que j'ai écouté sont des affirmations sans argumentation ni démonstration valide. La thèse de son ouvrage se résume à dire que dieu est la seule chose qui peut expliquer un phénomène actuellement inexpliqué. Ce qui est une corrélation fallacieuse puisqu'il n'existe aucun lien de causalité. ::Pour moi, les ouvrages évangéliste ou propagandiste n'ont pas leur place dans Wikilivres et je serais d'avis d'ouvrir une prise de décision pour établir une règle d'interdiction. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 11:42 (CEST) :::Oui voilà, nous sommes d'accord. Peut-être que Matthius peut adopter une attitude plus scientifique, mais l'esprit de "pédagogie" s'accompagne forcément d'une démarche scientifique, sinon c'est de la prédication/propagande. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 11:45 (CEST) ::::@[[Utilisateur:Fourmidable|Fourmidable]]... Wikilivres n'est pas une bibliothèque "scientifique" mais pédagogique. Tu sembles confondre les deux termes. Les livres pour enfants que contient Wikilivres ne sont pas "scientifique" tout en étant pédagogiques. ::::Un autre fait qui peut être reproché à @[[Utilisateur:Matthius|Matthius]] est son autopromotion, [[Wikilivres:Présentation#● Wikilivres n'est pas une vitrine|alors que la démarche proscrite sur Wikilivres]]. ::::Plutôt que de supprimer l'important travail effectué par Matthius, je propose à nouveau de le déplacer en sous page de son espace utilisateur pour qu'il puisse retravailler ses écrits. ::::Pour un retour dans l'espace principale, il faudrait au préalable qu'il supprime des ses travaux toute forme d'autopromotion et toute forme propagande, prosélytisme ou autre type de discours prédicateur. Ceci notamment en référence aux choix politiques [https://www.senat.fr/leg/ppl17-386.html français], [https://www.rtbf.be/article/le-proselytisme-religieux-ou-politique-n-a-pas-sa-place-a-l-ecole-quels-chiffres-derriere-ce-phenomene-pointe-par-la-ministre-de-l-education-11477234 belge], [https://www.assnat.qc.ca/fr/travaux-parlementaires/projets-loi/projet-loi-94-43-1.html Quebec], [https://ge.ch/grandconseil/data/loisvotee/L11764.pdf suisse]. Quatres communautés culturelles très largement majoritaire dans l'espace francophone des projets Wikimédia. ::::J'invite Matthius et les autres membres de notre communauté réagir à ce message et de discuter du lancement d'une nouvelle prise de décision pour interdire la propagande et le prosélytisme dans Wikilivres. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 12:21 (CEST) :::::Ce que je veux dire, c'est qu'un bon livre pédagogique s'appuie forcément sur des connaissances scientifiques. Ok pour un redéplacement. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 12:37 (CEST) ::::::Ne fais pas à ton tour du prosélytisme scientifique @[[Utilisateur:Fourmidable|Fourmidable]]. La science et les connaissances dites scientifiques comme tu les entends n'est pas la seule chose sur laquelle on peut s'appuyer pour produire un contenu pédagogique. ::::::Que fais-tu de la méditation, de l'humour, de la poésie, de la musique, du dessin, et toute autre expression artistique ? ::::::Et il existe aussi un tas d'ouvrages pédagogique religieux (pour le catéchisme entre autre), sauf que, comme la plupart des législations nationales des pays francophones occidentaux, je pense qu'ils n'ont pas leur place dans Wikilivres. Ce sur quoi nous devons nous positionner dans une prise de décision collective. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 12:52 (CEST) :::::::Ah oui, dans ce sens-là il y a en effet moins de science à proprement parler… Mais je ne suis pas sûr que cela s'applique aux propos politiques. Ça ne me viendrait pas à l'idée de faire un Wikilivre afin de convertir les gens au libéralisme, par exemple. C'est le rôle d'autres wikis ou sites web spécialisés. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 14:44 (CEST) :::Je vais supprimer Du même Auteur et Du même éditeur de mes wikilivres. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 15 mai 2025 à 12:32 (CEST) ::::Si vous voulez, mais c'est loin d'être le point principal. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 12:38 (CEST) :::::Effectivement @[[Utilisateur:Matthius|Matthius]], c'est une bonne résolution, mais il reste le prosélytisme à résoudre et je pense que cela demande beaucoup de travail à réaliser dans votre espace de travail personnel. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 12:55 (CEST) ::::::Vous mettiez que seul Pourquoi un Dieu est prosélyte. J'avais effectivement un doute en ajoutant ce livrel. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 15 mai 2025 à 19:43 (CEST) :::::::Je n'ai pas encore eu le temps d'écouter les autres livres @[[Utilisateur:Matthius|Matthius]] . Nous somme tous bénévoles ici. Cela peut prendre du temps, mais je vous invite déjà à déplacer vous-même le livre ''Pourquoi un Dieu'' dans vos sous page utilisateur''.'' :::::::Par anticipation, je peux déjà dire que tous les autres ouvrages faisant la publicité de vos écris doit être modifier ou retirer de l'espace principale ainsi que tous ceux qui font référence à Dieu ou au catholicisme de manière prosélyte. :::::::Seul le nom des auteurs devrais être repris dans les livre avec éventuellement des hyperliens vers leurs pages utilisateur qu'il sont libre d'éditer comme il veulent. :::::::On peut ensuite créer des pages catégories qui reprennent tous les travaux des auteurs, avec l'avantage qu'elle se complétent automatiquement à chaque fois que l'on ajoute une catégorie en bas de page d'un ouvrage. Vous trouverrez certainement des indication dans les pages d'aide. :::::::Je vous rassure sur le fait que ce traitement serait semblable pour un politicien libéral faisant la publicité de son parti, de ses idéologies et de sa personne. N'hésitez pas d'ailleurs à parcourir les autres wikilives pour y détecter ce genre de problème avant de nous le signaler. C'est ce que fait @[[Utilisateur:Fourmidable|Fourmidable]] en cherchant à veiller sur la qualité et la conformité de notre projet. Une belle fin de journée ! [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 16 mai 2025 à 11:41 (CEST) ::::::::Pour info, je confirme et soutiens tout ce que propose {{Mention|Lionel Scheepmans}} dans son dernier message (merci à lui). [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 16 mai 2025 à 12:01 (CEST) ::::::::Pourquoi a Dieu a été mis à jour dans mon espace personnel. Je ne sais pas comment effacer une page wikibooks.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 16 mai 2025 à 12:24 (CEST) :::::::::@[[Utilisateur:Matthius|Matthius]]. Je ne comprends pas ce que vous dite. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 16 mai 2025 à 15:16 (CEST) ::::::::::J'ai copié-collé Pourquoi un Dieu dans ma page personnelle. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 16 mai 2025 à 21:36 (CEST) :::::::::::Ah très bien @[[Utilisateur:Matthius|Matthius]]. Mais en fait, il est possible de déplacer les pages en les renomant. Cela permet de conserver tout l'historique de l'édition. Je vais le faire quand je serai sur PC. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 17 mai 2025 à 03:34 (CEST) ::::::::::::Ne le faites pas : L'original de l'historique est sur mon espace perso. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 17 mai 2025 à 09:30 (CEST) :::::::::::::@[[Utilisateur:Matthius|Matthius]], j'ai écouté l'ouvrage Économie enfant. Si j'étais à la tête d'une maison d'édition, je ne publierais pas ce manuscrit. Il y a des passages très intéressants avec des idées originales que je partage, mais aucune argumentation pour les valider. Pour le reste, on retrouve un copié collé du précédent ouvrage. Beaucoup d'information factuelle sans réelle contextualisation ni fil conducteur et puis de nombreuses affirmations gratuites qui ne sont finalement que des opinions très relatives et de nouveau non argumentées. :::::::::::::Le pire étant que certaine de ces affirmations son tout simplement fausses ou inscensées. :::::::::::::Exemples d'une phrase : :::::::::::::« Écrire sur ce que vous comprenez de l’archéologie, qui est l’humanité avant l’écriture. » :::::::::::::Cette phrase est erronée et n'a même aucun sens. L'archéologie n'est pas l'humanité, mais un domaine des sciences créé par les humains. Ensuite, l'archéologie n'est pas quelque chose qui se limite à avant l'écriture. Il existe des nombreux sites archéologiques qui fouillent les vestiges de la Rome antique. Une civilisation qui n'était pas dénuée d'écriture. :::::::::::::Exemple d'un paragraphe : :::::::::::::« Le [[w:Capital|capital]] de l’humanité peut donc être la Terre. En effet, l'argent est produit à partir du papier venant du bois. Les trafiquants ont toujours voulu se l'approprier. Le capital pourrait donc ne pas être l’argent. Le troc nécessite cependant un patrimoine conséquent. La Chine veut s’approprier le capital Lune, pour y prendre l’Helium 3 selon Solidarité et Progrès, seule ressource lunaire qu'il est intéressant de transporter, afin de le fusionner, pour en obtenir de l’énergie illimitée, favorisant la créativité par le surplus de biens. » :::::::::::::Ce paragraphe est incompréhensible et citer un parti politique (à d'autres reprises aussi dans l'ouvrage) comme source pour poser une affirmation, pose deux gros problèmes. 1 celui de faire la publicité d'une idéologie au sein d'un écrit pédagogique, 2 celui de ne pas respecter un des principes de base de l'écriture scientifique alors que le livre en parle et la défend. :::::::::::::Je n'irai pas plus loin dans les exemples. :::::::::::::Dans leurs états actuels et pour que ces livres travaux d'écritures soient admissibles dans Wikilivres. Je pense que vous devez impérativement supprimer : :::::::::::::* toute promotion personnelle. :::::::::::::* toute forme de Prosélytisme religieux. :::::::::::::* toute forme de publicité ou contre publicité politique et partisane :::::::::::::* toute affirmation fausse et autres types de fabulations. :::::::::::::* tout raisonnement ou démonstration sans lien de causalité. :::::::::::::Suite à quoi, il faudrait encore dans l'idéal en améliorer le style de sorte à y développer un fil conducteur qui permettrait aux lecteurs de suivre un développement ordonné propice à l'apprentissage, et non leur soumettre un journal de réflexions personnelles, reprenant des erreurs factuelles et logiques. :::::::::::::C'est un travail conséquent. :::::::::::::Et en ce qui concerne le prosélytisme, les approches politiques partisanes, il est impératif, y compris les sous page de votre page utilisateur. :::::::::::::Il y a des idées intéressantes dans vos écrits, et je partage pas mal de vos points de vue concernant la question du néolibéralisme. Mais Wikilivres n'est pas une tribune d'opinion à l'image d'AgoraVox. Nous sommes ici pour produire des ouvrages pédagogiques. Pas pour influencer nos lecteurs en faveurs ou à l'encontre de certaines religions ou idéologies. :::::::::::::Tout en l'encourageant à le faire de manière plus courtoise et constructive, je remercie donc @[[Utilisateur:Fourmidable|Fourmidable]] de nous avoir alerté sur l'incompatibilité de vos ouvrages avec notre projet. Dans tous les cas ceux que j'ai écoutés jusqu'à présent. :::::::::::::J'aimerais à votre tour vous encourager à poursuivre vos travaux d'écriture en cherchant à vous rapprocher de notre objectif tout en respectant nos règles et recommandations. Mais sachez aussi que vous pouvez aussi améliorer l'article de Wikipédia sur l'[[w:Économie_réelle|économie réelle]]. Ou aussi développer une leçon sur Wikiversité sur le même sujet dans la [[v:Faculté:Économie|Faculté d'Économie]]. C'est un sujet intéressant qui permet de mettre en lumières les limites de la [[w:Finance|finance]]. :::::::::::::Ces deux activités seraient moins ambitieuses que de vouloir produire un livre de qualité pour expliquer l'économie aux enfants. Cela demande une grande maîtrise du sujet en plus d'un certain don pour la vulgarisation. :::::::::::::Il me reste deux ouvrages proposés à la suppression à écouter, mais j'ai bien peur d'y retrouver les mêmes incompatibilités que celles que je viens d'expliquer à l'instant. :::::::::::::Bien cordialement, [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 26 mai 2025 à 21:16 (CEST) :::::::::::::Mon correcteur orhtographique ne fonctionnant pas pour des commentaires aussi long, le message que je viens de laisser est truflé de fautes et je n'ai pas le temps ni le courrage de les corriger. Encore une fois, le travail que je fournis sur ce projet est tout à fait bénévole. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 26 mai 2025 à 21:21 (CEST) ::::::::::::::J'ai passé beaucoup de temps à élaborer le coaching sans coach. Ce n'est naturel pour aucun ancien élève de simplifier. Je ne sais pas combien de fois j'ai relu Comment Écrire des Histoires. J'ai toujours beaucoup de temps devant moi pour revoir mes livrels.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 10:51 (CEST) :::::::::::::::@[[Utilisateur:Matthius|Matthius]], c'est précisément parce que vous travailler beaucoup et que vous Me semblez de bonne foi et volonté, que je passe autant de temps à vous aiidez. Tous vos textes comprends des problèmes qu'il faut résoudre. Vous devriez commencer par supprimer tout ce qui fait référence à vous, à la religion et au politique, pour ne garder que des faits et affirmations vérifiées par des sources sûres et non partisannes, à chaque fois pour vous assurez que vous n'être pas simplement en train de diffuser ou colporter une opinion fausse et/ou partisane. Ce qui vient d'être dit est incontournable. :::::::::::::::Je penses ensuite qu'indique messages auxquelles ont été écrites vos sections sont superflues dans le cadre d'un ouvrage pédagogique. La chronologie de vos écrits n'est pas un bon un fil conducteur. Encore une fois, Wikilivres n'est pas un lieu pour publier ses mémoires ou ses réélections du jour. Il existe le format blog pour ce genre de choses. :::::::::::::::Tennez compte aussi que nous ne disposons pas forcément d'autant de temps et de motivation que pour revoir vos livres. Raison pour laquelle, des méthodes plus expéditives telles que la suppression complète des pages inadaptées à notre projet finiront par être appliquées. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 13:18 (CEST) ::::::::::::::::Le livrel le plus important pour moi est l'économie pour les enfants, vient ensuite devenir un génie. L'Univers est Vivant a été référencé sur les moteurs de recherche récemment parce que j'ai trouvé sur l'âme qui ralentit la vitesse. Quand on cherche matière temps âme sur les moteurs de recherche occidentaux on tombe sur ma page archive.org/details/TempsAme. Il n'y a toujours pas de chercheur qui a publié sur la mathématisation de ma trouvaille. L'univers est vivant est une amélioration d'un autre livre. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 13:56 (CEST) ::::::::::::::::Je viens de mettre mon [http://matthieu.giroux.free.fr/html/cv.htm CV] à jour pour montrer ce que j'ai influencé. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 14:05 (CEST) ::::::::::::::::C'est moi qui ai diffusé le terme économie réelle. Je reproche à ceux qui l'ont utilisé d'être des économistes scolaires, c'est à dire de se référer à l'économie monétaire pour parler d'économie réelle. Je peux cependant mettre un historique de cette économie sur la page wikipedia. Je me demande juste s'il va rester. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 14:08 (CEST) :::::::::::::::::Je suis désolé @[[Utilisateur:Matthius|Matthius]]. Je ne vais pas poursuivre nos conversations faute d'en avoir envie. Vous ma laissez sur cette impression que votre motivation première est de promouvoir votre personne, vos valeurs et vos idées. Je vais donc arrêter de vous consacrer du temps. Je suis ici pour soutenir et développer les projets et intérêts collectifs et non individuels. Bonne chance pour vos ambitions que je vous invite à réaliser en dehors des projets Wikipédia. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 15:00 (CEST) ::::::::::::::::::Mon projet relève de l'intérêt général de faire connaître l'économie du XIX{{e}} siècle de [[Henry Charles Carey]]. Mon égoïsme peut donc être aussi le vôtre. Pour moi il faut être intelligent et égoïste pour défendre l'intérêt général. Je pense qu'on peut tous avoir l'air de génies comme les enfants peuvent avoir l'air de génies. Oui, je suis militant et veux faire partager la joie de la politique. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 15:55 (CEST) :::::::::::::::::::Nous ne sommes donc pas sur la même longueur d'onde. Je vois invite à ne pas faire de militantisme sur les projets wikimedia. Il y a d'autres endois pour le faire. La blogosphère, des tribune comme agoravox, et de nombreux sites web tenus par des communautés militantes et reliée aux valeurs et idées pour lesquelles vous militer. Ceci est mon dernier message à ce sujet. Cordialement. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 16:18 (CEST) ::::::::::::::::::::Je vous mets au défi de penser que les wikipédiens ne sont pas des militants. Eux veulent aussi défendre l'intérêt général en apportant la connaissance. Par contre ils ne ciblent pas leurs apports. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 17:10 (CEST) ::::::::::::::::::::Comme prévu, on me dit que mon [https://fr.wikipedia.org/wiki/%C3%89conomie_r%C3%A9elle#Histoire ajout sur l'économie réelle] est inédit. Je pense que vous vous êtes intéressé à certains de mes écrits parce qu'ils vous apportaient des réponses. Je peux faire cela sur wikibooks. Seulement c'est encore plus difficile sur wikipedia. Je ne suis pas théseux. Oui l'économie réelle a été créée pour faire connaître l'économie physique de Lyndon Larouche. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 30 mai 2025 à 17:15 (CEST) :::::::::::::::::::::Merci quand même ! [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 31 mai 2025 à 00:24 (CEST) :Mon livrel l'univers est vivant [https://www.agoravox.tv/actualites/technologies/article/et-si-la-physique-quantique-avait-105532 a eu un impact]. Je pense aussi avoir influencé les jeunes qui se sont tournés vers la bible. == [Recherche universitaire] Questionnaire sur la gouvernance Wikimedia == Bonjour à toutes et à tous, Dans le cadre d’un mémoire de recherche sur les modèles de gouvernance décentralisés dans les communs numériques, je mène une étude analysant le mouvement Wikimedia. L’objectif est de mieux comprendre la perception qu’ont les contributeurs et contributrices des projets Wikimedia (Wikilivres, Wikipédia, Wikidata, Commons, etc.) de la Fondation Wikimedia, de ses décisions, et des relations avec les chapters locaux (ex. Wikimédia France). Un questionnaire anonyme, rapide à remplir (environ 5 minutes), a été conçu à cet effet. Il s’adresse à toute personne majeure ayant déjà contribué à un projet Wikimedia, quelle que soit l’ancienneté ou le niveau d’implication. Lien vers le questionnaire : framaforms.org/questionnaire-communaute-wikipedienne-et-la-wikimedia-fondation-1747225404 '''Important''' : Les résultats seront utilisés uniquement dans un cadre académique. L'enquête, ainsi que l'étude, ne sont ni commandités ni supervisés par la Fondation ou aucun chapitre local. Il s'agit simplement d'un projet scolaire que je mène {{sourire}}. Merci d’avance pour votre participation ! [[Utilisateur:3(MG)²|3(MG)²]] ([[Discussion utilisateur:3(MG)²|discussion]]) 27 mai 2025 à 10:43 (CEST) :J'ai répondu. Bon courage pour ton mémoire ! (Ça me fait penser que je dois avancer sur le mien aussi...) [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 29 mai 2025 à 23:28 (CEST) == Propagande, prosélitisme, autopromotion, militanatisme, etc == Bonjours à la communauté des contributeurs de Wikilivres. Je me dit qu'il serait bon de faire une nouvelle prise de décision pour mieux cadrer le contenu de notre projet par rapport à ce qui se situebdans le titre de ce message. Qu'en pensez-vous ? [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 16:22 (CEST) :Totalement {{Pour}} ! [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 29 mai 2025 à 21:53 (CEST) :L'économie financière peut être considérée comme une propagande puisque son utilisation ne permet pas de lier la macro-économie et la micro-économie, ne permettant donc pas de développer une société comme le fait l'[https://fr.wikipedia.org/wiki/%C3%89conomie_r%C3%A9elle économie réelle]. :Si on considère le prosélytisme comme convaincre de rejoindre sa communauté, il faudrait donc enlever tous les wikilivres qui sont beaucoup lus, puisque les wikilivres qui sont peu lus n'arrivent pas à convaincre. :L'autopromotion permet malgré tout de connaître ce que fait l'auteur d'un wikilivre. Si on enlève le chemin qu'a suivi l'auteur, on évacuerait ainsi ses contradictions et on pourrait donc faire dire à un auteur l'inverse de ce qu'il a compris au bout de son parcours. Je suis pour qu'il y ait une page de l'auteur regroupant les livrels de l'auteur comme sur wikisource. :Je considère ceux qui contribuent à wikipedia et à wikibooks comme des militants, puisqu'ils essaient d'influencer les autres avec ce qu'ils écrivent sur ces sites web. Certes, certains travaux peuvent être désintéressés, mais alors pourquoi mettre ces travaux sur ces sites web alors. En effet le manque de passion crée des textes soporifiques. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 3 juillet 2025 à 22:36 (CEST) jblpuxfr251uea6m1vm2sobz7v4h32c 745892 745891 2025-07-03T21:01:31Z Matthius 11787 /* Propagande, prosélitisme, autopromotion, militanatisme, etc */ 745892 wikitext text/x-wiki <noinclude>{{Wikilivres:Le Bistro/En-tête}}</noinclude> == compléter les bons conseils pour un nouveau livre == bonjour wikilivre ! je refais un tour sur ce wiki depuis un sacré bout de temps. Je vois que certains noms sont toujours là :) wouah. J'ai entâmé un livre nouveau aka. [[La sécurité du citoyen dans son logement]] que je vais encore améliorer mais je me pose dejà quelques questions sur le process, et vu que [[Wikilivres/Créer un wikilivre]] est assez high level je préfère demander ici des conseils. J'aime à penser que si l'idée est pertinente le guide pourra évoluer rapidement. * '''AutoCat''': il est indiqué clairement dans le guide pour la page de garde du livre de mettre <code><nowiki>{{AutoCat}}</nowiki></code> en bas de page, mais est-ce conseillé également sur chaque page du livre ? ça a l'air de marcher et donc plutôt oui: & si oui on pourrait l'ajouter dans le guide ? * je ne sais pas quoi mettre dans `CDU item` : on peut peut être orienter vers une bonne page sur le comment remplir le template proposé sur la page de garde * '''navigation horizontale''': est-ce qu'un moyen universel permet de suivre les chapitres d'un livre ? ex. si je suis sur un chapitre et que je veux aller au suivant, soit je passe par la page parent, soit je passe par la catégorie. Mais je voudrai (mieux qu') un bouton "next" / "previous". Enfin voici l'idée. S'il y a des choses en template automatique, je suis preneur (peut être le guide aussi) (PS: je vois que la gestion du sommaire est automatisée au sein même d'un chapitre : génial :) ) :NB: à une certaines époque j'utilisais des templates propres au livre (ex. [[Modèle:Les félins]]) et je vois que certains livres ont repris l'idée.. * '''catégorie''' : que faut-il mettre exactement dans le contenu de la catégorie auto-générée pour le nouveau livre ? juste <code><nowiki>[[Catégorie:Livres par titre]]</nowiki></code> ? * '''livre modèle''' : avez-vous un livre "modèle" : c'est-à-dire un livre (probablement à succès & pas trop grand) qui serait particulièrement suivi par les habitués et sur lequel on retrouverai toutes les techniques les plus avancées pour bien rédiger un livre. Il apparaîtrait du coup en modèle dans le guide. qu'en pensez-vous ? [[Utilisateur:Boly38|Boly]] [[Discussion_Utilisateur:Boly38|♪]] 5 mars 2025 à 18:09 (CET) :Salut Boly :* Autocat : normalement, il ne se met que dans le modèle listant les chapitres du livre, inclus dans toutes les pages. Par exemple le modèle {{m|Programmation JavaFX}} est inclus comme ceci : <nowiki><noinclude>{{Programmation JavaFX}}</noinclude></nowiki>) dans tous les chapitres du livre [[Programmation JavaFX]]. :* [[Wikilivres:CDU]] : il y a un moteur de recherche pour trouver le classement, mais il n'est pas encore pleinement détaillé et parfois il faut créer les pages correspondantes à la CDU. J'utilise http://www.udcsummary.info/php/index.php?lang=fr pour ajouter les pages manquantes. Si tu trouves un ou plusieurs classement possibles, je peux me charger de créer les pages qui manquent. :* '''navigation horizontale''' : Fait automatiquement par l'inclusion du modèle dans toutes les pages. Voir par exemple : [[Programmation Java Swing/Introduction]]. Le modèle ajoute les liens suivant, précédent et une flèche au milieu pour déplier la liste complète des chapitres du livre. :Pour la catégorie, un petit descriptif, comme par exemple : <pre><nowiki> Catégorie recensant les pages du livre [[Programmation JavaFX]]. Pour discuter de la rédaction du livre c'est ici : [[Discussion:Programmation JavaFX]]. [[Catégorie:Java]] </nowiki></pre> :--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 5 mars 2025 à 19:22 (CET) ::J'ai fait des clics magiques (dans l'historique des pages) pour remercier ; je ne sais pas où ça atteri mais bon. Le template sommaire avec navigation par page c'est exactement ce que je voulais : c'est top :) & merci aussi pour les illustrations ! David L au top ! ! [[Utilisateur:Boly38|Boly]] [[Discussion_Utilisateur:Boly38|♪]] 7 mars 2025 à 18:04 (CET) == Problème de cache sur la page d'accueil == Salut, Les utilisateurs anonymes voient toujours les mêmes livres sur la page d'accueil (pendant plusieurs mois) alors que les livres changent tous les jours pour les utilisateurs connectés. Il faudrait installer l'extension [[mw:Extension:MagicNoCache]] afin de pouvoir utiliser <nowiki>__NOC</nowiki>ACHE__ sur la page d'accueil. --&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 29 mars 2025 à 20:56 (CET) :Bonjour, bien reçu, j'ai créé un ticket pour voir déjà si on peut diminuer ce cache à 24h (sinon il faudra voter pour l'extension) : https://phabricator.wikimedia.org/T390674. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<span style="color:#FF6600">$</span>♠]]) 1 avril 2025 à 11:46 (CEST) ::Merci JackPotte. ::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 1 avril 2025 à 19:00 (CEST) :::Un problème similaire a été signalé en 2023 [[phabricator:T351573]], et en 2017 [[phabricator:T119366]] mais pas la moindre action de correction depuis toutes les années écoulées. Les problèmes des "petits" wiki ne sont pas écoutés. :::J'ai donc créé la page de vote pour installer l'extension : [[Wikilivres:Prise de décision/Installer l'extension MagicNoCache]]. :::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 1 avril 2025 à 19:48 (CEST) ::::{{Mention|Lionel Scheepmans}}, {{Mention|Fourmidable}} : un avis / un vote sur ce sujet ? --&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 12 mai 2025 à 20:04 (CEST) :::::Je viens de donner mon avis sur la page idoine, merci du rappel ! [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 13 mai 2025 à 11:00 (CEST) == Erreur d'affichage sur la page d'accueil == Bonjour tout le monde, Un petit message pour savoir où nous en sommes sur le problème d'affichage dans la page d'accueil (débordement des cadres de livres suggérés sur la boîte à outils des utilisateurs connectés). Wikilivresquement, [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 26 avril 2025 à 17:59 (CEST) :Salut Fourmidable, :J'ai tenté de trouver une solution pour cet habillage, mais il est tellement mal conçu que ça semble impossible. :C'est le seul habillage qui pose problème, pour plusieurs pages et pas seulement la page d'accueil. :La décision arbitraire d'imposer cet habillage sans consulter la communauté du projet est une aberration. :Le mieux serait de : :# créer un bug pour l'habillage Vector-2022 qui ne fonctionne plus dès qu'il y a le moindre code CSS, :# créer une demande de fonctionnalité pour que les administrateurs du projet puisse sélectionner l'habillage par défaut par projet choisi par décision communautaire, :Mais comme les "petits wikis" ne sont pas écoutés, ce serait inutile (voir les nombreux exemples de problèmes reportés spécifiques à fr.wikibooks dont aucun n'a jamais été résolu). :--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 26 avril 2025 à 20:26 (CEST) ::Ok, en tout cas sache que je soutiens ta proposition ! [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 1 mai 2025 à 16:28 (CEST) == Matthius : le grand retour == Bonjour à tous, Quelqu'un veut-il bien m'aider à relire les [https://fr.wikibooks.org/w/index.php?title=Sp%C3%A9cial%3AContributions&target=Matthius&namespace=0&tagfilter=&newOnly=1&start=&end=&limit=50 nouveaux livres de Matthius] ? Il semble y avoir, une fois de plus, de graves problèmes de sourçage et des attaques (même déjà soulignées en 2023 !) contre "le libéralisme" et "la finance" avec des phrases obscures ; par exemple : * dans [[Conseils Chrétiens]] : "Le libéralisme empêche de voir la société. Alors on croit les films libéraux, faisant croire que l’individu fait la société, alors que c’est la société qui fait l’individu. En effet, notre ego est créé par notre famille." * dans [[Pourquoi un Dieu ?]] : "L'individualisme dû au libéralisme, de plus en plus prégnant, va par contre cacher de plus en plus notre sociabilité et notre créativité.", "le social-libéralisme ne sera que le moyen d'accéder au pouvoir par la voie opportune alors qu'on cachera le social au peuple, pour ne pas qu'il se comprenne. Le dirigeant social-libéral aura appris dans les écoles d'économie que les marchés c'est magique.", "désengager l'état, détruisant alors le développement donc la république", "La faille du libéralisme est la censure, censure permise par la pauvreté des esprits ayant peur des autres à cause de l'individualisme forcené. [...] Le libéralisme cherchera la censure pour empêcher qu'il y ait suffisamment d'esprits philosophes et créatifs s'intéressant à la politique.", "La finance croira alors qu'il faille installer une dictature pour liquider la population trop difficile à maîtriser. [...] il s'agit pour la finance de trouver de plus en plus d'illusions pour satisfaire la population" * dans [[Économie Enfants]] : le libéralisme a "rendu l’école non épanouissante par le manque de créativité, en disant que le pays ne peut plus se développer, à cause de la monnaie privée" et l'assertion non (mal ?) argumentée "Le libéralisme aboutit selon moi à l'abrutissement de l'individu, voire à la violence" * dans [[Devenir un Génie]] : "Ils sont ainsi devenus égoïstes, donc libéraux.", "le libéralisme peut apporter un manque de liberté, car c’est une doctrine et une idéologie orientée sur l'individu, individualisme cachant une société, allant alors vers la destruction du plus faible par une liberté sans limite.", "La finance a en fait tenté et tente de faire croire qu’elle s’occupe de notre liberté, alors qu’elle veut nous empêcher de nous émanciper." * dans [[Univers Vivant]] : "La finance veut que nous soyons des consommateurs alors que nous sommes des acteurs de la société.", "Pour les financiers la population pauvre doit souffrir de malnutrition.", la finance "devient alors autoritaire comme après la crise de 1929. Nous sommes à un moment crucial où nous pouvons remettre en cause l’idéologie scientiste aboutissant à nier la nature. Ainsi il y avait 1,7% de CO2 pendant le crétacé au lieu de 0,04 % en 2023." Notons que le dernier ouvrage en date, [[XXIe]], est particulièrement gratiné : * climatoscepticisme : "le GIEC aura causé une hécatombe de suicides pour un faux réchauffement de la terre" * théories du complot sur les résultats des élections occidentales : "Selon des journalistes de Sud Ouest diffusés sur Agora Vox qui ont récoltés les suffrages des élections de 2017 et qui ont suivi l’élection de 2022, Macron n’a pas été élu par les français. En réalité il est arrivé dernier des élections présidentielles de 2017.", "Emmanuel Macron avait des nuls médiatisés face à lui" * théories du complot sur la CIA et les démocrates américains : "les démocrates trichent sur les élections en 2021", "Les États-Unis sont partis d’Afghanistan pour préparer la guerre d’Ukraine" * biais prorusse : "la Russie entre en guerre contre l’Ukraine en février 2022, puisque l’Ukraine avait attaqué la Russie. Les médias occidentaux feront croire [...] que c’est la Russie qui attaque", "Vladimir Poutine est voulu par les russes, contrairement aux élus occidentaux. Les élections en Russie se déroulent suffisamment bien pour que la Russie soit considérée comme une démocratie." -- [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 11 mai 2025 à 17:24 (CEST) :J'ai lancé une série de [[Wikilivres:demandes de suppression|demandes de suppression]]. Je notifie les personnes ayant participé à l'[[Wikilivres:Demandes de suppression/2023|ancien débat (2023)]] : {{Mention|JackPotte}}, {{Mention|Lionel Scheepmans}} et {{Mention|DavidL}} pour info. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 12 mai 2025 à 11:23 (CEST) ::Salut @[[Utilisateur:Fourmidable|Fourmidable]].. C'est bien que tu inspecte le contenu de Wikiversité à la recherche de contenu indésirable ou problématiques. Mais je vois dans le titre de ce sujet de discussion une forme de sarcasme et de condescendance qui ne me semble pas adapter à un projet collaboration où tout le monde est le bienvenu peu importe ses croyance et ses idée. De plus la première personne concernée, c'est à dire l'auteur, n'y est pas notifiée. ::Ensuite, il fauétait une fois se mettre d'accord sur le fait que la ligne éditoriale de Wikiversité est différente à celle de Wikipedia. Un recueil de cours et de travaux de recherche, ce n'est pas une encyclopédie. On en a déjà discuté. La neutralité de point de vue n'existe pas dans l'enseignement ni dans la recherche. ::Pour preuve, mon fils a un cours de religion dans SZ formation secondaire et il peut choisir entre différentes religion ou opter pour un cours de morale et de citoyenneté. À l'université, les orientation idéologique des enseignants son souvent bien connue. Et il est évident que l'enseignement dans une business school sera plus libérale qu'une fac de théologie. ::Dans le cadre des travaux de recherches, la Liberté d'expression doit être complète, l'auteur doit être libre d'y faire ses propre interprétations des faits et développant sa propre argumentation. Sans quoi, c'est plus de la recherche. ::Finalement, un support d'enseignement dans un projet collaboratif, n'est pas un projet de recherche. On ne parle pas en "je" dans un cours, on le fait dans une recherche. Or, l'usage du "Je" implique une certaine subjectivité. ::En conclusion, je ne vois pas ce nouvelle appel dans la forme et l'énergie qu'il se présente, comme quelque chose de très collaboratif. Et je n'ai pas envie de jouer à nouveau le médiateur dans ce redémarage d'une confrontation idéologique entre deux contributeurs incapable de collaborer dans la production de contenu de qualité. ::Plutôt que de faire du rameutage ici, je te proposeraient plutôt, selon tes disponibilités, de collaborer aux écrits des auteurs en discutant avec eux sur le page de discussions de leurs articles au sujet des améliorations possibles. Plutôt que de faire appel à la suppression de toute une page pour certains passages problématiques, une démarche collaboratif serait d'aider à la résolutions de ces problèmes, dans le but de ne pas perdre tout le reste de la page. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 13:20 (CEST) :::Tu as raison, je notifie aussi {{Mention|Matthius}} en espérant que cette fois son comportement soit plus constructif... Concernant les ouvrages qui sont moins problématiques, j'ai fait des demandes dans les pages de discussion idoines. Ici on a des ouvrages clairement complotistes et anti-science qui nuisent à la réputation de Wikilivres. (PS : Nous sommes sur Wikilivres, pas sur Wikiversité ;)) [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 12 mai 2025 à 13:21 (CEST) ::::Entre-nous @[[Utilisateur:Fourmidable|Fourmidable]], je ne trouve pas ton comportement plus constructif, ni collaboratif que le tien... [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 13:24 (CEST) :::::À mes yeux et dans le cadre d'un projet collaboratif, commencer par une demande de suppression avant toute chose peut même être perçu comme violant. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 13:26 (CEST) ::::::Mon but n'est pas de faire une croisade pour le libéralisme ou le GIEC sur Wikilivres, mais il y a quand même des limites pour tenir la réputation du site et plus largement de la Wikimedia Foundation. Je te rejoins sur le fait que les auteurs ne doivent pas être libres d'écrire absolument tout ce qu'ils veulent, et aussi que la critique doit être constructive, mais ce n'est pas au créateur du livre d'être le seul arbitre de ce qui est raisonnable ou pas vis-à-vis de son travail (i.e. simple reformulation, suppression partielle ou totale...). Et en 2023 Matthius a montré un comportement très agressif vis-à-vis de mes critiques, ce qui a mené '''ensuite''' à des débats de suppression. Pour l'instant, je ne fais que soulever des phrases (souvent identiques à celles de 2023) que je trouve (de nouveau) hautement problématiques d'un point de vue scientifique (manque voire absence totale de sourçage), mais le passage par des demandes de suppression directement se justifie par une forme de récidive sur certaines affirmations auxquelles aucune amélioration n'a été apportée après critique. Tu m'accuses de rameutage, mais je ne fais que consulter la communauté dans son ensemble : ici pour une discussion globale, sur [[Wikilivres:Demandes de suppression]] pour un débat et un "vote" au cas par cas. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 12 mai 2025 à 13:34 (CEST) :::::::Désolé aussia pour le côté péjoratif du terme rameutage. Parlons de notiffication c'est plis adéquat. :::::::Je réalise seulement que l'on est sur wikilivres et pas Wikiversité. Désolé sur mon smartphone ça ne saute pas aux yeux. Il faut donc recontextualiser tout ce que j'ai écrits précédement. Heureusement, historiquement Wikiversité est un sous projet de wikilivre. Les deux projet sont très proches dans leurs mission pédagogique et mode de fonctionnement. L'objet ici étant de produire des livres pédagogiques pour toute les tranches d'âges et pas uniquement des ouvrages qui doivent répondre à à des attentes scientifiques. Il apparait dans tes propos des thermes très wikipédien tel que le sourçage et la neutralité de point de vue. Je ne pense pas que cela doit s'appliquer ici. :::::::Ensuite Wikilivres est trop petit pour avoir un commuté d'arbitrage et je n'ai pas envie de parcourir les historiques à la recherche de qui a commencé. Mais je maintient l'idée que notifier des personnes vers un appel à suppression est une démarche que je considère symboliqueemnt violente et me semble aussi être une récidive. :::::::As-tu cherché à améliorer les texte en question en discutant avec l'auteur avant de proposer leurs suppression ? :::::::As-tu conscience que nous sommes ici dans un projet collaboratif, pluraliste et non universitaire ? [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 15:02 (CEST) ::::::::Du reste, nous ne sommes pas ici pour répondre à des suposées attentes de la Fondation Wikimedia. Car le rôle de celle-ci est précisément de répondre aux notres. C'est le rôle d'une fondation. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 15:07 (CEST) :::::::::Bonjour, :::::::::Il faudrait avant tout classer les écrits de l'auteur, car il pourrait il y avoir un problème d'admissibilité, Wikilivres étant avant tout un projet de rédaction de livres '''pédagogiques'''. Ces écrits contiennent beaucoup d'avis personnels et présentent une vision sans discussion ni argumentation, sans apporter de pédagogie sur un sujet particulier. :::::::::Si on peut qualifier les écrits comme de la recherche, il vaudrait mieux les déplacer vers la wikiversité, où une communauté supplémentaire et plus expérimentée sur la recherche pourrait exprimer son avis sur le sujet ou sur comment améliorer/corriger les écrits de Matthius. :::::::::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 12 mai 2025 à 20:01 (CEST) ::::::::::Je plussoie {{Mention|DavidL}}. {{Mention|Lionel Scheepmans}} ce que tu dis s'applique aux cas où il y a une réelle démarche scientifique ou a minima une attitude collaborative de la part de l'auteur. Or : ::::::::::* premièrement (tu le sais sans doute, étant toi-même chercheur), les livres de Matthius sont très loin de toute méthode scientifique, c'est plutôt un ensemble d'assertions non sourcées qui font la promotion d'une idéologie (et on verse même dans l'antiscience avec les paragraphes sur le GIEC). On pourrait donner la parole à Matthius sur ce sujet mais je crains qu'il ne se définisse même pas lui-même comme scientifique ; ::::::::::* deuxièmement, avec cette série de recréations le 8 décembre dernier, sans attendre l'avis de la communauté, et avec les '''mêmes phrases''' problématiques (parfois à peine reformulées, souvent conservées à l'identique), je ne vois pas comment on pourrait supposer que Matthius fait preuve d'ouverture d'esprit et d'attitude collaborative. ::::::::::Bref, si vous voulez absolument garder tous ces ouvrages et essayer de composer tant bien que mal avec la pugnacité de leur auteur, ce sera sans moi... À mon avis, il serait nettement plus profitable de traduire les livrels de [[:en:Subject:Economics|Wikibooks en anglais sur l'économie]], par exemple. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 13 mai 2025 à 11:07 (CEST) :::::::::::Je viens de prévenir Matthius par mail. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 13 mai 2025 à 11:12 (CEST) ::::::::::::Tree bien. Moi aussi, je n'ai plus envie de consacrer du temps là dessus. Je vous laisse donc traiter la situation puisque votre avis est majoritaire. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 13 mai 2025 à 11:27 (CEST) :::::::::::Je ne comprends pas cette assertion. Je cite François Gervais contre le GIEC, qui a écrit pour le GIEC sans être entendu pour la conclusion. :::::::::::Je n'ai pas reformulé mes phrases à l'identique. J'ai soit indiqué la source contrairement à ce qui dit Fourmidable, soit indiqué que c'était mon point de vue ou émis une explication. Aussi quand je fais une assertion scientifique, j'en indique souvent la cause scientifique. Fourmidable a tendance à reprendre les phrases où je répète ce qui a été écrit avant pour aller plus loin. Donc il faut chercher dans mes livrels la phrase où je cite et où j'émets une hypothèse avec la cause scientifique. Je vais relire Fourmidable. :::::::::::Aussi j'ai trouvé sur l'[http://web.archive.org/web/20240810201141/https://www.google.com/search?q=mati%C3%A8re+temps+%C3%A2me âme qui ralentit la vitesse]. Je pense que Google utilise une IA pour détecter les limites de l'humain. Mon expérience de pensée va contre le matérialisme scientifique puisque j'émets l'hypothèse supérieure qu'il existe des multivers où des âmes agissent sur le nôtre. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 13 mai 2025 à 11:36 (CEST) :::::::::::Je ne pense pas effectivement que mon livrel sur le XXIe va rester sur wikibooks puisque il va contre ce qu'indique wikipedia. J'espère juste qu'il puisse rester. :::::::::::Seulement j'ai une formation en ingénierie et j'ai trouvé sur [https://archive.org/details/TempsAme l'âme qui ralentit la vitesse] [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 13 mai 2025 à 12:13 (CEST) ::::::::::Vous admettez {{Mention|DavidL}} que vous ne connaissez pas les domaines que j'aborde. Mes livrels sont pédagogiques donc vous pouvez apprendre avec. Donc lisez les avant d'émettre l'hypothèse qu'ils ne le sont pas. J'ai créé le coaching sans coach qui a permis de revoir la pédagogie d'un journal d'un réseau international. Mais cela ne m'empêche pas d'aller contre le libéralisme et l'appât du gain qui sont selon moi les fléaux actuels. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 13 mai 2025 à 12:06 (CEST) :::::::::::@[[Utilisateur:Matthius|Matthius]] semble ouvert au débat et à une aide pour améliorer ses textes. La suppression ne me semble donc pas une option souhaitable. Wikilivres est indépendant de Wikipédia. Il faut donc se référer à nos règles et recommandations locale disponible dans les espaces de noms "wikilivres" et "aide". Je vais essayer de prendre le temps d'écouter les textes avec une voix de synthèse pour gagner du temps. Cela me permettra d'en faire des commentaire en vue d'une amélioration. Car si ce sont des sources qui manques et bien il suffit de les ajouter. Nous sommes là pour travailler ensemble pour produire des ouvrages pédagogiques de qualité, pas pour juger du travail des autres en vue d'une suppression. Restons, s'il vous plait dans un esprit d'entraide et de collaboration. C'est tellement rare à notre époque... [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 14 mai 2025 à 15:00 (CEST) :::::::::::Mon livrel sur le XXIe siècle en cours d'écriture va aussi contre les théories du complot occidentales. J'écris que la Russie et la Chine sont des démocraties, alors que nos médias disent que ce sont des dictatures. J'émets effectivement des hypothèses non sourcées dans ce nouveau livrel. Je peux et vais les sourcer. Par contre j'utiliserai des sources primaires. En réalité, j'émets l'hypothèse que ce sont nos médias qui sont dans la post-vérité et que ce ne sont pas les médias étatsuniens, ni russes, ni chinois qui y sont. Ce livrel est effectivement une bombe dangereuse contre nos médias comme l'indique Fourmidable. ::::::::::::Je ne comprends pas l'acharnement de Fourmidable à ne pas vouloir discuter avec moi et à vouloir automatiquement supprimer mes livrels sans discussion préalable. En effet il a eu un an pour m'indiquer comment améliorer mes livrels. Et que Fourmidable ne me dise pas que c'est moi qui ait commencé, puisque j'étais outré qu'on veuille supprimer mes livrels avec ses copains sans discussion pédagagogique au tout début. ::::::::::::Concernant la neutralité de wikipedia : wikipedia ne fait que révéler l'avis des médias financés donc il n'est pas neutre. Être neutre c'est révéler tous les points de vue, même ceux avec lesquels on n'est pas d'accord, ce que [https://archive.org/details/wikipediaCo-Fondateur fit wikipedia au début de son histoire] et ce pour quoi je me suis intéressé et ai été réprimé sauf pour wikibooks anglais qui m'a viré pour ne pas enlever mon nom. :{{Mention|Matthius}} Avez-vous l'intention de publier des livres scientifiques, c'est-à-dire sourcés par de la science publiée et évaluée par les pairs, et à défaut de grands médias nationaux et internationaux ? Vous pouvez aussi tester vos hypothèses mais votre travail ne doit pas consister à sélectionner les sources qui vous conviennent pour seulement valider votre théorie, en mettant de coté tout ce qui vous dérangerait dans cette entreprise. --[[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 10:48 (CEST) ::@[[Utilisateur:Fourmidable|Fourmidable]], je pense que tu te fais une vision fausse du monde de l'édition. @[[Utilisateur:Matthius|Matthius]] peut payé une maison d'édition, dans le cadre d'une [[w:Édition_à_compte_d'auteur|édition à compte d'auteur]]. Probablement qu'il l'a déjà fait puisqu'il a déjà publié des ouvrages au format papier parmi ceux qu'il veut placer sur Wikilivres. Il en a même déposé certains dans une bibliothèque universitaire. Quant à la revue par les paires ne se fait que dans le cadre des journaux scientifique. ::J'ai écouté l'ouvrage [[Pourquoi un Dieu ?]] Et je trouve effectivement qu'il n'a pas sa place dans Wikilivres. Non pas parce qu'il critique le libéralisme avec des propos que je partage en grande partie, mais parce qu'il s'apparente plus à de la propagande chrétienne qu'à un réel ouvrage pédagogique sur le sujet. ::Matthius y est en posture de prédicateur et non de pédagogue. Je dirais que la moitié des phrases de l'ouvrage que j'ai écouté sont des affirmations sans argumentation ni démonstration valide. La thèse de son ouvrage se résume à dire que dieu est la seule chose qui peut expliquer un phénomène actuellement inexpliqué. Ce qui est une corrélation fallacieuse puisqu'il n'existe aucun lien de causalité. ::Pour moi, les ouvrages évangéliste ou propagandiste n'ont pas leur place dans Wikilivres et je serais d'avis d'ouvrir une prise de décision pour établir une règle d'interdiction. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 11:42 (CEST) :::Oui voilà, nous sommes d'accord. Peut-être que Matthius peut adopter une attitude plus scientifique, mais l'esprit de "pédagogie" s'accompagne forcément d'une démarche scientifique, sinon c'est de la prédication/propagande. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 11:45 (CEST) ::::@[[Utilisateur:Fourmidable|Fourmidable]]... Wikilivres n'est pas une bibliothèque "scientifique" mais pédagogique. Tu sembles confondre les deux termes. Les livres pour enfants que contient Wikilivres ne sont pas "scientifique" tout en étant pédagogiques. ::::Un autre fait qui peut être reproché à @[[Utilisateur:Matthius|Matthius]] est son autopromotion, [[Wikilivres:Présentation#● Wikilivres n'est pas une vitrine|alors que la démarche proscrite sur Wikilivres]]. ::::Plutôt que de supprimer l'important travail effectué par Matthius, je propose à nouveau de le déplacer en sous page de son espace utilisateur pour qu'il puisse retravailler ses écrits. ::::Pour un retour dans l'espace principale, il faudrait au préalable qu'il supprime des ses travaux toute forme d'autopromotion et toute forme propagande, prosélytisme ou autre type de discours prédicateur. Ceci notamment en référence aux choix politiques [https://www.senat.fr/leg/ppl17-386.html français], [https://www.rtbf.be/article/le-proselytisme-religieux-ou-politique-n-a-pas-sa-place-a-l-ecole-quels-chiffres-derriere-ce-phenomene-pointe-par-la-ministre-de-l-education-11477234 belge], [https://www.assnat.qc.ca/fr/travaux-parlementaires/projets-loi/projet-loi-94-43-1.html Quebec], [https://ge.ch/grandconseil/data/loisvotee/L11764.pdf suisse]. Quatres communautés culturelles très largement majoritaire dans l'espace francophone des projets Wikimédia. ::::J'invite Matthius et les autres membres de notre communauté réagir à ce message et de discuter du lancement d'une nouvelle prise de décision pour interdire la propagande et le prosélytisme dans Wikilivres. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 12:21 (CEST) :::::Ce que je veux dire, c'est qu'un bon livre pédagogique s'appuie forcément sur des connaissances scientifiques. Ok pour un redéplacement. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 12:37 (CEST) ::::::Ne fais pas à ton tour du prosélytisme scientifique @[[Utilisateur:Fourmidable|Fourmidable]]. La science et les connaissances dites scientifiques comme tu les entends n'est pas la seule chose sur laquelle on peut s'appuyer pour produire un contenu pédagogique. ::::::Que fais-tu de la méditation, de l'humour, de la poésie, de la musique, du dessin, et toute autre expression artistique ? ::::::Et il existe aussi un tas d'ouvrages pédagogique religieux (pour le catéchisme entre autre), sauf que, comme la plupart des législations nationales des pays francophones occidentaux, je pense qu'ils n'ont pas leur place dans Wikilivres. Ce sur quoi nous devons nous positionner dans une prise de décision collective. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 12:52 (CEST) :::::::Ah oui, dans ce sens-là il y a en effet moins de science à proprement parler… Mais je ne suis pas sûr que cela s'applique aux propos politiques. Ça ne me viendrait pas à l'idée de faire un Wikilivre afin de convertir les gens au libéralisme, par exemple. C'est le rôle d'autres wikis ou sites web spécialisés. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 14:44 (CEST) :::Je vais supprimer Du même Auteur et Du même éditeur de mes wikilivres. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 15 mai 2025 à 12:32 (CEST) ::::Si vous voulez, mais c'est loin d'être le point principal. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 12:38 (CEST) :::::Effectivement @[[Utilisateur:Matthius|Matthius]], c'est une bonne résolution, mais il reste le prosélytisme à résoudre et je pense que cela demande beaucoup de travail à réaliser dans votre espace de travail personnel. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 12:55 (CEST) ::::::Vous mettiez que seul Pourquoi un Dieu est prosélyte. J'avais effectivement un doute en ajoutant ce livrel. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 15 mai 2025 à 19:43 (CEST) :::::::Je n'ai pas encore eu le temps d'écouter les autres livres @[[Utilisateur:Matthius|Matthius]] . Nous somme tous bénévoles ici. Cela peut prendre du temps, mais je vous invite déjà à déplacer vous-même le livre ''Pourquoi un Dieu'' dans vos sous page utilisateur''.'' :::::::Par anticipation, je peux déjà dire que tous les autres ouvrages faisant la publicité de vos écris doit être modifier ou retirer de l'espace principale ainsi que tous ceux qui font référence à Dieu ou au catholicisme de manière prosélyte. :::::::Seul le nom des auteurs devrais être repris dans les livre avec éventuellement des hyperliens vers leurs pages utilisateur qu'il sont libre d'éditer comme il veulent. :::::::On peut ensuite créer des pages catégories qui reprennent tous les travaux des auteurs, avec l'avantage qu'elle se complétent automatiquement à chaque fois que l'on ajoute une catégorie en bas de page d'un ouvrage. Vous trouverrez certainement des indication dans les pages d'aide. :::::::Je vous rassure sur le fait que ce traitement serait semblable pour un politicien libéral faisant la publicité de son parti, de ses idéologies et de sa personne. N'hésitez pas d'ailleurs à parcourir les autres wikilives pour y détecter ce genre de problème avant de nous le signaler. C'est ce que fait @[[Utilisateur:Fourmidable|Fourmidable]] en cherchant à veiller sur la qualité et la conformité de notre projet. Une belle fin de journée ! [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 16 mai 2025 à 11:41 (CEST) ::::::::Pour info, je confirme et soutiens tout ce que propose {{Mention|Lionel Scheepmans}} dans son dernier message (merci à lui). [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 16 mai 2025 à 12:01 (CEST) ::::::::Pourquoi a Dieu a été mis à jour dans mon espace personnel. Je ne sais pas comment effacer une page wikibooks.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 16 mai 2025 à 12:24 (CEST) :::::::::@[[Utilisateur:Matthius|Matthius]]. Je ne comprends pas ce que vous dite. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 16 mai 2025 à 15:16 (CEST) ::::::::::J'ai copié-collé Pourquoi un Dieu dans ma page personnelle. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 16 mai 2025 à 21:36 (CEST) :::::::::::Ah très bien @[[Utilisateur:Matthius|Matthius]]. Mais en fait, il est possible de déplacer les pages en les renomant. Cela permet de conserver tout l'historique de l'édition. Je vais le faire quand je serai sur PC. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 17 mai 2025 à 03:34 (CEST) ::::::::::::Ne le faites pas : L'original de l'historique est sur mon espace perso. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 17 mai 2025 à 09:30 (CEST) :::::::::::::@[[Utilisateur:Matthius|Matthius]], j'ai écouté l'ouvrage Économie enfant. Si j'étais à la tête d'une maison d'édition, je ne publierais pas ce manuscrit. Il y a des passages très intéressants avec des idées originales que je partage, mais aucune argumentation pour les valider. Pour le reste, on retrouve un copié collé du précédent ouvrage. Beaucoup d'information factuelle sans réelle contextualisation ni fil conducteur et puis de nombreuses affirmations gratuites qui ne sont finalement que des opinions très relatives et de nouveau non argumentées. :::::::::::::Le pire étant que certaine de ces affirmations son tout simplement fausses ou inscensées. :::::::::::::Exemples d'une phrase : :::::::::::::« Écrire sur ce que vous comprenez de l’archéologie, qui est l’humanité avant l’écriture. » :::::::::::::Cette phrase est erronée et n'a même aucun sens. L'archéologie n'est pas l'humanité, mais un domaine des sciences créé par les humains. Ensuite, l'archéologie n'est pas quelque chose qui se limite à avant l'écriture. Il existe des nombreux sites archéologiques qui fouillent les vestiges de la Rome antique. Une civilisation qui n'était pas dénuée d'écriture. :::::::::::::Exemple d'un paragraphe : :::::::::::::« Le [[w:Capital|capital]] de l’humanité peut donc être la Terre. En effet, l'argent est produit à partir du papier venant du bois. Les trafiquants ont toujours voulu se l'approprier. Le capital pourrait donc ne pas être l’argent. Le troc nécessite cependant un patrimoine conséquent. La Chine veut s’approprier le capital Lune, pour y prendre l’Helium 3 selon Solidarité et Progrès, seule ressource lunaire qu'il est intéressant de transporter, afin de le fusionner, pour en obtenir de l’énergie illimitée, favorisant la créativité par le surplus de biens. » :::::::::::::Ce paragraphe est incompréhensible et citer un parti politique (à d'autres reprises aussi dans l'ouvrage) comme source pour poser une affirmation, pose deux gros problèmes. 1 celui de faire la publicité d'une idéologie au sein d'un écrit pédagogique, 2 celui de ne pas respecter un des principes de base de l'écriture scientifique alors que le livre en parle et la défend. :::::::::::::Je n'irai pas plus loin dans les exemples. :::::::::::::Dans leurs états actuels et pour que ces livres travaux d'écritures soient admissibles dans Wikilivres. Je pense que vous devez impérativement supprimer : :::::::::::::* toute promotion personnelle. :::::::::::::* toute forme de Prosélytisme religieux. :::::::::::::* toute forme de publicité ou contre publicité politique et partisane :::::::::::::* toute affirmation fausse et autres types de fabulations. :::::::::::::* tout raisonnement ou démonstration sans lien de causalité. :::::::::::::Suite à quoi, il faudrait encore dans l'idéal en améliorer le style de sorte à y développer un fil conducteur qui permettrait aux lecteurs de suivre un développement ordonné propice à l'apprentissage, et non leur soumettre un journal de réflexions personnelles, reprenant des erreurs factuelles et logiques. :::::::::::::C'est un travail conséquent. :::::::::::::Et en ce qui concerne le prosélytisme, les approches politiques partisanes, il est impératif, y compris les sous page de votre page utilisateur. :::::::::::::Il y a des idées intéressantes dans vos écrits, et je partage pas mal de vos points de vue concernant la question du néolibéralisme. Mais Wikilivres n'est pas une tribune d'opinion à l'image d'AgoraVox. Nous sommes ici pour produire des ouvrages pédagogiques. Pas pour influencer nos lecteurs en faveurs ou à l'encontre de certaines religions ou idéologies. :::::::::::::Tout en l'encourageant à le faire de manière plus courtoise et constructive, je remercie donc @[[Utilisateur:Fourmidable|Fourmidable]] de nous avoir alerté sur l'incompatibilité de vos ouvrages avec notre projet. Dans tous les cas ceux que j'ai écoutés jusqu'à présent. :::::::::::::J'aimerais à votre tour vous encourager à poursuivre vos travaux d'écriture en cherchant à vous rapprocher de notre objectif tout en respectant nos règles et recommandations. Mais sachez aussi que vous pouvez aussi améliorer l'article de Wikipédia sur l'[[w:Économie_réelle|économie réelle]]. Ou aussi développer une leçon sur Wikiversité sur le même sujet dans la [[v:Faculté:Économie|Faculté d'Économie]]. C'est un sujet intéressant qui permet de mettre en lumières les limites de la [[w:Finance|finance]]. :::::::::::::Ces deux activités seraient moins ambitieuses que de vouloir produire un livre de qualité pour expliquer l'économie aux enfants. Cela demande une grande maîtrise du sujet en plus d'un certain don pour la vulgarisation. :::::::::::::Il me reste deux ouvrages proposés à la suppression à écouter, mais j'ai bien peur d'y retrouver les mêmes incompatibilités que celles que je viens d'expliquer à l'instant. :::::::::::::Bien cordialement, [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 26 mai 2025 à 21:16 (CEST) :::::::::::::Mon correcteur orhtographique ne fonctionnant pas pour des commentaires aussi long, le message que je viens de laisser est truflé de fautes et je n'ai pas le temps ni le courrage de les corriger. Encore une fois, le travail que je fournis sur ce projet est tout à fait bénévole. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 26 mai 2025 à 21:21 (CEST) ::::::::::::::J'ai passé beaucoup de temps à élaborer le coaching sans coach. Ce n'est naturel pour aucun ancien élève de simplifier. Je ne sais pas combien de fois j'ai relu Comment Écrire des Histoires. J'ai toujours beaucoup de temps devant moi pour revoir mes livrels.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 10:51 (CEST) :::::::::::::::@[[Utilisateur:Matthius|Matthius]], c'est précisément parce que vous travailler beaucoup et que vous Me semblez de bonne foi et volonté, que je passe autant de temps à vous aiidez. Tous vos textes comprends des problèmes qu'il faut résoudre. Vous devriez commencer par supprimer tout ce qui fait référence à vous, à la religion et au politique, pour ne garder que des faits et affirmations vérifiées par des sources sûres et non partisannes, à chaque fois pour vous assurez que vous n'être pas simplement en train de diffuser ou colporter une opinion fausse et/ou partisane. Ce qui vient d'être dit est incontournable. :::::::::::::::Je penses ensuite qu'indique messages auxquelles ont été écrites vos sections sont superflues dans le cadre d'un ouvrage pédagogique. La chronologie de vos écrits n'est pas un bon un fil conducteur. Encore une fois, Wikilivres n'est pas un lieu pour publier ses mémoires ou ses réélections du jour. Il existe le format blog pour ce genre de choses. :::::::::::::::Tennez compte aussi que nous ne disposons pas forcément d'autant de temps et de motivation que pour revoir vos livres. Raison pour laquelle, des méthodes plus expéditives telles que la suppression complète des pages inadaptées à notre projet finiront par être appliquées. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 13:18 (CEST) ::::::::::::::::Le livrel le plus important pour moi est l'économie pour les enfants, vient ensuite devenir un génie. L'Univers est Vivant a été référencé sur les moteurs de recherche récemment parce que j'ai trouvé sur l'âme qui ralentit la vitesse. Quand on cherche matière temps âme sur les moteurs de recherche occidentaux on tombe sur ma page archive.org/details/TempsAme. Il n'y a toujours pas de chercheur qui a publié sur la mathématisation de ma trouvaille. L'univers est vivant est une amélioration d'un autre livre. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 13:56 (CEST) ::::::::::::::::Je viens de mettre mon [http://matthieu.giroux.free.fr/html/cv.htm CV] à jour pour montrer ce que j'ai influencé. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 14:05 (CEST) ::::::::::::::::C'est moi qui ai diffusé le terme économie réelle. Je reproche à ceux qui l'ont utilisé d'être des économistes scolaires, c'est à dire de se référer à l'économie monétaire pour parler d'économie réelle. Je peux cependant mettre un historique de cette économie sur la page wikipedia. Je me demande juste s'il va rester. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 14:08 (CEST) :::::::::::::::::Je suis désolé @[[Utilisateur:Matthius|Matthius]]. Je ne vais pas poursuivre nos conversations faute d'en avoir envie. Vous ma laissez sur cette impression que votre motivation première est de promouvoir votre personne, vos valeurs et vos idées. Je vais donc arrêter de vous consacrer du temps. Je suis ici pour soutenir et développer les projets et intérêts collectifs et non individuels. Bonne chance pour vos ambitions que je vous invite à réaliser en dehors des projets Wikipédia. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 15:00 (CEST) ::::::::::::::::::Mon projet relève de l'intérêt général de faire connaître l'économie du XIX{{e}} siècle de [[Henry Charles Carey]]. Mon égoïsme peut donc être aussi le vôtre. Pour moi il faut être intelligent et égoïste pour défendre l'intérêt général. Je pense qu'on peut tous avoir l'air de génies comme les enfants peuvent avoir l'air de génies. Oui, je suis militant et veux faire partager la joie de la politique. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 15:55 (CEST) :::::::::::::::::::Nous ne sommes donc pas sur la même longueur d'onde. Je vois invite à ne pas faire de militantisme sur les projets wikimedia. Il y a d'autres endois pour le faire. La blogosphère, des tribune comme agoravox, et de nombreux sites web tenus par des communautés militantes et reliée aux valeurs et idées pour lesquelles vous militer. Ceci est mon dernier message à ce sujet. Cordialement. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 16:18 (CEST) ::::::::::::::::::::Je vous mets au défi de penser que les wikipédiens ne sont pas des militants. Eux veulent aussi défendre l'intérêt général en apportant la connaissance. Par contre ils ne ciblent pas leurs apports. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 17:10 (CEST) ::::::::::::::::::::Comme prévu, on me dit que mon [https://fr.wikipedia.org/wiki/%C3%89conomie_r%C3%A9elle#Histoire ajout sur l'économie réelle] est inédit. Je pense que vous vous êtes intéressé à certains de mes écrits parce qu'ils vous apportaient des réponses. Je peux faire cela sur wikibooks. Seulement c'est encore plus difficile sur wikipedia. Je ne suis pas théseux. Oui l'économie réelle a été créée pour faire connaître l'économie physique de Lyndon Larouche. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 30 mai 2025 à 17:15 (CEST) :::::::::::::::::::::Merci quand même ! [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 31 mai 2025 à 00:24 (CEST) :Mon livrel l'univers est vivant [https://www.agoravox.tv/actualites/technologies/article/et-si-la-physique-quantique-avait-105532 a eu un impact]. Je pense aussi avoir influencé les jeunes qui se sont tournés vers la bible. == [Recherche universitaire] Questionnaire sur la gouvernance Wikimedia == Bonjour à toutes et à tous, Dans le cadre d’un mémoire de recherche sur les modèles de gouvernance décentralisés dans les communs numériques, je mène une étude analysant le mouvement Wikimedia. L’objectif est de mieux comprendre la perception qu’ont les contributeurs et contributrices des projets Wikimedia (Wikilivres, Wikipédia, Wikidata, Commons, etc.) de la Fondation Wikimedia, de ses décisions, et des relations avec les chapters locaux (ex. Wikimédia France). Un questionnaire anonyme, rapide à remplir (environ 5 minutes), a été conçu à cet effet. Il s’adresse à toute personne majeure ayant déjà contribué à un projet Wikimedia, quelle que soit l’ancienneté ou le niveau d’implication. Lien vers le questionnaire : framaforms.org/questionnaire-communaute-wikipedienne-et-la-wikimedia-fondation-1747225404 '''Important''' : Les résultats seront utilisés uniquement dans un cadre académique. L'enquête, ainsi que l'étude, ne sont ni commandités ni supervisés par la Fondation ou aucun chapitre local. Il s'agit simplement d'un projet scolaire que je mène {{sourire}}. Merci d’avance pour votre participation ! [[Utilisateur:3(MG)²|3(MG)²]] ([[Discussion utilisateur:3(MG)²|discussion]]) 27 mai 2025 à 10:43 (CEST) :J'ai répondu. Bon courage pour ton mémoire ! (Ça me fait penser que je dois avancer sur le mien aussi...) [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 29 mai 2025 à 23:28 (CEST) == Propagande, prosélitisme, autopromotion, militanatisme, etc == Bonjours à la communauté des contributeurs de Wikilivres. Je me dit qu'il serait bon de faire une nouvelle prise de décision pour mieux cadrer le contenu de notre projet par rapport à ce qui se situebdans le titre de ce message. Qu'en pensez-vous ? [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 16:22 (CEST) :Totalement {{Pour}} ! [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 29 mai 2025 à 21:53 (CEST) :L'économie financière peut être considérée comme une propagande puisque son utilisation ne permet pas de lier la macro-économie et la micro-économie, ne permettant donc pas de développer une société comme le fait l'[https://fr.wikipedia.org/wiki/%C3%89conomie_r%C3%A9elle économie réelle]. Par contre, l'économie réelle aurait pu être considérée comme une propagande tant qu'elle ne permettait pas de faire mieux que l'économie financière. :Si on considère le prosélytisme comme convaincre de rejoindre sa communauté, il faudrait donc enlever tous les wikilivres qui sont beaucoup lus, puisque les wikilivres qui sont peu lus n'arrivent pas à convaincre. :L'autopromotion permet malgré tout de connaître ce que fait l'auteur d'un wikilivre. Si on enlève le chemin qu'a suivi l'auteur, on évacuerait ainsi ses contradictions et on pourrait donc faire dire à un auteur l'inverse de ce qu'il a compris au bout de son parcours. Je suis pour qu'il y ait une page de l'auteur regroupant les livrels de l'auteur comme sur wikisource. :Je considère ceux qui contribuent à wikipedia et à wikibooks comme des militants, puisqu'ils essaient d'influencer les autres avec ce qu'ils écrivent sur ces sites web. Certes, certains travaux peuvent être désintéressés, mais alors pourquoi mettre ces travaux sur ces sites web alors. En effet le manque de passion crée des textes soporifiques. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 3 juillet 2025 à 22:36 (CEST) 1y6ug9w2x3ukuh6n1b063m1v0hn88ac 745893 745892 2025-07-03T21:05:15Z Matthius 11787 /* Propagande, prosélitisme, autopromotion, militanatisme, etc */ 745893 wikitext text/x-wiki <noinclude>{{Wikilivres:Le Bistro/En-tête}}</noinclude> == compléter les bons conseils pour un nouveau livre == bonjour wikilivre ! je refais un tour sur ce wiki depuis un sacré bout de temps. Je vois que certains noms sont toujours là :) wouah. J'ai entâmé un livre nouveau aka. [[La sécurité du citoyen dans son logement]] que je vais encore améliorer mais je me pose dejà quelques questions sur le process, et vu que [[Wikilivres/Créer un wikilivre]] est assez high level je préfère demander ici des conseils. J'aime à penser que si l'idée est pertinente le guide pourra évoluer rapidement. * '''AutoCat''': il est indiqué clairement dans le guide pour la page de garde du livre de mettre <code><nowiki>{{AutoCat}}</nowiki></code> en bas de page, mais est-ce conseillé également sur chaque page du livre ? ça a l'air de marcher et donc plutôt oui: & si oui on pourrait l'ajouter dans le guide ? * je ne sais pas quoi mettre dans `CDU item` : on peut peut être orienter vers une bonne page sur le comment remplir le template proposé sur la page de garde * '''navigation horizontale''': est-ce qu'un moyen universel permet de suivre les chapitres d'un livre ? ex. si je suis sur un chapitre et que je veux aller au suivant, soit je passe par la page parent, soit je passe par la catégorie. Mais je voudrai (mieux qu') un bouton "next" / "previous". Enfin voici l'idée. S'il y a des choses en template automatique, je suis preneur (peut être le guide aussi) (PS: je vois que la gestion du sommaire est automatisée au sein même d'un chapitre : génial :) ) :NB: à une certaines époque j'utilisais des templates propres au livre (ex. [[Modèle:Les félins]]) et je vois que certains livres ont repris l'idée.. * '''catégorie''' : que faut-il mettre exactement dans le contenu de la catégorie auto-générée pour le nouveau livre ? juste <code><nowiki>[[Catégorie:Livres par titre]]</nowiki></code> ? * '''livre modèle''' : avez-vous un livre "modèle" : c'est-à-dire un livre (probablement à succès & pas trop grand) qui serait particulièrement suivi par les habitués et sur lequel on retrouverai toutes les techniques les plus avancées pour bien rédiger un livre. Il apparaîtrait du coup en modèle dans le guide. qu'en pensez-vous ? [[Utilisateur:Boly38|Boly]] [[Discussion_Utilisateur:Boly38|♪]] 5 mars 2025 à 18:09 (CET) :Salut Boly :* Autocat : normalement, il ne se met que dans le modèle listant les chapitres du livre, inclus dans toutes les pages. Par exemple le modèle {{m|Programmation JavaFX}} est inclus comme ceci : <nowiki><noinclude>{{Programmation JavaFX}}</noinclude></nowiki>) dans tous les chapitres du livre [[Programmation JavaFX]]. :* [[Wikilivres:CDU]] : il y a un moteur de recherche pour trouver le classement, mais il n'est pas encore pleinement détaillé et parfois il faut créer les pages correspondantes à la CDU. J'utilise http://www.udcsummary.info/php/index.php?lang=fr pour ajouter les pages manquantes. Si tu trouves un ou plusieurs classement possibles, je peux me charger de créer les pages qui manquent. :* '''navigation horizontale''' : Fait automatiquement par l'inclusion du modèle dans toutes les pages. Voir par exemple : [[Programmation Java Swing/Introduction]]. Le modèle ajoute les liens suivant, précédent et une flèche au milieu pour déplier la liste complète des chapitres du livre. :Pour la catégorie, un petit descriptif, comme par exemple : <pre><nowiki> Catégorie recensant les pages du livre [[Programmation JavaFX]]. Pour discuter de la rédaction du livre c'est ici : [[Discussion:Programmation JavaFX]]. [[Catégorie:Java]] </nowiki></pre> :--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 5 mars 2025 à 19:22 (CET) ::J'ai fait des clics magiques (dans l'historique des pages) pour remercier ; je ne sais pas où ça atteri mais bon. Le template sommaire avec navigation par page c'est exactement ce que je voulais : c'est top :) & merci aussi pour les illustrations ! David L au top ! ! [[Utilisateur:Boly38|Boly]] [[Discussion_Utilisateur:Boly38|♪]] 7 mars 2025 à 18:04 (CET) == Problème de cache sur la page d'accueil == Salut, Les utilisateurs anonymes voient toujours les mêmes livres sur la page d'accueil (pendant plusieurs mois) alors que les livres changent tous les jours pour les utilisateurs connectés. Il faudrait installer l'extension [[mw:Extension:MagicNoCache]] afin de pouvoir utiliser <nowiki>__NOC</nowiki>ACHE__ sur la page d'accueil. --&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 29 mars 2025 à 20:56 (CET) :Bonjour, bien reçu, j'ai créé un ticket pour voir déjà si on peut diminuer ce cache à 24h (sinon il faudra voter pour l'extension) : https://phabricator.wikimedia.org/T390674. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<span style="color:#FF6600">$</span>♠]]) 1 avril 2025 à 11:46 (CEST) ::Merci JackPotte. ::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 1 avril 2025 à 19:00 (CEST) :::Un problème similaire a été signalé en 2023 [[phabricator:T351573]], et en 2017 [[phabricator:T119366]] mais pas la moindre action de correction depuis toutes les années écoulées. Les problèmes des "petits" wiki ne sont pas écoutés. :::J'ai donc créé la page de vote pour installer l'extension : [[Wikilivres:Prise de décision/Installer l'extension MagicNoCache]]. :::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 1 avril 2025 à 19:48 (CEST) ::::{{Mention|Lionel Scheepmans}}, {{Mention|Fourmidable}} : un avis / un vote sur ce sujet ? --&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 12 mai 2025 à 20:04 (CEST) :::::Je viens de donner mon avis sur la page idoine, merci du rappel ! [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 13 mai 2025 à 11:00 (CEST) == Erreur d'affichage sur la page d'accueil == Bonjour tout le monde, Un petit message pour savoir où nous en sommes sur le problème d'affichage dans la page d'accueil (débordement des cadres de livres suggérés sur la boîte à outils des utilisateurs connectés). Wikilivresquement, [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 26 avril 2025 à 17:59 (CEST) :Salut Fourmidable, :J'ai tenté de trouver une solution pour cet habillage, mais il est tellement mal conçu que ça semble impossible. :C'est le seul habillage qui pose problème, pour plusieurs pages et pas seulement la page d'accueil. :La décision arbitraire d'imposer cet habillage sans consulter la communauté du projet est une aberration. :Le mieux serait de : :# créer un bug pour l'habillage Vector-2022 qui ne fonctionne plus dès qu'il y a le moindre code CSS, :# créer une demande de fonctionnalité pour que les administrateurs du projet puisse sélectionner l'habillage par défaut par projet choisi par décision communautaire, :Mais comme les "petits wikis" ne sont pas écoutés, ce serait inutile (voir les nombreux exemples de problèmes reportés spécifiques à fr.wikibooks dont aucun n'a jamais été résolu). :--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 26 avril 2025 à 20:26 (CEST) ::Ok, en tout cas sache que je soutiens ta proposition ! [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 1 mai 2025 à 16:28 (CEST) == Matthius : le grand retour == Bonjour à tous, Quelqu'un veut-il bien m'aider à relire les [https://fr.wikibooks.org/w/index.php?title=Sp%C3%A9cial%3AContributions&target=Matthius&namespace=0&tagfilter=&newOnly=1&start=&end=&limit=50 nouveaux livres de Matthius] ? Il semble y avoir, une fois de plus, de graves problèmes de sourçage et des attaques (même déjà soulignées en 2023 !) contre "le libéralisme" et "la finance" avec des phrases obscures ; par exemple : * dans [[Conseils Chrétiens]] : "Le libéralisme empêche de voir la société. Alors on croit les films libéraux, faisant croire que l’individu fait la société, alors que c’est la société qui fait l’individu. En effet, notre ego est créé par notre famille." * dans [[Pourquoi un Dieu ?]] : "L'individualisme dû au libéralisme, de plus en plus prégnant, va par contre cacher de plus en plus notre sociabilité et notre créativité.", "le social-libéralisme ne sera que le moyen d'accéder au pouvoir par la voie opportune alors qu'on cachera le social au peuple, pour ne pas qu'il se comprenne. Le dirigeant social-libéral aura appris dans les écoles d'économie que les marchés c'est magique.", "désengager l'état, détruisant alors le développement donc la république", "La faille du libéralisme est la censure, censure permise par la pauvreté des esprits ayant peur des autres à cause de l'individualisme forcené. [...] Le libéralisme cherchera la censure pour empêcher qu'il y ait suffisamment d'esprits philosophes et créatifs s'intéressant à la politique.", "La finance croira alors qu'il faille installer une dictature pour liquider la population trop difficile à maîtriser. [...] il s'agit pour la finance de trouver de plus en plus d'illusions pour satisfaire la population" * dans [[Économie Enfants]] : le libéralisme a "rendu l’école non épanouissante par le manque de créativité, en disant que le pays ne peut plus se développer, à cause de la monnaie privée" et l'assertion non (mal ?) argumentée "Le libéralisme aboutit selon moi à l'abrutissement de l'individu, voire à la violence" * dans [[Devenir un Génie]] : "Ils sont ainsi devenus égoïstes, donc libéraux.", "le libéralisme peut apporter un manque de liberté, car c’est une doctrine et une idéologie orientée sur l'individu, individualisme cachant une société, allant alors vers la destruction du plus faible par une liberté sans limite.", "La finance a en fait tenté et tente de faire croire qu’elle s’occupe de notre liberté, alors qu’elle veut nous empêcher de nous émanciper." * dans [[Univers Vivant]] : "La finance veut que nous soyons des consommateurs alors que nous sommes des acteurs de la société.", "Pour les financiers la population pauvre doit souffrir de malnutrition.", la finance "devient alors autoritaire comme après la crise de 1929. Nous sommes à un moment crucial où nous pouvons remettre en cause l’idéologie scientiste aboutissant à nier la nature. Ainsi il y avait 1,7% de CO2 pendant le crétacé au lieu de 0,04 % en 2023." Notons que le dernier ouvrage en date, [[XXIe]], est particulièrement gratiné : * climatoscepticisme : "le GIEC aura causé une hécatombe de suicides pour un faux réchauffement de la terre" * théories du complot sur les résultats des élections occidentales : "Selon des journalistes de Sud Ouest diffusés sur Agora Vox qui ont récoltés les suffrages des élections de 2017 et qui ont suivi l’élection de 2022, Macron n’a pas été élu par les français. En réalité il est arrivé dernier des élections présidentielles de 2017.", "Emmanuel Macron avait des nuls médiatisés face à lui" * théories du complot sur la CIA et les démocrates américains : "les démocrates trichent sur les élections en 2021", "Les États-Unis sont partis d’Afghanistan pour préparer la guerre d’Ukraine" * biais prorusse : "la Russie entre en guerre contre l’Ukraine en février 2022, puisque l’Ukraine avait attaqué la Russie. Les médias occidentaux feront croire [...] que c’est la Russie qui attaque", "Vladimir Poutine est voulu par les russes, contrairement aux élus occidentaux. Les élections en Russie se déroulent suffisamment bien pour que la Russie soit considérée comme une démocratie." -- [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 11 mai 2025 à 17:24 (CEST) :J'ai lancé une série de [[Wikilivres:demandes de suppression|demandes de suppression]]. Je notifie les personnes ayant participé à l'[[Wikilivres:Demandes de suppression/2023|ancien débat (2023)]] : {{Mention|JackPotte}}, {{Mention|Lionel Scheepmans}} et {{Mention|DavidL}} pour info. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 12 mai 2025 à 11:23 (CEST) ::Salut @[[Utilisateur:Fourmidable|Fourmidable]].. C'est bien que tu inspecte le contenu de Wikiversité à la recherche de contenu indésirable ou problématiques. Mais je vois dans le titre de ce sujet de discussion une forme de sarcasme et de condescendance qui ne me semble pas adapter à un projet collaboration où tout le monde est le bienvenu peu importe ses croyance et ses idée. De plus la première personne concernée, c'est à dire l'auteur, n'y est pas notifiée. ::Ensuite, il fauétait une fois se mettre d'accord sur le fait que la ligne éditoriale de Wikiversité est différente à celle de Wikipedia. Un recueil de cours et de travaux de recherche, ce n'est pas une encyclopédie. On en a déjà discuté. La neutralité de point de vue n'existe pas dans l'enseignement ni dans la recherche. ::Pour preuve, mon fils a un cours de religion dans SZ formation secondaire et il peut choisir entre différentes religion ou opter pour un cours de morale et de citoyenneté. À l'université, les orientation idéologique des enseignants son souvent bien connue. Et il est évident que l'enseignement dans une business school sera plus libérale qu'une fac de théologie. ::Dans le cadre des travaux de recherches, la Liberté d'expression doit être complète, l'auteur doit être libre d'y faire ses propre interprétations des faits et développant sa propre argumentation. Sans quoi, c'est plus de la recherche. ::Finalement, un support d'enseignement dans un projet collaboratif, n'est pas un projet de recherche. On ne parle pas en "je" dans un cours, on le fait dans une recherche. Or, l'usage du "Je" implique une certaine subjectivité. ::En conclusion, je ne vois pas ce nouvelle appel dans la forme et l'énergie qu'il se présente, comme quelque chose de très collaboratif. Et je n'ai pas envie de jouer à nouveau le médiateur dans ce redémarage d'une confrontation idéologique entre deux contributeurs incapable de collaborer dans la production de contenu de qualité. ::Plutôt que de faire du rameutage ici, je te proposeraient plutôt, selon tes disponibilités, de collaborer aux écrits des auteurs en discutant avec eux sur le page de discussions de leurs articles au sujet des améliorations possibles. Plutôt que de faire appel à la suppression de toute une page pour certains passages problématiques, une démarche collaboratif serait d'aider à la résolutions de ces problèmes, dans le but de ne pas perdre tout le reste de la page. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 13:20 (CEST) :::Tu as raison, je notifie aussi {{Mention|Matthius}} en espérant que cette fois son comportement soit plus constructif... Concernant les ouvrages qui sont moins problématiques, j'ai fait des demandes dans les pages de discussion idoines. Ici on a des ouvrages clairement complotistes et anti-science qui nuisent à la réputation de Wikilivres. (PS : Nous sommes sur Wikilivres, pas sur Wikiversité ;)) [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 12 mai 2025 à 13:21 (CEST) ::::Entre-nous @[[Utilisateur:Fourmidable|Fourmidable]], je ne trouve pas ton comportement plus constructif, ni collaboratif que le tien... [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 13:24 (CEST) :::::À mes yeux et dans le cadre d'un projet collaboratif, commencer par une demande de suppression avant toute chose peut même être perçu comme violant. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 13:26 (CEST) ::::::Mon but n'est pas de faire une croisade pour le libéralisme ou le GIEC sur Wikilivres, mais il y a quand même des limites pour tenir la réputation du site et plus largement de la Wikimedia Foundation. Je te rejoins sur le fait que les auteurs ne doivent pas être libres d'écrire absolument tout ce qu'ils veulent, et aussi que la critique doit être constructive, mais ce n'est pas au créateur du livre d'être le seul arbitre de ce qui est raisonnable ou pas vis-à-vis de son travail (i.e. simple reformulation, suppression partielle ou totale...). Et en 2023 Matthius a montré un comportement très agressif vis-à-vis de mes critiques, ce qui a mené '''ensuite''' à des débats de suppression. Pour l'instant, je ne fais que soulever des phrases (souvent identiques à celles de 2023) que je trouve (de nouveau) hautement problématiques d'un point de vue scientifique (manque voire absence totale de sourçage), mais le passage par des demandes de suppression directement se justifie par une forme de récidive sur certaines affirmations auxquelles aucune amélioration n'a été apportée après critique. Tu m'accuses de rameutage, mais je ne fais que consulter la communauté dans son ensemble : ici pour une discussion globale, sur [[Wikilivres:Demandes de suppression]] pour un débat et un "vote" au cas par cas. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 12 mai 2025 à 13:34 (CEST) :::::::Désolé aussia pour le côté péjoratif du terme rameutage. Parlons de notiffication c'est plis adéquat. :::::::Je réalise seulement que l'on est sur wikilivres et pas Wikiversité. Désolé sur mon smartphone ça ne saute pas aux yeux. Il faut donc recontextualiser tout ce que j'ai écrits précédement. Heureusement, historiquement Wikiversité est un sous projet de wikilivre. Les deux projet sont très proches dans leurs mission pédagogique et mode de fonctionnement. L'objet ici étant de produire des livres pédagogiques pour toute les tranches d'âges et pas uniquement des ouvrages qui doivent répondre à à des attentes scientifiques. Il apparait dans tes propos des thermes très wikipédien tel que le sourçage et la neutralité de point de vue. Je ne pense pas que cela doit s'appliquer ici. :::::::Ensuite Wikilivres est trop petit pour avoir un commuté d'arbitrage et je n'ai pas envie de parcourir les historiques à la recherche de qui a commencé. Mais je maintient l'idée que notifier des personnes vers un appel à suppression est une démarche que je considère symboliqueemnt violente et me semble aussi être une récidive. :::::::As-tu cherché à améliorer les texte en question en discutant avec l'auteur avant de proposer leurs suppression ? :::::::As-tu conscience que nous sommes ici dans un projet collaboratif, pluraliste et non universitaire ? [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 15:02 (CEST) ::::::::Du reste, nous ne sommes pas ici pour répondre à des suposées attentes de la Fondation Wikimedia. Car le rôle de celle-ci est précisément de répondre aux notres. C'est le rôle d'une fondation. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 15:07 (CEST) :::::::::Bonjour, :::::::::Il faudrait avant tout classer les écrits de l'auteur, car il pourrait il y avoir un problème d'admissibilité, Wikilivres étant avant tout un projet de rédaction de livres '''pédagogiques'''. Ces écrits contiennent beaucoup d'avis personnels et présentent une vision sans discussion ni argumentation, sans apporter de pédagogie sur un sujet particulier. :::::::::Si on peut qualifier les écrits comme de la recherche, il vaudrait mieux les déplacer vers la wikiversité, où une communauté supplémentaire et plus expérimentée sur la recherche pourrait exprimer son avis sur le sujet ou sur comment améliorer/corriger les écrits de Matthius. :::::::::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 12 mai 2025 à 20:01 (CEST) ::::::::::Je plussoie {{Mention|DavidL}}. {{Mention|Lionel Scheepmans}} ce que tu dis s'applique aux cas où il y a une réelle démarche scientifique ou a minima une attitude collaborative de la part de l'auteur. Or : ::::::::::* premièrement (tu le sais sans doute, étant toi-même chercheur), les livres de Matthius sont très loin de toute méthode scientifique, c'est plutôt un ensemble d'assertions non sourcées qui font la promotion d'une idéologie (et on verse même dans l'antiscience avec les paragraphes sur le GIEC). On pourrait donner la parole à Matthius sur ce sujet mais je crains qu'il ne se définisse même pas lui-même comme scientifique ; ::::::::::* deuxièmement, avec cette série de recréations le 8 décembre dernier, sans attendre l'avis de la communauté, et avec les '''mêmes phrases''' problématiques (parfois à peine reformulées, souvent conservées à l'identique), je ne vois pas comment on pourrait supposer que Matthius fait preuve d'ouverture d'esprit et d'attitude collaborative. ::::::::::Bref, si vous voulez absolument garder tous ces ouvrages et essayer de composer tant bien que mal avec la pugnacité de leur auteur, ce sera sans moi... À mon avis, il serait nettement plus profitable de traduire les livrels de [[:en:Subject:Economics|Wikibooks en anglais sur l'économie]], par exemple. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 13 mai 2025 à 11:07 (CEST) :::::::::::Je viens de prévenir Matthius par mail. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 13 mai 2025 à 11:12 (CEST) ::::::::::::Tree bien. Moi aussi, je n'ai plus envie de consacrer du temps là dessus. Je vous laisse donc traiter la situation puisque votre avis est majoritaire. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 13 mai 2025 à 11:27 (CEST) :::::::::::Je ne comprends pas cette assertion. Je cite François Gervais contre le GIEC, qui a écrit pour le GIEC sans être entendu pour la conclusion. :::::::::::Je n'ai pas reformulé mes phrases à l'identique. J'ai soit indiqué la source contrairement à ce qui dit Fourmidable, soit indiqué que c'était mon point de vue ou émis une explication. Aussi quand je fais une assertion scientifique, j'en indique souvent la cause scientifique. Fourmidable a tendance à reprendre les phrases où je répète ce qui a été écrit avant pour aller plus loin. Donc il faut chercher dans mes livrels la phrase où je cite et où j'émets une hypothèse avec la cause scientifique. Je vais relire Fourmidable. :::::::::::Aussi j'ai trouvé sur l'[http://web.archive.org/web/20240810201141/https://www.google.com/search?q=mati%C3%A8re+temps+%C3%A2me âme qui ralentit la vitesse]. Je pense que Google utilise une IA pour détecter les limites de l'humain. Mon expérience de pensée va contre le matérialisme scientifique puisque j'émets l'hypothèse supérieure qu'il existe des multivers où des âmes agissent sur le nôtre. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 13 mai 2025 à 11:36 (CEST) :::::::::::Je ne pense pas effectivement que mon livrel sur le XXIe va rester sur wikibooks puisque il va contre ce qu'indique wikipedia. J'espère juste qu'il puisse rester. :::::::::::Seulement j'ai une formation en ingénierie et j'ai trouvé sur [https://archive.org/details/TempsAme l'âme qui ralentit la vitesse] [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 13 mai 2025 à 12:13 (CEST) ::::::::::Vous admettez {{Mention|DavidL}} que vous ne connaissez pas les domaines que j'aborde. Mes livrels sont pédagogiques donc vous pouvez apprendre avec. Donc lisez les avant d'émettre l'hypothèse qu'ils ne le sont pas. J'ai créé le coaching sans coach qui a permis de revoir la pédagogie d'un journal d'un réseau international. Mais cela ne m'empêche pas d'aller contre le libéralisme et l'appât du gain qui sont selon moi les fléaux actuels. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 13 mai 2025 à 12:06 (CEST) :::::::::::@[[Utilisateur:Matthius|Matthius]] semble ouvert au débat et à une aide pour améliorer ses textes. La suppression ne me semble donc pas une option souhaitable. Wikilivres est indépendant de Wikipédia. Il faut donc se référer à nos règles et recommandations locale disponible dans les espaces de noms "wikilivres" et "aide". Je vais essayer de prendre le temps d'écouter les textes avec une voix de synthèse pour gagner du temps. Cela me permettra d'en faire des commentaire en vue d'une amélioration. Car si ce sont des sources qui manques et bien il suffit de les ajouter. Nous sommes là pour travailler ensemble pour produire des ouvrages pédagogiques de qualité, pas pour juger du travail des autres en vue d'une suppression. Restons, s'il vous plait dans un esprit d'entraide et de collaboration. C'est tellement rare à notre époque... [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 14 mai 2025 à 15:00 (CEST) :::::::::::Mon livrel sur le XXIe siècle en cours d'écriture va aussi contre les théories du complot occidentales. J'écris que la Russie et la Chine sont des démocraties, alors que nos médias disent que ce sont des dictatures. J'émets effectivement des hypothèses non sourcées dans ce nouveau livrel. Je peux et vais les sourcer. Par contre j'utiliserai des sources primaires. En réalité, j'émets l'hypothèse que ce sont nos médias qui sont dans la post-vérité et que ce ne sont pas les médias étatsuniens, ni russes, ni chinois qui y sont. Ce livrel est effectivement une bombe dangereuse contre nos médias comme l'indique Fourmidable. ::::::::::::Je ne comprends pas l'acharnement de Fourmidable à ne pas vouloir discuter avec moi et à vouloir automatiquement supprimer mes livrels sans discussion préalable. En effet il a eu un an pour m'indiquer comment améliorer mes livrels. Et que Fourmidable ne me dise pas que c'est moi qui ait commencé, puisque j'étais outré qu'on veuille supprimer mes livrels avec ses copains sans discussion pédagagogique au tout début. ::::::::::::Concernant la neutralité de wikipedia : wikipedia ne fait que révéler l'avis des médias financés donc il n'est pas neutre. Être neutre c'est révéler tous les points de vue, même ceux avec lesquels on n'est pas d'accord, ce que [https://archive.org/details/wikipediaCo-Fondateur fit wikipedia au début de son histoire] et ce pour quoi je me suis intéressé et ai été réprimé sauf pour wikibooks anglais qui m'a viré pour ne pas enlever mon nom. :{{Mention|Matthius}} Avez-vous l'intention de publier des livres scientifiques, c'est-à-dire sourcés par de la science publiée et évaluée par les pairs, et à défaut de grands médias nationaux et internationaux ? Vous pouvez aussi tester vos hypothèses mais votre travail ne doit pas consister à sélectionner les sources qui vous conviennent pour seulement valider votre théorie, en mettant de coté tout ce qui vous dérangerait dans cette entreprise. --[[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 10:48 (CEST) ::@[[Utilisateur:Fourmidable|Fourmidable]], je pense que tu te fais une vision fausse du monde de l'édition. @[[Utilisateur:Matthius|Matthius]] peut payé une maison d'édition, dans le cadre d'une [[w:Édition_à_compte_d'auteur|édition à compte d'auteur]]. Probablement qu'il l'a déjà fait puisqu'il a déjà publié des ouvrages au format papier parmi ceux qu'il veut placer sur Wikilivres. Il en a même déposé certains dans une bibliothèque universitaire. Quant à la revue par les paires ne se fait que dans le cadre des journaux scientifique. ::J'ai écouté l'ouvrage [[Pourquoi un Dieu ?]] Et je trouve effectivement qu'il n'a pas sa place dans Wikilivres. Non pas parce qu'il critique le libéralisme avec des propos que je partage en grande partie, mais parce qu'il s'apparente plus à de la propagande chrétienne qu'à un réel ouvrage pédagogique sur le sujet. ::Matthius y est en posture de prédicateur et non de pédagogue. Je dirais que la moitié des phrases de l'ouvrage que j'ai écouté sont des affirmations sans argumentation ni démonstration valide. La thèse de son ouvrage se résume à dire que dieu est la seule chose qui peut expliquer un phénomène actuellement inexpliqué. Ce qui est une corrélation fallacieuse puisqu'il n'existe aucun lien de causalité. ::Pour moi, les ouvrages évangéliste ou propagandiste n'ont pas leur place dans Wikilivres et je serais d'avis d'ouvrir une prise de décision pour établir une règle d'interdiction. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 11:42 (CEST) :::Oui voilà, nous sommes d'accord. Peut-être que Matthius peut adopter une attitude plus scientifique, mais l'esprit de "pédagogie" s'accompagne forcément d'une démarche scientifique, sinon c'est de la prédication/propagande. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 11:45 (CEST) ::::@[[Utilisateur:Fourmidable|Fourmidable]]... Wikilivres n'est pas une bibliothèque "scientifique" mais pédagogique. Tu sembles confondre les deux termes. Les livres pour enfants que contient Wikilivres ne sont pas "scientifique" tout en étant pédagogiques. ::::Un autre fait qui peut être reproché à @[[Utilisateur:Matthius|Matthius]] est son autopromotion, [[Wikilivres:Présentation#● Wikilivres n'est pas une vitrine|alors que la démarche proscrite sur Wikilivres]]. ::::Plutôt que de supprimer l'important travail effectué par Matthius, je propose à nouveau de le déplacer en sous page de son espace utilisateur pour qu'il puisse retravailler ses écrits. ::::Pour un retour dans l'espace principale, il faudrait au préalable qu'il supprime des ses travaux toute forme d'autopromotion et toute forme propagande, prosélytisme ou autre type de discours prédicateur. Ceci notamment en référence aux choix politiques [https://www.senat.fr/leg/ppl17-386.html français], [https://www.rtbf.be/article/le-proselytisme-religieux-ou-politique-n-a-pas-sa-place-a-l-ecole-quels-chiffres-derriere-ce-phenomene-pointe-par-la-ministre-de-l-education-11477234 belge], [https://www.assnat.qc.ca/fr/travaux-parlementaires/projets-loi/projet-loi-94-43-1.html Quebec], [https://ge.ch/grandconseil/data/loisvotee/L11764.pdf suisse]. Quatres communautés culturelles très largement majoritaire dans l'espace francophone des projets Wikimédia. ::::J'invite Matthius et les autres membres de notre communauté réagir à ce message et de discuter du lancement d'une nouvelle prise de décision pour interdire la propagande et le prosélytisme dans Wikilivres. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 12:21 (CEST) :::::Ce que je veux dire, c'est qu'un bon livre pédagogique s'appuie forcément sur des connaissances scientifiques. Ok pour un redéplacement. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 12:37 (CEST) ::::::Ne fais pas à ton tour du prosélytisme scientifique @[[Utilisateur:Fourmidable|Fourmidable]]. La science et les connaissances dites scientifiques comme tu les entends n'est pas la seule chose sur laquelle on peut s'appuyer pour produire un contenu pédagogique. ::::::Que fais-tu de la méditation, de l'humour, de la poésie, de la musique, du dessin, et toute autre expression artistique ? ::::::Et il existe aussi un tas d'ouvrages pédagogique religieux (pour le catéchisme entre autre), sauf que, comme la plupart des législations nationales des pays francophones occidentaux, je pense qu'ils n'ont pas leur place dans Wikilivres. Ce sur quoi nous devons nous positionner dans une prise de décision collective. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 12:52 (CEST) :::::::Ah oui, dans ce sens-là il y a en effet moins de science à proprement parler… Mais je ne suis pas sûr que cela s'applique aux propos politiques. Ça ne me viendrait pas à l'idée de faire un Wikilivre afin de convertir les gens au libéralisme, par exemple. C'est le rôle d'autres wikis ou sites web spécialisés. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 14:44 (CEST) :::Je vais supprimer Du même Auteur et Du même éditeur de mes wikilivres. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 15 mai 2025 à 12:32 (CEST) ::::Si vous voulez, mais c'est loin d'être le point principal. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 12:38 (CEST) :::::Effectivement @[[Utilisateur:Matthius|Matthius]], c'est une bonne résolution, mais il reste le prosélytisme à résoudre et je pense que cela demande beaucoup de travail à réaliser dans votre espace de travail personnel. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 12:55 (CEST) ::::::Vous mettiez que seul Pourquoi un Dieu est prosélyte. J'avais effectivement un doute en ajoutant ce livrel. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 15 mai 2025 à 19:43 (CEST) :::::::Je n'ai pas encore eu le temps d'écouter les autres livres @[[Utilisateur:Matthius|Matthius]] . Nous somme tous bénévoles ici. Cela peut prendre du temps, mais je vous invite déjà à déplacer vous-même le livre ''Pourquoi un Dieu'' dans vos sous page utilisateur''.'' :::::::Par anticipation, je peux déjà dire que tous les autres ouvrages faisant la publicité de vos écris doit être modifier ou retirer de l'espace principale ainsi que tous ceux qui font référence à Dieu ou au catholicisme de manière prosélyte. :::::::Seul le nom des auteurs devrais être repris dans les livre avec éventuellement des hyperliens vers leurs pages utilisateur qu'il sont libre d'éditer comme il veulent. :::::::On peut ensuite créer des pages catégories qui reprennent tous les travaux des auteurs, avec l'avantage qu'elle se complétent automatiquement à chaque fois que l'on ajoute une catégorie en bas de page d'un ouvrage. Vous trouverrez certainement des indication dans les pages d'aide. :::::::Je vous rassure sur le fait que ce traitement serait semblable pour un politicien libéral faisant la publicité de son parti, de ses idéologies et de sa personne. N'hésitez pas d'ailleurs à parcourir les autres wikilives pour y détecter ce genre de problème avant de nous le signaler. C'est ce que fait @[[Utilisateur:Fourmidable|Fourmidable]] en cherchant à veiller sur la qualité et la conformité de notre projet. Une belle fin de journée ! [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 16 mai 2025 à 11:41 (CEST) ::::::::Pour info, je confirme et soutiens tout ce que propose {{Mention|Lionel Scheepmans}} dans son dernier message (merci à lui). [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 16 mai 2025 à 12:01 (CEST) ::::::::Pourquoi a Dieu a été mis à jour dans mon espace personnel. Je ne sais pas comment effacer une page wikibooks.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 16 mai 2025 à 12:24 (CEST) :::::::::@[[Utilisateur:Matthius|Matthius]]. Je ne comprends pas ce que vous dite. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 16 mai 2025 à 15:16 (CEST) ::::::::::J'ai copié-collé Pourquoi un Dieu dans ma page personnelle. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 16 mai 2025 à 21:36 (CEST) :::::::::::Ah très bien @[[Utilisateur:Matthius|Matthius]]. Mais en fait, il est possible de déplacer les pages en les renomant. Cela permet de conserver tout l'historique de l'édition. Je vais le faire quand je serai sur PC. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 17 mai 2025 à 03:34 (CEST) ::::::::::::Ne le faites pas : L'original de l'historique est sur mon espace perso. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 17 mai 2025 à 09:30 (CEST) :::::::::::::@[[Utilisateur:Matthius|Matthius]], j'ai écouté l'ouvrage Économie enfant. Si j'étais à la tête d'une maison d'édition, je ne publierais pas ce manuscrit. Il y a des passages très intéressants avec des idées originales que je partage, mais aucune argumentation pour les valider. Pour le reste, on retrouve un copié collé du précédent ouvrage. Beaucoup d'information factuelle sans réelle contextualisation ni fil conducteur et puis de nombreuses affirmations gratuites qui ne sont finalement que des opinions très relatives et de nouveau non argumentées. :::::::::::::Le pire étant que certaine de ces affirmations son tout simplement fausses ou inscensées. :::::::::::::Exemples d'une phrase : :::::::::::::« Écrire sur ce que vous comprenez de l’archéologie, qui est l’humanité avant l’écriture. » :::::::::::::Cette phrase est erronée et n'a même aucun sens. L'archéologie n'est pas l'humanité, mais un domaine des sciences créé par les humains. Ensuite, l'archéologie n'est pas quelque chose qui se limite à avant l'écriture. Il existe des nombreux sites archéologiques qui fouillent les vestiges de la Rome antique. Une civilisation qui n'était pas dénuée d'écriture. :::::::::::::Exemple d'un paragraphe : :::::::::::::« Le [[w:Capital|capital]] de l’humanité peut donc être la Terre. En effet, l'argent est produit à partir du papier venant du bois. Les trafiquants ont toujours voulu se l'approprier. Le capital pourrait donc ne pas être l’argent. Le troc nécessite cependant un patrimoine conséquent. La Chine veut s’approprier le capital Lune, pour y prendre l’Helium 3 selon Solidarité et Progrès, seule ressource lunaire qu'il est intéressant de transporter, afin de le fusionner, pour en obtenir de l’énergie illimitée, favorisant la créativité par le surplus de biens. » :::::::::::::Ce paragraphe est incompréhensible et citer un parti politique (à d'autres reprises aussi dans l'ouvrage) comme source pour poser une affirmation, pose deux gros problèmes. 1 celui de faire la publicité d'une idéologie au sein d'un écrit pédagogique, 2 celui de ne pas respecter un des principes de base de l'écriture scientifique alors que le livre en parle et la défend. :::::::::::::Je n'irai pas plus loin dans les exemples. :::::::::::::Dans leurs états actuels et pour que ces livres travaux d'écritures soient admissibles dans Wikilivres. Je pense que vous devez impérativement supprimer : :::::::::::::* toute promotion personnelle. :::::::::::::* toute forme de Prosélytisme religieux. :::::::::::::* toute forme de publicité ou contre publicité politique et partisane :::::::::::::* toute affirmation fausse et autres types de fabulations. :::::::::::::* tout raisonnement ou démonstration sans lien de causalité. :::::::::::::Suite à quoi, il faudrait encore dans l'idéal en améliorer le style de sorte à y développer un fil conducteur qui permettrait aux lecteurs de suivre un développement ordonné propice à l'apprentissage, et non leur soumettre un journal de réflexions personnelles, reprenant des erreurs factuelles et logiques. :::::::::::::C'est un travail conséquent. :::::::::::::Et en ce qui concerne le prosélytisme, les approches politiques partisanes, il est impératif, y compris les sous page de votre page utilisateur. :::::::::::::Il y a des idées intéressantes dans vos écrits, et je partage pas mal de vos points de vue concernant la question du néolibéralisme. Mais Wikilivres n'est pas une tribune d'opinion à l'image d'AgoraVox. Nous sommes ici pour produire des ouvrages pédagogiques. Pas pour influencer nos lecteurs en faveurs ou à l'encontre de certaines religions ou idéologies. :::::::::::::Tout en l'encourageant à le faire de manière plus courtoise et constructive, je remercie donc @[[Utilisateur:Fourmidable|Fourmidable]] de nous avoir alerté sur l'incompatibilité de vos ouvrages avec notre projet. Dans tous les cas ceux que j'ai écoutés jusqu'à présent. :::::::::::::J'aimerais à votre tour vous encourager à poursuivre vos travaux d'écriture en cherchant à vous rapprocher de notre objectif tout en respectant nos règles et recommandations. Mais sachez aussi que vous pouvez aussi améliorer l'article de Wikipédia sur l'[[w:Économie_réelle|économie réelle]]. Ou aussi développer une leçon sur Wikiversité sur le même sujet dans la [[v:Faculté:Économie|Faculté d'Économie]]. C'est un sujet intéressant qui permet de mettre en lumières les limites de la [[w:Finance|finance]]. :::::::::::::Ces deux activités seraient moins ambitieuses que de vouloir produire un livre de qualité pour expliquer l'économie aux enfants. Cela demande une grande maîtrise du sujet en plus d'un certain don pour la vulgarisation. :::::::::::::Il me reste deux ouvrages proposés à la suppression à écouter, mais j'ai bien peur d'y retrouver les mêmes incompatibilités que celles que je viens d'expliquer à l'instant. :::::::::::::Bien cordialement, [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 26 mai 2025 à 21:16 (CEST) :::::::::::::Mon correcteur orhtographique ne fonctionnant pas pour des commentaires aussi long, le message que je viens de laisser est truflé de fautes et je n'ai pas le temps ni le courrage de les corriger. Encore une fois, le travail que je fournis sur ce projet est tout à fait bénévole. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 26 mai 2025 à 21:21 (CEST) ::::::::::::::J'ai passé beaucoup de temps à élaborer le coaching sans coach. Ce n'est naturel pour aucun ancien élève de simplifier. Je ne sais pas combien de fois j'ai relu Comment Écrire des Histoires. J'ai toujours beaucoup de temps devant moi pour revoir mes livrels.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 10:51 (CEST) :::::::::::::::@[[Utilisateur:Matthius|Matthius]], c'est précisément parce que vous travailler beaucoup et que vous Me semblez de bonne foi et volonté, que je passe autant de temps à vous aiidez. Tous vos textes comprends des problèmes qu'il faut résoudre. Vous devriez commencer par supprimer tout ce qui fait référence à vous, à la religion et au politique, pour ne garder que des faits et affirmations vérifiées par des sources sûres et non partisannes, à chaque fois pour vous assurez que vous n'être pas simplement en train de diffuser ou colporter une opinion fausse et/ou partisane. Ce qui vient d'être dit est incontournable. :::::::::::::::Je penses ensuite qu'indique messages auxquelles ont été écrites vos sections sont superflues dans le cadre d'un ouvrage pédagogique. La chronologie de vos écrits n'est pas un bon un fil conducteur. Encore une fois, Wikilivres n'est pas un lieu pour publier ses mémoires ou ses réélections du jour. Il existe le format blog pour ce genre de choses. :::::::::::::::Tennez compte aussi que nous ne disposons pas forcément d'autant de temps et de motivation que pour revoir vos livres. Raison pour laquelle, des méthodes plus expéditives telles que la suppression complète des pages inadaptées à notre projet finiront par être appliquées. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 13:18 (CEST) ::::::::::::::::Le livrel le plus important pour moi est l'économie pour les enfants, vient ensuite devenir un génie. L'Univers est Vivant a été référencé sur les moteurs de recherche récemment parce que j'ai trouvé sur l'âme qui ralentit la vitesse. Quand on cherche matière temps âme sur les moteurs de recherche occidentaux on tombe sur ma page archive.org/details/TempsAme. Il n'y a toujours pas de chercheur qui a publié sur la mathématisation de ma trouvaille. L'univers est vivant est une amélioration d'un autre livre. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 13:56 (CEST) ::::::::::::::::Je viens de mettre mon [http://matthieu.giroux.free.fr/html/cv.htm CV] à jour pour montrer ce que j'ai influencé. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 14:05 (CEST) ::::::::::::::::C'est moi qui ai diffusé le terme économie réelle. Je reproche à ceux qui l'ont utilisé d'être des économistes scolaires, c'est à dire de se référer à l'économie monétaire pour parler d'économie réelle. Je peux cependant mettre un historique de cette économie sur la page wikipedia. Je me demande juste s'il va rester. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 14:08 (CEST) :::::::::::::::::Je suis désolé @[[Utilisateur:Matthius|Matthius]]. Je ne vais pas poursuivre nos conversations faute d'en avoir envie. Vous ma laissez sur cette impression que votre motivation première est de promouvoir votre personne, vos valeurs et vos idées. Je vais donc arrêter de vous consacrer du temps. Je suis ici pour soutenir et développer les projets et intérêts collectifs et non individuels. Bonne chance pour vos ambitions que je vous invite à réaliser en dehors des projets Wikipédia. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 15:00 (CEST) ::::::::::::::::::Mon projet relève de l'intérêt général de faire connaître l'économie du XIX{{e}} siècle de [[Henry Charles Carey]]. Mon égoïsme peut donc être aussi le vôtre. Pour moi il faut être intelligent et égoïste pour défendre l'intérêt général. Je pense qu'on peut tous avoir l'air de génies comme les enfants peuvent avoir l'air de génies. Oui, je suis militant et veux faire partager la joie de la politique. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 15:55 (CEST) :::::::::::::::::::Nous ne sommes donc pas sur la même longueur d'onde. Je vois invite à ne pas faire de militantisme sur les projets wikimedia. Il y a d'autres endois pour le faire. La blogosphère, des tribune comme agoravox, et de nombreux sites web tenus par des communautés militantes et reliée aux valeurs et idées pour lesquelles vous militer. Ceci est mon dernier message à ce sujet. Cordialement. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 16:18 (CEST) ::::::::::::::::::::Je vous mets au défi de penser que les wikipédiens ne sont pas des militants. Eux veulent aussi défendre l'intérêt général en apportant la connaissance. Par contre ils ne ciblent pas leurs apports. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 17:10 (CEST) ::::::::::::::::::::Comme prévu, on me dit que mon [https://fr.wikipedia.org/wiki/%C3%89conomie_r%C3%A9elle#Histoire ajout sur l'économie réelle] est inédit. Je pense que vous vous êtes intéressé à certains de mes écrits parce qu'ils vous apportaient des réponses. Je peux faire cela sur wikibooks. Seulement c'est encore plus difficile sur wikipedia. Je ne suis pas théseux. Oui l'économie réelle a été créée pour faire connaître l'économie physique de Lyndon Larouche. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 30 mai 2025 à 17:15 (CEST) :::::::::::::::::::::Merci quand même ! [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 31 mai 2025 à 00:24 (CEST) :Mon livrel l'univers est vivant [https://www.agoravox.tv/actualites/technologies/article/et-si-la-physique-quantique-avait-105532 a eu un impact]. Je pense aussi avoir influencé les jeunes qui se sont tournés vers la bible. == [Recherche universitaire] Questionnaire sur la gouvernance Wikimedia == Bonjour à toutes et à tous, Dans le cadre d’un mémoire de recherche sur les modèles de gouvernance décentralisés dans les communs numériques, je mène une étude analysant le mouvement Wikimedia. L’objectif est de mieux comprendre la perception qu’ont les contributeurs et contributrices des projets Wikimedia (Wikilivres, Wikipédia, Wikidata, Commons, etc.) de la Fondation Wikimedia, de ses décisions, et des relations avec les chapters locaux (ex. Wikimédia France). Un questionnaire anonyme, rapide à remplir (environ 5 minutes), a été conçu à cet effet. Il s’adresse à toute personne majeure ayant déjà contribué à un projet Wikimedia, quelle que soit l’ancienneté ou le niveau d’implication. Lien vers le questionnaire : framaforms.org/questionnaire-communaute-wikipedienne-et-la-wikimedia-fondation-1747225404 '''Important''' : Les résultats seront utilisés uniquement dans un cadre académique. L'enquête, ainsi que l'étude, ne sont ni commandités ni supervisés par la Fondation ou aucun chapitre local. Il s'agit simplement d'un projet scolaire que je mène {{sourire}}. Merci d’avance pour votre participation ! [[Utilisateur:3(MG)²|3(MG)²]] ([[Discussion utilisateur:3(MG)²|discussion]]) 27 mai 2025 à 10:43 (CEST) :J'ai répondu. Bon courage pour ton mémoire ! (Ça me fait penser que je dois avancer sur le mien aussi...) [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 29 mai 2025 à 23:28 (CEST) == Propagande, prosélitisme, autopromotion, militanatisme, etc == Bonjours à la communauté des contributeurs de Wikilivres. Je me dit qu'il serait bon de faire une nouvelle prise de décision pour mieux cadrer le contenu de notre projet par rapport à ce qui se situebdans le titre de ce message. Qu'en pensez-vous ? [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 16:22 (CEST) :Totalement {{Pour}} ! [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 29 mai 2025 à 21:53 (CEST) :L'économie financière peut être considérée comme une propagande puisque son utilisation ne permet pas de lier la macro-économie et la micro-économie, ne permettant donc pas de développer une société comme le fait l'[https://fr.wikipedia.org/wiki/%C3%89conomie_r%C3%A9elle économie réelle]. Par contre, l'économie réelle aurait pu être considérée comme une propagande tant qu'elle ne permettait pas de faire mieux que l'économie financière. :Si on considère le prosélytisme comme convaincre de rejoindre sa communauté, il faudrait donc enlever tous les wikilivres qui sont beaucoup lus, puisque les wikilivres qui sont peu lus n'arrivent pas à convaincre. Je pense que mon livrel l'économie pour les enfants arrive à convaincre, malgré quelques défauts qu'on peut régler. Je pense que c'est pour cela qu'il a été ajouté pour suppression pour ne laisser que l'économie financière. :L'autopromotion permet malgré tout de connaître ce que fait l'auteur d'un wikilivre. Si on enlève le chemin qu'a suivi l'auteur, on évacuerait ainsi ses contradictions et on pourrait donc faire dire à un auteur l'inverse de ce qu'il a compris au bout de son parcours. Je suis pour qu'il y ait une page de l'auteur regroupant les livrels de l'auteur comme sur wikisource. :Je considère ceux qui contribuent à wikipedia et à wikibooks comme des militants, puisqu'ils essaient d'influencer les autres avec ce qu'ils écrivent sur ces sites web. Certes, certains travaux peuvent être désintéressés, mais alors pourquoi mettre ces travaux sur ces sites web alors. En effet le manque de passion crée des textes soporifiques. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 3 juillet 2025 à 22:36 (CEST) 1sl6x7gg5y8ktp2jlaffz9qxhzhpz9m 745894 745893 2025-07-03T21:09:12Z Matthius 11787 /* Propagande, prosélitisme, autopromotion, militanatisme, etc */ 745894 wikitext text/x-wiki <noinclude>{{Wikilivres:Le Bistro/En-tête}}</noinclude> == compléter les bons conseils pour un nouveau livre == bonjour wikilivre ! je refais un tour sur ce wiki depuis un sacré bout de temps. Je vois que certains noms sont toujours là :) wouah. J'ai entâmé un livre nouveau aka. [[La sécurité du citoyen dans son logement]] que je vais encore améliorer mais je me pose dejà quelques questions sur le process, et vu que [[Wikilivres/Créer un wikilivre]] est assez high level je préfère demander ici des conseils. J'aime à penser que si l'idée est pertinente le guide pourra évoluer rapidement. * '''AutoCat''': il est indiqué clairement dans le guide pour la page de garde du livre de mettre <code><nowiki>{{AutoCat}}</nowiki></code> en bas de page, mais est-ce conseillé également sur chaque page du livre ? ça a l'air de marcher et donc plutôt oui: & si oui on pourrait l'ajouter dans le guide ? * je ne sais pas quoi mettre dans `CDU item` : on peut peut être orienter vers une bonne page sur le comment remplir le template proposé sur la page de garde * '''navigation horizontale''': est-ce qu'un moyen universel permet de suivre les chapitres d'un livre ? ex. si je suis sur un chapitre et que je veux aller au suivant, soit je passe par la page parent, soit je passe par la catégorie. Mais je voudrai (mieux qu') un bouton "next" / "previous". Enfin voici l'idée. S'il y a des choses en template automatique, je suis preneur (peut être le guide aussi) (PS: je vois que la gestion du sommaire est automatisée au sein même d'un chapitre : génial :) ) :NB: à une certaines époque j'utilisais des templates propres au livre (ex. [[Modèle:Les félins]]) et je vois que certains livres ont repris l'idée.. * '''catégorie''' : que faut-il mettre exactement dans le contenu de la catégorie auto-générée pour le nouveau livre ? juste <code><nowiki>[[Catégorie:Livres par titre]]</nowiki></code> ? * '''livre modèle''' : avez-vous un livre "modèle" : c'est-à-dire un livre (probablement à succès & pas trop grand) qui serait particulièrement suivi par les habitués et sur lequel on retrouverai toutes les techniques les plus avancées pour bien rédiger un livre. Il apparaîtrait du coup en modèle dans le guide. qu'en pensez-vous ? [[Utilisateur:Boly38|Boly]] [[Discussion_Utilisateur:Boly38|♪]] 5 mars 2025 à 18:09 (CET) :Salut Boly :* Autocat : normalement, il ne se met que dans le modèle listant les chapitres du livre, inclus dans toutes les pages. Par exemple le modèle {{m|Programmation JavaFX}} est inclus comme ceci : <nowiki><noinclude>{{Programmation JavaFX}}</noinclude></nowiki>) dans tous les chapitres du livre [[Programmation JavaFX]]. :* [[Wikilivres:CDU]] : il y a un moteur de recherche pour trouver le classement, mais il n'est pas encore pleinement détaillé et parfois il faut créer les pages correspondantes à la CDU. J'utilise http://www.udcsummary.info/php/index.php?lang=fr pour ajouter les pages manquantes. Si tu trouves un ou plusieurs classement possibles, je peux me charger de créer les pages qui manquent. :* '''navigation horizontale''' : Fait automatiquement par l'inclusion du modèle dans toutes les pages. Voir par exemple : [[Programmation Java Swing/Introduction]]. Le modèle ajoute les liens suivant, précédent et une flèche au milieu pour déplier la liste complète des chapitres du livre. :Pour la catégorie, un petit descriptif, comme par exemple : <pre><nowiki> Catégorie recensant les pages du livre [[Programmation JavaFX]]. Pour discuter de la rédaction du livre c'est ici : [[Discussion:Programmation JavaFX]]. [[Catégorie:Java]] </nowiki></pre> :--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 5 mars 2025 à 19:22 (CET) ::J'ai fait des clics magiques (dans l'historique des pages) pour remercier ; je ne sais pas où ça atteri mais bon. Le template sommaire avec navigation par page c'est exactement ce que je voulais : c'est top :) & merci aussi pour les illustrations ! David L au top ! ! [[Utilisateur:Boly38|Boly]] [[Discussion_Utilisateur:Boly38|♪]] 7 mars 2025 à 18:04 (CET) == Problème de cache sur la page d'accueil == Salut, Les utilisateurs anonymes voient toujours les mêmes livres sur la page d'accueil (pendant plusieurs mois) alors que les livres changent tous les jours pour les utilisateurs connectés. Il faudrait installer l'extension [[mw:Extension:MagicNoCache]] afin de pouvoir utiliser <nowiki>__NOC</nowiki>ACHE__ sur la page d'accueil. --&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 29 mars 2025 à 20:56 (CET) :Bonjour, bien reçu, j'ai créé un ticket pour voir déjà si on peut diminuer ce cache à 24h (sinon il faudra voter pour l'extension) : https://phabricator.wikimedia.org/T390674. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<span style="color:#FF6600">$</span>♠]]) 1 avril 2025 à 11:46 (CEST) ::Merci JackPotte. ::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 1 avril 2025 à 19:00 (CEST) :::Un problème similaire a été signalé en 2023 [[phabricator:T351573]], et en 2017 [[phabricator:T119366]] mais pas la moindre action de correction depuis toutes les années écoulées. Les problèmes des "petits" wiki ne sont pas écoutés. :::J'ai donc créé la page de vote pour installer l'extension : [[Wikilivres:Prise de décision/Installer l'extension MagicNoCache]]. :::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 1 avril 2025 à 19:48 (CEST) ::::{{Mention|Lionel Scheepmans}}, {{Mention|Fourmidable}} : un avis / un vote sur ce sujet ? --&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 12 mai 2025 à 20:04 (CEST) :::::Je viens de donner mon avis sur la page idoine, merci du rappel ! [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 13 mai 2025 à 11:00 (CEST) == Erreur d'affichage sur la page d'accueil == Bonjour tout le monde, Un petit message pour savoir où nous en sommes sur le problème d'affichage dans la page d'accueil (débordement des cadres de livres suggérés sur la boîte à outils des utilisateurs connectés). Wikilivresquement, [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 26 avril 2025 à 17:59 (CEST) :Salut Fourmidable, :J'ai tenté de trouver une solution pour cet habillage, mais il est tellement mal conçu que ça semble impossible. :C'est le seul habillage qui pose problème, pour plusieurs pages et pas seulement la page d'accueil. :La décision arbitraire d'imposer cet habillage sans consulter la communauté du projet est une aberration. :Le mieux serait de : :# créer un bug pour l'habillage Vector-2022 qui ne fonctionne plus dès qu'il y a le moindre code CSS, :# créer une demande de fonctionnalité pour que les administrateurs du projet puisse sélectionner l'habillage par défaut par projet choisi par décision communautaire, :Mais comme les "petits wikis" ne sont pas écoutés, ce serait inutile (voir les nombreux exemples de problèmes reportés spécifiques à fr.wikibooks dont aucun n'a jamais été résolu). :--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 26 avril 2025 à 20:26 (CEST) ::Ok, en tout cas sache que je soutiens ta proposition ! [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 1 mai 2025 à 16:28 (CEST) == Matthius : le grand retour == Bonjour à tous, Quelqu'un veut-il bien m'aider à relire les [https://fr.wikibooks.org/w/index.php?title=Sp%C3%A9cial%3AContributions&target=Matthius&namespace=0&tagfilter=&newOnly=1&start=&end=&limit=50 nouveaux livres de Matthius] ? Il semble y avoir, une fois de plus, de graves problèmes de sourçage et des attaques (même déjà soulignées en 2023 !) contre "le libéralisme" et "la finance" avec des phrases obscures ; par exemple : * dans [[Conseils Chrétiens]] : "Le libéralisme empêche de voir la société. Alors on croit les films libéraux, faisant croire que l’individu fait la société, alors que c’est la société qui fait l’individu. En effet, notre ego est créé par notre famille." * dans [[Pourquoi un Dieu ?]] : "L'individualisme dû au libéralisme, de plus en plus prégnant, va par contre cacher de plus en plus notre sociabilité et notre créativité.", "le social-libéralisme ne sera que le moyen d'accéder au pouvoir par la voie opportune alors qu'on cachera le social au peuple, pour ne pas qu'il se comprenne. Le dirigeant social-libéral aura appris dans les écoles d'économie que les marchés c'est magique.", "désengager l'état, détruisant alors le développement donc la république", "La faille du libéralisme est la censure, censure permise par la pauvreté des esprits ayant peur des autres à cause de l'individualisme forcené. [...] Le libéralisme cherchera la censure pour empêcher qu'il y ait suffisamment d'esprits philosophes et créatifs s'intéressant à la politique.", "La finance croira alors qu'il faille installer une dictature pour liquider la population trop difficile à maîtriser. [...] il s'agit pour la finance de trouver de plus en plus d'illusions pour satisfaire la population" * dans [[Économie Enfants]] : le libéralisme a "rendu l’école non épanouissante par le manque de créativité, en disant que le pays ne peut plus se développer, à cause de la monnaie privée" et l'assertion non (mal ?) argumentée "Le libéralisme aboutit selon moi à l'abrutissement de l'individu, voire à la violence" * dans [[Devenir un Génie]] : "Ils sont ainsi devenus égoïstes, donc libéraux.", "le libéralisme peut apporter un manque de liberté, car c’est une doctrine et une idéologie orientée sur l'individu, individualisme cachant une société, allant alors vers la destruction du plus faible par une liberté sans limite.", "La finance a en fait tenté et tente de faire croire qu’elle s’occupe de notre liberté, alors qu’elle veut nous empêcher de nous émanciper." * dans [[Univers Vivant]] : "La finance veut que nous soyons des consommateurs alors que nous sommes des acteurs de la société.", "Pour les financiers la population pauvre doit souffrir de malnutrition.", la finance "devient alors autoritaire comme après la crise de 1929. Nous sommes à un moment crucial où nous pouvons remettre en cause l’idéologie scientiste aboutissant à nier la nature. Ainsi il y avait 1,7% de CO2 pendant le crétacé au lieu de 0,04 % en 2023." Notons que le dernier ouvrage en date, [[XXIe]], est particulièrement gratiné : * climatoscepticisme : "le GIEC aura causé une hécatombe de suicides pour un faux réchauffement de la terre" * théories du complot sur les résultats des élections occidentales : "Selon des journalistes de Sud Ouest diffusés sur Agora Vox qui ont récoltés les suffrages des élections de 2017 et qui ont suivi l’élection de 2022, Macron n’a pas été élu par les français. En réalité il est arrivé dernier des élections présidentielles de 2017.", "Emmanuel Macron avait des nuls médiatisés face à lui" * théories du complot sur la CIA et les démocrates américains : "les démocrates trichent sur les élections en 2021", "Les États-Unis sont partis d’Afghanistan pour préparer la guerre d’Ukraine" * biais prorusse : "la Russie entre en guerre contre l’Ukraine en février 2022, puisque l’Ukraine avait attaqué la Russie. Les médias occidentaux feront croire [...] que c’est la Russie qui attaque", "Vladimir Poutine est voulu par les russes, contrairement aux élus occidentaux. Les élections en Russie se déroulent suffisamment bien pour que la Russie soit considérée comme une démocratie." -- [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 11 mai 2025 à 17:24 (CEST) :J'ai lancé une série de [[Wikilivres:demandes de suppression|demandes de suppression]]. Je notifie les personnes ayant participé à l'[[Wikilivres:Demandes de suppression/2023|ancien débat (2023)]] : {{Mention|JackPotte}}, {{Mention|Lionel Scheepmans}} et {{Mention|DavidL}} pour info. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 12 mai 2025 à 11:23 (CEST) ::Salut @[[Utilisateur:Fourmidable|Fourmidable]].. C'est bien que tu inspecte le contenu de Wikiversité à la recherche de contenu indésirable ou problématiques. Mais je vois dans le titre de ce sujet de discussion une forme de sarcasme et de condescendance qui ne me semble pas adapter à un projet collaboration où tout le monde est le bienvenu peu importe ses croyance et ses idée. De plus la première personne concernée, c'est à dire l'auteur, n'y est pas notifiée. ::Ensuite, il fauétait une fois se mettre d'accord sur le fait que la ligne éditoriale de Wikiversité est différente à celle de Wikipedia. Un recueil de cours et de travaux de recherche, ce n'est pas une encyclopédie. On en a déjà discuté. La neutralité de point de vue n'existe pas dans l'enseignement ni dans la recherche. ::Pour preuve, mon fils a un cours de religion dans SZ formation secondaire et il peut choisir entre différentes religion ou opter pour un cours de morale et de citoyenneté. À l'université, les orientation idéologique des enseignants son souvent bien connue. Et il est évident que l'enseignement dans une business school sera plus libérale qu'une fac de théologie. ::Dans le cadre des travaux de recherches, la Liberté d'expression doit être complète, l'auteur doit être libre d'y faire ses propre interprétations des faits et développant sa propre argumentation. Sans quoi, c'est plus de la recherche. ::Finalement, un support d'enseignement dans un projet collaboratif, n'est pas un projet de recherche. On ne parle pas en "je" dans un cours, on le fait dans une recherche. Or, l'usage du "Je" implique une certaine subjectivité. ::En conclusion, je ne vois pas ce nouvelle appel dans la forme et l'énergie qu'il se présente, comme quelque chose de très collaboratif. Et je n'ai pas envie de jouer à nouveau le médiateur dans ce redémarage d'une confrontation idéologique entre deux contributeurs incapable de collaborer dans la production de contenu de qualité. ::Plutôt que de faire du rameutage ici, je te proposeraient plutôt, selon tes disponibilités, de collaborer aux écrits des auteurs en discutant avec eux sur le page de discussions de leurs articles au sujet des améliorations possibles. Plutôt que de faire appel à la suppression de toute une page pour certains passages problématiques, une démarche collaboratif serait d'aider à la résolutions de ces problèmes, dans le but de ne pas perdre tout le reste de la page. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 13:20 (CEST) :::Tu as raison, je notifie aussi {{Mention|Matthius}} en espérant que cette fois son comportement soit plus constructif... Concernant les ouvrages qui sont moins problématiques, j'ai fait des demandes dans les pages de discussion idoines. Ici on a des ouvrages clairement complotistes et anti-science qui nuisent à la réputation de Wikilivres. (PS : Nous sommes sur Wikilivres, pas sur Wikiversité ;)) [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 12 mai 2025 à 13:21 (CEST) ::::Entre-nous @[[Utilisateur:Fourmidable|Fourmidable]], je ne trouve pas ton comportement plus constructif, ni collaboratif que le tien... [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 13:24 (CEST) :::::À mes yeux et dans le cadre d'un projet collaboratif, commencer par une demande de suppression avant toute chose peut même être perçu comme violant. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 13:26 (CEST) ::::::Mon but n'est pas de faire une croisade pour le libéralisme ou le GIEC sur Wikilivres, mais il y a quand même des limites pour tenir la réputation du site et plus largement de la Wikimedia Foundation. Je te rejoins sur le fait que les auteurs ne doivent pas être libres d'écrire absolument tout ce qu'ils veulent, et aussi que la critique doit être constructive, mais ce n'est pas au créateur du livre d'être le seul arbitre de ce qui est raisonnable ou pas vis-à-vis de son travail (i.e. simple reformulation, suppression partielle ou totale...). Et en 2023 Matthius a montré un comportement très agressif vis-à-vis de mes critiques, ce qui a mené '''ensuite''' à des débats de suppression. Pour l'instant, je ne fais que soulever des phrases (souvent identiques à celles de 2023) que je trouve (de nouveau) hautement problématiques d'un point de vue scientifique (manque voire absence totale de sourçage), mais le passage par des demandes de suppression directement se justifie par une forme de récidive sur certaines affirmations auxquelles aucune amélioration n'a été apportée après critique. Tu m'accuses de rameutage, mais je ne fais que consulter la communauté dans son ensemble : ici pour une discussion globale, sur [[Wikilivres:Demandes de suppression]] pour un débat et un "vote" au cas par cas. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 12 mai 2025 à 13:34 (CEST) :::::::Désolé aussia pour le côté péjoratif du terme rameutage. Parlons de notiffication c'est plis adéquat. :::::::Je réalise seulement que l'on est sur wikilivres et pas Wikiversité. Désolé sur mon smartphone ça ne saute pas aux yeux. Il faut donc recontextualiser tout ce que j'ai écrits précédement. Heureusement, historiquement Wikiversité est un sous projet de wikilivre. Les deux projet sont très proches dans leurs mission pédagogique et mode de fonctionnement. L'objet ici étant de produire des livres pédagogiques pour toute les tranches d'âges et pas uniquement des ouvrages qui doivent répondre à à des attentes scientifiques. Il apparait dans tes propos des thermes très wikipédien tel que le sourçage et la neutralité de point de vue. Je ne pense pas que cela doit s'appliquer ici. :::::::Ensuite Wikilivres est trop petit pour avoir un commuté d'arbitrage et je n'ai pas envie de parcourir les historiques à la recherche de qui a commencé. Mais je maintient l'idée que notifier des personnes vers un appel à suppression est une démarche que je considère symboliqueemnt violente et me semble aussi être une récidive. :::::::As-tu cherché à améliorer les texte en question en discutant avec l'auteur avant de proposer leurs suppression ? :::::::As-tu conscience que nous sommes ici dans un projet collaboratif, pluraliste et non universitaire ? [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 15:02 (CEST) ::::::::Du reste, nous ne sommes pas ici pour répondre à des suposées attentes de la Fondation Wikimedia. Car le rôle de celle-ci est précisément de répondre aux notres. C'est le rôle d'une fondation. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 15:07 (CEST) :::::::::Bonjour, :::::::::Il faudrait avant tout classer les écrits de l'auteur, car il pourrait il y avoir un problème d'admissibilité, Wikilivres étant avant tout un projet de rédaction de livres '''pédagogiques'''. Ces écrits contiennent beaucoup d'avis personnels et présentent une vision sans discussion ni argumentation, sans apporter de pédagogie sur un sujet particulier. :::::::::Si on peut qualifier les écrits comme de la recherche, il vaudrait mieux les déplacer vers la wikiversité, où une communauté supplémentaire et plus expérimentée sur la recherche pourrait exprimer son avis sur le sujet ou sur comment améliorer/corriger les écrits de Matthius. :::::::::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 12 mai 2025 à 20:01 (CEST) ::::::::::Je plussoie {{Mention|DavidL}}. {{Mention|Lionel Scheepmans}} ce que tu dis s'applique aux cas où il y a une réelle démarche scientifique ou a minima une attitude collaborative de la part de l'auteur. Or : ::::::::::* premièrement (tu le sais sans doute, étant toi-même chercheur), les livres de Matthius sont très loin de toute méthode scientifique, c'est plutôt un ensemble d'assertions non sourcées qui font la promotion d'une idéologie (et on verse même dans l'antiscience avec les paragraphes sur le GIEC). On pourrait donner la parole à Matthius sur ce sujet mais je crains qu'il ne se définisse même pas lui-même comme scientifique ; ::::::::::* deuxièmement, avec cette série de recréations le 8 décembre dernier, sans attendre l'avis de la communauté, et avec les '''mêmes phrases''' problématiques (parfois à peine reformulées, souvent conservées à l'identique), je ne vois pas comment on pourrait supposer que Matthius fait preuve d'ouverture d'esprit et d'attitude collaborative. ::::::::::Bref, si vous voulez absolument garder tous ces ouvrages et essayer de composer tant bien que mal avec la pugnacité de leur auteur, ce sera sans moi... À mon avis, il serait nettement plus profitable de traduire les livrels de [[:en:Subject:Economics|Wikibooks en anglais sur l'économie]], par exemple. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 13 mai 2025 à 11:07 (CEST) :::::::::::Je viens de prévenir Matthius par mail. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 13 mai 2025 à 11:12 (CEST) ::::::::::::Tree bien. Moi aussi, je n'ai plus envie de consacrer du temps là dessus. Je vous laisse donc traiter la situation puisque votre avis est majoritaire. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 13 mai 2025 à 11:27 (CEST) :::::::::::Je ne comprends pas cette assertion. Je cite François Gervais contre le GIEC, qui a écrit pour le GIEC sans être entendu pour la conclusion. :::::::::::Je n'ai pas reformulé mes phrases à l'identique. J'ai soit indiqué la source contrairement à ce qui dit Fourmidable, soit indiqué que c'était mon point de vue ou émis une explication. Aussi quand je fais une assertion scientifique, j'en indique souvent la cause scientifique. Fourmidable a tendance à reprendre les phrases où je répète ce qui a été écrit avant pour aller plus loin. Donc il faut chercher dans mes livrels la phrase où je cite et où j'émets une hypothèse avec la cause scientifique. Je vais relire Fourmidable. :::::::::::Aussi j'ai trouvé sur l'[http://web.archive.org/web/20240810201141/https://www.google.com/search?q=mati%C3%A8re+temps+%C3%A2me âme qui ralentit la vitesse]. Je pense que Google utilise une IA pour détecter les limites de l'humain. Mon expérience de pensée va contre le matérialisme scientifique puisque j'émets l'hypothèse supérieure qu'il existe des multivers où des âmes agissent sur le nôtre. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 13 mai 2025 à 11:36 (CEST) :::::::::::Je ne pense pas effectivement que mon livrel sur le XXIe va rester sur wikibooks puisque il va contre ce qu'indique wikipedia. J'espère juste qu'il puisse rester. :::::::::::Seulement j'ai une formation en ingénierie et j'ai trouvé sur [https://archive.org/details/TempsAme l'âme qui ralentit la vitesse] [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 13 mai 2025 à 12:13 (CEST) ::::::::::Vous admettez {{Mention|DavidL}} que vous ne connaissez pas les domaines que j'aborde. Mes livrels sont pédagogiques donc vous pouvez apprendre avec. Donc lisez les avant d'émettre l'hypothèse qu'ils ne le sont pas. J'ai créé le coaching sans coach qui a permis de revoir la pédagogie d'un journal d'un réseau international. Mais cela ne m'empêche pas d'aller contre le libéralisme et l'appât du gain qui sont selon moi les fléaux actuels. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 13 mai 2025 à 12:06 (CEST) :::::::::::@[[Utilisateur:Matthius|Matthius]] semble ouvert au débat et à une aide pour améliorer ses textes. La suppression ne me semble donc pas une option souhaitable. Wikilivres est indépendant de Wikipédia. Il faut donc se référer à nos règles et recommandations locale disponible dans les espaces de noms "wikilivres" et "aide". Je vais essayer de prendre le temps d'écouter les textes avec une voix de synthèse pour gagner du temps. Cela me permettra d'en faire des commentaire en vue d'une amélioration. Car si ce sont des sources qui manques et bien il suffit de les ajouter. Nous sommes là pour travailler ensemble pour produire des ouvrages pédagogiques de qualité, pas pour juger du travail des autres en vue d'une suppression. Restons, s'il vous plait dans un esprit d'entraide et de collaboration. C'est tellement rare à notre époque... [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 14 mai 2025 à 15:00 (CEST) :::::::::::Mon livrel sur le XXIe siècle en cours d'écriture va aussi contre les théories du complot occidentales. J'écris que la Russie et la Chine sont des démocraties, alors que nos médias disent que ce sont des dictatures. J'émets effectivement des hypothèses non sourcées dans ce nouveau livrel. Je peux et vais les sourcer. Par contre j'utiliserai des sources primaires. En réalité, j'émets l'hypothèse que ce sont nos médias qui sont dans la post-vérité et que ce ne sont pas les médias étatsuniens, ni russes, ni chinois qui y sont. Ce livrel est effectivement une bombe dangereuse contre nos médias comme l'indique Fourmidable. ::::::::::::Je ne comprends pas l'acharnement de Fourmidable à ne pas vouloir discuter avec moi et à vouloir automatiquement supprimer mes livrels sans discussion préalable. En effet il a eu un an pour m'indiquer comment améliorer mes livrels. Et que Fourmidable ne me dise pas que c'est moi qui ait commencé, puisque j'étais outré qu'on veuille supprimer mes livrels avec ses copains sans discussion pédagagogique au tout début. ::::::::::::Concernant la neutralité de wikipedia : wikipedia ne fait que révéler l'avis des médias financés donc il n'est pas neutre. Être neutre c'est révéler tous les points de vue, même ceux avec lesquels on n'est pas d'accord, ce que [https://archive.org/details/wikipediaCo-Fondateur fit wikipedia au début de son histoire] et ce pour quoi je me suis intéressé et ai été réprimé sauf pour wikibooks anglais qui m'a viré pour ne pas enlever mon nom. :{{Mention|Matthius}} Avez-vous l'intention de publier des livres scientifiques, c'est-à-dire sourcés par de la science publiée et évaluée par les pairs, et à défaut de grands médias nationaux et internationaux ? Vous pouvez aussi tester vos hypothèses mais votre travail ne doit pas consister à sélectionner les sources qui vous conviennent pour seulement valider votre théorie, en mettant de coté tout ce qui vous dérangerait dans cette entreprise. --[[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 10:48 (CEST) ::@[[Utilisateur:Fourmidable|Fourmidable]], je pense que tu te fais une vision fausse du monde de l'édition. @[[Utilisateur:Matthius|Matthius]] peut payé une maison d'édition, dans le cadre d'une [[w:Édition_à_compte_d'auteur|édition à compte d'auteur]]. Probablement qu'il l'a déjà fait puisqu'il a déjà publié des ouvrages au format papier parmi ceux qu'il veut placer sur Wikilivres. Il en a même déposé certains dans une bibliothèque universitaire. Quant à la revue par les paires ne se fait que dans le cadre des journaux scientifique. ::J'ai écouté l'ouvrage [[Pourquoi un Dieu ?]] Et je trouve effectivement qu'il n'a pas sa place dans Wikilivres. Non pas parce qu'il critique le libéralisme avec des propos que je partage en grande partie, mais parce qu'il s'apparente plus à de la propagande chrétienne qu'à un réel ouvrage pédagogique sur le sujet. ::Matthius y est en posture de prédicateur et non de pédagogue. Je dirais que la moitié des phrases de l'ouvrage que j'ai écouté sont des affirmations sans argumentation ni démonstration valide. La thèse de son ouvrage se résume à dire que dieu est la seule chose qui peut expliquer un phénomène actuellement inexpliqué. Ce qui est une corrélation fallacieuse puisqu'il n'existe aucun lien de causalité. ::Pour moi, les ouvrages évangéliste ou propagandiste n'ont pas leur place dans Wikilivres et je serais d'avis d'ouvrir une prise de décision pour établir une règle d'interdiction. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 11:42 (CEST) :::Oui voilà, nous sommes d'accord. Peut-être que Matthius peut adopter une attitude plus scientifique, mais l'esprit de "pédagogie" s'accompagne forcément d'une démarche scientifique, sinon c'est de la prédication/propagande. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 11:45 (CEST) ::::@[[Utilisateur:Fourmidable|Fourmidable]]... Wikilivres n'est pas une bibliothèque "scientifique" mais pédagogique. Tu sembles confondre les deux termes. Les livres pour enfants que contient Wikilivres ne sont pas "scientifique" tout en étant pédagogiques. ::::Un autre fait qui peut être reproché à @[[Utilisateur:Matthius|Matthius]] est son autopromotion, [[Wikilivres:Présentation#● Wikilivres n'est pas une vitrine|alors que la démarche proscrite sur Wikilivres]]. ::::Plutôt que de supprimer l'important travail effectué par Matthius, je propose à nouveau de le déplacer en sous page de son espace utilisateur pour qu'il puisse retravailler ses écrits. ::::Pour un retour dans l'espace principale, il faudrait au préalable qu'il supprime des ses travaux toute forme d'autopromotion et toute forme propagande, prosélytisme ou autre type de discours prédicateur. Ceci notamment en référence aux choix politiques [https://www.senat.fr/leg/ppl17-386.html français], [https://www.rtbf.be/article/le-proselytisme-religieux-ou-politique-n-a-pas-sa-place-a-l-ecole-quels-chiffres-derriere-ce-phenomene-pointe-par-la-ministre-de-l-education-11477234 belge], [https://www.assnat.qc.ca/fr/travaux-parlementaires/projets-loi/projet-loi-94-43-1.html Quebec], [https://ge.ch/grandconseil/data/loisvotee/L11764.pdf suisse]. Quatres communautés culturelles très largement majoritaire dans l'espace francophone des projets Wikimédia. ::::J'invite Matthius et les autres membres de notre communauté réagir à ce message et de discuter du lancement d'une nouvelle prise de décision pour interdire la propagande et le prosélytisme dans Wikilivres. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 12:21 (CEST) :::::Ce que je veux dire, c'est qu'un bon livre pédagogique s'appuie forcément sur des connaissances scientifiques. Ok pour un redéplacement. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 12:37 (CEST) ::::::Ne fais pas à ton tour du prosélytisme scientifique @[[Utilisateur:Fourmidable|Fourmidable]]. La science et les connaissances dites scientifiques comme tu les entends n'est pas la seule chose sur laquelle on peut s'appuyer pour produire un contenu pédagogique. ::::::Que fais-tu de la méditation, de l'humour, de la poésie, de la musique, du dessin, et toute autre expression artistique ? ::::::Et il existe aussi un tas d'ouvrages pédagogique religieux (pour le catéchisme entre autre), sauf que, comme la plupart des législations nationales des pays francophones occidentaux, je pense qu'ils n'ont pas leur place dans Wikilivres. Ce sur quoi nous devons nous positionner dans une prise de décision collective. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 12:52 (CEST) :::::::Ah oui, dans ce sens-là il y a en effet moins de science à proprement parler… Mais je ne suis pas sûr que cela s'applique aux propos politiques. Ça ne me viendrait pas à l'idée de faire un Wikilivre afin de convertir les gens au libéralisme, par exemple. C'est le rôle d'autres wikis ou sites web spécialisés. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 14:44 (CEST) :::Je vais supprimer Du même Auteur et Du même éditeur de mes wikilivres. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 15 mai 2025 à 12:32 (CEST) ::::Si vous voulez, mais c'est loin d'être le point principal. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 12:38 (CEST) :::::Effectivement @[[Utilisateur:Matthius|Matthius]], c'est une bonne résolution, mais il reste le prosélytisme à résoudre et je pense que cela demande beaucoup de travail à réaliser dans votre espace de travail personnel. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 12:55 (CEST) ::::::Vous mettiez que seul Pourquoi un Dieu est prosélyte. J'avais effectivement un doute en ajoutant ce livrel. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 15 mai 2025 à 19:43 (CEST) :::::::Je n'ai pas encore eu le temps d'écouter les autres livres @[[Utilisateur:Matthius|Matthius]] . Nous somme tous bénévoles ici. Cela peut prendre du temps, mais je vous invite déjà à déplacer vous-même le livre ''Pourquoi un Dieu'' dans vos sous page utilisateur''.'' :::::::Par anticipation, je peux déjà dire que tous les autres ouvrages faisant la publicité de vos écris doit être modifier ou retirer de l'espace principale ainsi que tous ceux qui font référence à Dieu ou au catholicisme de manière prosélyte. :::::::Seul le nom des auteurs devrais être repris dans les livre avec éventuellement des hyperliens vers leurs pages utilisateur qu'il sont libre d'éditer comme il veulent. :::::::On peut ensuite créer des pages catégories qui reprennent tous les travaux des auteurs, avec l'avantage qu'elle se complétent automatiquement à chaque fois que l'on ajoute une catégorie en bas de page d'un ouvrage. Vous trouverrez certainement des indication dans les pages d'aide. :::::::Je vous rassure sur le fait que ce traitement serait semblable pour un politicien libéral faisant la publicité de son parti, de ses idéologies et de sa personne. N'hésitez pas d'ailleurs à parcourir les autres wikilives pour y détecter ce genre de problème avant de nous le signaler. C'est ce que fait @[[Utilisateur:Fourmidable|Fourmidable]] en cherchant à veiller sur la qualité et la conformité de notre projet. Une belle fin de journée ! [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 16 mai 2025 à 11:41 (CEST) ::::::::Pour info, je confirme et soutiens tout ce que propose {{Mention|Lionel Scheepmans}} dans son dernier message (merci à lui). [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 16 mai 2025 à 12:01 (CEST) ::::::::Pourquoi a Dieu a été mis à jour dans mon espace personnel. Je ne sais pas comment effacer une page wikibooks.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 16 mai 2025 à 12:24 (CEST) :::::::::@[[Utilisateur:Matthius|Matthius]]. Je ne comprends pas ce que vous dite. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 16 mai 2025 à 15:16 (CEST) ::::::::::J'ai copié-collé Pourquoi un Dieu dans ma page personnelle. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 16 mai 2025 à 21:36 (CEST) :::::::::::Ah très bien @[[Utilisateur:Matthius|Matthius]]. Mais en fait, il est possible de déplacer les pages en les renomant. Cela permet de conserver tout l'historique de l'édition. Je vais le faire quand je serai sur PC. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 17 mai 2025 à 03:34 (CEST) ::::::::::::Ne le faites pas : L'original de l'historique est sur mon espace perso. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 17 mai 2025 à 09:30 (CEST) :::::::::::::@[[Utilisateur:Matthius|Matthius]], j'ai écouté l'ouvrage Économie enfant. Si j'étais à la tête d'une maison d'édition, je ne publierais pas ce manuscrit. Il y a des passages très intéressants avec des idées originales que je partage, mais aucune argumentation pour les valider. Pour le reste, on retrouve un copié collé du précédent ouvrage. Beaucoup d'information factuelle sans réelle contextualisation ni fil conducteur et puis de nombreuses affirmations gratuites qui ne sont finalement que des opinions très relatives et de nouveau non argumentées. :::::::::::::Le pire étant que certaine de ces affirmations son tout simplement fausses ou inscensées. :::::::::::::Exemples d'une phrase : :::::::::::::« Écrire sur ce que vous comprenez de l’archéologie, qui est l’humanité avant l’écriture. » :::::::::::::Cette phrase est erronée et n'a même aucun sens. L'archéologie n'est pas l'humanité, mais un domaine des sciences créé par les humains. Ensuite, l'archéologie n'est pas quelque chose qui se limite à avant l'écriture. Il existe des nombreux sites archéologiques qui fouillent les vestiges de la Rome antique. Une civilisation qui n'était pas dénuée d'écriture. :::::::::::::Exemple d'un paragraphe : :::::::::::::« Le [[w:Capital|capital]] de l’humanité peut donc être la Terre. En effet, l'argent est produit à partir du papier venant du bois. Les trafiquants ont toujours voulu se l'approprier. Le capital pourrait donc ne pas être l’argent. Le troc nécessite cependant un patrimoine conséquent. La Chine veut s’approprier le capital Lune, pour y prendre l’Helium 3 selon Solidarité et Progrès, seule ressource lunaire qu'il est intéressant de transporter, afin de le fusionner, pour en obtenir de l’énergie illimitée, favorisant la créativité par le surplus de biens. » :::::::::::::Ce paragraphe est incompréhensible et citer un parti politique (à d'autres reprises aussi dans l'ouvrage) comme source pour poser une affirmation, pose deux gros problèmes. 1 celui de faire la publicité d'une idéologie au sein d'un écrit pédagogique, 2 celui de ne pas respecter un des principes de base de l'écriture scientifique alors que le livre en parle et la défend. :::::::::::::Je n'irai pas plus loin dans les exemples. :::::::::::::Dans leurs états actuels et pour que ces livres travaux d'écritures soient admissibles dans Wikilivres. Je pense que vous devez impérativement supprimer : :::::::::::::* toute promotion personnelle. :::::::::::::* toute forme de Prosélytisme religieux. :::::::::::::* toute forme de publicité ou contre publicité politique et partisane :::::::::::::* toute affirmation fausse et autres types de fabulations. :::::::::::::* tout raisonnement ou démonstration sans lien de causalité. :::::::::::::Suite à quoi, il faudrait encore dans l'idéal en améliorer le style de sorte à y développer un fil conducteur qui permettrait aux lecteurs de suivre un développement ordonné propice à l'apprentissage, et non leur soumettre un journal de réflexions personnelles, reprenant des erreurs factuelles et logiques. :::::::::::::C'est un travail conséquent. :::::::::::::Et en ce qui concerne le prosélytisme, les approches politiques partisanes, il est impératif, y compris les sous page de votre page utilisateur. :::::::::::::Il y a des idées intéressantes dans vos écrits, et je partage pas mal de vos points de vue concernant la question du néolibéralisme. Mais Wikilivres n'est pas une tribune d'opinion à l'image d'AgoraVox. Nous sommes ici pour produire des ouvrages pédagogiques. Pas pour influencer nos lecteurs en faveurs ou à l'encontre de certaines religions ou idéologies. :::::::::::::Tout en l'encourageant à le faire de manière plus courtoise et constructive, je remercie donc @[[Utilisateur:Fourmidable|Fourmidable]] de nous avoir alerté sur l'incompatibilité de vos ouvrages avec notre projet. Dans tous les cas ceux que j'ai écoutés jusqu'à présent. :::::::::::::J'aimerais à votre tour vous encourager à poursuivre vos travaux d'écriture en cherchant à vous rapprocher de notre objectif tout en respectant nos règles et recommandations. Mais sachez aussi que vous pouvez aussi améliorer l'article de Wikipédia sur l'[[w:Économie_réelle|économie réelle]]. Ou aussi développer une leçon sur Wikiversité sur le même sujet dans la [[v:Faculté:Économie|Faculté d'Économie]]. C'est un sujet intéressant qui permet de mettre en lumières les limites de la [[w:Finance|finance]]. :::::::::::::Ces deux activités seraient moins ambitieuses que de vouloir produire un livre de qualité pour expliquer l'économie aux enfants. Cela demande une grande maîtrise du sujet en plus d'un certain don pour la vulgarisation. :::::::::::::Il me reste deux ouvrages proposés à la suppression à écouter, mais j'ai bien peur d'y retrouver les mêmes incompatibilités que celles que je viens d'expliquer à l'instant. :::::::::::::Bien cordialement, [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 26 mai 2025 à 21:16 (CEST) :::::::::::::Mon correcteur orhtographique ne fonctionnant pas pour des commentaires aussi long, le message que je viens de laisser est truflé de fautes et je n'ai pas le temps ni le courrage de les corriger. Encore une fois, le travail que je fournis sur ce projet est tout à fait bénévole. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 26 mai 2025 à 21:21 (CEST) ::::::::::::::J'ai passé beaucoup de temps à élaborer le coaching sans coach. Ce n'est naturel pour aucun ancien élève de simplifier. Je ne sais pas combien de fois j'ai relu Comment Écrire des Histoires. J'ai toujours beaucoup de temps devant moi pour revoir mes livrels.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 10:51 (CEST) :::::::::::::::@[[Utilisateur:Matthius|Matthius]], c'est précisément parce que vous travailler beaucoup et que vous Me semblez de bonne foi et volonté, que je passe autant de temps à vous aiidez. Tous vos textes comprends des problèmes qu'il faut résoudre. Vous devriez commencer par supprimer tout ce qui fait référence à vous, à la religion et au politique, pour ne garder que des faits et affirmations vérifiées par des sources sûres et non partisannes, à chaque fois pour vous assurez que vous n'être pas simplement en train de diffuser ou colporter une opinion fausse et/ou partisane. Ce qui vient d'être dit est incontournable. :::::::::::::::Je penses ensuite qu'indique messages auxquelles ont été écrites vos sections sont superflues dans le cadre d'un ouvrage pédagogique. La chronologie de vos écrits n'est pas un bon un fil conducteur. Encore une fois, Wikilivres n'est pas un lieu pour publier ses mémoires ou ses réélections du jour. Il existe le format blog pour ce genre de choses. :::::::::::::::Tennez compte aussi que nous ne disposons pas forcément d'autant de temps et de motivation que pour revoir vos livres. Raison pour laquelle, des méthodes plus expéditives telles que la suppression complète des pages inadaptées à notre projet finiront par être appliquées. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 13:18 (CEST) ::::::::::::::::Le livrel le plus important pour moi est l'économie pour les enfants, vient ensuite devenir un génie. L'Univers est Vivant a été référencé sur les moteurs de recherche récemment parce que j'ai trouvé sur l'âme qui ralentit la vitesse. Quand on cherche matière temps âme sur les moteurs de recherche occidentaux on tombe sur ma page archive.org/details/TempsAme. Il n'y a toujours pas de chercheur qui a publié sur la mathématisation de ma trouvaille. L'univers est vivant est une amélioration d'un autre livre. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 13:56 (CEST) ::::::::::::::::Je viens de mettre mon [http://matthieu.giroux.free.fr/html/cv.htm CV] à jour pour montrer ce que j'ai influencé. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 14:05 (CEST) ::::::::::::::::C'est moi qui ai diffusé le terme économie réelle. Je reproche à ceux qui l'ont utilisé d'être des économistes scolaires, c'est à dire de se référer à l'économie monétaire pour parler d'économie réelle. Je peux cependant mettre un historique de cette économie sur la page wikipedia. Je me demande juste s'il va rester. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 14:08 (CEST) :::::::::::::::::Je suis désolé @[[Utilisateur:Matthius|Matthius]]. Je ne vais pas poursuivre nos conversations faute d'en avoir envie. Vous ma laissez sur cette impression que votre motivation première est de promouvoir votre personne, vos valeurs et vos idées. Je vais donc arrêter de vous consacrer du temps. Je suis ici pour soutenir et développer les projets et intérêts collectifs et non individuels. Bonne chance pour vos ambitions que je vous invite à réaliser en dehors des projets Wikipédia. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 15:00 (CEST) ::::::::::::::::::Mon projet relève de l'intérêt général de faire connaître l'économie du XIX{{e}} siècle de [[Henry Charles Carey]]. Mon égoïsme peut donc être aussi le vôtre. Pour moi il faut être intelligent et égoïste pour défendre l'intérêt général. Je pense qu'on peut tous avoir l'air de génies comme les enfants peuvent avoir l'air de génies. Oui, je suis militant et veux faire partager la joie de la politique. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 15:55 (CEST) :::::::::::::::::::Nous ne sommes donc pas sur la même longueur d'onde. Je vois invite à ne pas faire de militantisme sur les projets wikimedia. Il y a d'autres endois pour le faire. La blogosphère, des tribune comme agoravox, et de nombreux sites web tenus par des communautés militantes et reliée aux valeurs et idées pour lesquelles vous militer. Ceci est mon dernier message à ce sujet. Cordialement. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 16:18 (CEST) ::::::::::::::::::::Je vous mets au défi de penser que les wikipédiens ne sont pas des militants. Eux veulent aussi défendre l'intérêt général en apportant la connaissance. Par contre ils ne ciblent pas leurs apports. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 17:10 (CEST) ::::::::::::::::::::Comme prévu, on me dit que mon [https://fr.wikipedia.org/wiki/%C3%89conomie_r%C3%A9elle#Histoire ajout sur l'économie réelle] est inédit. Je pense que vous vous êtes intéressé à certains de mes écrits parce qu'ils vous apportaient des réponses. Je peux faire cela sur wikibooks. Seulement c'est encore plus difficile sur wikipedia. Je ne suis pas théseux. Oui l'économie réelle a été créée pour faire connaître l'économie physique de Lyndon Larouche. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 30 mai 2025 à 17:15 (CEST) :::::::::::::::::::::Merci quand même ! [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 31 mai 2025 à 00:24 (CEST) :Mon livrel l'univers est vivant [https://www.agoravox.tv/actualites/technologies/article/et-si-la-physique-quantique-avait-105532 a eu un impact]. Je pense aussi avoir influencé les jeunes qui se sont tournés vers la bible. == [Recherche universitaire] Questionnaire sur la gouvernance Wikimedia == Bonjour à toutes et à tous, Dans le cadre d’un mémoire de recherche sur les modèles de gouvernance décentralisés dans les communs numériques, je mène une étude analysant le mouvement Wikimedia. L’objectif est de mieux comprendre la perception qu’ont les contributeurs et contributrices des projets Wikimedia (Wikilivres, Wikipédia, Wikidata, Commons, etc.) de la Fondation Wikimedia, de ses décisions, et des relations avec les chapters locaux (ex. Wikimédia France). Un questionnaire anonyme, rapide à remplir (environ 5 minutes), a été conçu à cet effet. Il s’adresse à toute personne majeure ayant déjà contribué à un projet Wikimedia, quelle que soit l’ancienneté ou le niveau d’implication. Lien vers le questionnaire : framaforms.org/questionnaire-communaute-wikipedienne-et-la-wikimedia-fondation-1747225404 '''Important''' : Les résultats seront utilisés uniquement dans un cadre académique. L'enquête, ainsi que l'étude, ne sont ni commandités ni supervisés par la Fondation ou aucun chapitre local. Il s'agit simplement d'un projet scolaire que je mène {{sourire}}. Merci d’avance pour votre participation ! [[Utilisateur:3(MG)²|3(MG)²]] ([[Discussion utilisateur:3(MG)²|discussion]]) 27 mai 2025 à 10:43 (CEST) :J'ai répondu. Bon courage pour ton mémoire ! (Ça me fait penser que je dois avancer sur le mien aussi...) [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 29 mai 2025 à 23:28 (CEST) == Propagande, prosélitisme, autopromotion, militanatisme, etc == Bonjours à la communauté des contributeurs de Wikilivres. Je me dit qu'il serait bon de faire une nouvelle prise de décision pour mieux cadrer le contenu de notre projet par rapport à ce qui se situebdans le titre de ce message. Qu'en pensez-vous ? [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 16:22 (CEST) :Totalement {{Pour}} ! [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 29 mai 2025 à 21:53 (CEST) :L'économie financière peut être considérée comme une propagande puisque son utilisation ne permet pas de lier la macro-économie et la micro-économie, ne permettant donc pas de développer une société comme le fait l'[https://fr.wikipedia.org/wiki/%C3%89conomie_r%C3%A9elle économie réelle]. Par contre, l'économie réelle aurait pu être considérée comme une propagande tant qu'elle ne permettait pas de faire mieux que l'économie financière. :Si on considère le prosélytisme comme convaincre de rejoindre sa communauté, il faudrait donc enlever tous les wikilivres qui sont beaucoup lus, puisque les wikilivres qui sont peu lus n'arrivent pas à convaincre. Je pense que mon livrel l'[https://fr.wikibooks.org/wiki/Utilisateur:Matthius/%C3%89conomie_Enfants économie pour les enfants] arrive à convaincre, malgré quelques défauts qu'on peut régler. Je pense que c'est pour cela qu'il a été ajouté pour suppression pour ne laisser que l'économie financière. Oui, le livre parle de Dieu, mais les [https://www.agoravox.tv/actualites/technologies/article/interviews-avec-le-physicien-yves-105950 scientifiques aussi]. Le livre a été effacé, mais corrigé puis remis. Heureusement que [[User:Lionel Scheepmans|Lionel Scheepmans]] m'a permis de garder les images. :L'autopromotion permet malgré tout de connaître ce que fait l'auteur d'un wikilivre. Si on enlève le chemin qu'a suivi l'auteur, on évacuerait ainsi ses contradictions et on pourrait donc faire dire à un auteur l'inverse de ce qu'il a compris au bout de son parcours. Je suis pour qu'il y ait une page de l'auteur regroupant les livrels de l'auteur comme sur wikisource. :Je considère ceux qui contribuent à wikipedia et à wikibooks comme des militants, puisqu'ils essaient d'influencer les autres avec ce qu'ils écrivent sur ces sites web. Certes, certains travaux peuvent être désintéressés, mais alors pourquoi mettre ces travaux sur ces sites web alors. En effet le manque de passion crée des textes soporifiques. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 3 juillet 2025 à 22:36 (CEST) kod77jplbbjbop79i48z8pdzuxwc409 745895 745894 2025-07-03T21:11:50Z Matthius 11787 /* Propagande, prosélitisme, autopromotion, militanatisme, etc */ 745895 wikitext text/x-wiki <noinclude>{{Wikilivres:Le Bistro/En-tête}}</noinclude> == compléter les bons conseils pour un nouveau livre == bonjour wikilivre ! je refais un tour sur ce wiki depuis un sacré bout de temps. Je vois que certains noms sont toujours là :) wouah. J'ai entâmé un livre nouveau aka. [[La sécurité du citoyen dans son logement]] que je vais encore améliorer mais je me pose dejà quelques questions sur le process, et vu que [[Wikilivres/Créer un wikilivre]] est assez high level je préfère demander ici des conseils. J'aime à penser que si l'idée est pertinente le guide pourra évoluer rapidement. * '''AutoCat''': il est indiqué clairement dans le guide pour la page de garde du livre de mettre <code><nowiki>{{AutoCat}}</nowiki></code> en bas de page, mais est-ce conseillé également sur chaque page du livre ? ça a l'air de marcher et donc plutôt oui: & si oui on pourrait l'ajouter dans le guide ? * je ne sais pas quoi mettre dans `CDU item` : on peut peut être orienter vers une bonne page sur le comment remplir le template proposé sur la page de garde * '''navigation horizontale''': est-ce qu'un moyen universel permet de suivre les chapitres d'un livre ? ex. si je suis sur un chapitre et que je veux aller au suivant, soit je passe par la page parent, soit je passe par la catégorie. Mais je voudrai (mieux qu') un bouton "next" / "previous". Enfin voici l'idée. S'il y a des choses en template automatique, je suis preneur (peut être le guide aussi) (PS: je vois que la gestion du sommaire est automatisée au sein même d'un chapitre : génial :) ) :NB: à une certaines époque j'utilisais des templates propres au livre (ex. [[Modèle:Les félins]]) et je vois que certains livres ont repris l'idée.. * '''catégorie''' : que faut-il mettre exactement dans le contenu de la catégorie auto-générée pour le nouveau livre ? juste <code><nowiki>[[Catégorie:Livres par titre]]</nowiki></code> ? * '''livre modèle''' : avez-vous un livre "modèle" : c'est-à-dire un livre (probablement à succès & pas trop grand) qui serait particulièrement suivi par les habitués et sur lequel on retrouverai toutes les techniques les plus avancées pour bien rédiger un livre. Il apparaîtrait du coup en modèle dans le guide. qu'en pensez-vous ? [[Utilisateur:Boly38|Boly]] [[Discussion_Utilisateur:Boly38|♪]] 5 mars 2025 à 18:09 (CET) :Salut Boly :* Autocat : normalement, il ne se met que dans le modèle listant les chapitres du livre, inclus dans toutes les pages. Par exemple le modèle {{m|Programmation JavaFX}} est inclus comme ceci : <nowiki><noinclude>{{Programmation JavaFX}}</noinclude></nowiki>) dans tous les chapitres du livre [[Programmation JavaFX]]. :* [[Wikilivres:CDU]] : il y a un moteur de recherche pour trouver le classement, mais il n'est pas encore pleinement détaillé et parfois il faut créer les pages correspondantes à la CDU. J'utilise http://www.udcsummary.info/php/index.php?lang=fr pour ajouter les pages manquantes. Si tu trouves un ou plusieurs classement possibles, je peux me charger de créer les pages qui manquent. :* '''navigation horizontale''' : Fait automatiquement par l'inclusion du modèle dans toutes les pages. Voir par exemple : [[Programmation Java Swing/Introduction]]. Le modèle ajoute les liens suivant, précédent et une flèche au milieu pour déplier la liste complète des chapitres du livre. :Pour la catégorie, un petit descriptif, comme par exemple : <pre><nowiki> Catégorie recensant les pages du livre [[Programmation JavaFX]]. Pour discuter de la rédaction du livre c'est ici : [[Discussion:Programmation JavaFX]]. [[Catégorie:Java]] </nowiki></pre> :--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 5 mars 2025 à 19:22 (CET) ::J'ai fait des clics magiques (dans l'historique des pages) pour remercier ; je ne sais pas où ça atteri mais bon. Le template sommaire avec navigation par page c'est exactement ce que je voulais : c'est top :) & merci aussi pour les illustrations ! David L au top ! ! [[Utilisateur:Boly38|Boly]] [[Discussion_Utilisateur:Boly38|♪]] 7 mars 2025 à 18:04 (CET) == Problème de cache sur la page d'accueil == Salut, Les utilisateurs anonymes voient toujours les mêmes livres sur la page d'accueil (pendant plusieurs mois) alors que les livres changent tous les jours pour les utilisateurs connectés. Il faudrait installer l'extension [[mw:Extension:MagicNoCache]] afin de pouvoir utiliser <nowiki>__NOC</nowiki>ACHE__ sur la page d'accueil. --&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 29 mars 2025 à 20:56 (CET) :Bonjour, bien reçu, j'ai créé un ticket pour voir déjà si on peut diminuer ce cache à 24h (sinon il faudra voter pour l'extension) : https://phabricator.wikimedia.org/T390674. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<span style="color:#FF6600">$</span>♠]]) 1 avril 2025 à 11:46 (CEST) ::Merci JackPotte. ::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 1 avril 2025 à 19:00 (CEST) :::Un problème similaire a été signalé en 2023 [[phabricator:T351573]], et en 2017 [[phabricator:T119366]] mais pas la moindre action de correction depuis toutes les années écoulées. Les problèmes des "petits" wiki ne sont pas écoutés. :::J'ai donc créé la page de vote pour installer l'extension : [[Wikilivres:Prise de décision/Installer l'extension MagicNoCache]]. :::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 1 avril 2025 à 19:48 (CEST) ::::{{Mention|Lionel Scheepmans}}, {{Mention|Fourmidable}} : un avis / un vote sur ce sujet ? --&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 12 mai 2025 à 20:04 (CEST) :::::Je viens de donner mon avis sur la page idoine, merci du rappel ! [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 13 mai 2025 à 11:00 (CEST) == Erreur d'affichage sur la page d'accueil == Bonjour tout le monde, Un petit message pour savoir où nous en sommes sur le problème d'affichage dans la page d'accueil (débordement des cadres de livres suggérés sur la boîte à outils des utilisateurs connectés). Wikilivresquement, [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 26 avril 2025 à 17:59 (CEST) :Salut Fourmidable, :J'ai tenté de trouver une solution pour cet habillage, mais il est tellement mal conçu que ça semble impossible. :C'est le seul habillage qui pose problème, pour plusieurs pages et pas seulement la page d'accueil. :La décision arbitraire d'imposer cet habillage sans consulter la communauté du projet est une aberration. :Le mieux serait de : :# créer un bug pour l'habillage Vector-2022 qui ne fonctionne plus dès qu'il y a le moindre code CSS, :# créer une demande de fonctionnalité pour que les administrateurs du projet puisse sélectionner l'habillage par défaut par projet choisi par décision communautaire, :Mais comme les "petits wikis" ne sont pas écoutés, ce serait inutile (voir les nombreux exemples de problèmes reportés spécifiques à fr.wikibooks dont aucun n'a jamais été résolu). :--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 26 avril 2025 à 20:26 (CEST) ::Ok, en tout cas sache que je soutiens ta proposition ! [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 1 mai 2025 à 16:28 (CEST) == Matthius : le grand retour == Bonjour à tous, Quelqu'un veut-il bien m'aider à relire les [https://fr.wikibooks.org/w/index.php?title=Sp%C3%A9cial%3AContributions&target=Matthius&namespace=0&tagfilter=&newOnly=1&start=&end=&limit=50 nouveaux livres de Matthius] ? Il semble y avoir, une fois de plus, de graves problèmes de sourçage et des attaques (même déjà soulignées en 2023 !) contre "le libéralisme" et "la finance" avec des phrases obscures ; par exemple : * dans [[Conseils Chrétiens]] : "Le libéralisme empêche de voir la société. Alors on croit les films libéraux, faisant croire que l’individu fait la société, alors que c’est la société qui fait l’individu. En effet, notre ego est créé par notre famille." * dans [[Pourquoi un Dieu ?]] : "L'individualisme dû au libéralisme, de plus en plus prégnant, va par contre cacher de plus en plus notre sociabilité et notre créativité.", "le social-libéralisme ne sera que le moyen d'accéder au pouvoir par la voie opportune alors qu'on cachera le social au peuple, pour ne pas qu'il se comprenne. Le dirigeant social-libéral aura appris dans les écoles d'économie que les marchés c'est magique.", "désengager l'état, détruisant alors le développement donc la république", "La faille du libéralisme est la censure, censure permise par la pauvreté des esprits ayant peur des autres à cause de l'individualisme forcené. [...] Le libéralisme cherchera la censure pour empêcher qu'il y ait suffisamment d'esprits philosophes et créatifs s'intéressant à la politique.", "La finance croira alors qu'il faille installer une dictature pour liquider la population trop difficile à maîtriser. [...] il s'agit pour la finance de trouver de plus en plus d'illusions pour satisfaire la population" * dans [[Économie Enfants]] : le libéralisme a "rendu l’école non épanouissante par le manque de créativité, en disant que le pays ne peut plus se développer, à cause de la monnaie privée" et l'assertion non (mal ?) argumentée "Le libéralisme aboutit selon moi à l'abrutissement de l'individu, voire à la violence" * dans [[Devenir un Génie]] : "Ils sont ainsi devenus égoïstes, donc libéraux.", "le libéralisme peut apporter un manque de liberté, car c’est une doctrine et une idéologie orientée sur l'individu, individualisme cachant une société, allant alors vers la destruction du plus faible par une liberté sans limite.", "La finance a en fait tenté et tente de faire croire qu’elle s’occupe de notre liberté, alors qu’elle veut nous empêcher de nous émanciper." * dans [[Univers Vivant]] : "La finance veut que nous soyons des consommateurs alors que nous sommes des acteurs de la société.", "Pour les financiers la population pauvre doit souffrir de malnutrition.", la finance "devient alors autoritaire comme après la crise de 1929. Nous sommes à un moment crucial où nous pouvons remettre en cause l’idéologie scientiste aboutissant à nier la nature. Ainsi il y avait 1,7% de CO2 pendant le crétacé au lieu de 0,04 % en 2023." Notons que le dernier ouvrage en date, [[XXIe]], est particulièrement gratiné : * climatoscepticisme : "le GIEC aura causé une hécatombe de suicides pour un faux réchauffement de la terre" * théories du complot sur les résultats des élections occidentales : "Selon des journalistes de Sud Ouest diffusés sur Agora Vox qui ont récoltés les suffrages des élections de 2017 et qui ont suivi l’élection de 2022, Macron n’a pas été élu par les français. En réalité il est arrivé dernier des élections présidentielles de 2017.", "Emmanuel Macron avait des nuls médiatisés face à lui" * théories du complot sur la CIA et les démocrates américains : "les démocrates trichent sur les élections en 2021", "Les États-Unis sont partis d’Afghanistan pour préparer la guerre d’Ukraine" * biais prorusse : "la Russie entre en guerre contre l’Ukraine en février 2022, puisque l’Ukraine avait attaqué la Russie. Les médias occidentaux feront croire [...] que c’est la Russie qui attaque", "Vladimir Poutine est voulu par les russes, contrairement aux élus occidentaux. Les élections en Russie se déroulent suffisamment bien pour que la Russie soit considérée comme une démocratie." -- [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 11 mai 2025 à 17:24 (CEST) :J'ai lancé une série de [[Wikilivres:demandes de suppression|demandes de suppression]]. Je notifie les personnes ayant participé à l'[[Wikilivres:Demandes de suppression/2023|ancien débat (2023)]] : {{Mention|JackPotte}}, {{Mention|Lionel Scheepmans}} et {{Mention|DavidL}} pour info. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 12 mai 2025 à 11:23 (CEST) ::Salut @[[Utilisateur:Fourmidable|Fourmidable]].. C'est bien que tu inspecte le contenu de Wikiversité à la recherche de contenu indésirable ou problématiques. Mais je vois dans le titre de ce sujet de discussion une forme de sarcasme et de condescendance qui ne me semble pas adapter à un projet collaboration où tout le monde est le bienvenu peu importe ses croyance et ses idée. De plus la première personne concernée, c'est à dire l'auteur, n'y est pas notifiée. ::Ensuite, il fauétait une fois se mettre d'accord sur le fait que la ligne éditoriale de Wikiversité est différente à celle de Wikipedia. Un recueil de cours et de travaux de recherche, ce n'est pas une encyclopédie. On en a déjà discuté. La neutralité de point de vue n'existe pas dans l'enseignement ni dans la recherche. ::Pour preuve, mon fils a un cours de religion dans SZ formation secondaire et il peut choisir entre différentes religion ou opter pour un cours de morale et de citoyenneté. À l'université, les orientation idéologique des enseignants son souvent bien connue. Et il est évident que l'enseignement dans une business school sera plus libérale qu'une fac de théologie. ::Dans le cadre des travaux de recherches, la Liberté d'expression doit être complète, l'auteur doit être libre d'y faire ses propre interprétations des faits et développant sa propre argumentation. Sans quoi, c'est plus de la recherche. ::Finalement, un support d'enseignement dans un projet collaboratif, n'est pas un projet de recherche. On ne parle pas en "je" dans un cours, on le fait dans une recherche. Or, l'usage du "Je" implique une certaine subjectivité. ::En conclusion, je ne vois pas ce nouvelle appel dans la forme et l'énergie qu'il se présente, comme quelque chose de très collaboratif. Et je n'ai pas envie de jouer à nouveau le médiateur dans ce redémarage d'une confrontation idéologique entre deux contributeurs incapable de collaborer dans la production de contenu de qualité. ::Plutôt que de faire du rameutage ici, je te proposeraient plutôt, selon tes disponibilités, de collaborer aux écrits des auteurs en discutant avec eux sur le page de discussions de leurs articles au sujet des améliorations possibles. Plutôt que de faire appel à la suppression de toute une page pour certains passages problématiques, une démarche collaboratif serait d'aider à la résolutions de ces problèmes, dans le but de ne pas perdre tout le reste de la page. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 13:20 (CEST) :::Tu as raison, je notifie aussi {{Mention|Matthius}} en espérant que cette fois son comportement soit plus constructif... Concernant les ouvrages qui sont moins problématiques, j'ai fait des demandes dans les pages de discussion idoines. Ici on a des ouvrages clairement complotistes et anti-science qui nuisent à la réputation de Wikilivres. (PS : Nous sommes sur Wikilivres, pas sur Wikiversité ;)) [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 12 mai 2025 à 13:21 (CEST) ::::Entre-nous @[[Utilisateur:Fourmidable|Fourmidable]], je ne trouve pas ton comportement plus constructif, ni collaboratif que le tien... [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 13:24 (CEST) :::::À mes yeux et dans le cadre d'un projet collaboratif, commencer par une demande de suppression avant toute chose peut même être perçu comme violant. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 13:26 (CEST) ::::::Mon but n'est pas de faire une croisade pour le libéralisme ou le GIEC sur Wikilivres, mais il y a quand même des limites pour tenir la réputation du site et plus largement de la Wikimedia Foundation. Je te rejoins sur le fait que les auteurs ne doivent pas être libres d'écrire absolument tout ce qu'ils veulent, et aussi que la critique doit être constructive, mais ce n'est pas au créateur du livre d'être le seul arbitre de ce qui est raisonnable ou pas vis-à-vis de son travail (i.e. simple reformulation, suppression partielle ou totale...). Et en 2023 Matthius a montré un comportement très agressif vis-à-vis de mes critiques, ce qui a mené '''ensuite''' à des débats de suppression. Pour l'instant, je ne fais que soulever des phrases (souvent identiques à celles de 2023) que je trouve (de nouveau) hautement problématiques d'un point de vue scientifique (manque voire absence totale de sourçage), mais le passage par des demandes de suppression directement se justifie par une forme de récidive sur certaines affirmations auxquelles aucune amélioration n'a été apportée après critique. Tu m'accuses de rameutage, mais je ne fais que consulter la communauté dans son ensemble : ici pour une discussion globale, sur [[Wikilivres:Demandes de suppression]] pour un débat et un "vote" au cas par cas. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 12 mai 2025 à 13:34 (CEST) :::::::Désolé aussia pour le côté péjoratif du terme rameutage. Parlons de notiffication c'est plis adéquat. :::::::Je réalise seulement que l'on est sur wikilivres et pas Wikiversité. Désolé sur mon smartphone ça ne saute pas aux yeux. Il faut donc recontextualiser tout ce que j'ai écrits précédement. Heureusement, historiquement Wikiversité est un sous projet de wikilivre. Les deux projet sont très proches dans leurs mission pédagogique et mode de fonctionnement. L'objet ici étant de produire des livres pédagogiques pour toute les tranches d'âges et pas uniquement des ouvrages qui doivent répondre à à des attentes scientifiques. Il apparait dans tes propos des thermes très wikipédien tel que le sourçage et la neutralité de point de vue. Je ne pense pas que cela doit s'appliquer ici. :::::::Ensuite Wikilivres est trop petit pour avoir un commuté d'arbitrage et je n'ai pas envie de parcourir les historiques à la recherche de qui a commencé. Mais je maintient l'idée que notifier des personnes vers un appel à suppression est une démarche que je considère symboliqueemnt violente et me semble aussi être une récidive. :::::::As-tu cherché à améliorer les texte en question en discutant avec l'auteur avant de proposer leurs suppression ? :::::::As-tu conscience que nous sommes ici dans un projet collaboratif, pluraliste et non universitaire ? [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 15:02 (CEST) ::::::::Du reste, nous ne sommes pas ici pour répondre à des suposées attentes de la Fondation Wikimedia. Car le rôle de celle-ci est précisément de répondre aux notres. C'est le rôle d'une fondation. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 15:07 (CEST) :::::::::Bonjour, :::::::::Il faudrait avant tout classer les écrits de l'auteur, car il pourrait il y avoir un problème d'admissibilité, Wikilivres étant avant tout un projet de rédaction de livres '''pédagogiques'''. Ces écrits contiennent beaucoup d'avis personnels et présentent une vision sans discussion ni argumentation, sans apporter de pédagogie sur un sujet particulier. :::::::::Si on peut qualifier les écrits comme de la recherche, il vaudrait mieux les déplacer vers la wikiversité, où une communauté supplémentaire et plus expérimentée sur la recherche pourrait exprimer son avis sur le sujet ou sur comment améliorer/corriger les écrits de Matthius. :::::::::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 12 mai 2025 à 20:01 (CEST) ::::::::::Je plussoie {{Mention|DavidL}}. {{Mention|Lionel Scheepmans}} ce que tu dis s'applique aux cas où il y a une réelle démarche scientifique ou a minima une attitude collaborative de la part de l'auteur. Or : ::::::::::* premièrement (tu le sais sans doute, étant toi-même chercheur), les livres de Matthius sont très loin de toute méthode scientifique, c'est plutôt un ensemble d'assertions non sourcées qui font la promotion d'une idéologie (et on verse même dans l'antiscience avec les paragraphes sur le GIEC). On pourrait donner la parole à Matthius sur ce sujet mais je crains qu'il ne se définisse même pas lui-même comme scientifique ; ::::::::::* deuxièmement, avec cette série de recréations le 8 décembre dernier, sans attendre l'avis de la communauté, et avec les '''mêmes phrases''' problématiques (parfois à peine reformulées, souvent conservées à l'identique), je ne vois pas comment on pourrait supposer que Matthius fait preuve d'ouverture d'esprit et d'attitude collaborative. ::::::::::Bref, si vous voulez absolument garder tous ces ouvrages et essayer de composer tant bien que mal avec la pugnacité de leur auteur, ce sera sans moi... À mon avis, il serait nettement plus profitable de traduire les livrels de [[:en:Subject:Economics|Wikibooks en anglais sur l'économie]], par exemple. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 13 mai 2025 à 11:07 (CEST) :::::::::::Je viens de prévenir Matthius par mail. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 13 mai 2025 à 11:12 (CEST) ::::::::::::Tree bien. Moi aussi, je n'ai plus envie de consacrer du temps là dessus. Je vous laisse donc traiter la situation puisque votre avis est majoritaire. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 13 mai 2025 à 11:27 (CEST) :::::::::::Je ne comprends pas cette assertion. Je cite François Gervais contre le GIEC, qui a écrit pour le GIEC sans être entendu pour la conclusion. :::::::::::Je n'ai pas reformulé mes phrases à l'identique. J'ai soit indiqué la source contrairement à ce qui dit Fourmidable, soit indiqué que c'était mon point de vue ou émis une explication. Aussi quand je fais une assertion scientifique, j'en indique souvent la cause scientifique. Fourmidable a tendance à reprendre les phrases où je répète ce qui a été écrit avant pour aller plus loin. Donc il faut chercher dans mes livrels la phrase où je cite et où j'émets une hypothèse avec la cause scientifique. Je vais relire Fourmidable. :::::::::::Aussi j'ai trouvé sur l'[http://web.archive.org/web/20240810201141/https://www.google.com/search?q=mati%C3%A8re+temps+%C3%A2me âme qui ralentit la vitesse]. Je pense que Google utilise une IA pour détecter les limites de l'humain. Mon expérience de pensée va contre le matérialisme scientifique puisque j'émets l'hypothèse supérieure qu'il existe des multivers où des âmes agissent sur le nôtre. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 13 mai 2025 à 11:36 (CEST) :::::::::::Je ne pense pas effectivement que mon livrel sur le XXIe va rester sur wikibooks puisque il va contre ce qu'indique wikipedia. J'espère juste qu'il puisse rester. :::::::::::Seulement j'ai une formation en ingénierie et j'ai trouvé sur [https://archive.org/details/TempsAme l'âme qui ralentit la vitesse] [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 13 mai 2025 à 12:13 (CEST) ::::::::::Vous admettez {{Mention|DavidL}} que vous ne connaissez pas les domaines que j'aborde. Mes livrels sont pédagogiques donc vous pouvez apprendre avec. Donc lisez les avant d'émettre l'hypothèse qu'ils ne le sont pas. J'ai créé le coaching sans coach qui a permis de revoir la pédagogie d'un journal d'un réseau international. Mais cela ne m'empêche pas d'aller contre le libéralisme et l'appât du gain qui sont selon moi les fléaux actuels. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 13 mai 2025 à 12:06 (CEST) :::::::::::@[[Utilisateur:Matthius|Matthius]] semble ouvert au débat et à une aide pour améliorer ses textes. La suppression ne me semble donc pas une option souhaitable. Wikilivres est indépendant de Wikipédia. Il faut donc se référer à nos règles et recommandations locale disponible dans les espaces de noms "wikilivres" et "aide". Je vais essayer de prendre le temps d'écouter les textes avec une voix de synthèse pour gagner du temps. Cela me permettra d'en faire des commentaire en vue d'une amélioration. Car si ce sont des sources qui manques et bien il suffit de les ajouter. Nous sommes là pour travailler ensemble pour produire des ouvrages pédagogiques de qualité, pas pour juger du travail des autres en vue d'une suppression. Restons, s'il vous plait dans un esprit d'entraide et de collaboration. C'est tellement rare à notre époque... [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 14 mai 2025 à 15:00 (CEST) :::::::::::Mon livrel sur le XXIe siècle en cours d'écriture va aussi contre les théories du complot occidentales. J'écris que la Russie et la Chine sont des démocraties, alors que nos médias disent que ce sont des dictatures. J'émets effectivement des hypothèses non sourcées dans ce nouveau livrel. Je peux et vais les sourcer. Par contre j'utiliserai des sources primaires. En réalité, j'émets l'hypothèse que ce sont nos médias qui sont dans la post-vérité et que ce ne sont pas les médias étatsuniens, ni russes, ni chinois qui y sont. Ce livrel est effectivement une bombe dangereuse contre nos médias comme l'indique Fourmidable. ::::::::::::Je ne comprends pas l'acharnement de Fourmidable à ne pas vouloir discuter avec moi et à vouloir automatiquement supprimer mes livrels sans discussion préalable. En effet il a eu un an pour m'indiquer comment améliorer mes livrels. Et que Fourmidable ne me dise pas que c'est moi qui ait commencé, puisque j'étais outré qu'on veuille supprimer mes livrels avec ses copains sans discussion pédagagogique au tout début. ::::::::::::Concernant la neutralité de wikipedia : wikipedia ne fait que révéler l'avis des médias financés donc il n'est pas neutre. Être neutre c'est révéler tous les points de vue, même ceux avec lesquels on n'est pas d'accord, ce que [https://archive.org/details/wikipediaCo-Fondateur fit wikipedia au début de son histoire] et ce pour quoi je me suis intéressé et ai été réprimé sauf pour wikibooks anglais qui m'a viré pour ne pas enlever mon nom. :{{Mention|Matthius}} Avez-vous l'intention de publier des livres scientifiques, c'est-à-dire sourcés par de la science publiée et évaluée par les pairs, et à défaut de grands médias nationaux et internationaux ? Vous pouvez aussi tester vos hypothèses mais votre travail ne doit pas consister à sélectionner les sources qui vous conviennent pour seulement valider votre théorie, en mettant de coté tout ce qui vous dérangerait dans cette entreprise. --[[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 10:48 (CEST) ::@[[Utilisateur:Fourmidable|Fourmidable]], je pense que tu te fais une vision fausse du monde de l'édition. @[[Utilisateur:Matthius|Matthius]] peut payé une maison d'édition, dans le cadre d'une [[w:Édition_à_compte_d'auteur|édition à compte d'auteur]]. Probablement qu'il l'a déjà fait puisqu'il a déjà publié des ouvrages au format papier parmi ceux qu'il veut placer sur Wikilivres. Il en a même déposé certains dans une bibliothèque universitaire. Quant à la revue par les paires ne se fait que dans le cadre des journaux scientifique. ::J'ai écouté l'ouvrage [[Pourquoi un Dieu ?]] Et je trouve effectivement qu'il n'a pas sa place dans Wikilivres. Non pas parce qu'il critique le libéralisme avec des propos que je partage en grande partie, mais parce qu'il s'apparente plus à de la propagande chrétienne qu'à un réel ouvrage pédagogique sur le sujet. ::Matthius y est en posture de prédicateur et non de pédagogue. Je dirais que la moitié des phrases de l'ouvrage que j'ai écouté sont des affirmations sans argumentation ni démonstration valide. La thèse de son ouvrage se résume à dire que dieu est la seule chose qui peut expliquer un phénomène actuellement inexpliqué. Ce qui est une corrélation fallacieuse puisqu'il n'existe aucun lien de causalité. ::Pour moi, les ouvrages évangéliste ou propagandiste n'ont pas leur place dans Wikilivres et je serais d'avis d'ouvrir une prise de décision pour établir une règle d'interdiction. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 11:42 (CEST) :::Oui voilà, nous sommes d'accord. Peut-être que Matthius peut adopter une attitude plus scientifique, mais l'esprit de "pédagogie" s'accompagne forcément d'une démarche scientifique, sinon c'est de la prédication/propagande. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 11:45 (CEST) ::::@[[Utilisateur:Fourmidable|Fourmidable]]... Wikilivres n'est pas une bibliothèque "scientifique" mais pédagogique. Tu sembles confondre les deux termes. Les livres pour enfants que contient Wikilivres ne sont pas "scientifique" tout en étant pédagogiques. ::::Un autre fait qui peut être reproché à @[[Utilisateur:Matthius|Matthius]] est son autopromotion, [[Wikilivres:Présentation#● Wikilivres n'est pas une vitrine|alors que la démarche proscrite sur Wikilivres]]. ::::Plutôt que de supprimer l'important travail effectué par Matthius, je propose à nouveau de le déplacer en sous page de son espace utilisateur pour qu'il puisse retravailler ses écrits. ::::Pour un retour dans l'espace principale, il faudrait au préalable qu'il supprime des ses travaux toute forme d'autopromotion et toute forme propagande, prosélytisme ou autre type de discours prédicateur. Ceci notamment en référence aux choix politiques [https://www.senat.fr/leg/ppl17-386.html français], [https://www.rtbf.be/article/le-proselytisme-religieux-ou-politique-n-a-pas-sa-place-a-l-ecole-quels-chiffres-derriere-ce-phenomene-pointe-par-la-ministre-de-l-education-11477234 belge], [https://www.assnat.qc.ca/fr/travaux-parlementaires/projets-loi/projet-loi-94-43-1.html Quebec], [https://ge.ch/grandconseil/data/loisvotee/L11764.pdf suisse]. Quatres communautés culturelles très largement majoritaire dans l'espace francophone des projets Wikimédia. ::::J'invite Matthius et les autres membres de notre communauté réagir à ce message et de discuter du lancement d'une nouvelle prise de décision pour interdire la propagande et le prosélytisme dans Wikilivres. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 12:21 (CEST) :::::Ce que je veux dire, c'est qu'un bon livre pédagogique s'appuie forcément sur des connaissances scientifiques. Ok pour un redéplacement. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 12:37 (CEST) ::::::Ne fais pas à ton tour du prosélytisme scientifique @[[Utilisateur:Fourmidable|Fourmidable]]. La science et les connaissances dites scientifiques comme tu les entends n'est pas la seule chose sur laquelle on peut s'appuyer pour produire un contenu pédagogique. ::::::Que fais-tu de la méditation, de l'humour, de la poésie, de la musique, du dessin, et toute autre expression artistique ? ::::::Et il existe aussi un tas d'ouvrages pédagogique religieux (pour le catéchisme entre autre), sauf que, comme la plupart des législations nationales des pays francophones occidentaux, je pense qu'ils n'ont pas leur place dans Wikilivres. Ce sur quoi nous devons nous positionner dans une prise de décision collective. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 12:52 (CEST) :::::::Ah oui, dans ce sens-là il y a en effet moins de science à proprement parler… Mais je ne suis pas sûr que cela s'applique aux propos politiques. Ça ne me viendrait pas à l'idée de faire un Wikilivre afin de convertir les gens au libéralisme, par exemple. C'est le rôle d'autres wikis ou sites web spécialisés. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 14:44 (CEST) :::Je vais supprimer Du même Auteur et Du même éditeur de mes wikilivres. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 15 mai 2025 à 12:32 (CEST) ::::Si vous voulez, mais c'est loin d'être le point principal. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 12:38 (CEST) :::::Effectivement @[[Utilisateur:Matthius|Matthius]], c'est une bonne résolution, mais il reste le prosélytisme à résoudre et je pense que cela demande beaucoup de travail à réaliser dans votre espace de travail personnel. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 12:55 (CEST) ::::::Vous mettiez que seul Pourquoi un Dieu est prosélyte. J'avais effectivement un doute en ajoutant ce livrel. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 15 mai 2025 à 19:43 (CEST) :::::::Je n'ai pas encore eu le temps d'écouter les autres livres @[[Utilisateur:Matthius|Matthius]] . Nous somme tous bénévoles ici. Cela peut prendre du temps, mais je vous invite déjà à déplacer vous-même le livre ''Pourquoi un Dieu'' dans vos sous page utilisateur''.'' :::::::Par anticipation, je peux déjà dire que tous les autres ouvrages faisant la publicité de vos écris doit être modifier ou retirer de l'espace principale ainsi que tous ceux qui font référence à Dieu ou au catholicisme de manière prosélyte. :::::::Seul le nom des auteurs devrais être repris dans les livre avec éventuellement des hyperliens vers leurs pages utilisateur qu'il sont libre d'éditer comme il veulent. :::::::On peut ensuite créer des pages catégories qui reprennent tous les travaux des auteurs, avec l'avantage qu'elle se complétent automatiquement à chaque fois que l'on ajoute une catégorie en bas de page d'un ouvrage. Vous trouverrez certainement des indication dans les pages d'aide. :::::::Je vous rassure sur le fait que ce traitement serait semblable pour un politicien libéral faisant la publicité de son parti, de ses idéologies et de sa personne. N'hésitez pas d'ailleurs à parcourir les autres wikilives pour y détecter ce genre de problème avant de nous le signaler. C'est ce que fait @[[Utilisateur:Fourmidable|Fourmidable]] en cherchant à veiller sur la qualité et la conformité de notre projet. Une belle fin de journée ! [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 16 mai 2025 à 11:41 (CEST) ::::::::Pour info, je confirme et soutiens tout ce que propose {{Mention|Lionel Scheepmans}} dans son dernier message (merci à lui). [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 16 mai 2025 à 12:01 (CEST) ::::::::Pourquoi a Dieu a été mis à jour dans mon espace personnel. Je ne sais pas comment effacer une page wikibooks.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 16 mai 2025 à 12:24 (CEST) :::::::::@[[Utilisateur:Matthius|Matthius]]. Je ne comprends pas ce que vous dite. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 16 mai 2025 à 15:16 (CEST) ::::::::::J'ai copié-collé Pourquoi un Dieu dans ma page personnelle. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 16 mai 2025 à 21:36 (CEST) :::::::::::Ah très bien @[[Utilisateur:Matthius|Matthius]]. Mais en fait, il est possible de déplacer les pages en les renomant. Cela permet de conserver tout l'historique de l'édition. Je vais le faire quand je serai sur PC. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 17 mai 2025 à 03:34 (CEST) ::::::::::::Ne le faites pas : L'original de l'historique est sur mon espace perso. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 17 mai 2025 à 09:30 (CEST) :::::::::::::@[[Utilisateur:Matthius|Matthius]], j'ai écouté l'ouvrage Économie enfant. Si j'étais à la tête d'une maison d'édition, je ne publierais pas ce manuscrit. Il y a des passages très intéressants avec des idées originales que je partage, mais aucune argumentation pour les valider. Pour le reste, on retrouve un copié collé du précédent ouvrage. Beaucoup d'information factuelle sans réelle contextualisation ni fil conducteur et puis de nombreuses affirmations gratuites qui ne sont finalement que des opinions très relatives et de nouveau non argumentées. :::::::::::::Le pire étant que certaine de ces affirmations son tout simplement fausses ou inscensées. :::::::::::::Exemples d'une phrase : :::::::::::::« Écrire sur ce que vous comprenez de l’archéologie, qui est l’humanité avant l’écriture. » :::::::::::::Cette phrase est erronée et n'a même aucun sens. L'archéologie n'est pas l'humanité, mais un domaine des sciences créé par les humains. Ensuite, l'archéologie n'est pas quelque chose qui se limite à avant l'écriture. Il existe des nombreux sites archéologiques qui fouillent les vestiges de la Rome antique. Une civilisation qui n'était pas dénuée d'écriture. :::::::::::::Exemple d'un paragraphe : :::::::::::::« Le [[w:Capital|capital]] de l’humanité peut donc être la Terre. En effet, l'argent est produit à partir du papier venant du bois. Les trafiquants ont toujours voulu se l'approprier. Le capital pourrait donc ne pas être l’argent. Le troc nécessite cependant un patrimoine conséquent. La Chine veut s’approprier le capital Lune, pour y prendre l’Helium 3 selon Solidarité et Progrès, seule ressource lunaire qu'il est intéressant de transporter, afin de le fusionner, pour en obtenir de l’énergie illimitée, favorisant la créativité par le surplus de biens. » :::::::::::::Ce paragraphe est incompréhensible et citer un parti politique (à d'autres reprises aussi dans l'ouvrage) comme source pour poser une affirmation, pose deux gros problèmes. 1 celui de faire la publicité d'une idéologie au sein d'un écrit pédagogique, 2 celui de ne pas respecter un des principes de base de l'écriture scientifique alors que le livre en parle et la défend. :::::::::::::Je n'irai pas plus loin dans les exemples. :::::::::::::Dans leurs états actuels et pour que ces livres travaux d'écritures soient admissibles dans Wikilivres. Je pense que vous devez impérativement supprimer : :::::::::::::* toute promotion personnelle. :::::::::::::* toute forme de Prosélytisme religieux. :::::::::::::* toute forme de publicité ou contre publicité politique et partisane :::::::::::::* toute affirmation fausse et autres types de fabulations. :::::::::::::* tout raisonnement ou démonstration sans lien de causalité. :::::::::::::Suite à quoi, il faudrait encore dans l'idéal en améliorer le style de sorte à y développer un fil conducteur qui permettrait aux lecteurs de suivre un développement ordonné propice à l'apprentissage, et non leur soumettre un journal de réflexions personnelles, reprenant des erreurs factuelles et logiques. :::::::::::::C'est un travail conséquent. :::::::::::::Et en ce qui concerne le prosélytisme, les approches politiques partisanes, il est impératif, y compris les sous page de votre page utilisateur. :::::::::::::Il y a des idées intéressantes dans vos écrits, et je partage pas mal de vos points de vue concernant la question du néolibéralisme. Mais Wikilivres n'est pas une tribune d'opinion à l'image d'AgoraVox. Nous sommes ici pour produire des ouvrages pédagogiques. Pas pour influencer nos lecteurs en faveurs ou à l'encontre de certaines religions ou idéologies. :::::::::::::Tout en l'encourageant à le faire de manière plus courtoise et constructive, je remercie donc @[[Utilisateur:Fourmidable|Fourmidable]] de nous avoir alerté sur l'incompatibilité de vos ouvrages avec notre projet. Dans tous les cas ceux que j'ai écoutés jusqu'à présent. :::::::::::::J'aimerais à votre tour vous encourager à poursuivre vos travaux d'écriture en cherchant à vous rapprocher de notre objectif tout en respectant nos règles et recommandations. Mais sachez aussi que vous pouvez aussi améliorer l'article de Wikipédia sur l'[[w:Économie_réelle|économie réelle]]. Ou aussi développer une leçon sur Wikiversité sur le même sujet dans la [[v:Faculté:Économie|Faculté d'Économie]]. C'est un sujet intéressant qui permet de mettre en lumières les limites de la [[w:Finance|finance]]. :::::::::::::Ces deux activités seraient moins ambitieuses que de vouloir produire un livre de qualité pour expliquer l'économie aux enfants. Cela demande une grande maîtrise du sujet en plus d'un certain don pour la vulgarisation. :::::::::::::Il me reste deux ouvrages proposés à la suppression à écouter, mais j'ai bien peur d'y retrouver les mêmes incompatibilités que celles que je viens d'expliquer à l'instant. :::::::::::::Bien cordialement, [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 26 mai 2025 à 21:16 (CEST) :::::::::::::Mon correcteur orhtographique ne fonctionnant pas pour des commentaires aussi long, le message que je viens de laisser est truflé de fautes et je n'ai pas le temps ni le courrage de les corriger. Encore une fois, le travail que je fournis sur ce projet est tout à fait bénévole. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 26 mai 2025 à 21:21 (CEST) ::::::::::::::J'ai passé beaucoup de temps à élaborer le coaching sans coach. Ce n'est naturel pour aucun ancien élève de simplifier. Je ne sais pas combien de fois j'ai relu Comment Écrire des Histoires. J'ai toujours beaucoup de temps devant moi pour revoir mes livrels.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 10:51 (CEST) :::::::::::::::@[[Utilisateur:Matthius|Matthius]], c'est précisément parce que vous travailler beaucoup et que vous Me semblez de bonne foi et volonté, que je passe autant de temps à vous aiidez. Tous vos textes comprends des problèmes qu'il faut résoudre. Vous devriez commencer par supprimer tout ce qui fait référence à vous, à la religion et au politique, pour ne garder que des faits et affirmations vérifiées par des sources sûres et non partisannes, à chaque fois pour vous assurez que vous n'être pas simplement en train de diffuser ou colporter une opinion fausse et/ou partisane. Ce qui vient d'être dit est incontournable. :::::::::::::::Je penses ensuite qu'indique messages auxquelles ont été écrites vos sections sont superflues dans le cadre d'un ouvrage pédagogique. La chronologie de vos écrits n'est pas un bon un fil conducteur. Encore une fois, Wikilivres n'est pas un lieu pour publier ses mémoires ou ses réélections du jour. Il existe le format blog pour ce genre de choses. :::::::::::::::Tennez compte aussi que nous ne disposons pas forcément d'autant de temps et de motivation que pour revoir vos livres. Raison pour laquelle, des méthodes plus expéditives telles que la suppression complète des pages inadaptées à notre projet finiront par être appliquées. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 13:18 (CEST) ::::::::::::::::Le livrel le plus important pour moi est l'économie pour les enfants, vient ensuite devenir un génie. L'Univers est Vivant a été référencé sur les moteurs de recherche récemment parce que j'ai trouvé sur l'âme qui ralentit la vitesse. Quand on cherche matière temps âme sur les moteurs de recherche occidentaux on tombe sur ma page archive.org/details/TempsAme. Il n'y a toujours pas de chercheur qui a publié sur la mathématisation de ma trouvaille. L'univers est vivant est une amélioration d'un autre livre. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 13:56 (CEST) ::::::::::::::::Je viens de mettre mon [http://matthieu.giroux.free.fr/html/cv.htm CV] à jour pour montrer ce que j'ai influencé. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 14:05 (CEST) ::::::::::::::::C'est moi qui ai diffusé le terme économie réelle. Je reproche à ceux qui l'ont utilisé d'être des économistes scolaires, c'est à dire de se référer à l'économie monétaire pour parler d'économie réelle. Je peux cependant mettre un historique de cette économie sur la page wikipedia. Je me demande juste s'il va rester. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 14:08 (CEST) :::::::::::::::::Je suis désolé @[[Utilisateur:Matthius|Matthius]]. Je ne vais pas poursuivre nos conversations faute d'en avoir envie. Vous ma laissez sur cette impression que votre motivation première est de promouvoir votre personne, vos valeurs et vos idées. Je vais donc arrêter de vous consacrer du temps. Je suis ici pour soutenir et développer les projets et intérêts collectifs et non individuels. Bonne chance pour vos ambitions que je vous invite à réaliser en dehors des projets Wikipédia. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 15:00 (CEST) ::::::::::::::::::Mon projet relève de l'intérêt général de faire connaître l'économie du XIX{{e}} siècle de [[Henry Charles Carey]]. Mon égoïsme peut donc être aussi le vôtre. Pour moi il faut être intelligent et égoïste pour défendre l'intérêt général. Je pense qu'on peut tous avoir l'air de génies comme les enfants peuvent avoir l'air de génies. Oui, je suis militant et veux faire partager la joie de la politique. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 15:55 (CEST) :::::::::::::::::::Nous ne sommes donc pas sur la même longueur d'onde. Je vois invite à ne pas faire de militantisme sur les projets wikimedia. Il y a d'autres endois pour le faire. La blogosphère, des tribune comme agoravox, et de nombreux sites web tenus par des communautés militantes et reliée aux valeurs et idées pour lesquelles vous militer. Ceci est mon dernier message à ce sujet. Cordialement. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 16:18 (CEST) ::::::::::::::::::::Je vous mets au défi de penser que les wikipédiens ne sont pas des militants. Eux veulent aussi défendre l'intérêt général en apportant la connaissance. Par contre ils ne ciblent pas leurs apports. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 17:10 (CEST) ::::::::::::::::::::Comme prévu, on me dit que mon [https://fr.wikipedia.org/wiki/%C3%89conomie_r%C3%A9elle#Histoire ajout sur l'économie réelle] est inédit. Je pense que vous vous êtes intéressé à certains de mes écrits parce qu'ils vous apportaient des réponses. Je peux faire cela sur wikibooks. Seulement c'est encore plus difficile sur wikipedia. Je ne suis pas théseux. Oui l'économie réelle a été créée pour faire connaître l'économie physique de Lyndon Larouche. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 30 mai 2025 à 17:15 (CEST) :::::::::::::::::::::Merci quand même ! [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 31 mai 2025 à 00:24 (CEST) :Mon livrel l'univers est vivant [https://www.agoravox.tv/actualites/technologies/article/et-si-la-physique-quantique-avait-105532 a eu un impact]. Je pense aussi avoir influencé les jeunes qui se sont tournés vers la bible. == [Recherche universitaire] Questionnaire sur la gouvernance Wikimedia == Bonjour à toutes et à tous, Dans le cadre d’un mémoire de recherche sur les modèles de gouvernance décentralisés dans les communs numériques, je mène une étude analysant le mouvement Wikimedia. L’objectif est de mieux comprendre la perception qu’ont les contributeurs et contributrices des projets Wikimedia (Wikilivres, Wikipédia, Wikidata, Commons, etc.) de la Fondation Wikimedia, de ses décisions, et des relations avec les chapters locaux (ex. Wikimédia France). Un questionnaire anonyme, rapide à remplir (environ 5 minutes), a été conçu à cet effet. Il s’adresse à toute personne majeure ayant déjà contribué à un projet Wikimedia, quelle que soit l’ancienneté ou le niveau d’implication. Lien vers le questionnaire : framaforms.org/questionnaire-communaute-wikipedienne-et-la-wikimedia-fondation-1747225404 '''Important''' : Les résultats seront utilisés uniquement dans un cadre académique. L'enquête, ainsi que l'étude, ne sont ni commandités ni supervisés par la Fondation ou aucun chapitre local. Il s'agit simplement d'un projet scolaire que je mène {{sourire}}. Merci d’avance pour votre participation ! [[Utilisateur:3(MG)²|3(MG)²]] ([[Discussion utilisateur:3(MG)²|discussion]]) 27 mai 2025 à 10:43 (CEST) :J'ai répondu. Bon courage pour ton mémoire ! (Ça me fait penser que je dois avancer sur le mien aussi...) [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 29 mai 2025 à 23:28 (CEST) == Propagande, prosélitisme, autopromotion, militanatisme, etc == Bonjours à la communauté des contributeurs de Wikilivres. Je me dit qu'il serait bon de faire une nouvelle prise de décision pour mieux cadrer le contenu de notre projet par rapport à ce qui se situebdans le titre de ce message. Qu'en pensez-vous ? [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 16:22 (CEST) :Totalement {{Pour}} ! [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 29 mai 2025 à 21:53 (CEST) :L'économie financière peut être considérée comme une propagande puisque son utilisation ne permet pas de lier la macro-économie et la micro-économie, ne permettant donc pas de développer une société comme le fait l'[https://fr.wikipedia.org/wiki/%C3%89conomie_r%C3%A9elle économie réelle]. Par contre, l'économie réelle aurait pu être considérée comme une propagande tant qu'elle ne permettait pas de faire mieux que l'économie financière. :Si on considère le prosélytisme comme convaincre de rejoindre sa communauté, il faudrait donc enlever tous les wikilivres qui sont beaucoup lus, puisque les wikilivres qui sont peu lus n'arrivent pas à convaincre. Je pense que mon livrel l'[https://fr.wikibooks.org/wiki/Utilisateur:Matthius/%C3%89conomie_Enfants économie pour les enfants] arrive à convaincre, malgré quelques défauts qu'on peut régler. Je pense que c'est pour cela qu'il a été ajouté pour suppression pour ne laisser que l'économie financière. Oui, le livre parle de Dieu, mais les [https://www.agoravox.tv/actualites/technologies/article/interviews-avec-le-physicien-yves-105950 scientifiques aussi]. Le livre a été effacé, mais corrigé puis remis avant d'être de nouveau déclassé malgré de nouvelles corrections suite aux critiques. Heureusement que [[User:Lionel Scheepmans|Lionel Scheepmans]] m'a permis de garder les images. :L'autopromotion permet malgré tout de connaître ce que fait l'auteur d'un wikilivre. Si on enlève le chemin qu'a suivi l'auteur, on évacuerait ainsi ses contradictions et on pourrait donc faire dire à un auteur l'inverse de ce qu'il a compris au bout de son parcours. Je suis pour qu'il y ait une page de l'auteur regroupant les livrels de l'auteur comme sur wikisource. :Je considère ceux qui contribuent à wikipedia et à wikibooks comme des militants, puisqu'ils essaient d'influencer les autres avec ce qu'ils écrivent sur ces sites web. Certes, certains travaux peuvent être désintéressés, mais alors pourquoi mettre ces travaux sur ces sites web alors. En effet le manque de passion crée des textes soporifiques. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 3 juillet 2025 à 22:36 (CEST) k906u0auic64gyoh4pyw7rbe183eczx 745896 745895 2025-07-03T22:07:52Z Matthius 11787 /* Propagande, prosélitisme, autopromotion, militanatisme, etc */ 745896 wikitext text/x-wiki <noinclude>{{Wikilivres:Le Bistro/En-tête}}</noinclude> == compléter les bons conseils pour un nouveau livre == bonjour wikilivre ! je refais un tour sur ce wiki depuis un sacré bout de temps. Je vois que certains noms sont toujours là :) wouah. J'ai entâmé un livre nouveau aka. [[La sécurité du citoyen dans son logement]] que je vais encore améliorer mais je me pose dejà quelques questions sur le process, et vu que [[Wikilivres/Créer un wikilivre]] est assez high level je préfère demander ici des conseils. J'aime à penser que si l'idée est pertinente le guide pourra évoluer rapidement. * '''AutoCat''': il est indiqué clairement dans le guide pour la page de garde du livre de mettre <code><nowiki>{{AutoCat}}</nowiki></code> en bas de page, mais est-ce conseillé également sur chaque page du livre ? ça a l'air de marcher et donc plutôt oui: & si oui on pourrait l'ajouter dans le guide ? * je ne sais pas quoi mettre dans `CDU item` : on peut peut être orienter vers une bonne page sur le comment remplir le template proposé sur la page de garde * '''navigation horizontale''': est-ce qu'un moyen universel permet de suivre les chapitres d'un livre ? ex. si je suis sur un chapitre et que je veux aller au suivant, soit je passe par la page parent, soit je passe par la catégorie. Mais je voudrai (mieux qu') un bouton "next" / "previous". Enfin voici l'idée. S'il y a des choses en template automatique, je suis preneur (peut être le guide aussi) (PS: je vois que la gestion du sommaire est automatisée au sein même d'un chapitre : génial :) ) :NB: à une certaines époque j'utilisais des templates propres au livre (ex. [[Modèle:Les félins]]) et je vois que certains livres ont repris l'idée.. * '''catégorie''' : que faut-il mettre exactement dans le contenu de la catégorie auto-générée pour le nouveau livre ? juste <code><nowiki>[[Catégorie:Livres par titre]]</nowiki></code> ? * '''livre modèle''' : avez-vous un livre "modèle" : c'est-à-dire un livre (probablement à succès & pas trop grand) qui serait particulièrement suivi par les habitués et sur lequel on retrouverai toutes les techniques les plus avancées pour bien rédiger un livre. Il apparaîtrait du coup en modèle dans le guide. qu'en pensez-vous ? [[Utilisateur:Boly38|Boly]] [[Discussion_Utilisateur:Boly38|♪]] 5 mars 2025 à 18:09 (CET) :Salut Boly :* Autocat : normalement, il ne se met que dans le modèle listant les chapitres du livre, inclus dans toutes les pages. Par exemple le modèle {{m|Programmation JavaFX}} est inclus comme ceci : <nowiki><noinclude>{{Programmation JavaFX}}</noinclude></nowiki>) dans tous les chapitres du livre [[Programmation JavaFX]]. :* [[Wikilivres:CDU]] : il y a un moteur de recherche pour trouver le classement, mais il n'est pas encore pleinement détaillé et parfois il faut créer les pages correspondantes à la CDU. J'utilise http://www.udcsummary.info/php/index.php?lang=fr pour ajouter les pages manquantes. Si tu trouves un ou plusieurs classement possibles, je peux me charger de créer les pages qui manquent. :* '''navigation horizontale''' : Fait automatiquement par l'inclusion du modèle dans toutes les pages. Voir par exemple : [[Programmation Java Swing/Introduction]]. Le modèle ajoute les liens suivant, précédent et une flèche au milieu pour déplier la liste complète des chapitres du livre. :Pour la catégorie, un petit descriptif, comme par exemple : <pre><nowiki> Catégorie recensant les pages du livre [[Programmation JavaFX]]. Pour discuter de la rédaction du livre c'est ici : [[Discussion:Programmation JavaFX]]. [[Catégorie:Java]] </nowiki></pre> :--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 5 mars 2025 à 19:22 (CET) ::J'ai fait des clics magiques (dans l'historique des pages) pour remercier ; je ne sais pas où ça atteri mais bon. Le template sommaire avec navigation par page c'est exactement ce que je voulais : c'est top :) & merci aussi pour les illustrations ! David L au top ! ! [[Utilisateur:Boly38|Boly]] [[Discussion_Utilisateur:Boly38|♪]] 7 mars 2025 à 18:04 (CET) == Problème de cache sur la page d'accueil == Salut, Les utilisateurs anonymes voient toujours les mêmes livres sur la page d'accueil (pendant plusieurs mois) alors que les livres changent tous les jours pour les utilisateurs connectés. Il faudrait installer l'extension [[mw:Extension:MagicNoCache]] afin de pouvoir utiliser <nowiki>__NOC</nowiki>ACHE__ sur la page d'accueil. --&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 29 mars 2025 à 20:56 (CET) :Bonjour, bien reçu, j'ai créé un ticket pour voir déjà si on peut diminuer ce cache à 24h (sinon il faudra voter pour l'extension) : https://phabricator.wikimedia.org/T390674. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<span style="color:#FF6600">$</span>♠]]) 1 avril 2025 à 11:46 (CEST) ::Merci JackPotte. ::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 1 avril 2025 à 19:00 (CEST) :::Un problème similaire a été signalé en 2023 [[phabricator:T351573]], et en 2017 [[phabricator:T119366]] mais pas la moindre action de correction depuis toutes les années écoulées. Les problèmes des "petits" wiki ne sont pas écoutés. :::J'ai donc créé la page de vote pour installer l'extension : [[Wikilivres:Prise de décision/Installer l'extension MagicNoCache]]. :::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 1 avril 2025 à 19:48 (CEST) ::::{{Mention|Lionel Scheepmans}}, {{Mention|Fourmidable}} : un avis / un vote sur ce sujet ? --&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 12 mai 2025 à 20:04 (CEST) :::::Je viens de donner mon avis sur la page idoine, merci du rappel ! [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 13 mai 2025 à 11:00 (CEST) == Erreur d'affichage sur la page d'accueil == Bonjour tout le monde, Un petit message pour savoir où nous en sommes sur le problème d'affichage dans la page d'accueil (débordement des cadres de livres suggérés sur la boîte à outils des utilisateurs connectés). Wikilivresquement, [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 26 avril 2025 à 17:59 (CEST) :Salut Fourmidable, :J'ai tenté de trouver une solution pour cet habillage, mais il est tellement mal conçu que ça semble impossible. :C'est le seul habillage qui pose problème, pour plusieurs pages et pas seulement la page d'accueil. :La décision arbitraire d'imposer cet habillage sans consulter la communauté du projet est une aberration. :Le mieux serait de : :# créer un bug pour l'habillage Vector-2022 qui ne fonctionne plus dès qu'il y a le moindre code CSS, :# créer une demande de fonctionnalité pour que les administrateurs du projet puisse sélectionner l'habillage par défaut par projet choisi par décision communautaire, :Mais comme les "petits wikis" ne sont pas écoutés, ce serait inutile (voir les nombreux exemples de problèmes reportés spécifiques à fr.wikibooks dont aucun n'a jamais été résolu). :--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 26 avril 2025 à 20:26 (CEST) ::Ok, en tout cas sache que je soutiens ta proposition ! [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 1 mai 2025 à 16:28 (CEST) == Matthius : le grand retour == Bonjour à tous, Quelqu'un veut-il bien m'aider à relire les [https://fr.wikibooks.org/w/index.php?title=Sp%C3%A9cial%3AContributions&target=Matthius&namespace=0&tagfilter=&newOnly=1&start=&end=&limit=50 nouveaux livres de Matthius] ? Il semble y avoir, une fois de plus, de graves problèmes de sourçage et des attaques (même déjà soulignées en 2023 !) contre "le libéralisme" et "la finance" avec des phrases obscures ; par exemple : * dans [[Conseils Chrétiens]] : "Le libéralisme empêche de voir la société. Alors on croit les films libéraux, faisant croire que l’individu fait la société, alors que c’est la société qui fait l’individu. En effet, notre ego est créé par notre famille." * dans [[Pourquoi un Dieu ?]] : "L'individualisme dû au libéralisme, de plus en plus prégnant, va par contre cacher de plus en plus notre sociabilité et notre créativité.", "le social-libéralisme ne sera que le moyen d'accéder au pouvoir par la voie opportune alors qu'on cachera le social au peuple, pour ne pas qu'il se comprenne. Le dirigeant social-libéral aura appris dans les écoles d'économie que les marchés c'est magique.", "désengager l'état, détruisant alors le développement donc la république", "La faille du libéralisme est la censure, censure permise par la pauvreté des esprits ayant peur des autres à cause de l'individualisme forcené. [...] Le libéralisme cherchera la censure pour empêcher qu'il y ait suffisamment d'esprits philosophes et créatifs s'intéressant à la politique.", "La finance croira alors qu'il faille installer une dictature pour liquider la population trop difficile à maîtriser. [...] il s'agit pour la finance de trouver de plus en plus d'illusions pour satisfaire la population" * dans [[Économie Enfants]] : le libéralisme a "rendu l’école non épanouissante par le manque de créativité, en disant que le pays ne peut plus se développer, à cause de la monnaie privée" et l'assertion non (mal ?) argumentée "Le libéralisme aboutit selon moi à l'abrutissement de l'individu, voire à la violence" * dans [[Devenir un Génie]] : "Ils sont ainsi devenus égoïstes, donc libéraux.", "le libéralisme peut apporter un manque de liberté, car c’est une doctrine et une idéologie orientée sur l'individu, individualisme cachant une société, allant alors vers la destruction du plus faible par une liberté sans limite.", "La finance a en fait tenté et tente de faire croire qu’elle s’occupe de notre liberté, alors qu’elle veut nous empêcher de nous émanciper." * dans [[Univers Vivant]] : "La finance veut que nous soyons des consommateurs alors que nous sommes des acteurs de la société.", "Pour les financiers la population pauvre doit souffrir de malnutrition.", la finance "devient alors autoritaire comme après la crise de 1929. Nous sommes à un moment crucial où nous pouvons remettre en cause l’idéologie scientiste aboutissant à nier la nature. Ainsi il y avait 1,7% de CO2 pendant le crétacé au lieu de 0,04 % en 2023." Notons que le dernier ouvrage en date, [[XXIe]], est particulièrement gratiné : * climatoscepticisme : "le GIEC aura causé une hécatombe de suicides pour un faux réchauffement de la terre" * théories du complot sur les résultats des élections occidentales : "Selon des journalistes de Sud Ouest diffusés sur Agora Vox qui ont récoltés les suffrages des élections de 2017 et qui ont suivi l’élection de 2022, Macron n’a pas été élu par les français. En réalité il est arrivé dernier des élections présidentielles de 2017.", "Emmanuel Macron avait des nuls médiatisés face à lui" * théories du complot sur la CIA et les démocrates américains : "les démocrates trichent sur les élections en 2021", "Les États-Unis sont partis d’Afghanistan pour préparer la guerre d’Ukraine" * biais prorusse : "la Russie entre en guerre contre l’Ukraine en février 2022, puisque l’Ukraine avait attaqué la Russie. Les médias occidentaux feront croire [...] que c’est la Russie qui attaque", "Vladimir Poutine est voulu par les russes, contrairement aux élus occidentaux. Les élections en Russie se déroulent suffisamment bien pour que la Russie soit considérée comme une démocratie." -- [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 11 mai 2025 à 17:24 (CEST) :J'ai lancé une série de [[Wikilivres:demandes de suppression|demandes de suppression]]. Je notifie les personnes ayant participé à l'[[Wikilivres:Demandes de suppression/2023|ancien débat (2023)]] : {{Mention|JackPotte}}, {{Mention|Lionel Scheepmans}} et {{Mention|DavidL}} pour info. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 12 mai 2025 à 11:23 (CEST) ::Salut @[[Utilisateur:Fourmidable|Fourmidable]].. C'est bien que tu inspecte le contenu de Wikiversité à la recherche de contenu indésirable ou problématiques. Mais je vois dans le titre de ce sujet de discussion une forme de sarcasme et de condescendance qui ne me semble pas adapter à un projet collaboration où tout le monde est le bienvenu peu importe ses croyance et ses idée. De plus la première personne concernée, c'est à dire l'auteur, n'y est pas notifiée. ::Ensuite, il fauétait une fois se mettre d'accord sur le fait que la ligne éditoriale de Wikiversité est différente à celle de Wikipedia. Un recueil de cours et de travaux de recherche, ce n'est pas une encyclopédie. On en a déjà discuté. La neutralité de point de vue n'existe pas dans l'enseignement ni dans la recherche. ::Pour preuve, mon fils a un cours de religion dans SZ formation secondaire et il peut choisir entre différentes religion ou opter pour un cours de morale et de citoyenneté. À l'université, les orientation idéologique des enseignants son souvent bien connue. Et il est évident que l'enseignement dans une business school sera plus libérale qu'une fac de théologie. ::Dans le cadre des travaux de recherches, la Liberté d'expression doit être complète, l'auteur doit être libre d'y faire ses propre interprétations des faits et développant sa propre argumentation. Sans quoi, c'est plus de la recherche. ::Finalement, un support d'enseignement dans un projet collaboratif, n'est pas un projet de recherche. On ne parle pas en "je" dans un cours, on le fait dans une recherche. Or, l'usage du "Je" implique une certaine subjectivité. ::En conclusion, je ne vois pas ce nouvelle appel dans la forme et l'énergie qu'il se présente, comme quelque chose de très collaboratif. Et je n'ai pas envie de jouer à nouveau le médiateur dans ce redémarage d'une confrontation idéologique entre deux contributeurs incapable de collaborer dans la production de contenu de qualité. ::Plutôt que de faire du rameutage ici, je te proposeraient plutôt, selon tes disponibilités, de collaborer aux écrits des auteurs en discutant avec eux sur le page de discussions de leurs articles au sujet des améliorations possibles. Plutôt que de faire appel à la suppression de toute une page pour certains passages problématiques, une démarche collaboratif serait d'aider à la résolutions de ces problèmes, dans le but de ne pas perdre tout le reste de la page. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 13:20 (CEST) :::Tu as raison, je notifie aussi {{Mention|Matthius}} en espérant que cette fois son comportement soit plus constructif... Concernant les ouvrages qui sont moins problématiques, j'ai fait des demandes dans les pages de discussion idoines. Ici on a des ouvrages clairement complotistes et anti-science qui nuisent à la réputation de Wikilivres. (PS : Nous sommes sur Wikilivres, pas sur Wikiversité ;)) [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 12 mai 2025 à 13:21 (CEST) ::::Entre-nous @[[Utilisateur:Fourmidable|Fourmidable]], je ne trouve pas ton comportement plus constructif, ni collaboratif que le tien... [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 13:24 (CEST) :::::À mes yeux et dans le cadre d'un projet collaboratif, commencer par une demande de suppression avant toute chose peut même être perçu comme violant. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 13:26 (CEST) ::::::Mon but n'est pas de faire une croisade pour le libéralisme ou le GIEC sur Wikilivres, mais il y a quand même des limites pour tenir la réputation du site et plus largement de la Wikimedia Foundation. Je te rejoins sur le fait que les auteurs ne doivent pas être libres d'écrire absolument tout ce qu'ils veulent, et aussi que la critique doit être constructive, mais ce n'est pas au créateur du livre d'être le seul arbitre de ce qui est raisonnable ou pas vis-à-vis de son travail (i.e. simple reformulation, suppression partielle ou totale...). Et en 2023 Matthius a montré un comportement très agressif vis-à-vis de mes critiques, ce qui a mené '''ensuite''' à des débats de suppression. Pour l'instant, je ne fais que soulever des phrases (souvent identiques à celles de 2023) que je trouve (de nouveau) hautement problématiques d'un point de vue scientifique (manque voire absence totale de sourçage), mais le passage par des demandes de suppression directement se justifie par une forme de récidive sur certaines affirmations auxquelles aucune amélioration n'a été apportée après critique. Tu m'accuses de rameutage, mais je ne fais que consulter la communauté dans son ensemble : ici pour une discussion globale, sur [[Wikilivres:Demandes de suppression]] pour un débat et un "vote" au cas par cas. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 12 mai 2025 à 13:34 (CEST) :::::::Désolé aussia pour le côté péjoratif du terme rameutage. Parlons de notiffication c'est plis adéquat. :::::::Je réalise seulement que l'on est sur wikilivres et pas Wikiversité. Désolé sur mon smartphone ça ne saute pas aux yeux. Il faut donc recontextualiser tout ce que j'ai écrits précédement. Heureusement, historiquement Wikiversité est un sous projet de wikilivre. Les deux projet sont très proches dans leurs mission pédagogique et mode de fonctionnement. L'objet ici étant de produire des livres pédagogiques pour toute les tranches d'âges et pas uniquement des ouvrages qui doivent répondre à à des attentes scientifiques. Il apparait dans tes propos des thermes très wikipédien tel que le sourçage et la neutralité de point de vue. Je ne pense pas que cela doit s'appliquer ici. :::::::Ensuite Wikilivres est trop petit pour avoir un commuté d'arbitrage et je n'ai pas envie de parcourir les historiques à la recherche de qui a commencé. Mais je maintient l'idée que notifier des personnes vers un appel à suppression est une démarche que je considère symboliqueemnt violente et me semble aussi être une récidive. :::::::As-tu cherché à améliorer les texte en question en discutant avec l'auteur avant de proposer leurs suppression ? :::::::As-tu conscience que nous sommes ici dans un projet collaboratif, pluraliste et non universitaire ? [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 15:02 (CEST) ::::::::Du reste, nous ne sommes pas ici pour répondre à des suposées attentes de la Fondation Wikimedia. Car le rôle de celle-ci est précisément de répondre aux notres. C'est le rôle d'une fondation. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 15:07 (CEST) :::::::::Bonjour, :::::::::Il faudrait avant tout classer les écrits de l'auteur, car il pourrait il y avoir un problème d'admissibilité, Wikilivres étant avant tout un projet de rédaction de livres '''pédagogiques'''. Ces écrits contiennent beaucoup d'avis personnels et présentent une vision sans discussion ni argumentation, sans apporter de pédagogie sur un sujet particulier. :::::::::Si on peut qualifier les écrits comme de la recherche, il vaudrait mieux les déplacer vers la wikiversité, où une communauté supplémentaire et plus expérimentée sur la recherche pourrait exprimer son avis sur le sujet ou sur comment améliorer/corriger les écrits de Matthius. :::::::::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 12 mai 2025 à 20:01 (CEST) ::::::::::Je plussoie {{Mention|DavidL}}. {{Mention|Lionel Scheepmans}} ce que tu dis s'applique aux cas où il y a une réelle démarche scientifique ou a minima une attitude collaborative de la part de l'auteur. Or : ::::::::::* premièrement (tu le sais sans doute, étant toi-même chercheur), les livres de Matthius sont très loin de toute méthode scientifique, c'est plutôt un ensemble d'assertions non sourcées qui font la promotion d'une idéologie (et on verse même dans l'antiscience avec les paragraphes sur le GIEC). On pourrait donner la parole à Matthius sur ce sujet mais je crains qu'il ne se définisse même pas lui-même comme scientifique ; ::::::::::* deuxièmement, avec cette série de recréations le 8 décembre dernier, sans attendre l'avis de la communauté, et avec les '''mêmes phrases''' problématiques (parfois à peine reformulées, souvent conservées à l'identique), je ne vois pas comment on pourrait supposer que Matthius fait preuve d'ouverture d'esprit et d'attitude collaborative. ::::::::::Bref, si vous voulez absolument garder tous ces ouvrages et essayer de composer tant bien que mal avec la pugnacité de leur auteur, ce sera sans moi... À mon avis, il serait nettement plus profitable de traduire les livrels de [[:en:Subject:Economics|Wikibooks en anglais sur l'économie]], par exemple. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 13 mai 2025 à 11:07 (CEST) :::::::::::Je viens de prévenir Matthius par mail. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 13 mai 2025 à 11:12 (CEST) ::::::::::::Tree bien. Moi aussi, je n'ai plus envie de consacrer du temps là dessus. Je vous laisse donc traiter la situation puisque votre avis est majoritaire. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 13 mai 2025 à 11:27 (CEST) :::::::::::Je ne comprends pas cette assertion. Je cite François Gervais contre le GIEC, qui a écrit pour le GIEC sans être entendu pour la conclusion. :::::::::::Je n'ai pas reformulé mes phrases à l'identique. J'ai soit indiqué la source contrairement à ce qui dit Fourmidable, soit indiqué que c'était mon point de vue ou émis une explication. Aussi quand je fais une assertion scientifique, j'en indique souvent la cause scientifique. Fourmidable a tendance à reprendre les phrases où je répète ce qui a été écrit avant pour aller plus loin. Donc il faut chercher dans mes livrels la phrase où je cite et où j'émets une hypothèse avec la cause scientifique. Je vais relire Fourmidable. :::::::::::Aussi j'ai trouvé sur l'[http://web.archive.org/web/20240810201141/https://www.google.com/search?q=mati%C3%A8re+temps+%C3%A2me âme qui ralentit la vitesse]. Je pense que Google utilise une IA pour détecter les limites de l'humain. Mon expérience de pensée va contre le matérialisme scientifique puisque j'émets l'hypothèse supérieure qu'il existe des multivers où des âmes agissent sur le nôtre. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 13 mai 2025 à 11:36 (CEST) :::::::::::Je ne pense pas effectivement que mon livrel sur le XXIe va rester sur wikibooks puisque il va contre ce qu'indique wikipedia. J'espère juste qu'il puisse rester. :::::::::::Seulement j'ai une formation en ingénierie et j'ai trouvé sur [https://archive.org/details/TempsAme l'âme qui ralentit la vitesse] [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 13 mai 2025 à 12:13 (CEST) ::::::::::Vous admettez {{Mention|DavidL}} que vous ne connaissez pas les domaines que j'aborde. Mes livrels sont pédagogiques donc vous pouvez apprendre avec. Donc lisez les avant d'émettre l'hypothèse qu'ils ne le sont pas. J'ai créé le coaching sans coach qui a permis de revoir la pédagogie d'un journal d'un réseau international. Mais cela ne m'empêche pas d'aller contre le libéralisme et l'appât du gain qui sont selon moi les fléaux actuels. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 13 mai 2025 à 12:06 (CEST) :::::::::::@[[Utilisateur:Matthius|Matthius]] semble ouvert au débat et à une aide pour améliorer ses textes. La suppression ne me semble donc pas une option souhaitable. Wikilivres est indépendant de Wikipédia. Il faut donc se référer à nos règles et recommandations locale disponible dans les espaces de noms "wikilivres" et "aide". Je vais essayer de prendre le temps d'écouter les textes avec une voix de synthèse pour gagner du temps. Cela me permettra d'en faire des commentaire en vue d'une amélioration. Car si ce sont des sources qui manques et bien il suffit de les ajouter. Nous sommes là pour travailler ensemble pour produire des ouvrages pédagogiques de qualité, pas pour juger du travail des autres en vue d'une suppression. Restons, s'il vous plait dans un esprit d'entraide et de collaboration. C'est tellement rare à notre époque... [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 14 mai 2025 à 15:00 (CEST) :::::::::::Mon livrel sur le XXIe siècle en cours d'écriture va aussi contre les théories du complot occidentales. J'écris que la Russie et la Chine sont des démocraties, alors que nos médias disent que ce sont des dictatures. J'émets effectivement des hypothèses non sourcées dans ce nouveau livrel. Je peux et vais les sourcer. Par contre j'utiliserai des sources primaires. En réalité, j'émets l'hypothèse que ce sont nos médias qui sont dans la post-vérité et que ce ne sont pas les médias étatsuniens, ni russes, ni chinois qui y sont. Ce livrel est effectivement une bombe dangereuse contre nos médias comme l'indique Fourmidable. ::::::::::::Je ne comprends pas l'acharnement de Fourmidable à ne pas vouloir discuter avec moi et à vouloir automatiquement supprimer mes livrels sans discussion préalable. En effet il a eu un an pour m'indiquer comment améliorer mes livrels. Et que Fourmidable ne me dise pas que c'est moi qui ait commencé, puisque j'étais outré qu'on veuille supprimer mes livrels avec ses copains sans discussion pédagagogique au tout début. ::::::::::::Concernant la neutralité de wikipedia : wikipedia ne fait que révéler l'avis des médias financés donc il n'est pas neutre. Être neutre c'est révéler tous les points de vue, même ceux avec lesquels on n'est pas d'accord, ce que [https://archive.org/details/wikipediaCo-Fondateur fit wikipedia au début de son histoire] et ce pour quoi je me suis intéressé et ai été réprimé sauf pour wikibooks anglais qui m'a viré pour ne pas enlever mon nom. :{{Mention|Matthius}} Avez-vous l'intention de publier des livres scientifiques, c'est-à-dire sourcés par de la science publiée et évaluée par les pairs, et à défaut de grands médias nationaux et internationaux ? Vous pouvez aussi tester vos hypothèses mais votre travail ne doit pas consister à sélectionner les sources qui vous conviennent pour seulement valider votre théorie, en mettant de coté tout ce qui vous dérangerait dans cette entreprise. --[[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 10:48 (CEST) ::@[[Utilisateur:Fourmidable|Fourmidable]], je pense que tu te fais une vision fausse du monde de l'édition. @[[Utilisateur:Matthius|Matthius]] peut payé une maison d'édition, dans le cadre d'une [[w:Édition_à_compte_d'auteur|édition à compte d'auteur]]. Probablement qu'il l'a déjà fait puisqu'il a déjà publié des ouvrages au format papier parmi ceux qu'il veut placer sur Wikilivres. Il en a même déposé certains dans une bibliothèque universitaire. Quant à la revue par les paires ne se fait que dans le cadre des journaux scientifique. ::J'ai écouté l'ouvrage [[Pourquoi un Dieu ?]] Et je trouve effectivement qu'il n'a pas sa place dans Wikilivres. Non pas parce qu'il critique le libéralisme avec des propos que je partage en grande partie, mais parce qu'il s'apparente plus à de la propagande chrétienne qu'à un réel ouvrage pédagogique sur le sujet. ::Matthius y est en posture de prédicateur et non de pédagogue. Je dirais que la moitié des phrases de l'ouvrage que j'ai écouté sont des affirmations sans argumentation ni démonstration valide. La thèse de son ouvrage se résume à dire que dieu est la seule chose qui peut expliquer un phénomène actuellement inexpliqué. Ce qui est une corrélation fallacieuse puisqu'il n'existe aucun lien de causalité. ::Pour moi, les ouvrages évangéliste ou propagandiste n'ont pas leur place dans Wikilivres et je serais d'avis d'ouvrir une prise de décision pour établir une règle d'interdiction. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 11:42 (CEST) :::Oui voilà, nous sommes d'accord. Peut-être que Matthius peut adopter une attitude plus scientifique, mais l'esprit de "pédagogie" s'accompagne forcément d'une démarche scientifique, sinon c'est de la prédication/propagande. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 11:45 (CEST) ::::@[[Utilisateur:Fourmidable|Fourmidable]]... Wikilivres n'est pas une bibliothèque "scientifique" mais pédagogique. Tu sembles confondre les deux termes. Les livres pour enfants que contient Wikilivres ne sont pas "scientifique" tout en étant pédagogiques. ::::Un autre fait qui peut être reproché à @[[Utilisateur:Matthius|Matthius]] est son autopromotion, [[Wikilivres:Présentation#● Wikilivres n'est pas une vitrine|alors que la démarche proscrite sur Wikilivres]]. ::::Plutôt que de supprimer l'important travail effectué par Matthius, je propose à nouveau de le déplacer en sous page de son espace utilisateur pour qu'il puisse retravailler ses écrits. ::::Pour un retour dans l'espace principale, il faudrait au préalable qu'il supprime des ses travaux toute forme d'autopromotion et toute forme propagande, prosélytisme ou autre type de discours prédicateur. Ceci notamment en référence aux choix politiques [https://www.senat.fr/leg/ppl17-386.html français], [https://www.rtbf.be/article/le-proselytisme-religieux-ou-politique-n-a-pas-sa-place-a-l-ecole-quels-chiffres-derriere-ce-phenomene-pointe-par-la-ministre-de-l-education-11477234 belge], [https://www.assnat.qc.ca/fr/travaux-parlementaires/projets-loi/projet-loi-94-43-1.html Quebec], [https://ge.ch/grandconseil/data/loisvotee/L11764.pdf suisse]. Quatres communautés culturelles très largement majoritaire dans l'espace francophone des projets Wikimédia. ::::J'invite Matthius et les autres membres de notre communauté réagir à ce message et de discuter du lancement d'une nouvelle prise de décision pour interdire la propagande et le prosélytisme dans Wikilivres. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 12:21 (CEST) :::::Ce que je veux dire, c'est qu'un bon livre pédagogique s'appuie forcément sur des connaissances scientifiques. Ok pour un redéplacement. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 12:37 (CEST) ::::::Ne fais pas à ton tour du prosélytisme scientifique @[[Utilisateur:Fourmidable|Fourmidable]]. La science et les connaissances dites scientifiques comme tu les entends n'est pas la seule chose sur laquelle on peut s'appuyer pour produire un contenu pédagogique. ::::::Que fais-tu de la méditation, de l'humour, de la poésie, de la musique, du dessin, et toute autre expression artistique ? ::::::Et il existe aussi un tas d'ouvrages pédagogique religieux (pour le catéchisme entre autre), sauf que, comme la plupart des législations nationales des pays francophones occidentaux, je pense qu'ils n'ont pas leur place dans Wikilivres. Ce sur quoi nous devons nous positionner dans une prise de décision collective. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 12:52 (CEST) :::::::Ah oui, dans ce sens-là il y a en effet moins de science à proprement parler… Mais je ne suis pas sûr que cela s'applique aux propos politiques. Ça ne me viendrait pas à l'idée de faire un Wikilivre afin de convertir les gens au libéralisme, par exemple. C'est le rôle d'autres wikis ou sites web spécialisés. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 14:44 (CEST) :::Je vais supprimer Du même Auteur et Du même éditeur de mes wikilivres. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 15 mai 2025 à 12:32 (CEST) ::::Si vous voulez, mais c'est loin d'être le point principal. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 12:38 (CEST) :::::Effectivement @[[Utilisateur:Matthius|Matthius]], c'est une bonne résolution, mais il reste le prosélytisme à résoudre et je pense que cela demande beaucoup de travail à réaliser dans votre espace de travail personnel. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 12:55 (CEST) ::::::Vous mettiez que seul Pourquoi un Dieu est prosélyte. J'avais effectivement un doute en ajoutant ce livrel. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 15 mai 2025 à 19:43 (CEST) :::::::Je n'ai pas encore eu le temps d'écouter les autres livres @[[Utilisateur:Matthius|Matthius]] . Nous somme tous bénévoles ici. Cela peut prendre du temps, mais je vous invite déjà à déplacer vous-même le livre ''Pourquoi un Dieu'' dans vos sous page utilisateur''.'' :::::::Par anticipation, je peux déjà dire que tous les autres ouvrages faisant la publicité de vos écris doit être modifier ou retirer de l'espace principale ainsi que tous ceux qui font référence à Dieu ou au catholicisme de manière prosélyte. :::::::Seul le nom des auteurs devrais être repris dans les livre avec éventuellement des hyperliens vers leurs pages utilisateur qu'il sont libre d'éditer comme il veulent. :::::::On peut ensuite créer des pages catégories qui reprennent tous les travaux des auteurs, avec l'avantage qu'elle se complétent automatiquement à chaque fois que l'on ajoute une catégorie en bas de page d'un ouvrage. Vous trouverrez certainement des indication dans les pages d'aide. :::::::Je vous rassure sur le fait que ce traitement serait semblable pour un politicien libéral faisant la publicité de son parti, de ses idéologies et de sa personne. N'hésitez pas d'ailleurs à parcourir les autres wikilives pour y détecter ce genre de problème avant de nous le signaler. C'est ce que fait @[[Utilisateur:Fourmidable|Fourmidable]] en cherchant à veiller sur la qualité et la conformité de notre projet. Une belle fin de journée ! [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 16 mai 2025 à 11:41 (CEST) ::::::::Pour info, je confirme et soutiens tout ce que propose {{Mention|Lionel Scheepmans}} dans son dernier message (merci à lui). [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 16 mai 2025 à 12:01 (CEST) ::::::::Pourquoi a Dieu a été mis à jour dans mon espace personnel. Je ne sais pas comment effacer une page wikibooks.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 16 mai 2025 à 12:24 (CEST) :::::::::@[[Utilisateur:Matthius|Matthius]]. Je ne comprends pas ce que vous dite. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 16 mai 2025 à 15:16 (CEST) ::::::::::J'ai copié-collé Pourquoi un Dieu dans ma page personnelle. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 16 mai 2025 à 21:36 (CEST) :::::::::::Ah très bien @[[Utilisateur:Matthius|Matthius]]. Mais en fait, il est possible de déplacer les pages en les renomant. Cela permet de conserver tout l'historique de l'édition. Je vais le faire quand je serai sur PC. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 17 mai 2025 à 03:34 (CEST) ::::::::::::Ne le faites pas : L'original de l'historique est sur mon espace perso. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 17 mai 2025 à 09:30 (CEST) :::::::::::::@[[Utilisateur:Matthius|Matthius]], j'ai écouté l'ouvrage Économie enfant. Si j'étais à la tête d'une maison d'édition, je ne publierais pas ce manuscrit. Il y a des passages très intéressants avec des idées originales que je partage, mais aucune argumentation pour les valider. Pour le reste, on retrouve un copié collé du précédent ouvrage. Beaucoup d'information factuelle sans réelle contextualisation ni fil conducteur et puis de nombreuses affirmations gratuites qui ne sont finalement que des opinions très relatives et de nouveau non argumentées. :::::::::::::Le pire étant que certaine de ces affirmations son tout simplement fausses ou inscensées. :::::::::::::Exemples d'une phrase : :::::::::::::« Écrire sur ce que vous comprenez de l’archéologie, qui est l’humanité avant l’écriture. » :::::::::::::Cette phrase est erronée et n'a même aucun sens. L'archéologie n'est pas l'humanité, mais un domaine des sciences créé par les humains. Ensuite, l'archéologie n'est pas quelque chose qui se limite à avant l'écriture. Il existe des nombreux sites archéologiques qui fouillent les vestiges de la Rome antique. Une civilisation qui n'était pas dénuée d'écriture. :::::::::::::Exemple d'un paragraphe : :::::::::::::« Le [[w:Capital|capital]] de l’humanité peut donc être la Terre. En effet, l'argent est produit à partir du papier venant du bois. Les trafiquants ont toujours voulu se l'approprier. Le capital pourrait donc ne pas être l’argent. Le troc nécessite cependant un patrimoine conséquent. La Chine veut s’approprier le capital Lune, pour y prendre l’Helium 3 selon Solidarité et Progrès, seule ressource lunaire qu'il est intéressant de transporter, afin de le fusionner, pour en obtenir de l’énergie illimitée, favorisant la créativité par le surplus de biens. » :::::::::::::Ce paragraphe est incompréhensible et citer un parti politique (à d'autres reprises aussi dans l'ouvrage) comme source pour poser une affirmation, pose deux gros problèmes. 1 celui de faire la publicité d'une idéologie au sein d'un écrit pédagogique, 2 celui de ne pas respecter un des principes de base de l'écriture scientifique alors que le livre en parle et la défend. :::::::::::::Je n'irai pas plus loin dans les exemples. :::::::::::::Dans leurs états actuels et pour que ces livres travaux d'écritures soient admissibles dans Wikilivres. Je pense que vous devez impérativement supprimer : :::::::::::::* toute promotion personnelle. :::::::::::::* toute forme de Prosélytisme religieux. :::::::::::::* toute forme de publicité ou contre publicité politique et partisane :::::::::::::* toute affirmation fausse et autres types de fabulations. :::::::::::::* tout raisonnement ou démonstration sans lien de causalité. :::::::::::::Suite à quoi, il faudrait encore dans l'idéal en améliorer le style de sorte à y développer un fil conducteur qui permettrait aux lecteurs de suivre un développement ordonné propice à l'apprentissage, et non leur soumettre un journal de réflexions personnelles, reprenant des erreurs factuelles et logiques. :::::::::::::C'est un travail conséquent. :::::::::::::Et en ce qui concerne le prosélytisme, les approches politiques partisanes, il est impératif, y compris les sous page de votre page utilisateur. :::::::::::::Il y a des idées intéressantes dans vos écrits, et je partage pas mal de vos points de vue concernant la question du néolibéralisme. Mais Wikilivres n'est pas une tribune d'opinion à l'image d'AgoraVox. Nous sommes ici pour produire des ouvrages pédagogiques. Pas pour influencer nos lecteurs en faveurs ou à l'encontre de certaines religions ou idéologies. :::::::::::::Tout en l'encourageant à le faire de manière plus courtoise et constructive, je remercie donc @[[Utilisateur:Fourmidable|Fourmidable]] de nous avoir alerté sur l'incompatibilité de vos ouvrages avec notre projet. Dans tous les cas ceux que j'ai écoutés jusqu'à présent. :::::::::::::J'aimerais à votre tour vous encourager à poursuivre vos travaux d'écriture en cherchant à vous rapprocher de notre objectif tout en respectant nos règles et recommandations. Mais sachez aussi que vous pouvez aussi améliorer l'article de Wikipédia sur l'[[w:Économie_réelle|économie réelle]]. Ou aussi développer une leçon sur Wikiversité sur le même sujet dans la [[v:Faculté:Économie|Faculté d'Économie]]. C'est un sujet intéressant qui permet de mettre en lumières les limites de la [[w:Finance|finance]]. :::::::::::::Ces deux activités seraient moins ambitieuses que de vouloir produire un livre de qualité pour expliquer l'économie aux enfants. Cela demande une grande maîtrise du sujet en plus d'un certain don pour la vulgarisation. :::::::::::::Il me reste deux ouvrages proposés à la suppression à écouter, mais j'ai bien peur d'y retrouver les mêmes incompatibilités que celles que je viens d'expliquer à l'instant. :::::::::::::Bien cordialement, [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 26 mai 2025 à 21:16 (CEST) :::::::::::::Mon correcteur orhtographique ne fonctionnant pas pour des commentaires aussi long, le message que je viens de laisser est truflé de fautes et je n'ai pas le temps ni le courrage de les corriger. Encore une fois, le travail que je fournis sur ce projet est tout à fait bénévole. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 26 mai 2025 à 21:21 (CEST) ::::::::::::::J'ai passé beaucoup de temps à élaborer le coaching sans coach. Ce n'est naturel pour aucun ancien élève de simplifier. Je ne sais pas combien de fois j'ai relu Comment Écrire des Histoires. J'ai toujours beaucoup de temps devant moi pour revoir mes livrels.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 10:51 (CEST) :::::::::::::::@[[Utilisateur:Matthius|Matthius]], c'est précisément parce que vous travailler beaucoup et que vous Me semblez de bonne foi et volonté, que je passe autant de temps à vous aiidez. Tous vos textes comprends des problèmes qu'il faut résoudre. Vous devriez commencer par supprimer tout ce qui fait référence à vous, à la religion et au politique, pour ne garder que des faits et affirmations vérifiées par des sources sûres et non partisannes, à chaque fois pour vous assurez que vous n'être pas simplement en train de diffuser ou colporter une opinion fausse et/ou partisane. Ce qui vient d'être dit est incontournable. :::::::::::::::Je penses ensuite qu'indique messages auxquelles ont été écrites vos sections sont superflues dans le cadre d'un ouvrage pédagogique. La chronologie de vos écrits n'est pas un bon un fil conducteur. Encore une fois, Wikilivres n'est pas un lieu pour publier ses mémoires ou ses réélections du jour. Il existe le format blog pour ce genre de choses. :::::::::::::::Tennez compte aussi que nous ne disposons pas forcément d'autant de temps et de motivation que pour revoir vos livres. Raison pour laquelle, des méthodes plus expéditives telles que la suppression complète des pages inadaptées à notre projet finiront par être appliquées. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 13:18 (CEST) ::::::::::::::::Le livrel le plus important pour moi est l'économie pour les enfants, vient ensuite devenir un génie. L'Univers est Vivant a été référencé sur les moteurs de recherche récemment parce que j'ai trouvé sur l'âme qui ralentit la vitesse. Quand on cherche matière temps âme sur les moteurs de recherche occidentaux on tombe sur ma page archive.org/details/TempsAme. Il n'y a toujours pas de chercheur qui a publié sur la mathématisation de ma trouvaille. L'univers est vivant est une amélioration d'un autre livre. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 13:56 (CEST) ::::::::::::::::Je viens de mettre mon [http://matthieu.giroux.free.fr/html/cv.htm CV] à jour pour montrer ce que j'ai influencé. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 14:05 (CEST) ::::::::::::::::C'est moi qui ai diffusé le terme économie réelle. Je reproche à ceux qui l'ont utilisé d'être des économistes scolaires, c'est à dire de se référer à l'économie monétaire pour parler d'économie réelle. Je peux cependant mettre un historique de cette économie sur la page wikipedia. Je me demande juste s'il va rester. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 14:08 (CEST) :::::::::::::::::Je suis désolé @[[Utilisateur:Matthius|Matthius]]. Je ne vais pas poursuivre nos conversations faute d'en avoir envie. Vous ma laissez sur cette impression que votre motivation première est de promouvoir votre personne, vos valeurs et vos idées. Je vais donc arrêter de vous consacrer du temps. Je suis ici pour soutenir et développer les projets et intérêts collectifs et non individuels. Bonne chance pour vos ambitions que je vous invite à réaliser en dehors des projets Wikipédia. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 15:00 (CEST) ::::::::::::::::::Mon projet relève de l'intérêt général de faire connaître l'économie du XIX{{e}} siècle de [[Henry Charles Carey]]. Mon égoïsme peut donc être aussi le vôtre. Pour moi il faut être intelligent et égoïste pour défendre l'intérêt général. Je pense qu'on peut tous avoir l'air de génies comme les enfants peuvent avoir l'air de génies. Oui, je suis militant et veux faire partager la joie de la politique. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 15:55 (CEST) :::::::::::::::::::Nous ne sommes donc pas sur la même longueur d'onde. Je vois invite à ne pas faire de militantisme sur les projets wikimedia. Il y a d'autres endois pour le faire. La blogosphère, des tribune comme agoravox, et de nombreux sites web tenus par des communautés militantes et reliée aux valeurs et idées pour lesquelles vous militer. Ceci est mon dernier message à ce sujet. Cordialement. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 16:18 (CEST) ::::::::::::::::::::Je vous mets au défi de penser que les wikipédiens ne sont pas des militants. Eux veulent aussi défendre l'intérêt général en apportant la connaissance. Par contre ils ne ciblent pas leurs apports. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 17:10 (CEST) ::::::::::::::::::::Comme prévu, on me dit que mon [https://fr.wikipedia.org/wiki/%C3%89conomie_r%C3%A9elle#Histoire ajout sur l'économie réelle] est inédit. Je pense que vous vous êtes intéressé à certains de mes écrits parce qu'ils vous apportaient des réponses. Je peux faire cela sur wikibooks. Seulement c'est encore plus difficile sur wikipedia. Je ne suis pas théseux. Oui l'économie réelle a été créée pour faire connaître l'économie physique de Lyndon Larouche. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 30 mai 2025 à 17:15 (CEST) :::::::::::::::::::::Merci quand même ! [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 31 mai 2025 à 00:24 (CEST) :Mon livrel l'univers est vivant [https://www.agoravox.tv/actualites/technologies/article/et-si-la-physique-quantique-avait-105532 a eu un impact]. Je pense aussi avoir influencé les jeunes qui se sont tournés vers la bible. == [Recherche universitaire] Questionnaire sur la gouvernance Wikimedia == Bonjour à toutes et à tous, Dans le cadre d’un mémoire de recherche sur les modèles de gouvernance décentralisés dans les communs numériques, je mène une étude analysant le mouvement Wikimedia. L’objectif est de mieux comprendre la perception qu’ont les contributeurs et contributrices des projets Wikimedia (Wikilivres, Wikipédia, Wikidata, Commons, etc.) de la Fondation Wikimedia, de ses décisions, et des relations avec les chapters locaux (ex. Wikimédia France). Un questionnaire anonyme, rapide à remplir (environ 5 minutes), a été conçu à cet effet. Il s’adresse à toute personne majeure ayant déjà contribué à un projet Wikimedia, quelle que soit l’ancienneté ou le niveau d’implication. Lien vers le questionnaire : framaforms.org/questionnaire-communaute-wikipedienne-et-la-wikimedia-fondation-1747225404 '''Important''' : Les résultats seront utilisés uniquement dans un cadre académique. L'enquête, ainsi que l'étude, ne sont ni commandités ni supervisés par la Fondation ou aucun chapitre local. Il s'agit simplement d'un projet scolaire que je mène {{sourire}}. Merci d’avance pour votre participation ! [[Utilisateur:3(MG)²|3(MG)²]] ([[Discussion utilisateur:3(MG)²|discussion]]) 27 mai 2025 à 10:43 (CEST) :J'ai répondu. Bon courage pour ton mémoire ! (Ça me fait penser que je dois avancer sur le mien aussi...) [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 29 mai 2025 à 23:28 (CEST) == Propagande, prosélitisme, autopromotion, militanatisme, etc == Bonjours à la communauté des contributeurs de Wikilivres. Je me dit qu'il serait bon de faire une nouvelle prise de décision pour mieux cadrer le contenu de notre projet par rapport à ce qui se situebdans le titre de ce message. Qu'en pensez-vous ? [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 16:22 (CEST) :Totalement {{Pour}} ! [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 29 mai 2025 à 21:53 (CEST) :L'économie financière peut être considérée comme une propagande puisque son utilisation ne permet pas de lier la macro-économie et la micro-économie, ne permettant donc pas de développer une société comme le fait l'[https://fr.wikipedia.org/wiki/%C3%89conomie_r%C3%A9elle économie réelle]. Par contre, l'économie réelle aurait pu être considérée comme une propagande tant qu'elle ne permettait pas de faire mieux que l'économie financière. :Si on considère le prosélytisme comme convaincre de rejoindre sa communauté, il faudrait donc enlever tous les wikilivres qui sont beaucoup lus, puisque les wikilivres qui sont peu lus n'arrivent pas à convaincre. Je pense que mon livrel l'[https://fr.wikibooks.org/wiki/Utilisateur:Matthius/%C3%89conomie_Enfants économie pour les enfants] arrive à convaincre, malgré quelques défauts qu'on peut régler. Je pense que c'est pour cela qu'il a été ajouté pour suppression pour ne laisser que l'économie financière. Oui, le livre parle de Dieu, mais les [https://www.agoravox.tv/actualites/technologies/article/interviews-avec-le-physicien-yves-105950 scientifiques aussi]. Le livre a été effacé, mais corrigé puis remis avant d'être de nouveau déclassé malgré de nouvelles corrections suite aux critiques. Heureusement que [[User:Lionel Scheepmans|Lionel Scheepmans]] m'a permis de garder les images. :L'autopromotion permet malgré tout de connaître ce que fait l'auteur d'un wikilivre. Si on enlève le chemin qu'a suivi l'auteur, on évacuerait ainsi ses contradictions et on pourrait donc faire dire à un auteur l'inverse de ce qu'il a compris au bout de son parcours. Je suis pour qu'il y ait une page de l'auteur regroupant les livrels de l'auteur comme sur wikisource. :Je considère ceux qui contribuent à wikipedia et à wikibooks comme des militants, puisqu'ils essaient d'influencer les autres avec ce qu'ils écrivent sur ces sites web. Certes, certains travaux peuvent être désintéressés, mais alors pourquoi mettre ces travaux sur ces sites web alors. En effet le manque de passion crée des textes soporifiques. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 3 juillet 2025 à 22:36 (CEST) :Au final, à l'heure où les réseaux sociaux ne font que confirmer les opinions par le consumérisme, où la recherche sur les moteurs de recherche change quand on a un compte connecté, il est bon de proposer l'ensemble des points de vues sur wikibooks et wikipedia, comme le [https://www.agoravox.tv/actualites/technologies/article/wikipedia-son-co-fondateur-devoile-104049 demande son co-fondateur]. qrc5vkadac8v9qe217l5ilhxxt4jaw9 745898 745896 2025-07-03T22:47:45Z Lionel Scheepmans 20012 /* Propagande, prosélitisme, autopromotion, militanatisme, etc */ Réponse 745898 wikitext text/x-wiki <noinclude>{{Wikilivres:Le Bistro/En-tête}}</noinclude> == compléter les bons conseils pour un nouveau livre == bonjour wikilivre ! je refais un tour sur ce wiki depuis un sacré bout de temps. Je vois que certains noms sont toujours là :) wouah. J'ai entâmé un livre nouveau aka. [[La sécurité du citoyen dans son logement]] que je vais encore améliorer mais je me pose dejà quelques questions sur le process, et vu que [[Wikilivres/Créer un wikilivre]] est assez high level je préfère demander ici des conseils. J'aime à penser que si l'idée est pertinente le guide pourra évoluer rapidement. * '''AutoCat''': il est indiqué clairement dans le guide pour la page de garde du livre de mettre <code><nowiki>{{AutoCat}}</nowiki></code> en bas de page, mais est-ce conseillé également sur chaque page du livre ? ça a l'air de marcher et donc plutôt oui: & si oui on pourrait l'ajouter dans le guide ? * je ne sais pas quoi mettre dans `CDU item` : on peut peut être orienter vers une bonne page sur le comment remplir le template proposé sur la page de garde * '''navigation horizontale''': est-ce qu'un moyen universel permet de suivre les chapitres d'un livre ? ex. si je suis sur un chapitre et que je veux aller au suivant, soit je passe par la page parent, soit je passe par la catégorie. Mais je voudrai (mieux qu') un bouton "next" / "previous". Enfin voici l'idée. S'il y a des choses en template automatique, je suis preneur (peut être le guide aussi) (PS: je vois que la gestion du sommaire est automatisée au sein même d'un chapitre : génial :) ) :NB: à une certaines époque j'utilisais des templates propres au livre (ex. [[Modèle:Les félins]]) et je vois que certains livres ont repris l'idée.. * '''catégorie''' : que faut-il mettre exactement dans le contenu de la catégorie auto-générée pour le nouveau livre ? juste <code><nowiki>[[Catégorie:Livres par titre]]</nowiki></code> ? * '''livre modèle''' : avez-vous un livre "modèle" : c'est-à-dire un livre (probablement à succès & pas trop grand) qui serait particulièrement suivi par les habitués et sur lequel on retrouverai toutes les techniques les plus avancées pour bien rédiger un livre. Il apparaîtrait du coup en modèle dans le guide. qu'en pensez-vous ? [[Utilisateur:Boly38|Boly]] [[Discussion_Utilisateur:Boly38|♪]] 5 mars 2025 à 18:09 (CET) :Salut Boly :* Autocat : normalement, il ne se met que dans le modèle listant les chapitres du livre, inclus dans toutes les pages. Par exemple le modèle {{m|Programmation JavaFX}} est inclus comme ceci : <nowiki><noinclude>{{Programmation JavaFX}}</noinclude></nowiki>) dans tous les chapitres du livre [[Programmation JavaFX]]. :* [[Wikilivres:CDU]] : il y a un moteur de recherche pour trouver le classement, mais il n'est pas encore pleinement détaillé et parfois il faut créer les pages correspondantes à la CDU. J'utilise http://www.udcsummary.info/php/index.php?lang=fr pour ajouter les pages manquantes. Si tu trouves un ou plusieurs classement possibles, je peux me charger de créer les pages qui manquent. :* '''navigation horizontale''' : Fait automatiquement par l'inclusion du modèle dans toutes les pages. Voir par exemple : [[Programmation Java Swing/Introduction]]. Le modèle ajoute les liens suivant, précédent et une flèche au milieu pour déplier la liste complète des chapitres du livre. :Pour la catégorie, un petit descriptif, comme par exemple : <pre><nowiki> Catégorie recensant les pages du livre [[Programmation JavaFX]]. Pour discuter de la rédaction du livre c'est ici : [[Discussion:Programmation JavaFX]]. [[Catégorie:Java]] </nowiki></pre> :--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 5 mars 2025 à 19:22 (CET) ::J'ai fait des clics magiques (dans l'historique des pages) pour remercier ; je ne sais pas où ça atteri mais bon. Le template sommaire avec navigation par page c'est exactement ce que je voulais : c'est top :) & merci aussi pour les illustrations ! David L au top ! ! [[Utilisateur:Boly38|Boly]] [[Discussion_Utilisateur:Boly38|♪]] 7 mars 2025 à 18:04 (CET) == Problème de cache sur la page d'accueil == Salut, Les utilisateurs anonymes voient toujours les mêmes livres sur la page d'accueil (pendant plusieurs mois) alors que les livres changent tous les jours pour les utilisateurs connectés. Il faudrait installer l'extension [[mw:Extension:MagicNoCache]] afin de pouvoir utiliser <nowiki>__NOC</nowiki>ACHE__ sur la page d'accueil. --&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 29 mars 2025 à 20:56 (CET) :Bonjour, bien reçu, j'ai créé un ticket pour voir déjà si on peut diminuer ce cache à 24h (sinon il faudra voter pour l'extension) : https://phabricator.wikimedia.org/T390674. [[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<span style="color:#FF6600">$</span>♠]]) 1 avril 2025 à 11:46 (CEST) ::Merci JackPotte. ::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 1 avril 2025 à 19:00 (CEST) :::Un problème similaire a été signalé en 2023 [[phabricator:T351573]], et en 2017 [[phabricator:T119366]] mais pas la moindre action de correction depuis toutes les années écoulées. Les problèmes des "petits" wiki ne sont pas écoutés. :::J'ai donc créé la page de vote pour installer l'extension : [[Wikilivres:Prise de décision/Installer l'extension MagicNoCache]]. :::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 1 avril 2025 à 19:48 (CEST) ::::{{Mention|Lionel Scheepmans}}, {{Mention|Fourmidable}} : un avis / un vote sur ce sujet ? --&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 12 mai 2025 à 20:04 (CEST) :::::Je viens de donner mon avis sur la page idoine, merci du rappel ! [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 13 mai 2025 à 11:00 (CEST) == Erreur d'affichage sur la page d'accueil == Bonjour tout le monde, Un petit message pour savoir où nous en sommes sur le problème d'affichage dans la page d'accueil (débordement des cadres de livres suggérés sur la boîte à outils des utilisateurs connectés). Wikilivresquement, [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 26 avril 2025 à 17:59 (CEST) :Salut Fourmidable, :J'ai tenté de trouver une solution pour cet habillage, mais il est tellement mal conçu que ça semble impossible. :C'est le seul habillage qui pose problème, pour plusieurs pages et pas seulement la page d'accueil. :La décision arbitraire d'imposer cet habillage sans consulter la communauté du projet est une aberration. :Le mieux serait de : :# créer un bug pour l'habillage Vector-2022 qui ne fonctionne plus dès qu'il y a le moindre code CSS, :# créer une demande de fonctionnalité pour que les administrateurs du projet puisse sélectionner l'habillage par défaut par projet choisi par décision communautaire, :Mais comme les "petits wikis" ne sont pas écoutés, ce serait inutile (voir les nombreux exemples de problèmes reportés spécifiques à fr.wikibooks dont aucun n'a jamais été résolu). :--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 26 avril 2025 à 20:26 (CEST) ::Ok, en tout cas sache que je soutiens ta proposition ! [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 1 mai 2025 à 16:28 (CEST) == Matthius : le grand retour == Bonjour à tous, Quelqu'un veut-il bien m'aider à relire les [https://fr.wikibooks.org/w/index.php?title=Sp%C3%A9cial%3AContributions&target=Matthius&namespace=0&tagfilter=&newOnly=1&start=&end=&limit=50 nouveaux livres de Matthius] ? Il semble y avoir, une fois de plus, de graves problèmes de sourçage et des attaques (même déjà soulignées en 2023 !) contre "le libéralisme" et "la finance" avec des phrases obscures ; par exemple : * dans [[Conseils Chrétiens]] : "Le libéralisme empêche de voir la société. Alors on croit les films libéraux, faisant croire que l’individu fait la société, alors que c’est la société qui fait l’individu. En effet, notre ego est créé par notre famille." * dans [[Pourquoi un Dieu ?]] : "L'individualisme dû au libéralisme, de plus en plus prégnant, va par contre cacher de plus en plus notre sociabilité et notre créativité.", "le social-libéralisme ne sera que le moyen d'accéder au pouvoir par la voie opportune alors qu'on cachera le social au peuple, pour ne pas qu'il se comprenne. Le dirigeant social-libéral aura appris dans les écoles d'économie que les marchés c'est magique.", "désengager l'état, détruisant alors le développement donc la république", "La faille du libéralisme est la censure, censure permise par la pauvreté des esprits ayant peur des autres à cause de l'individualisme forcené. [...] Le libéralisme cherchera la censure pour empêcher qu'il y ait suffisamment d'esprits philosophes et créatifs s'intéressant à la politique.", "La finance croira alors qu'il faille installer une dictature pour liquider la population trop difficile à maîtriser. [...] il s'agit pour la finance de trouver de plus en plus d'illusions pour satisfaire la population" * dans [[Économie Enfants]] : le libéralisme a "rendu l’école non épanouissante par le manque de créativité, en disant que le pays ne peut plus se développer, à cause de la monnaie privée" et l'assertion non (mal ?) argumentée "Le libéralisme aboutit selon moi à l'abrutissement de l'individu, voire à la violence" * dans [[Devenir un Génie]] : "Ils sont ainsi devenus égoïstes, donc libéraux.", "le libéralisme peut apporter un manque de liberté, car c’est une doctrine et une idéologie orientée sur l'individu, individualisme cachant une société, allant alors vers la destruction du plus faible par une liberté sans limite.", "La finance a en fait tenté et tente de faire croire qu’elle s’occupe de notre liberté, alors qu’elle veut nous empêcher de nous émanciper." * dans [[Univers Vivant]] : "La finance veut que nous soyons des consommateurs alors que nous sommes des acteurs de la société.", "Pour les financiers la population pauvre doit souffrir de malnutrition.", la finance "devient alors autoritaire comme après la crise de 1929. Nous sommes à un moment crucial où nous pouvons remettre en cause l’idéologie scientiste aboutissant à nier la nature. Ainsi il y avait 1,7% de CO2 pendant le crétacé au lieu de 0,04 % en 2023." Notons que le dernier ouvrage en date, [[XXIe]], est particulièrement gratiné : * climatoscepticisme : "le GIEC aura causé une hécatombe de suicides pour un faux réchauffement de la terre" * théories du complot sur les résultats des élections occidentales : "Selon des journalistes de Sud Ouest diffusés sur Agora Vox qui ont récoltés les suffrages des élections de 2017 et qui ont suivi l’élection de 2022, Macron n’a pas été élu par les français. En réalité il est arrivé dernier des élections présidentielles de 2017.", "Emmanuel Macron avait des nuls médiatisés face à lui" * théories du complot sur la CIA et les démocrates américains : "les démocrates trichent sur les élections en 2021", "Les États-Unis sont partis d’Afghanistan pour préparer la guerre d’Ukraine" * biais prorusse : "la Russie entre en guerre contre l’Ukraine en février 2022, puisque l’Ukraine avait attaqué la Russie. Les médias occidentaux feront croire [...] que c’est la Russie qui attaque", "Vladimir Poutine est voulu par les russes, contrairement aux élus occidentaux. Les élections en Russie se déroulent suffisamment bien pour que la Russie soit considérée comme une démocratie." -- [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 11 mai 2025 à 17:24 (CEST) :J'ai lancé une série de [[Wikilivres:demandes de suppression|demandes de suppression]]. Je notifie les personnes ayant participé à l'[[Wikilivres:Demandes de suppression/2023|ancien débat (2023)]] : {{Mention|JackPotte}}, {{Mention|Lionel Scheepmans}} et {{Mention|DavidL}} pour info. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 12 mai 2025 à 11:23 (CEST) ::Salut @[[Utilisateur:Fourmidable|Fourmidable]].. C'est bien que tu inspecte le contenu de Wikiversité à la recherche de contenu indésirable ou problématiques. Mais je vois dans le titre de ce sujet de discussion une forme de sarcasme et de condescendance qui ne me semble pas adapter à un projet collaboration où tout le monde est le bienvenu peu importe ses croyance et ses idée. De plus la première personne concernée, c'est à dire l'auteur, n'y est pas notifiée. ::Ensuite, il fauétait une fois se mettre d'accord sur le fait que la ligne éditoriale de Wikiversité est différente à celle de Wikipedia. Un recueil de cours et de travaux de recherche, ce n'est pas une encyclopédie. On en a déjà discuté. La neutralité de point de vue n'existe pas dans l'enseignement ni dans la recherche. ::Pour preuve, mon fils a un cours de religion dans SZ formation secondaire et il peut choisir entre différentes religion ou opter pour un cours de morale et de citoyenneté. À l'université, les orientation idéologique des enseignants son souvent bien connue. Et il est évident que l'enseignement dans une business school sera plus libérale qu'une fac de théologie. ::Dans le cadre des travaux de recherches, la Liberté d'expression doit être complète, l'auteur doit être libre d'y faire ses propre interprétations des faits et développant sa propre argumentation. Sans quoi, c'est plus de la recherche. ::Finalement, un support d'enseignement dans un projet collaboratif, n'est pas un projet de recherche. On ne parle pas en "je" dans un cours, on le fait dans une recherche. Or, l'usage du "Je" implique une certaine subjectivité. ::En conclusion, je ne vois pas ce nouvelle appel dans la forme et l'énergie qu'il se présente, comme quelque chose de très collaboratif. Et je n'ai pas envie de jouer à nouveau le médiateur dans ce redémarage d'une confrontation idéologique entre deux contributeurs incapable de collaborer dans la production de contenu de qualité. ::Plutôt que de faire du rameutage ici, je te proposeraient plutôt, selon tes disponibilités, de collaborer aux écrits des auteurs en discutant avec eux sur le page de discussions de leurs articles au sujet des améliorations possibles. Plutôt que de faire appel à la suppression de toute une page pour certains passages problématiques, une démarche collaboratif serait d'aider à la résolutions de ces problèmes, dans le but de ne pas perdre tout le reste de la page. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 13:20 (CEST) :::Tu as raison, je notifie aussi {{Mention|Matthius}} en espérant que cette fois son comportement soit plus constructif... Concernant les ouvrages qui sont moins problématiques, j'ai fait des demandes dans les pages de discussion idoines. Ici on a des ouvrages clairement complotistes et anti-science qui nuisent à la réputation de Wikilivres. (PS : Nous sommes sur Wikilivres, pas sur Wikiversité ;)) [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 12 mai 2025 à 13:21 (CEST) ::::Entre-nous @[[Utilisateur:Fourmidable|Fourmidable]], je ne trouve pas ton comportement plus constructif, ni collaboratif que le tien... [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 13:24 (CEST) :::::À mes yeux et dans le cadre d'un projet collaboratif, commencer par une demande de suppression avant toute chose peut même être perçu comme violant. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 13:26 (CEST) ::::::Mon but n'est pas de faire une croisade pour le libéralisme ou le GIEC sur Wikilivres, mais il y a quand même des limites pour tenir la réputation du site et plus largement de la Wikimedia Foundation. Je te rejoins sur le fait que les auteurs ne doivent pas être libres d'écrire absolument tout ce qu'ils veulent, et aussi que la critique doit être constructive, mais ce n'est pas au créateur du livre d'être le seul arbitre de ce qui est raisonnable ou pas vis-à-vis de son travail (i.e. simple reformulation, suppression partielle ou totale...). Et en 2023 Matthius a montré un comportement très agressif vis-à-vis de mes critiques, ce qui a mené '''ensuite''' à des débats de suppression. Pour l'instant, je ne fais que soulever des phrases (souvent identiques à celles de 2023) que je trouve (de nouveau) hautement problématiques d'un point de vue scientifique (manque voire absence totale de sourçage), mais le passage par des demandes de suppression directement se justifie par une forme de récidive sur certaines affirmations auxquelles aucune amélioration n'a été apportée après critique. Tu m'accuses de rameutage, mais je ne fais que consulter la communauté dans son ensemble : ici pour une discussion globale, sur [[Wikilivres:Demandes de suppression]] pour un débat et un "vote" au cas par cas. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 12 mai 2025 à 13:34 (CEST) :::::::Désolé aussia pour le côté péjoratif du terme rameutage. Parlons de notiffication c'est plis adéquat. :::::::Je réalise seulement que l'on est sur wikilivres et pas Wikiversité. Désolé sur mon smartphone ça ne saute pas aux yeux. Il faut donc recontextualiser tout ce que j'ai écrits précédement. Heureusement, historiquement Wikiversité est un sous projet de wikilivre. Les deux projet sont très proches dans leurs mission pédagogique et mode de fonctionnement. L'objet ici étant de produire des livres pédagogiques pour toute les tranches d'âges et pas uniquement des ouvrages qui doivent répondre à à des attentes scientifiques. Il apparait dans tes propos des thermes très wikipédien tel que le sourçage et la neutralité de point de vue. Je ne pense pas que cela doit s'appliquer ici. :::::::Ensuite Wikilivres est trop petit pour avoir un commuté d'arbitrage et je n'ai pas envie de parcourir les historiques à la recherche de qui a commencé. Mais je maintient l'idée que notifier des personnes vers un appel à suppression est une démarche que je considère symboliqueemnt violente et me semble aussi être une récidive. :::::::As-tu cherché à améliorer les texte en question en discutant avec l'auteur avant de proposer leurs suppression ? :::::::As-tu conscience que nous sommes ici dans un projet collaboratif, pluraliste et non universitaire ? [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 15:02 (CEST) ::::::::Du reste, nous ne sommes pas ici pour répondre à des suposées attentes de la Fondation Wikimedia. Car le rôle de celle-ci est précisément de répondre aux notres. C'est le rôle d'une fondation. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 12 mai 2025 à 15:07 (CEST) :::::::::Bonjour, :::::::::Il faudrait avant tout classer les écrits de l'auteur, car il pourrait il y avoir un problème d'admissibilité, Wikilivres étant avant tout un projet de rédaction de livres '''pédagogiques'''. Ces écrits contiennent beaucoup d'avis personnels et présentent une vision sans discussion ni argumentation, sans apporter de pédagogie sur un sujet particulier. :::::::::Si on peut qualifier les écrits comme de la recherche, il vaudrait mieux les déplacer vers la wikiversité, où une communauté supplémentaire et plus expérimentée sur la recherche pourrait exprimer son avis sur le sujet ou sur comment améliorer/corriger les écrits de Matthius. :::::::::--&nbsp;◄&nbsp;[[Utilisateur:DavidL|'''D'''avid&nbsp;'''L''']]&nbsp;•&nbsp;[[Discussion Utilisateur:DavidL|discuter]]&nbsp;► 12 mai 2025 à 20:01 (CEST) ::::::::::Je plussoie {{Mention|DavidL}}. {{Mention|Lionel Scheepmans}} ce que tu dis s'applique aux cas où il y a une réelle démarche scientifique ou a minima une attitude collaborative de la part de l'auteur. Or : ::::::::::* premièrement (tu le sais sans doute, étant toi-même chercheur), les livres de Matthius sont très loin de toute méthode scientifique, c'est plutôt un ensemble d'assertions non sourcées qui font la promotion d'une idéologie (et on verse même dans l'antiscience avec les paragraphes sur le GIEC). On pourrait donner la parole à Matthius sur ce sujet mais je crains qu'il ne se définisse même pas lui-même comme scientifique ; ::::::::::* deuxièmement, avec cette série de recréations le 8 décembre dernier, sans attendre l'avis de la communauté, et avec les '''mêmes phrases''' problématiques (parfois à peine reformulées, souvent conservées à l'identique), je ne vois pas comment on pourrait supposer que Matthius fait preuve d'ouverture d'esprit et d'attitude collaborative. ::::::::::Bref, si vous voulez absolument garder tous ces ouvrages et essayer de composer tant bien que mal avec la pugnacité de leur auteur, ce sera sans moi... À mon avis, il serait nettement plus profitable de traduire les livrels de [[:en:Subject:Economics|Wikibooks en anglais sur l'économie]], par exemple. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 13 mai 2025 à 11:07 (CEST) :::::::::::Je viens de prévenir Matthius par mail. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 13 mai 2025 à 11:12 (CEST) ::::::::::::Tree bien. Moi aussi, je n'ai plus envie de consacrer du temps là dessus. Je vous laisse donc traiter la situation puisque votre avis est majoritaire. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 13 mai 2025 à 11:27 (CEST) :::::::::::Je ne comprends pas cette assertion. Je cite François Gervais contre le GIEC, qui a écrit pour le GIEC sans être entendu pour la conclusion. :::::::::::Je n'ai pas reformulé mes phrases à l'identique. J'ai soit indiqué la source contrairement à ce qui dit Fourmidable, soit indiqué que c'était mon point de vue ou émis une explication. Aussi quand je fais une assertion scientifique, j'en indique souvent la cause scientifique. Fourmidable a tendance à reprendre les phrases où je répète ce qui a été écrit avant pour aller plus loin. Donc il faut chercher dans mes livrels la phrase où je cite et où j'émets une hypothèse avec la cause scientifique. Je vais relire Fourmidable. :::::::::::Aussi j'ai trouvé sur l'[http://web.archive.org/web/20240810201141/https://www.google.com/search?q=mati%C3%A8re+temps+%C3%A2me âme qui ralentit la vitesse]. Je pense que Google utilise une IA pour détecter les limites de l'humain. Mon expérience de pensée va contre le matérialisme scientifique puisque j'émets l'hypothèse supérieure qu'il existe des multivers où des âmes agissent sur le nôtre. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 13 mai 2025 à 11:36 (CEST) :::::::::::Je ne pense pas effectivement que mon livrel sur le XXIe va rester sur wikibooks puisque il va contre ce qu'indique wikipedia. J'espère juste qu'il puisse rester. :::::::::::Seulement j'ai une formation en ingénierie et j'ai trouvé sur [https://archive.org/details/TempsAme l'âme qui ralentit la vitesse] [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 13 mai 2025 à 12:13 (CEST) ::::::::::Vous admettez {{Mention|DavidL}} que vous ne connaissez pas les domaines que j'aborde. Mes livrels sont pédagogiques donc vous pouvez apprendre avec. Donc lisez les avant d'émettre l'hypothèse qu'ils ne le sont pas. J'ai créé le coaching sans coach qui a permis de revoir la pédagogie d'un journal d'un réseau international. Mais cela ne m'empêche pas d'aller contre le libéralisme et l'appât du gain qui sont selon moi les fléaux actuels. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 13 mai 2025 à 12:06 (CEST) :::::::::::@[[Utilisateur:Matthius|Matthius]] semble ouvert au débat et à une aide pour améliorer ses textes. La suppression ne me semble donc pas une option souhaitable. Wikilivres est indépendant de Wikipédia. Il faut donc se référer à nos règles et recommandations locale disponible dans les espaces de noms "wikilivres" et "aide". Je vais essayer de prendre le temps d'écouter les textes avec une voix de synthèse pour gagner du temps. Cela me permettra d'en faire des commentaire en vue d'une amélioration. Car si ce sont des sources qui manques et bien il suffit de les ajouter. Nous sommes là pour travailler ensemble pour produire des ouvrages pédagogiques de qualité, pas pour juger du travail des autres en vue d'une suppression. Restons, s'il vous plait dans un esprit d'entraide et de collaboration. C'est tellement rare à notre époque... [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 14 mai 2025 à 15:00 (CEST) :::::::::::Mon livrel sur le XXIe siècle en cours d'écriture va aussi contre les théories du complot occidentales. J'écris que la Russie et la Chine sont des démocraties, alors que nos médias disent que ce sont des dictatures. J'émets effectivement des hypothèses non sourcées dans ce nouveau livrel. Je peux et vais les sourcer. Par contre j'utiliserai des sources primaires. En réalité, j'émets l'hypothèse que ce sont nos médias qui sont dans la post-vérité et que ce ne sont pas les médias étatsuniens, ni russes, ni chinois qui y sont. Ce livrel est effectivement une bombe dangereuse contre nos médias comme l'indique Fourmidable. ::::::::::::Je ne comprends pas l'acharnement de Fourmidable à ne pas vouloir discuter avec moi et à vouloir automatiquement supprimer mes livrels sans discussion préalable. En effet il a eu un an pour m'indiquer comment améliorer mes livrels. Et que Fourmidable ne me dise pas que c'est moi qui ait commencé, puisque j'étais outré qu'on veuille supprimer mes livrels avec ses copains sans discussion pédagagogique au tout début. ::::::::::::Concernant la neutralité de wikipedia : wikipedia ne fait que révéler l'avis des médias financés donc il n'est pas neutre. Être neutre c'est révéler tous les points de vue, même ceux avec lesquels on n'est pas d'accord, ce que [https://archive.org/details/wikipediaCo-Fondateur fit wikipedia au début de son histoire] et ce pour quoi je me suis intéressé et ai été réprimé sauf pour wikibooks anglais qui m'a viré pour ne pas enlever mon nom. :{{Mention|Matthius}} Avez-vous l'intention de publier des livres scientifiques, c'est-à-dire sourcés par de la science publiée et évaluée par les pairs, et à défaut de grands médias nationaux et internationaux ? Vous pouvez aussi tester vos hypothèses mais votre travail ne doit pas consister à sélectionner les sources qui vous conviennent pour seulement valider votre théorie, en mettant de coté tout ce qui vous dérangerait dans cette entreprise. --[[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 10:48 (CEST) ::@[[Utilisateur:Fourmidable|Fourmidable]], je pense que tu te fais une vision fausse du monde de l'édition. @[[Utilisateur:Matthius|Matthius]] peut payé une maison d'édition, dans le cadre d'une [[w:Édition_à_compte_d'auteur|édition à compte d'auteur]]. Probablement qu'il l'a déjà fait puisqu'il a déjà publié des ouvrages au format papier parmi ceux qu'il veut placer sur Wikilivres. Il en a même déposé certains dans une bibliothèque universitaire. Quant à la revue par les paires ne se fait que dans le cadre des journaux scientifique. ::J'ai écouté l'ouvrage [[Pourquoi un Dieu ?]] Et je trouve effectivement qu'il n'a pas sa place dans Wikilivres. Non pas parce qu'il critique le libéralisme avec des propos que je partage en grande partie, mais parce qu'il s'apparente plus à de la propagande chrétienne qu'à un réel ouvrage pédagogique sur le sujet. ::Matthius y est en posture de prédicateur et non de pédagogue. Je dirais que la moitié des phrases de l'ouvrage que j'ai écouté sont des affirmations sans argumentation ni démonstration valide. La thèse de son ouvrage se résume à dire que dieu est la seule chose qui peut expliquer un phénomène actuellement inexpliqué. Ce qui est une corrélation fallacieuse puisqu'il n'existe aucun lien de causalité. ::Pour moi, les ouvrages évangéliste ou propagandiste n'ont pas leur place dans Wikilivres et je serais d'avis d'ouvrir une prise de décision pour établir une règle d'interdiction. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 11:42 (CEST) :::Oui voilà, nous sommes d'accord. Peut-être que Matthius peut adopter une attitude plus scientifique, mais l'esprit de "pédagogie" s'accompagne forcément d'une démarche scientifique, sinon c'est de la prédication/propagande. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 11:45 (CEST) ::::@[[Utilisateur:Fourmidable|Fourmidable]]... Wikilivres n'est pas une bibliothèque "scientifique" mais pédagogique. Tu sembles confondre les deux termes. Les livres pour enfants que contient Wikilivres ne sont pas "scientifique" tout en étant pédagogiques. ::::Un autre fait qui peut être reproché à @[[Utilisateur:Matthius|Matthius]] est son autopromotion, [[Wikilivres:Présentation#● Wikilivres n'est pas une vitrine|alors que la démarche proscrite sur Wikilivres]]. ::::Plutôt que de supprimer l'important travail effectué par Matthius, je propose à nouveau de le déplacer en sous page de son espace utilisateur pour qu'il puisse retravailler ses écrits. ::::Pour un retour dans l'espace principale, il faudrait au préalable qu'il supprime des ses travaux toute forme d'autopromotion et toute forme propagande, prosélytisme ou autre type de discours prédicateur. Ceci notamment en référence aux choix politiques [https://www.senat.fr/leg/ppl17-386.html français], [https://www.rtbf.be/article/le-proselytisme-religieux-ou-politique-n-a-pas-sa-place-a-l-ecole-quels-chiffres-derriere-ce-phenomene-pointe-par-la-ministre-de-l-education-11477234 belge], [https://www.assnat.qc.ca/fr/travaux-parlementaires/projets-loi/projet-loi-94-43-1.html Quebec], [https://ge.ch/grandconseil/data/loisvotee/L11764.pdf suisse]. Quatres communautés culturelles très largement majoritaire dans l'espace francophone des projets Wikimédia. ::::J'invite Matthius et les autres membres de notre communauté réagir à ce message et de discuter du lancement d'une nouvelle prise de décision pour interdire la propagande et le prosélytisme dans Wikilivres. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 12:21 (CEST) :::::Ce que je veux dire, c'est qu'un bon livre pédagogique s'appuie forcément sur des connaissances scientifiques. Ok pour un redéplacement. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 12:37 (CEST) ::::::Ne fais pas à ton tour du prosélytisme scientifique @[[Utilisateur:Fourmidable|Fourmidable]]. La science et les connaissances dites scientifiques comme tu les entends n'est pas la seule chose sur laquelle on peut s'appuyer pour produire un contenu pédagogique. ::::::Que fais-tu de la méditation, de l'humour, de la poésie, de la musique, du dessin, et toute autre expression artistique ? ::::::Et il existe aussi un tas d'ouvrages pédagogique religieux (pour le catéchisme entre autre), sauf que, comme la plupart des législations nationales des pays francophones occidentaux, je pense qu'ils n'ont pas leur place dans Wikilivres. Ce sur quoi nous devons nous positionner dans une prise de décision collective. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 12:52 (CEST) :::::::Ah oui, dans ce sens-là il y a en effet moins de science à proprement parler… Mais je ne suis pas sûr que cela s'applique aux propos politiques. Ça ne me viendrait pas à l'idée de faire un Wikilivre afin de convertir les gens au libéralisme, par exemple. C'est le rôle d'autres wikis ou sites web spécialisés. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 14:44 (CEST) :::Je vais supprimer Du même Auteur et Du même éditeur de mes wikilivres. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 15 mai 2025 à 12:32 (CEST) ::::Si vous voulez, mais c'est loin d'être le point principal. [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 15 mai 2025 à 12:38 (CEST) :::::Effectivement @[[Utilisateur:Matthius|Matthius]], c'est une bonne résolution, mais il reste le prosélytisme à résoudre et je pense que cela demande beaucoup de travail à réaliser dans votre espace de travail personnel. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 15 mai 2025 à 12:55 (CEST) ::::::Vous mettiez que seul Pourquoi un Dieu est prosélyte. J'avais effectivement un doute en ajoutant ce livrel. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 15 mai 2025 à 19:43 (CEST) :::::::Je n'ai pas encore eu le temps d'écouter les autres livres @[[Utilisateur:Matthius|Matthius]] . Nous somme tous bénévoles ici. Cela peut prendre du temps, mais je vous invite déjà à déplacer vous-même le livre ''Pourquoi un Dieu'' dans vos sous page utilisateur''.'' :::::::Par anticipation, je peux déjà dire que tous les autres ouvrages faisant la publicité de vos écris doit être modifier ou retirer de l'espace principale ainsi que tous ceux qui font référence à Dieu ou au catholicisme de manière prosélyte. :::::::Seul le nom des auteurs devrais être repris dans les livre avec éventuellement des hyperliens vers leurs pages utilisateur qu'il sont libre d'éditer comme il veulent. :::::::On peut ensuite créer des pages catégories qui reprennent tous les travaux des auteurs, avec l'avantage qu'elle se complétent automatiquement à chaque fois que l'on ajoute une catégorie en bas de page d'un ouvrage. Vous trouverrez certainement des indication dans les pages d'aide. :::::::Je vous rassure sur le fait que ce traitement serait semblable pour un politicien libéral faisant la publicité de son parti, de ses idéologies et de sa personne. N'hésitez pas d'ailleurs à parcourir les autres wikilives pour y détecter ce genre de problème avant de nous le signaler. C'est ce que fait @[[Utilisateur:Fourmidable|Fourmidable]] en cherchant à veiller sur la qualité et la conformité de notre projet. Une belle fin de journée ! [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 16 mai 2025 à 11:41 (CEST) ::::::::Pour info, je confirme et soutiens tout ce que propose {{Mention|Lionel Scheepmans}} dans son dernier message (merci à lui). [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 16 mai 2025 à 12:01 (CEST) ::::::::Pourquoi a Dieu a été mis à jour dans mon espace personnel. Je ne sais pas comment effacer une page wikibooks.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 16 mai 2025 à 12:24 (CEST) :::::::::@[[Utilisateur:Matthius|Matthius]]. Je ne comprends pas ce que vous dite. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 16 mai 2025 à 15:16 (CEST) ::::::::::J'ai copié-collé Pourquoi un Dieu dans ma page personnelle. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 16 mai 2025 à 21:36 (CEST) :::::::::::Ah très bien @[[Utilisateur:Matthius|Matthius]]. Mais en fait, il est possible de déplacer les pages en les renomant. Cela permet de conserver tout l'historique de l'édition. Je vais le faire quand je serai sur PC. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 17 mai 2025 à 03:34 (CEST) ::::::::::::Ne le faites pas : L'original de l'historique est sur mon espace perso. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 17 mai 2025 à 09:30 (CEST) :::::::::::::@[[Utilisateur:Matthius|Matthius]], j'ai écouté l'ouvrage Économie enfant. Si j'étais à la tête d'une maison d'édition, je ne publierais pas ce manuscrit. Il y a des passages très intéressants avec des idées originales que je partage, mais aucune argumentation pour les valider. Pour le reste, on retrouve un copié collé du précédent ouvrage. Beaucoup d'information factuelle sans réelle contextualisation ni fil conducteur et puis de nombreuses affirmations gratuites qui ne sont finalement que des opinions très relatives et de nouveau non argumentées. :::::::::::::Le pire étant que certaine de ces affirmations son tout simplement fausses ou inscensées. :::::::::::::Exemples d'une phrase : :::::::::::::« Écrire sur ce que vous comprenez de l’archéologie, qui est l’humanité avant l’écriture. » :::::::::::::Cette phrase est erronée et n'a même aucun sens. L'archéologie n'est pas l'humanité, mais un domaine des sciences créé par les humains. Ensuite, l'archéologie n'est pas quelque chose qui se limite à avant l'écriture. Il existe des nombreux sites archéologiques qui fouillent les vestiges de la Rome antique. Une civilisation qui n'était pas dénuée d'écriture. :::::::::::::Exemple d'un paragraphe : :::::::::::::« Le [[w:Capital|capital]] de l’humanité peut donc être la Terre. En effet, l'argent est produit à partir du papier venant du bois. Les trafiquants ont toujours voulu se l'approprier. Le capital pourrait donc ne pas être l’argent. Le troc nécessite cependant un patrimoine conséquent. La Chine veut s’approprier le capital Lune, pour y prendre l’Helium 3 selon Solidarité et Progrès, seule ressource lunaire qu'il est intéressant de transporter, afin de le fusionner, pour en obtenir de l’énergie illimitée, favorisant la créativité par le surplus de biens. » :::::::::::::Ce paragraphe est incompréhensible et citer un parti politique (à d'autres reprises aussi dans l'ouvrage) comme source pour poser une affirmation, pose deux gros problèmes. 1 celui de faire la publicité d'une idéologie au sein d'un écrit pédagogique, 2 celui de ne pas respecter un des principes de base de l'écriture scientifique alors que le livre en parle et la défend. :::::::::::::Je n'irai pas plus loin dans les exemples. :::::::::::::Dans leurs états actuels et pour que ces livres travaux d'écritures soient admissibles dans Wikilivres. Je pense que vous devez impérativement supprimer : :::::::::::::* toute promotion personnelle. :::::::::::::* toute forme de Prosélytisme religieux. :::::::::::::* toute forme de publicité ou contre publicité politique et partisane :::::::::::::* toute affirmation fausse et autres types de fabulations. :::::::::::::* tout raisonnement ou démonstration sans lien de causalité. :::::::::::::Suite à quoi, il faudrait encore dans l'idéal en améliorer le style de sorte à y développer un fil conducteur qui permettrait aux lecteurs de suivre un développement ordonné propice à l'apprentissage, et non leur soumettre un journal de réflexions personnelles, reprenant des erreurs factuelles et logiques. :::::::::::::C'est un travail conséquent. :::::::::::::Et en ce qui concerne le prosélytisme, les approches politiques partisanes, il est impératif, y compris les sous page de votre page utilisateur. :::::::::::::Il y a des idées intéressantes dans vos écrits, et je partage pas mal de vos points de vue concernant la question du néolibéralisme. Mais Wikilivres n'est pas une tribune d'opinion à l'image d'AgoraVox. Nous sommes ici pour produire des ouvrages pédagogiques. Pas pour influencer nos lecteurs en faveurs ou à l'encontre de certaines religions ou idéologies. :::::::::::::Tout en l'encourageant à le faire de manière plus courtoise et constructive, je remercie donc @[[Utilisateur:Fourmidable|Fourmidable]] de nous avoir alerté sur l'incompatibilité de vos ouvrages avec notre projet. Dans tous les cas ceux que j'ai écoutés jusqu'à présent. :::::::::::::J'aimerais à votre tour vous encourager à poursuivre vos travaux d'écriture en cherchant à vous rapprocher de notre objectif tout en respectant nos règles et recommandations. Mais sachez aussi que vous pouvez aussi améliorer l'article de Wikipédia sur l'[[w:Économie_réelle|économie réelle]]. Ou aussi développer une leçon sur Wikiversité sur le même sujet dans la [[v:Faculté:Économie|Faculté d'Économie]]. C'est un sujet intéressant qui permet de mettre en lumières les limites de la [[w:Finance|finance]]. :::::::::::::Ces deux activités seraient moins ambitieuses que de vouloir produire un livre de qualité pour expliquer l'économie aux enfants. Cela demande une grande maîtrise du sujet en plus d'un certain don pour la vulgarisation. :::::::::::::Il me reste deux ouvrages proposés à la suppression à écouter, mais j'ai bien peur d'y retrouver les mêmes incompatibilités que celles que je viens d'expliquer à l'instant. :::::::::::::Bien cordialement, [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 26 mai 2025 à 21:16 (CEST) :::::::::::::Mon correcteur orhtographique ne fonctionnant pas pour des commentaires aussi long, le message que je viens de laisser est truflé de fautes et je n'ai pas le temps ni le courrage de les corriger. Encore une fois, le travail que je fournis sur ce projet est tout à fait bénévole. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 26 mai 2025 à 21:21 (CEST) ::::::::::::::J'ai passé beaucoup de temps à élaborer le coaching sans coach. Ce n'est naturel pour aucun ancien élève de simplifier. Je ne sais pas combien de fois j'ai relu Comment Écrire des Histoires. J'ai toujours beaucoup de temps devant moi pour revoir mes livrels.--[[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 10:51 (CEST) :::::::::::::::@[[Utilisateur:Matthius|Matthius]], c'est précisément parce que vous travailler beaucoup et que vous Me semblez de bonne foi et volonté, que je passe autant de temps à vous aiidez. Tous vos textes comprends des problèmes qu'il faut résoudre. Vous devriez commencer par supprimer tout ce qui fait référence à vous, à la religion et au politique, pour ne garder que des faits et affirmations vérifiées par des sources sûres et non partisannes, à chaque fois pour vous assurez que vous n'être pas simplement en train de diffuser ou colporter une opinion fausse et/ou partisane. Ce qui vient d'être dit est incontournable. :::::::::::::::Je penses ensuite qu'indique messages auxquelles ont été écrites vos sections sont superflues dans le cadre d'un ouvrage pédagogique. La chronologie de vos écrits n'est pas un bon un fil conducteur. Encore une fois, Wikilivres n'est pas un lieu pour publier ses mémoires ou ses réélections du jour. Il existe le format blog pour ce genre de choses. :::::::::::::::Tennez compte aussi que nous ne disposons pas forcément d'autant de temps et de motivation que pour revoir vos livres. Raison pour laquelle, des méthodes plus expéditives telles que la suppression complète des pages inadaptées à notre projet finiront par être appliquées. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 13:18 (CEST) ::::::::::::::::Le livrel le plus important pour moi est l'économie pour les enfants, vient ensuite devenir un génie. L'Univers est Vivant a été référencé sur les moteurs de recherche récemment parce que j'ai trouvé sur l'âme qui ralentit la vitesse. Quand on cherche matière temps âme sur les moteurs de recherche occidentaux on tombe sur ma page archive.org/details/TempsAme. Il n'y a toujours pas de chercheur qui a publié sur la mathématisation de ma trouvaille. L'univers est vivant est une amélioration d'un autre livre. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 13:56 (CEST) ::::::::::::::::Je viens de mettre mon [http://matthieu.giroux.free.fr/html/cv.htm CV] à jour pour montrer ce que j'ai influencé. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 14:05 (CEST) ::::::::::::::::C'est moi qui ai diffusé le terme économie réelle. Je reproche à ceux qui l'ont utilisé d'être des économistes scolaires, c'est à dire de se référer à l'économie monétaire pour parler d'économie réelle. Je peux cependant mettre un historique de cette économie sur la page wikipedia. Je me demande juste s'il va rester. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 14:08 (CEST) :::::::::::::::::Je suis désolé @[[Utilisateur:Matthius|Matthius]]. Je ne vais pas poursuivre nos conversations faute d'en avoir envie. Vous ma laissez sur cette impression que votre motivation première est de promouvoir votre personne, vos valeurs et vos idées. Je vais donc arrêter de vous consacrer du temps. Je suis ici pour soutenir et développer les projets et intérêts collectifs et non individuels. Bonne chance pour vos ambitions que je vous invite à réaliser en dehors des projets Wikipédia. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 15:00 (CEST) ::::::::::::::::::Mon projet relève de l'intérêt général de faire connaître l'économie du XIX{{e}} siècle de [[Henry Charles Carey]]. Mon égoïsme peut donc être aussi le vôtre. Pour moi il faut être intelligent et égoïste pour défendre l'intérêt général. Je pense qu'on peut tous avoir l'air de génies comme les enfants peuvent avoir l'air de génies. Oui, je suis militant et veux faire partager la joie de la politique. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 15:55 (CEST) :::::::::::::::::::Nous ne sommes donc pas sur la même longueur d'onde. Je vois invite à ne pas faire de militantisme sur les projets wikimedia. Il y a d'autres endois pour le faire. La blogosphère, des tribune comme agoravox, et de nombreux sites web tenus par des communautés militantes et reliée aux valeurs et idées pour lesquelles vous militer. Ceci est mon dernier message à ce sujet. Cordialement. [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 16:18 (CEST) ::::::::::::::::::::Je vous mets au défi de penser que les wikipédiens ne sont pas des militants. Eux veulent aussi défendre l'intérêt général en apportant la connaissance. Par contre ils ne ciblent pas leurs apports. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 28 mai 2025 à 17:10 (CEST) ::::::::::::::::::::Comme prévu, on me dit que mon [https://fr.wikipedia.org/wiki/%C3%89conomie_r%C3%A9elle#Histoire ajout sur l'économie réelle] est inédit. Je pense que vous vous êtes intéressé à certains de mes écrits parce qu'ils vous apportaient des réponses. Je peux faire cela sur wikibooks. Seulement c'est encore plus difficile sur wikipedia. Je ne suis pas théseux. Oui l'économie réelle a été créée pour faire connaître l'économie physique de Lyndon Larouche. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 30 mai 2025 à 17:15 (CEST) :::::::::::::::::::::Merci quand même ! [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 31 mai 2025 à 00:24 (CEST) :Mon livrel l'univers est vivant [https://www.agoravox.tv/actualites/technologies/article/et-si-la-physique-quantique-avait-105532 a eu un impact]. Je pense aussi avoir influencé les jeunes qui se sont tournés vers la bible. == [Recherche universitaire] Questionnaire sur la gouvernance Wikimedia == Bonjour à toutes et à tous, Dans le cadre d’un mémoire de recherche sur les modèles de gouvernance décentralisés dans les communs numériques, je mène une étude analysant le mouvement Wikimedia. L’objectif est de mieux comprendre la perception qu’ont les contributeurs et contributrices des projets Wikimedia (Wikilivres, Wikipédia, Wikidata, Commons, etc.) de la Fondation Wikimedia, de ses décisions, et des relations avec les chapters locaux (ex. Wikimédia France). Un questionnaire anonyme, rapide à remplir (environ 5 minutes), a été conçu à cet effet. Il s’adresse à toute personne majeure ayant déjà contribué à un projet Wikimedia, quelle que soit l’ancienneté ou le niveau d’implication. Lien vers le questionnaire : framaforms.org/questionnaire-communaute-wikipedienne-et-la-wikimedia-fondation-1747225404 '''Important''' : Les résultats seront utilisés uniquement dans un cadre académique. L'enquête, ainsi que l'étude, ne sont ni commandités ni supervisés par la Fondation ou aucun chapitre local. Il s'agit simplement d'un projet scolaire que je mène {{sourire}}. Merci d’avance pour votre participation ! [[Utilisateur:3(MG)²|3(MG)²]] ([[Discussion utilisateur:3(MG)²|discussion]]) 27 mai 2025 à 10:43 (CEST) :J'ai répondu. Bon courage pour ton mémoire ! (Ça me fait penser que je dois avancer sur le mien aussi...) [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 29 mai 2025 à 23:28 (CEST) == Propagande, prosélitisme, autopromotion, militanatisme, etc == Bonjours à la communauté des contributeurs de Wikilivres. Je me dit qu'il serait bon de faire une nouvelle prise de décision pour mieux cadrer le contenu de notre projet par rapport à ce qui se situebdans le titre de ce message. Qu'en pensez-vous ? [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 28 mai 2025 à 16:22 (CEST) :Totalement {{Pour}} ! [[Utilisateur:Fourmidable|Fourmidable]] ([[Discussion utilisateur:Fourmidable|discussion]]) 29 mai 2025 à 21:53 (CEST) :L'économie financière peut être considérée comme une propagande puisque son utilisation ne permet pas de lier la macro-économie et la micro-économie, ne permettant donc pas de développer une société comme le fait l'[https://fr.wikipedia.org/wiki/%C3%89conomie_r%C3%A9elle économie réelle]. Par contre, l'économie réelle aurait pu être considérée comme une propagande tant qu'elle ne permettait pas de faire mieux que l'économie financière. :Si on considère le prosélytisme comme convaincre de rejoindre sa communauté, il faudrait donc enlever tous les wikilivres qui sont beaucoup lus, puisque les wikilivres qui sont peu lus n'arrivent pas à convaincre. Je pense que mon livrel l'[https://fr.wikibooks.org/wiki/Utilisateur:Matthius/%C3%89conomie_Enfants économie pour les enfants] arrive à convaincre, malgré quelques défauts qu'on peut régler. Je pense que c'est pour cela qu'il a été ajouté pour suppression pour ne laisser que l'économie financière. Oui, le livre parle de Dieu, mais les [https://www.agoravox.tv/actualites/technologies/article/interviews-avec-le-physicien-yves-105950 scientifiques aussi]. Le livre a été effacé, mais corrigé puis remis avant d'être de nouveau déclassé malgré de nouvelles corrections suite aux critiques. Heureusement que [[User:Lionel Scheepmans|Lionel Scheepmans]] m'a permis de garder les images. :L'autopromotion permet malgré tout de connaître ce que fait l'auteur d'un wikilivre. Si on enlève le chemin qu'a suivi l'auteur, on évacuerait ainsi ses contradictions et on pourrait donc faire dire à un auteur l'inverse de ce qu'il a compris au bout de son parcours. Je suis pour qu'il y ait une page de l'auteur regroupant les livrels de l'auteur comme sur wikisource. :Je considère ceux qui contribuent à wikipedia et à wikibooks comme des militants, puisqu'ils essaient d'influencer les autres avec ce qu'ils écrivent sur ces sites web. Certes, certains travaux peuvent être désintéressés, mais alors pourquoi mettre ces travaux sur ces sites web alors. En effet le manque de passion crée des textes soporifiques. [[Utilisateur:Matthius|Matthius]] ([[Discussion utilisateur:Matthius|discussion]]) 3 juillet 2025 à 22:36 (CEST) ::Pas de propagande dans les projet wikimedia, au même titre que la publicité commerciale, pas de prosélytisme religieux ou politique, quand à la présentation des auteurs, il y a un espace de nom complet qui y est dédié. Chaque éditeur est libre de se présenter en détails sur sa page utilisateur, comme je ne me gêne pas de le faire moi- même. ::Je fatigue de répondre à vos messages. Il existe plein d'endroits sur le net qui répondent à vos attentes. Faite ce que vous voulez faire là-bas et ne venez ici qu'en respectant les choix de nos communautés. Sans quoi, votre comportement devient harcelant. Je pense être une exception en matière de patience dans l'écosystème wikimedia, mais faut pas abuser. ::Est-ce que vous comprenez @[[Utilisateur:Matthius|Matthius]] ? [[User:Lionel Scheepmans|Lionel Scheepmans]] <sup><big>✉</big> [[User talk:Lionel Scheepmans|Contact]]</sup> <sub>Désolé pour ma [[w:dysorthographie|dysorthographie]], [[w:dyslexie|dyslexie]] et [[wikt:distraction|"dys"traction]].</sub> 4 juillet 2025 à 00:47 (CEST) :Au final, à l'heure où les réseaux sociaux ne font que confirmer les opinions par le consumérisme, où la recherche sur les moteurs de recherche change quand on a un compte connecté, il est bon de proposer l'ensemble des points de vues sur wikibooks et wikipedia, comme le [https://www.agoravox.tv/actualites/technologies/article/wikipedia-son-co-fondateur-devoile-104049 demande son co-fondateur]. n59dtww8lqb75iqvxqbqsn2ph0u6krm Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020 0 82108 745885 745444 2025-07-03T19:27:53Z LodestarChariot2 120009 table des matières modifiée 745885 wikitext text/x-wiki {{Page de garde|image=OSPO cover.png|description= '''Observations préliminaires&nbsp;: Observatoire des politiques d'Érudition ouverte, 2017-2020''' est un recueil de réflexions, sous forme de livre, sur des questions pertinentes au mouvement de la science ouverte. Ce tome vise à faciliter la compréhension de la science sociale ouverte à travers le Canada et à l'international, afin de contribuer à influencer et à mettre en œuvre des politiques liées à la mobilisation des connaissances. Ce faisant, il reflète les politiques pertinentes et leur impact sur les communautés de recherche, tout en signalant les tendances et les recherches actuelles; et offre une base large et approfondie pour l'élaboration de recommandations politiques sur des questions importantes, notamment la gestion de l'identité, l'accès ouvert, la gestion des données, la science citoyenne et d'autres domaines connexes. |avancement=Terminé |cdu= * {{CDU item|3/31|316}} |versions= {{Moteur}} }} ''Pour lire la version anglaise de ce texte, voir [[b:en:Foundational Observations: Open Scholarship Policy Observatory, 2017-2020 | Foundational Observations: Open Scholarship Policy Observatory, 2017-2020]].'' ''Pour le deuxième volume de cette série, voir [[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024 | Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024]]. <big><div style="text-align: left;">'''Éditrices / Éditeurs&nbsp;: Alyssa Arbuckle, Ray Siemens, Tanja Niemann, Lynne Siemens'''</div></big> <big><div style="text-align: left;">'''Auteures / Auteurs&nbsp;: Sarah Milligan, Alyssa Arbuckle, Kim Silk, Caroline Winter'''</div></big> <div class="noprint"> ==Table des matières== ===[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Introduction | Introduction]]=== ===2017=== *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Politique_des_trois_organismes_sur_le_libre_accès_aux_publications | Politique des trois organismes sur le libre accès aux publications]] <small>(Milligan)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/L'Examen_du_soutien_fédéral_aux_sciences | L'Examen du soutien fédéral aux sciences]] <small>(Milligan)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Access_Copyright_c._Université_York | Access Copyright c. Université York]] <small>(Milligan)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Feuille_de_route_sur_la_communication_savante_de_l'ABRC | Feuille de route sur la communication savante de l'ABRC]] <small>(Milligan)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Recommandations_politiques_pour_le_libre_accès_aux_données_de_recherche_en_Europe_(RECODE) | Recommandations politiques pour le libre accès aux données de recherche en Europe (RECODE)]] <small>(Arbuckle)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Groupe_de_travail_sur_la_science_ouverte_du_G7 | Groupe de travail sur la science ouverte du G7]] <small>(Milligan)</small> ===2018=== *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Déclaration_de_principes_des_trois_organismes_sur_la_gestion_des_données_numériques | Déclaration de principes des trois organismes sur la gestion des données numériques]] <small>(Milligan)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Appel_de_Jussieu_pour_la_Science_ouverte_et_la_bibliodiversité | Appel de Jussieu pour la Science ouverte et la bibliodiversité]] <small>(Milligan)</small> *[[b:en:Foundational_Observations:_Open_Scholarship_Policy_Observatory,_2017-2020/Integrated_Digital_Scholarship_Ecosystem | Integrated Digital Scholarship Ecosystem]] <small>(Milligan)</small>{{ref|Ce texte est uniquement disponible en anglais.|a}} *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/ORCID : Connecter la recherche et les chercheurs | ORCID : Connecter la recherche et les chercheurs]] <small>(Silk)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Le_gouvernement_ouvert | Le gouvernement ouvert]] <small>(Silk)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Négociations_de_l'édition_à_libre_accès_en_Europe | Négociations de l'édition à libre accès en Europe]] <small>(Silk)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Comment_le_budget_fédéral_de_2018_affecte_la_recherche_au_Canada | Comment le budget fédéral de 2018 affecte la recherche au Canada]] <small>(Silk)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Ouvrir_les_outils_d'annotation | Ouvrir les outils d'annotation]] <small>(Silk)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Plan_S_et_cOAlition_S | Plan S et cOAlition S]] <small>(Winter)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Le_Canada_célèbre_la_Semaine_du_libre_accès_international_2018 | Le Canada célèbre la Semaine du libre accès international 2018]] <small>(Winter)</small> {{reflist}} ===2019=== *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Conformité_à_la_politique_de_libre_accès_au_Canada | Conformité à la politique de libre accès au Canada]] <small>(Winter)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/L'Analysis_&_Policy_Observatory | L'Analysis & Policy Observatory]] <small>(Winter)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Le Film Paywall : The Business of Scholarship | Le Film Paywall : The Business of Scholarship]] <small>(Winter)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/La_rupture_entre_Elsevier_et_l'University_of_California | La rupture entre Elsevier et l'University of California]] <small>(Winter)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/La_semain_de_l'éducation_ouverte_2019 | La semain de l'éducation ouverte 2019]] <small>(Winter)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/L'éducation_ouverte_en_Colombie_Britannique | L'éducation ouverte en Colombie Britannique]] <small>(Winter)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Le_Projet_Review,_Promotion,_and_Tenure_à_ScholCommLab | Le Projet «&#8239;Review, Promotion, and Tenure&#8239;» à ScholCommLab]] <small>(Winter)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Déclaration_électorale_commune_de_CAUL-AOASG | Déclaration électorale commune de CAUL-AOASG]] <small>(Winter)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Le_directive_de_l'Union_Européenne_sur_le_droit_d'auteur_dans_le_marché_unique_numérique | Le directive de l'Union Européenne sur le droit d'auteur dans le marché unique numérique]] <small>(Winter)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Le_Canadian–Australian_Partnership_for_Open_Scholarship_(CAPOS) | Le Canadian–Australian Partnership for Open Scholarship (CAPOS)]] <small>(Winter)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Les_médias_sociaux_pour_la_communauté_savant | Les médias sociaux pour la communauté savant]] <small>(Winter)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Mise à jour ORCID : Intégration des identifiants ORCID dans les workflows de financement de la recherche | Mise à jour ORCID : Intégration des identifiants ORCID dans les workflows de financement de la recherche]] <small>(Winter)</small> ===2020=== *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Wikidata_dans_les_bibliothèques_de_recherche | Wikidata dans les bibliothèques de recherche]] <small>(Winter)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/La_déclaration_de_la_Sorbonne_sur_les_droits_relatifs_aux_données_de_recherche | La déclaration de la Sorbonne sur les droits relatifs aux données de recherche]] <small>(Winter)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Le_politique_des_trois_organismes_sur_la_gestion_des_données_de_recherche | Le politique des trois organismes sur la gestion des données de recherche]] <small>(Winter)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/NOIRN_et_la_stratégie_canadienne_d’infrastructure_de_recherche_numérique | NOIRN et la stratégie canadienne d’infrastructure de recherche numérique]] <small>(Winter)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Examen_et_consultation_de_la_politique_de_L’UKRI_sur_libre_accès | Examen et consultation de la politique de L’UKRI sur libre accès]] <small>(Winter)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Plan_Stratégique_2019–2024_du_CRKN–RCDR | Plan Stratégique 2019–2024 du CRKN–RCDR]] <small>(Winter)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Science_Ouverte_et_COVID-19 | Science Ouverte et COVID-19]] <small>(Winter)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Mind_the_Gap_et_POP!_:_En_conversation_avec_John_Maxwell | Mind the Gap et POP! : En conversation avec John Maxwell]] <small>(Winter)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/La_Recommandation_de_l’UNESCO_sur_la_science_ouverte | La Recommandation de l’UNESCO sur la science ouverte]] <small>(Winter)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Le_Persistent_Identifier_(PID)_Consortium_de_Royaume-Uni | Le Persistent Identifier (PID) Consortium de Royaume-Uni]] <small>(Winter)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/L’atelier_et_rapport_Advancing_Open_d’ABRC | L’atelier et rapport Advancing Open d’ABRC]] <small>(Winter)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Feuille_de_route_pour_la_science_ouverte_du_Canada | Feuille de route pour la science ouverte du Canada]] <small>(Winter)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Mise à jour du Plan S : La Stratégie de conservation des droits | Mise à jour du Plan S : La Stratégie de conservation des droits]] <small>(Winter)</small> *[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Les_principes_TRUST_pour_les_dépôts_numériques | Les principes TRUST pour les dépôts numériques]] <small>(Winter)</small> </div> [[Catégorie:Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020 (livre)]] snohtosfxftepcejrxr2rhh424pxur8 Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024 0 82269 745886 745485 2025-07-03T19:29:05Z LodestarChariot2 120009 table des matières modifiée 745886 wikitext text/x-wiki {{Page de garde|image=Lunette mg 2368.jpg|description= '''L'Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024''' est un recueil de réflexions, sous forme de livre, sur des questions pertinentes au mouvement de la science ouverte. Ce tome, actuellement en cours, vise à faciliter la compréhension de la science sociale ouverte à travers le Canada et à l'international, afin de contribuer à influencer et à mettre en œuvre des politiques liées à la mobilisation des connaissances. Ce faisant, il reflète les politiques pertinentes et leur impact sur les communautés de recherche, tout en signalant les tendances et les recherches actuelles; et offre une base large et approfondie pour l'élaboration de recommandations politiques sur des questions importantes, notamment la gestion de l'identité, l'accès ouvert, la gestion des données, la science citoyenne et d'autres domaines connexes. |avancement=Terminé |cdu= * {{CDU item|3/31|316}} |versions= {{Moteur}} }} ''Pour lire la version anglaise de ce texte, voir [[b:en:Extensions: Open Scholarship Policy Observatory, 2021-2024 | Extensions: Open Scholarship Policy Observatory, 2021-2024]].'' ''Pour le premier volume de cette série, voir [[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020]]''. <big><div style="text-align: left;">'''Éditrices / Éditeurs: Lynne Siemens, Tanja Niemann, Alyssa Arbuckle, Ray Siemens'''</div></big> <big><div style="text-align: left;">'''Auteures / Auteurs: Caroline Winter, Talya Jesperson, JT Kern, Maggie Sardino, Brittany Amell'''</div></big> <div class="noprint"> ==Table des matières== ===[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Introduction | Introduction]]=== ===2021=== *[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Les programmes wikipédien(ne) en residence | Les programmes wikipédien(ne) en residence]] <small>(Winter et Jesperson)</small> *[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Mise à jour du Plan S : L’élargissement de l’adhésion de la cOAlition S | Mise à jour du Plan S : L’élargissement de l’adhésion de la cOAlition S]] <small>(Winter)</small> *[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Les monographies en libre accès | Les monographies en libre accès]] <small>(Winter)</small> *[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Mise à jour : Gestion des données de recherche au Canada | Mise à jour : Gestion des données de recherche au Canada]] <small>(Winter)</small> *[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Les accords de libre accès | Les accords de libre accès]] <small>(Winter)</small> *[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/La Semaine internationale du libre accès 2021, 25–31 octobre | La Semaine internationale du libre accès 2021, 25–31 octobre]] <small>(Winter)</small> *[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/La prolongation de la période de protection du droit d’auteur en Canada en vertu de l’Accord Canada–États-Unis–Mexique (ACEUM) | La prolongation de la période de protection du droit d’auteur en Canada en vertu de l’Accord Canada–États-Unis–Mexique (ACEUM)]] <small>(Winter)</small> *[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/État actuel de la gestion des données de recherche au Canada : un rapport par l’Alliance de recherche numérique du Canada | État actuel de la gestion des données de recherche au Canada : un rapport par l’Alliance de recherche numérique du Canada]] <small>(Winter)</small> ===2022=== *[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Les Fonds de recherche du Québec rejoignent la cOAlition S | Les Fonds de recherche du Québec rejoignent la cOAlition S]] <small>(Winter)</small> *[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Renforcement des capacités de GDR au Canada et la série de rapports Insights de Portage | Renforcement des capacités de GDR au Canada et la série de rapports Insights de Portage]] <small>(Winter)</small> *[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/La Stratégie canadienne de numérisation du patrimoine documentaire | La Stratégie canadienne de numérisation du patrimoine documentaire]] <small>(Winter et Kern)</small> *[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/La Collaboration entre l’ABRC et OpenAIRE | La Collaboration entre l’ABRC et OpenAIRE]] <small>(Winter)</small> *[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Le Rapport sur l’infrastructure ouverte du projet Future of Open Scholarship | Le Rapport sur l’infrastructure ouverte du projet Future of Open Scholarship]] <small>(Winter)</small> *[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/La Politique de libre accès du l’UKRI 2021 | La Politique de libre accès du l’UKRI 2021]] <small>(Winter)</small> *[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Le rapport The state of open data 2021 | Le rapport The state of open data 2021]] <small>(Winter)</small> *[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Les mesures alternatives pour l’évaluation de la recherche | Les mesures alternatives pour l’évaluation de la recherche]] <small>(Winter)</small> *[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Le partenariat renouvelé entre PKP et SciELO | Le partenariat renouvelé entre PKP et SciELO]] <small>(Winter)</small> *[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Le projet de la décolonisation des métadonnées de Canadiana du RCDR | Le projet de la décolonisation des métadonnées de Canadiana du RCDR]] <small>(Winter et Kern)</small> *[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Une mise à jour sur les monographies en libre accès | Une mise à jour sur les monographies en libre accès]] <small>(Winter)</small> *[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Le mémo Nelson : Une politique d’accès public mis à jour aux États-Unis | Le mémo Nelson : Une politique d’accès public mis à jour aux États-Unis]] <small>(Winter)</small> ===2023=== *[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Un plan d’action pour faire avancer le libre accès diamant | Un plan d’action pour faire avancer le libre accès diamant]] <small>(Winter)</small> *[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/La Semaine internationale du libre accès 2022, le 24–30 octobre | La Semaine internationale du libre accès 2022, le 24–30 octobre]] <small>(Winter)</small> *[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/La consolidation du marché et la communication savante | La consolidation du marché et la communication savante]] <small>(Winter et Sardino)</small> *[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Les droits de propriété intellectuelle et la science ouverte en Europe | Les droits de propriété intellectuelle et la science ouverte en Europe]] <small>(Winter)</small> *[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Le 20e anniversaire de l’Initiative de Budapest pour l’accès ouvert | Le 20e anniversaire de l’Initiative de Budapest pour l’accès ouvert]] <small>(Winter et Kern)</small> *[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/La sécurité de la recherche et la science ouverte au Canada | La sécurité de la recherche et la science ouverte au Canada]] <small>(Winter)</small> ===2024=== *[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Une révision de la Politique des trois organismes sur le libre accès aux publications (2015) | Une révision de la Politique des trois organismes sur le libre accès aux publications (2015)]] <small>(Winter)</small> *[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/La communauté avant la commercialisation | La communauté avant la commercialisation]] <small>(Amell)</small> *[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Réponses à l’intelligence artificielle | Réponses à l’intelligence artificielle]] <small>(Amell)</small> *[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/L’IA générative et l’édition savante | L’IA générative et l’édition savante]] <small>(Amell)</small> *[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Les agences fédérales de financement de la recherche annoncent un projet de lignes directrices sur l’utilisation de l’intelligence artificielle générative | Les agences fédérales de financement de la recherche annoncent un projet de lignes directrices sur l’utilisation de l’intelligence artificielle générative]] <small>(Amell)</small> </div> [[Catégorie:Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024 (livre)]] 787383ott5styu9w33m0dg926xrmtin Utilisateur:LodestarChariot2/Compilations/Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020 2 82590 745897 2025-07-03T22:11:28Z LodestarChariot2 120009 Page créée avec « {{Compilation}} :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Introduction]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Politique des trois organismes sur le libre accès aux publications]] :Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2... » 745897 wikitext text/x-wiki {{Compilation}} :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Introduction]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Politique des trois organismes sur le libre accès aux publications]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/L'Examen du soutien fédéral aux sciences]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Access Copyright c. Université York]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Feuille de route sur la communication savante de l'ABRC]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Recommandations politiques pour le libre accès aux données de recherche en Europe (RECODE)]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Groupe de travail sur la science ouverte du G7]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Déclaration de principes des trois organismes sur la gestion des données numériques]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Appel de Jussieu pour la Science ouverte et la bibliodiversité]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/ORCID : Connecter la recherche et les chercheurs]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Le gouvernement ouvert]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Négociations de l'édition à libre accès en Europe]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Comment le budget fédéral de 2018 affecte la recherche au Canada]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Ouvrir les outils d'annotation]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Plan S et cOAlition S]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Le Canada célèbre la Semaine du libre accès international 2018]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Conformité à la politique de libre accès au Canada]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/L'Analysis & Policy Observatory]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Le Film Paywall : The Business of Scholarship]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/La rupture entre Elsevier et l'University of California]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/La semain de l'éducation ouverte 2019]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/L'éducation ouverte en Colombie Britannique]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Le Projet Review, Promotion, and Tenure à ScholCommLab]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Déclaration électorale commune de CAUL-AOASG]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Le directive de l'Union Européenne sur le droit d'auteur dans le marché unique numérique]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Le Canadian–Australian Partnership for Open Scholarship (CAPOS)]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Les médias sociaux pour la communauté savant]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Mise à jour ORCID : Intégration des identifiants ORCID dans les workflows de financement de la recherche]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Wikidata dans les bibliothèques de recherche]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/La déclaration de la Sorbonne sur les droits relatifs aux données de recherche]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Le politique des trois organismes sur la gestion des données de recherche]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/NOIRN et la stratégie canadienne d’infrastructure de recherche numérique]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Examen et consultation de la politique de L’UKRI sur libre accès]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Plan Stratégique 2019–2024 du CRKN–RCDR]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Science Ouverte et COVID-19]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Mind the Gap et POP! : En conversation avec John Maxwell]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/La Recommandation de l’UNESCO sur la science ouverte]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Le Persistent Identifier (PID) Consortium de Royaume-Uni]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/L’atelier et rapport Advancing Open d’ABRC]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Feuille de route pour la science ouverte du Canada]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Mise à jour du Plan S : La Stratégie de conservation des droits]] :[[Observations préliminaires : Observatoire des politiques d'Érudition ouverte, 2017-2020/Les principes TRUST pour les dépôts numériques]] [[Catégorie:Compilations|Observations préliminaires : Observatoire des politiques d&#39;Érudition ouverte, 2017-2020]] sdivxe4ovrmcwbmpxyb0dmr2qds6a37 Utilisateur:LodestarChariot2/Compilations/Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024 2 82591 745900 2025-07-03T23:16:22Z LodestarChariot2 120009 Page créée avec « {{Compilation}} :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Introduction]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Les programmes wikipédien(ne) en residence]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Mise à jour du Plan S : L’élargissement de l’adhésion de la cOAlition S]] :Ext... » 745900 wikitext text/x-wiki {{Compilation}} :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Introduction]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Les programmes wikipédien(ne) en residence]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Mise à jour du Plan S : L’élargissement de l’adhésion de la cOAlition S]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Les monographies en libre accès]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Mise à jour : Gestion des données de recherche au Canada]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Les accords de libre accès]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/La Semaine internationale du libre accès 2021, 25–31 octobre]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/La prolongation de la période de protection du droit d’auteur en Canada en vertu de l’Accord Canada–États-Unis–Mexique (ACEUM)]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/État actuel de la gestion des données de recherche au Canada : un rapport par l’Alliance de recherche numérique du Canada]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Les Fonds de recherche du Québec rejoignent la cOAlition S]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Renforcement des capacités de GDR au Canada et la série de rapports Insights de Portage]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/La Stratégie canadienne de numérisation du patrimoine documentaire]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/La Collaboration entre l’ABRC et OpenAIRE]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Le Rapport sur l’infrastructure ouverte du projet Future of Open Scholarship]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/La Politique de libre accès du l’UKRI 2021]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Le rapport The state of open data 2021]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Les mesures alternatives pour l’évaluation de la recherche]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Le partenariat renouvelé entre PKP et SciELO]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Le projet de la décolonisation des métadonnées de Canadiana du RCDR]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Une mise à jour sur les monographies en libre accès]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Le mémo Nelson : Une politique d’accès public mis à jour aux États-Unis]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Un plan d’action pour faire avancer le libre accès diamant]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/La Semaine internationale du libre accès 2022, le 24–30 octobre]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/La consolidation du marché et la communication savante]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Les droits de propriété intellectuelle et la science ouverte en Europe]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Le 20e anniversaire de l’Initiative de Budapest pour l’accès ouvert]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/La sécurité de la recherche et la science ouverte au Canada]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Une révision de la Politique des trois organismes sur le libre accès aux publications (2015)]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/La communauté avant la commercialisation]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Réponses à l’intelligence artificielle]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/L’IA générative et l’édition savante]] :[[Extension : Observatoire des politiques d'Érudition ouverte, 2021-2024/Les agences fédérales de financement de la recherche annoncent un projet de lignes directrices sur l’utilisation de l’intelligence artificielle générative]] [[Catégorie:Compilations|Extension : Observatoire des politiques d&#39;Érudition ouverte, 2021-2024]] 197ssg88kzdz2icut3r0v9dyzfsu6bp